From e3270113af31f16deec7539d79a0b97702e97c36 Mon Sep 17 00:00:00 2001 From: Mark Turiansky Date: Tue, 8 Oct 2019 19:15:26 -0700 Subject: [PATCH 1/4] Eigenval class --- pymatgen/io/vasp/outputs.py | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/pymatgen/io/vasp/outputs.py b/pymatgen/io/vasp/outputs.py index 2bdfa425cf3..f1c5bcc3641 100644 --- a/pymatgen/io/vasp/outputs.py +++ b/pymatgen/io/vasp/outputs.py @@ -4499,6 +4499,74 @@ def get_parchg(self, poscar, kpoint, band, spin=None, phase=False, return Chgcar(poscar, data) +class Eigenval: + """ + Object for reading EIGENVAL file. + """ + def __init__(self, filename, occu_tol=1e-8): + self.filename = filename + self.occu_tol = occu_tol + + with zopen(filename, 'r') as f: + self.ispin = int(f.readline().split()[-1]) + + # useless header information + for _ in range(4): + f.readline() + + self.nelect, self.nkpt, self.nbands = \ + list(map(int, f.readline().split())) + + self.kpoints = [] + self.kpoints_weights = [] + if self.ispin == 2: + self.eigenvalues = \ + {Spin.up: np.zeros((self.nkpt, self.nbands, 2)), + Spin.down: np.zeros((self.nkpt, self.nbands, 2))} + else: + self.eigenvalues = \ + {Spin.up: np.zeros((self.nkpt, self.nbands, 2))} + + ikpt = -1 + for line in f: + if re.search(r'(\s+[\-+0-9eE.]+){4}', str(line)): + ikpt += 1 + kpt = list(map(float, line.split())) + self.kpoints.append(kpt[:-1]) + self.kpoints_weights.append(kpt[-1]) + for i in range(self.nbands): + sl = list(map(float, f.readline().split())) + if len(sl) == 3: + self.eigenvalues[Spin.up][ikpt, i, 0] = sl[1] + self.eigenvalues[Spin.up][ikpt, i, 1] = sl[2] + elif len(sl) == 5: + self.eigenvalues[Spin.up][ikpt, i, 0] = sl[1] + self.eigenvalues[Spin.up][ikpt, i, 1] = sl[3] + self.eigenvalues[Spin.down][ikpt, i, 0] = sl[2] + self.eigenvalues[Spin.down][ikpt, i, 1] = sl[4] + + @property + def eigenvalue_band_properties(self): + """ + Band properties from the eigenvalues as a tuple, + (band gap, cbm, vbm, is_band_gap_direct). + """ + vbm = -float("inf") + vbm_kpoint = None + cbm = float("inf") + cbm_kpoint = None + for spin, d in self.eigenvalues.items(): + for k, val in enumerate(d): + for (eigenval, occu) in val: + if occu > self.occu_tol and eigenval > vbm: + vbm = eigenval + vbm_kpoint = k + elif occu <= self.occu_tol and eigenval < cbm: + cbm = eigenval + cbm_kpoint = k + return max(cbm - vbm, 0), cbm, vbm, vbm_kpoint == cbm_kpoint + + class Wavederf: """ Object for reading a WAVEDERF file. From 1125dea552733ea9754e228fe16c6bfd32d38b0b Mon Sep 17 00:00:00 2001 From: Mark Turiansky Date: Tue, 8 Oct 2019 19:15:52 -0700 Subject: [PATCH 2/4] Eigenval test files --- test_files/EIGENVAL.gz | Bin 0 -> 24170 bytes test_files/EIGENVAL.ispin2.gz | Bin 0 -> 7665 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test_files/EIGENVAL.gz create mode 100644 test_files/EIGENVAL.ispin2.gz diff --git a/test_files/EIGENVAL.gz b/test_files/EIGENVAL.gz new file mode 100644 index 0000000000000000000000000000000000000000..4a84e4a1d8f50029d1f88a221b00163a58a46f9a GIT binary patch literal 24170 zcmXVXcRZW#_rAUNti6g5s*P16_KcO%3RR=67)4v7)SjhADH5%gh?*@THA}2iTSQ4w zo6^>MxkXlPBf(N4yB zLN`S}Y*kdY4+;LYva}-4Gj2icE?;ijyK^~iZm!hUQ6SvHbgA8$)y{7G&5(1^!#_)@ zGO26~iJdY3{*K1{J1c5CUzX^MDXZ05dL{F(Cl=xhx{OtU!`TR`( ztfzLHtWP=j$~muTaW5k2$85||4(-nD6xz=wf;P)~AGnQrqT9~)lh41UY-uCba&B_3iXI5){YKotHsWVY&nZ!T0DI-#uAs~ zKAsmDYM@)}f65zFv#HRi&kB1RB_~?!@7^+Q?G5TjD9hNSd_Ss}+`GH$WY;LU^Jl5! zGcW0&(Fg8s4my6K1RmJKE!0j9lQxl{Sb=Tom-YYTHBbkC_oPsXWcHX0j;FwSVM>lm zR+$%%U}aaF%t5PuJH)y{M*qcFY2|b6?3>Rkj{~Z(1p&6_9dBtv$Mgs%Vll?~$8?*G zBgb(A?$JB+>-fP~0r*=P0zC_<&7Mr8p2q1*7+JcP9X7-kUx0P6Se37fe*_*2Exf}V znG_UL({WE*0w0x65pGjvf&J>b*rIxC7G1UH8a{*8x%vF}GTmbB`>@4QUQ}B^q_^ly zf;{Sm`1M0pQV~74%sIg|oR-zSP-PQ#eqqCPQrDh>tL~OUZjl^kFvDSs7lMBgAQj=s z_M5QGt23;=n=n1?8T~*4c=|XFP00DJ9~Se9kTdsUkGh{zvBo|pWjA@2vv@%{mmxdS zb<}kd@%l4VmL92i%1J1~VwIvkUTOea6%BNH@bjvwn7Id||pnEvTz@d#1g1`AUu zZ3VwAhxNGjMW)pb=Zr+hC*-(mB*1w(ZTh~LUYpo62K5Mb-cuvrCLc+6z^Yia_Hjz0 zPl{xm&RC*0A4~F~3KX_QqLXqC50q*!VX`Xo^LTys8)Gg0M zy{!3&xyjNCK4#ANI5(^ezs<>5l$Z&3bE=5qh+Kdyg69gm6cb#(?|n#to}aqFH(e*) zH%Oc0O9b$1&cF@a#dF?u9GlTC0ytei{s33NdQoN^cZ+`!T?hVW;~gqn1O+A76flQ` zbnV98SC8A>62+eY*KbN23q$Vtmb8E)cfMjez*@*xN4V-1M)+AF-rF2MD}SVsAgeux<{<_>-w>FQcIuSz zr_)(F#?5fAQxSs9@zj=)Ssqz@M1Eq^0?vq+*tGOpT7-DXVkVHzN&$GDi!wU3)q1ez zaO7t~&K?Q)*P(9Cuct#aYL)b)AmPY0NukN`#of-*0dR#p=Yw#hX^8eRdbX%buC^NS zoNbr%!_9&2WzG{(e|8FL(PNL5BhRjRj~XoM&oTJ0n^=Br2v_|CRNR&m2+~W_5M5__ zry9mVi9)b2_E(H()$(zKeqC~77$EMtzTRLKy+)^>wA%`%o(`TxW7Jf`kiRN_GnLJt z8&8z)Zozhyl3KvW;yM!e9K^0v^rfH;LeA2ANYE_03{$N1`kvdetMkPGfBp?va_jIP zQZHw5Y3&sO#$6ygRPD+5EW0X1MQ&h1{UQv74y-GJeO_oUKLdh8_?_x;HCzmz>uyfI z2-b$Gy9HUBT{T#oru?e5y)M=T182GG?hr`MKU1=JBpaLmt_||+>75&Wz0yB|pC;Bk z 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 Date: Tue, 8 Oct 2019 19:16:04 -0700 Subject: [PATCH 3/4] Eigenval tests --- pymatgen/io/vasp/tests/test_outputs.py | 33 +++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/pymatgen/io/vasp/tests/test_outputs.py b/pymatgen/io/vasp/tests/test_outputs.py index dfd2b545107..ade4907544f 100644 --- a/pymatgen/io/vasp/tests/test_outputs.py +++ b/pymatgen/io/vasp/tests/test_outputs.py @@ -20,7 +20,7 @@ from pymatgen.io.vasp.inputs import Kpoints, Poscar from pymatgen.io.vasp.outputs import Chgcar, Locpot, Oszicar, Outcar, \ Vasprun, Procar, Xdatcar, Dynmat, BSVasprun, UnconvergedVASPWarning, \ - VaspParserError, Wavecar, Waveder, Elfcar + VaspParserError, Wavecar, Waveder, Elfcar, Eigenval from pymatgen import Spin, Orbital, Lattice, Structure from pymatgen.entries.compatibility import MaterialsProjectCompatibility from pymatgen.electronic_structure.core import Magmom @@ -1412,6 +1412,37 @@ def test_get_parchg(self): self.assertFalse(np.all(c.data['total'] > 0.)) +class EigenvalTest(PymatgenTest): + _multiprocess_shared_ = True + + def test_init(self): + eig = Eigenval(self.TEST_FILES_DIR / 'EIGENVAL.gz') + self.assertEqual(eig.ispin, 1) + self.assertEqual(eig.nkpt, len(eig.kpoints)) + self.assertEqual(eig.nkpt, len(eig.kpoints_weights)) + self.assertEqual(eig.nkpt, eig.eigenvalues[Spin.up].shape[0]) + self.assertEqual(eig.nelect, 16) + self.assertEqual(eig.nbands, eig.eigenvalues[Spin.up].shape[1]) + self.assertTrue(np.max(eig.eigenvalues[Spin.up]) > 0) + self.assertTrue(np.min(eig.eigenvalues[Spin.up]) < 0) + + def test_ispin2(self): + eig = Eigenval(self.TEST_FILES_DIR / 'EIGENVAL.ispin2.gz') + self.assertEqual(eig.ispin, 2) + self.assertEqual(eig.nkpt, eig.eigenvalues[Spin.up].shape[0]) + self.assertEqual(eig.nbands, eig.eigenvalues[Spin.up].shape[1]) + self.assertEqual(eig.nkpt, eig.eigenvalues[Spin.down].shape[0]) + self.assertEqual(eig.nbands, eig.eigenvalues[Spin.down].shape[1]) + + def test_eigenvalue_band_properties(self): + eig = Eigenval(self.TEST_FILES_DIR / 'EIGENVAL.gz') + props = eig.eigenvalue_band_properties + self.assertAlmostEqual(props[0], 6.4153, places=4) + self.assertAlmostEqual(props[1], 7.5587, places=4) + self.assertAlmostEqual(props[2], 1.1434, places=4) + self.assertEqual(props[3], False) + + class WavederTest(PymatgenTest): _multiprocess_shared_ = True From eb9428d1de3439ebf195a6832453757bd9885c56 Mon Sep 17 00:00:00 2001 From: Mark Turiansky Date: Tue, 8 Oct 2019 19:24:26 -0700 Subject: [PATCH 4/4] Eigenval docstrings --- pymatgen/io/vasp/outputs.py | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/pymatgen/io/vasp/outputs.py b/pymatgen/io/vasp/outputs.py index f1c5bcc3641..7fada65295b 100644 --- a/pymatgen/io/vasp/outputs.py +++ b/pymatgen/io/vasp/outputs.py @@ -4502,8 +4502,59 @@ def get_parchg(self, poscar, kpoint, band, spin=None, phase=False, class Eigenval: """ Object for reading EIGENVAL file. + + .. attribute:: filename + + string containing input filename + + .. attribute:: occu_tol + + tolerance for determining occupation in band properties + + .. attribute:: ispin + + spin polarization tag (int) + + .. attribute:: nelect + + number of electrons + + .. attribute:: nkpt + + number of kpoints + + .. attribute:: nbands + + number of bands + + .. attribute:: kpoints + + list of kpoints + + .. attribute:: kpoints_weights + + weights of each kpoint in the BZ, should sum to 1. + + .. attribute:: eigenvalues + + Eigenvalues as a dict of {(spin): np.ndarray(shape=(nkpt, nbands, 2))}. + This representation is based on actual ordering in VASP and is meant as + an intermediate representation to be converted into proper objects. The + kpoint index is 0-based (unlike the 1-based indexing in VASP). """ + def __init__(self, filename, occu_tol=1e-8): + """ + Reads input from filename to construct Eigenval object + + Args: + filename (str): filename of EIGENVAL to read in + occu_tol (float): tolerance for determining band gap + + Returns: + a pymatgen.io.vasp.outputs.Eigenval object + """ + self.filename = filename self.occu_tol = occu_tol @@ -4551,6 +4602,7 @@ def eigenvalue_band_properties(self): Band properties from the eigenvalues as a tuple, (band gap, cbm, vbm, is_band_gap_direct). """ + vbm = -float("inf") vbm_kpoint = None cbm = float("inf")