Esempio n. 1
0
 def test_pseudoprojector(self):
     print("TEST PSEUDO")
     sys.stdout.flush()
     # test ps projections
     wf = Wavefunction.from_directory(".")
     basis = Wavefunction.from_directory(".")
     pr = Projector(wf, basis, method="pseudo")
     res = pr.single_band_projection(6)
     assert res.shape[0] == basis.nband * basis.nspin * basis.nwk
     res = pr.defect_band_analysis(4, 10, False)
     assert len(res.keys()) == 15
Esempio n. 2
0
 def test_desymmetrization(self):
     print("TEST DESYM")
     sys.stdout.flush()
     # test ae projections
     wf1 = Wavefunction.from_directory(".", False)
     basis = Wavefunction.from_directory("nosym", False)
     pr = Projector(wf1, basis, unsym_wf=True, unsym_basis=True)
     test_vals = {}
     for b in range(wf1.nband):
         v, c = pr.proportion_conduction(b)
         print("CHECK_VALS", v, c)
         test_vals[b] = (v, c)
     for b in range(wf1.nband // 2):
         if b < 6:
             assert_almost_equal(test_vals[b][0], 1, decimal=3)
             assert_almost_equal(test_vals[b][1], 0, decimal=7)
         else:
             assert_almost_equal(test_vals[b][0], 0, decimal=7)
             assert_almost_equal(test_vals[b][1], 1, decimal=3)
Esempio n. 3
0
    def test_projector(self):
        print("TEST PROJ")
        sys.stdout.flush()
        # test ae projections
        wf1 = Wavefunction.from_directory('.', False)
        basis = Wavefunction.from_directory('.', False)
        pr = Projector(wf1, basis)
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        generator = Projector.setup_multiple_projections('.', ['.', '.'])
        for wf_dir, wf in generator:
            wf.defect_band_analysis(4, 10, spinpol=True)

        wf1 = Wavefunction.from_directory('.', False)
        basis = Wavefunction.from_directory('.', False)
        pr = Projector(wf1, basis, 'aug_recip')
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        wf1 = Wavefunction.from_directory('.', False)
        basis = Wavefunction.from_directory('.', False)
        pr = Projector(wf1, basis, 'realspace')
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)
Esempio n. 4
0
    def test_projector_gz(self):
        print("TEST PROJGZ")
        sys.stdout.flush()
        # test ae projections
        wf1 = Wavefunction.from_files("CONTCAR", "WAVECAR2.gz", "POTCAR",
                                      "vasprun.xml", False)
        basis = Wavefunction.from_directory(".", False)
        pr = Projector(wf1, basis)
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        generator = Projector.setup_multiple_projections(".", [".", "."])
        for wf_dir, wf in generator:
            wf.defect_band_analysis(4, 10, spinpol=True)
Esempio n. 5
0
    def test_flip_spin(self):

        wf = Wavefunction.from_directory('.', False)
        basis = Wavefunction.from_directory('.', False)
        pr = Projector(wf, basis)
        for b in range(wf.nband):
            res = pr.single_band_projection(b, flip_spin=True)
            res = np.abs(res)**2
            print(b, res)
            for br in range(basis.nband):
                expected = 1 if b == br else 0
                decimal = 4 if b == br else 8
                for k in range(basis.nspin * basis.nwk):
                    assert_almost_equal(np.sum(
                        res[br * basis.nwk * basis.nspin + k]),
                                        expected,
                                        decimal=decimal)

        pr = Projector(wf, basis, method='aug_recip')
        for b in range(wf.nband):
            res = pr.single_band_projection(b, flip_spin=True)
            res = np.abs(res)**2
            print(b, res)
            for br in range(basis.nband):
                expected = 1 if b == br else 0
                decimal = 4 if b == br else 8
                for k in range(basis.nspin * basis.nwk):
                    assert_almost_equal(np.sum(
                        res[br * basis.nwk * basis.nspin + k]),
                                        expected,
                                        decimal=decimal)
Esempio n. 6
0
def main(band_indice, defect_ind, dir_init, dir_final):
    from pawpyseed.core.projector import Wavefunction, Projector  # also imports the wavefunction module
    wf_list = []
    overlap_list = []

    wf_basis = Wavefunction.from_directory(dir_init, setup_projectors=False)
    kpt_len = len(wf_basis.kpts)

    for dir_name in ["{}".format(_) for _ in dir_final]:
        wf_trap = Wavefunction.from_directory(dir_name, setup_projectors=False)
        pr = Projector(wf_trap, wf_basis)
        result = pr.single_band_projection(band_num=defect_ind)

        # result = result.reshape((kpt_len, int(len(result)/kpt_len)))
        result = result.reshape((int(len(result) / kpt_len), kpt_len))
        result = result[:, 0]
        overlap_list.append(result[band_indice])

    print("\n\n\n")
    print("=================================")
    print("----------- Overlaps ------------")
    print("=================================")
    print(np.abs(np.array(overlap_list)))
Esempio n. 7
0
    def test_offsite(self):
        Projector = DummyProjector
        print("TEST OFFSITE")
        sys.stdout.flush()
        wf1 = Wavefunction.from_directory("nosym", False)
        basis = Wavefunction.from_directory("nosym", False)
        print("ENCUT", wf1.encut, basis.encut)
        pr = Projector(wf1, basis)
        test_vals = {}
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            print("CHECK_VALS", v, c)
            test_vals[b] = (v, c)
        for b in range(wf1.nband // 2):
            if b < 6:
                assert_almost_equal(test_vals[b][0], 1, decimal=2)
                assert_almost_equal(test_vals[b][1], 0, decimal=4)
            else:
                assert_almost_equal(test_vals[b][0], 0, decimal=4)
                assert_almost_equal(test_vals[b][1], 1, decimal=2)

        generator = Projector.setup_multiple_projections(".", [".", "."])
        for wf_dir, wf in generator:
            wf.defect_band_analysis(4, 10, spinpol=True)

        wf1 = Wavefunction.from_directory("nosym", False)
        basis = Wavefunction.from_directory("nosym", False)
        print("ENCUT", wf1.encut, basis.encut)
        pr = Projector(wf1, basis, "aug_recip")
        test_vals = {}
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            print("CHECK_VALS", v, c)
            test_vals[b] = (v, c)
        for b in range(wf1.nband // 2):
            if b < 6:
                assert_almost_equal(test_vals[b][0], 1, decimal=2)
                assert_almost_equal(test_vals[b][1], 0, decimal=4)
            else:
                assert_almost_equal(test_vals[b][0], 0, decimal=4)
                assert_almost_equal(test_vals[b][1], 1, decimal=2)
Esempio n. 8
0
    def test_projector(self):
        print("TEST PROJ")
        sys.stdout.flush()
        # test ae projections
        wf1 = Wavefunction.from_directory(".", False)
        basis = Wavefunction.from_directory(".", False)
        pr = Projector(wf1, basis)
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        generator = Projector.setup_multiple_projections(".", [".", "."])
        for wf_dir, wf in generator:
            wf.defect_band_analysis(4, 10, spinpol=True)

        wf1 = Wavefunction.from_directory(".", False)
        basis = Wavefunction.from_directory(".", False)
        pr = Projector(wf1, basis, "aug_recip")
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        wf1 = Wavefunction.from_directory(".", False)
        basis = Wavefunction.from_directory(".", False)
        pr = Projector(wf1, basis, "realspace")
        for b in range(wf1.nband):
            v, c = pr.proportion_conduction(b)
            if b < 6:
                assert_almost_equal(v, 1, decimal=4)
                assert_almost_equal(c, 0, decimal=8)
            else:
                assert_almost_equal(v, 0, decimal=8)
                assert_almost_equal(c, 1, decimal=4)

        with assert_raises(ValueError):
            pr.proportion_conduction(100)
            pr.proportion_conduction(-1)
Esempio n. 9
0
    def run_pawpy(self):
        """
        Container for running pawpyseed on all defects in this workflow
        """

        vbm = None
        bulk_dirs, wf_dirs = [], []
        bulk_sizes, wf_sizes = [], []
        for sc_size, bulk_fw in self.bulk_fw_sets.items():
            launch_dir = bulk_fw.launches[-1].launch_dir
            bulk_sizes.append(sc_size)
            bulk_dirs.append(launch_dir)
            if not vbm:
                # need to check different filenames
                vr = Vasprun(os.path.join(launch_dir, "vasprun.xml"))
                vbm = vr.eigenvalue_band_properties[2]
                print("\twill use vbm value of ", vbm)
        for sc_size, size_set in self.dwo.defect_fw_sets.items():
            for fw in size_set:
                wf_sizes.append(sc_size)
                wf_dirs.append(fw.launches[-1].launch_dir)
        projector_list, bases = Projector.setup_bases(bulk_dirs, wf_dirs, True)
        num_proj_els = bases[0].num_proj_els
        store_all_data = {}
        basis_sets = {}
        for i, sc_size in enumerate(bulk_sizes):
            basis_sets[sc_size] = bases[i]

        # for each defect, in a given supercell size
        for sc_size, size_set in self.dwo.defect_fw_sets.items():
            for fw in size_set:
                try:
                    launch_dir = fw.launches[-1].launch_dir
                    print(f"start parsing of {fw.name} wavefunction")

                    # setup file path,
                    print("\tsetting up files")
                    self._setup_file_for_parsing(launch_dir)

                    # find band number which is at VBM and iniitalize band_dict and find spin polarization
                    print("\tinitializing band_dict")
                    band_dict, spinpol = self._get_vbm_band_dict(
                        launch_dir, vbm)

                    # setup defect wavefunction
                    print("\tmerging wf from dir")
                    wf = Wavefunction.from_atomate_directory(
                        launch_dir, setup_projectors=False)

                    # loop over band projections around band edge and store results
                    print("\tperforming projections")
                    pr = Projector(
                        wf,
                        basis_sets[sc_size],
                        projector_list=projector_list,
                        unsym_wf=True,
                    )
                    for bandnum in band_dict.keys():
                        v, c = pr.proportion_conduction(bandnum,
                                                        spinpol=spinpol)
                        band_dict[bandnum]["VB_projection"] = v[:]
                        band_dict[bandnum]["CB_projection"] = c[:]
                        print(bandnum, band_dict[bandnum])

                    # then tear down file path
                    print("\ttear down files")
                    rmtree(os.path.join(launch_dir, "kyle_file"))

                    # release defect memory
                    pr.wf.free_all()

                    store_all_data[fw.fw_id] = band_dict
                except Exception as e:
                    print(
                        "___&*$#&(*#@&$)(*&@#)($----\n--> ERROR OCCURED. "
                        "Skipping this defect.\n-------------^#$^*&^#$&*^#@^$#-------------"
                    )
                    print(repr(e))

        # now release all bulk basis memory
        for bulk_basis in basis_sets.values():
            bulk_basis.free_all()

        Projector.free_projector_list(projector_list, num_proj_els)

        return store_all_data
Esempio n. 10
0
 def setup(self):
     os.chdir(os.path.join(MODULE_DIR, '../../../test_files'))
     generator = Projector.setup_multiple_projections('.', ['.', '.'])
     self.bes = BasisExpansion.makeit(generator)
Esempio n. 11
0
 def setup(self):
     os.chdir(os.path.join(MODULE_DIR, '../../../test_files'))
     generator = Projector.setup_multiple_projections('.', ['.', '.'])
     self.bcs = BulkCharacter.makeit(generator)