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
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)
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)
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)
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)
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)))
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)
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)
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
def setup(self): os.chdir(os.path.join(MODULE_DIR, '../../../test_files')) generator = Projector.setup_multiple_projections('.', ['.', '.']) self.bes = BasisExpansion.makeit(generator)
def setup(self): os.chdir(os.path.join(MODULE_DIR, '../../../test_files')) generator = Projector.setup_multiple_projections('.', ['.', '.']) self.bcs = BulkCharacter.makeit(generator)