class BztInterpolatorTest(unittest.TestCase): def setUp(self): loader = VasprunLoader().from_file(vrunfile) self.bztInterp = BztInterpolator(loader) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") def tearDown(self): warnings.resetwarnings() def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape,(5, 3, 3, 3, 148877)) self.assertTupleEqual(self.bztInterp.eband.shape,(5, 148877)) self.assertTupleEqual(self.bztInterp.coeffs.shape,(5, 1429)) self.assertEqual(self.bztInterp.nemax,12) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(list(sbs.bands.values())[0].shape,(5,137)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies),10000) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True,T=200) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()),3)
class BztInterpolatorTest(unittest.TestCase): def setUp(self): self.loader = VasprunLoader(vrun) self.assertTupleEqual(self.loader.proj.shape,(120, 20, 2, 9)) self.bztInterp = BztInterpolator(self.loader,lpfac=2) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") def tearDown(self): warnings.resetwarnings() def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape,(5, 3, 3, 3, 29791)) self.assertTupleEqual(self.bztInterp.eband.shape,(5, 29791)) self.assertTupleEqual(self.bztInterp.coeffs.shape,(5, 322)) self.assertEqual(self.bztInterp.nemax,12) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape,(5,137)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200,npts_mu = 100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies),100) self.assertAlmostEqual(tot_dos.densities[Spin.up][0],1.42859939,5) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True,T=200,npts_mu = 100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()),3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][0] self.assertAlmostEqual(pdos,15.474392020,5)
class BztInterpolatorTest(unittest.TestCase): def setUp(self): self.loader = VasprunLoader(vrun) self.assertTupleEqual(self.loader.proj.shape,(120, 20, 2, 9)) self.bztInterp = BztInterpolator(self.loader,lpfac=2) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") bs_sp = loadfn(os.path.join(test_dir, "N2_bandstructure.json")) loader_sp_up = BandstructureLoader(bs_sp, vrun_sp.structures[-1],spin=1) loader_sp_dn = BandstructureLoader(bs_sp, vrun_sp.structures[-1],spin=-1) min_bnd = min(loader_sp_up.ebands.min(),loader_sp_dn.ebands.min()) max_bnd = max(loader_sp_up.ebands.max(),loader_sp_dn.ebands.max()) loader_sp_up.set_upper_lower_bands(min_bnd,max_bnd) loader_sp_dn.set_upper_lower_bands(min_bnd,max_bnd) self.bztI_up = BztInterpolator(loader_sp_up,lpfac=2,energy_range=np.inf,curvature=False) self.bztI_dn = BztInterpolator(loader_sp_dn,lpfac=2,energy_range=np.inf,curvature=False) def tearDown(self): warnings.simplefilter("default") def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape,(5, 3, 3, 3, 29791)) self.assertTupleEqual(self.bztInterp.eband.shape,(5, 29791)) self.assertTupleEqual(self.bztInterp.coeffs.shape,(5, 322)) self.assertEqual(self.bztInterp.nemax,12) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape,(5,137)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200,npts_mu = 100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies),100) self.assertAlmostEqual(tot_dos.densities[Spin.up][0],1.42859939,5) dos_up = self.bztI_up.get_dos(partial_dos=False,npts_mu = 100) dos_dn = self.bztI_dn.get_dos(partial_dos=False,npts_mu = 100) cdos = merge_up_down_doses(dos_up,dos_dn) self.assertAlmostEqual(cdos.densities[Spin.down][50],92.87836778,5) self.assertAlmostEqual(cdos.densities[Spin.up][45],9.564067,5) self.assertEqual(len(cdos.energies),100) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True,T=200,npts_mu = 100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()),3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][0] self.assertAlmostEqual(pdos,15.474392020,5)
class BztInterpolatorTest(unittest.TestCase): def setUp(self): self.loader = VasprunLoader(vrun) self.assertTupleEqual(self.loader.proj.shape,(120, 20, 2, 9)) self.bztInterp = BztInterpolator(self.loader,lpfac=2) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") bs_sp = loadfn(os.path.join(test_dir, "N2_bandstructure.json")) loader_sp_up = BandstructureLoader(bs_sp, vrun_sp.structures[-1],spin=1) loader_sp_dn = BandstructureLoader(bs_sp, vrun_sp.structures[-1],spin=-1) min_bnd = min(loader_sp_up.ebands.min(),loader_sp_dn.ebands.min()) max_bnd = max(loader_sp_up.ebands.max(),loader_sp_dn.ebands.max()) loader_sp_up.set_upper_lower_bands(min_bnd,max_bnd) loader_sp_dn.set_upper_lower_bands(min_bnd,max_bnd) self.bztI_up = BztInterpolator(loader_sp_up,lpfac=2,energy_range=np.inf,curvature=False) self.bztI_dn = BztInterpolator(loader_sp_dn,lpfac=2,energy_range=np.inf,curvature=False) def tearDown(self): warnings.resetwarnings() def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape,(5, 3, 3, 3, 29791)) self.assertTupleEqual(self.bztInterp.eband.shape,(5, 29791)) self.assertTupleEqual(self.bztInterp.coeffs.shape,(5, 322)) self.assertEqual(self.bztInterp.nemax,12) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape,(5,137)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200,npts_mu = 100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies),100) self.assertAlmostEqual(tot_dos.densities[Spin.up][0],1.42859939,5) dos_up = self.bztI_up.get_dos(partial_dos=False,npts_mu = 100) dos_dn = self.bztI_dn.get_dos(partial_dos=False,npts_mu = 100) cdos = merge_up_down_doses(dos_up,dos_dn) self.assertAlmostEqual(cdos.densities[Spin.down][50],92.87836778,5) self.assertAlmostEqual(cdos.densities[Spin.up][45],9.564067,5) self.assertEqual(len(cdos.energies),100) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True,T=200,npts_mu = 100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()),3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][0] self.assertAlmostEqual(pdos,15.474392020,5)
def dos_from_boltztrap(bs_dict, energy_grid=0.005, avoid_projections=False): """ Function to just interpolate a DOS from a bandstructure using BoltzTrap Args: bs_dict(dict): A MSONable dictionary for a bandstructure object energy_grid(float): the energy_grid spacing for the DOS in eV avoid_projections(bool): don't interpolate projections even if present """ bs = BandStructure.from_dict(bs_dict) st = bs.structure energy_grid = energy_grid * units.eV projections = True if bs.projections and not avoid_projections else False if bs.is_spin_polarized: data_up = BandstructureLoader(bs, st, spin=1) data_dn = BandstructureLoader(bs, st, spin=-1) min_bnd = min(data_up.ebands.min(), data_dn.ebands.min()) max_bnd = max(data_up.ebands.max(), data_dn.ebands.max()) data_up.set_upper_lower_bands(min_bnd, max_bnd) data_dn.set_upper_lower_bands(min_bnd, max_bnd) bztI_up = BztInterpolator(data_up, energy_range=np.inf, curvature=False) bztI_dn = BztInterpolator(data_dn, energy_range=np.inf, curvature=False) npts_mu = int((max_bnd - min_bnd) / energy_grid) dos_up = bztI_up.get_dos(partial_dos=projections, npts_mu=npts_mu) dos_dn = bztI_dn.get_dos(partial_dos=projections, npts_mu=npts_mu) cdos = merge_up_down_doses(dos_up, dos_dn) else: data = BandstructureLoader(bs, st) min_bnd = min(data.ebands.min(), data.ebands.min()) max_bnd = max(data.ebands.max(), data.ebands.max()) npts_mu = int((max_bnd - min_bnd) / energy_grid) bztI = BztInterpolator(data, energy_range=np.inf, curvature=False) cdos = bztI.get_dos(partial_dos=projections, npts_mu=npts_mu) return cdos.as_dict()
class BztInterpolatorTest(unittest.TestCase): def setUp(self): self.loader = VasprunLoader(vrun) self.assertTupleEqual(self.loader.proj.shape, (120, 20, 2, 9)) self.bztInterp = BztInterpolator(self.loader, lpfac=2) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") def tearDown(self): warnings.resetwarnings() def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape, (5, 3, 3, 3, 29791)) self.assertTupleEqual(self.bztInterp.eband.shape, (5, 29791)) self.assertTupleEqual(self.bztInterp.coeffs.shape, (5, 322)) self.assertEqual(self.bztInterp.nemax, 12) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape, (5, 137)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200, npts_mu=100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies), 100) self.assertAlmostEqual(tot_dos.densities[Spin.up][0], 1.42859939, 5) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True, T=200, npts_mu=100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()), 3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][0] self.assertAlmostEqual(pdos, 15.474392020, 5)
class BztInterpolatorTest(unittest.TestCase): def setUp(self): self.loader = VasprunBSLoader(vrun) self.bztInterp = BztInterpolator(self.loader, lpfac=2) self.assertIsNotNone(self.bztInterp) self.bztInterp = BztInterpolator(self.loader, lpfac=2, save_bztInterp=True, fname=bztinterp_fn) self.assertIsNotNone(self.bztInterp) self.bztInterp = BztInterpolator(self.loader, load_bztInterp=True, fname=bztinterp_fn) self.assertIsNotNone(self.bztInterp) warnings.simplefilter("ignore") self.loader_sp = VasprunBSLoader(vrun_sp) self.bztInterp_sp = BztInterpolator(self.loader_sp, lpfac=2) self.assertIsNotNone(self.bztInterp_sp) self.bztInterp_sp = BztInterpolator(self.loader_sp, lpfac=2, save_bztInterp=True, fname=bztinterp_fn) self.assertIsNotNone(self.bztInterp_sp) self.bztInterp_sp = BztInterpolator(self.loader_sp, lpfac=2, load_bztInterp=True, fname=bztinterp_fn) self.assertIsNotNone(self.bztInterp_sp) warnings.simplefilter("ignore") def tearDown(self): warnings.simplefilter("default") def test_properties(self): self.assertTupleEqual(self.bztInterp.cband.shape, (6, 3, 3, 3, 29791)) self.assertTupleEqual(self.bztInterp.eband.shape, (6, 29791)) self.assertTupleEqual(self.bztInterp.coeffs.shape, (6, 322)) self.assertEqual(self.bztInterp.data.nelect, 6.0) self.assertEqual(self.bztInterp.data.nelect_all, 20.0) self.assertTupleEqual(self.bztInterp.data.ebands.shape, (6, 120)) self.assertTupleEqual(self.bztInterp_sp.cband.shape, (10, 3, 3, 3, 23275)) self.assertTupleEqual(self.bztInterp_sp.eband.shape, (10, 23275)) self.assertTupleEqual(self.bztInterp_sp.coeffs.shape, (10, 519)) self.assertEqual(self.bztInterp_sp.data.nelect, 6.0) self.assertEqual(self.bztInterp_sp.data.nelect_all, 10.0) self.assertTupleEqual(self.bztInterp_sp.data.ebands.shape, (10, 198)) def test_get_band_structure(self): sbs = self.bztInterp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape, (6, 137)) kpaths = [["L", "K"]] kp_lbl = {"L": np.array([0.5, 0.5, 0.5]), "K": np.array([0.375, 0.375, 0.75])} sbs = self.bztInterp.get_band_structure(kpaths, kp_lbl) self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape, (6, 20)) sbs = self.bztInterp_sp.get_band_structure() self.assertIsNotNone(sbs) self.assertTupleEqual(sbs.bands[Spin.up].shape, (6, 143)) self.assertTupleEqual(sbs.bands[Spin.down].shape, (4, 143)) def test_tot_dos(self): tot_dos = self.bztInterp.get_dos(T=200, npts_mu=100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies), 100) self.assertAlmostEqual(tot_dos.densities[Spin.up][0], 1.35371715, 5) tot_dos = self.bztInterp_sp.get_dos(T=200, npts_mu=100) self.assertIsNotNone(tot_dos) self.assertEqual(len(tot_dos.energies), 100) self.assertAlmostEqual(tot_dos.densities[Spin.up][75], 88.034456, 5) self.assertAlmostEqual(tot_dos.densities[Spin.down][75], 41.421367, 5) def test_tot_proj_dos(self): tot_proj_dos = self.bztInterp.get_dos(partial_dos=True, T=200, npts_mu=100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()), 3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][75] self.assertAlmostEqual(pdos, 2490.169396, 5) tot_proj_dos = self.bztInterp_sp.get_dos(partial_dos=True, T=200, npts_mu=100) self.assertIsNotNone(tot_proj_dos) self.assertEqual(len(tot_proj_dos.get_spd_dos().values()), 3) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.up][75] self.assertAlmostEqual(pdos, 166.4933305, 5) pdos = tot_proj_dos.get_spd_dos()[OrbitalType.s].densities[Spin.down][75] self.assertAlmostEqual(pdos, 272.194174, 5)