Skip to content

Commit

Permalink
Merge adf6e05 into 4145ffd
Browse files Browse the repository at this point in the history
  • Loading branch information
ezpzbz committed Sep 10, 2021
2 parents 4145ffd + adf6e05 commit c92e3c9
Show file tree
Hide file tree
Showing 4 changed files with 3,616 additions and 4 deletions.
11 changes: 7 additions & 4 deletions pymatgen/io/lobster/outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -1303,21 +1303,24 @@ def __init__(self, filename: str = "bandOverlaps.lobster"):
with zopen(filename, "rt") as f:
contents = f.read().split("\n")

self._read(contents)
spin_numbers = [0, 1] if contents[0].split()[-1] == "0" else [1, 2]

def _read(self, contents: list):
self._read(contents, spin_numbers)

def _read(self, contents: list, spin_numbers: list):
"""
will read in all contents of the file
Args:
contents: list of strings
spin_numbers: list of spin numbers depending on `Lobster` version.
"""
self.bandoverlapsdict = {} # type: Dict
self.max_deviation = [] # type: List
# This has to be done like this because there can be different numbers of problematic k-points per spin
for line in contents:
if "Overlap Matrix (abs) of the orthonormalized projected bands for spin 0" in line:
if f"Overlap Matrix (abs) of the orthonormalized projected bands for spin {spin_numbers[0]}" in line:
spin = Spin.up
elif "Overlap Matrix (abs) of the orthonormalized projected bands for spin 1" in line:
elif f"Overlap Matrix (abs) of the orthonormalized projected bands for spin {spin_numbers[1]}" in line:
spin = Spin.down
elif "k-point" in line:
kpoint = line.split(" ")
Expand Down
105 changes: 105 additions & 0 deletions pymatgen/io/lobster/tests/test_lobster.py
Original file line number Diff line number Diff line change
Expand Up @@ -2244,36 +2244,65 @@ def setUp(self):
self.bandoverlaps1 = Bandoverlaps(os.path.join(PymatgenTest.TEST_FILES_DIR, "cohp", "bandOverlaps.lobster.1"))
self.bandoverlaps2 = Bandoverlaps(os.path.join(PymatgenTest.TEST_FILES_DIR, "cohp", "bandOverlaps.lobster.2"))

self.bandoverlaps1_new = Bandoverlaps(
os.path.join(PymatgenTest.TEST_FILES_DIR, "cohp", "bandOverlaps.lobster.new.1")
)
self.bandoverlaps2_new = Bandoverlaps(
os.path.join(PymatgenTest.TEST_FILES_DIR, "cohp", "bandOverlaps.lobster.new.2")
)

def test_attributes(self):
# bandoverlapsdict
self.assertAlmostEqual(
self.bandoverlaps1.bandoverlapsdict[Spin.up]["0.5 0 0"]["maxDeviation"],
0.000278953,
)
self.assertAlmostEqual(
self.bandoverlaps1_new.bandoverlapsdict[Spin.up]["0 0 0"]["maxDeviation"],
0.0640933,
)
self.assertAlmostEqual(
self.bandoverlaps1.bandoverlapsdict[Spin.up]["0.5 0 0"]["matrix"][-1][-1],
0.0188058,
)
self.assertAlmostEqual(
self.bandoverlaps1_new.bandoverlapsdict[Spin.up]["0 0 0"]["matrix"][-1][-1],
1.0,
)
self.assertAlmostEqual(self.bandoverlaps1.bandoverlapsdict[Spin.up]["0.5 0 0"]["matrix"][0][0], 1)
self.assertAlmostEqual(self.bandoverlaps1_new.bandoverlapsdict[Spin.up]["0 0 0"]["matrix"][0][0], 0.995849)

self.assertAlmostEqual(
self.bandoverlaps1.bandoverlapsdict[Spin.down]["0.0261194 0.0261194 0.473881"]["maxDeviation"],
4.31567e-05,
)
self.assertAlmostEqual(
self.bandoverlaps1_new.bandoverlapsdict[Spin.down]["0 0 0"]["maxDeviation"],
0.064369,
)
self.assertAlmostEqual(
self.bandoverlaps1.bandoverlapsdict[Spin.down]["0.0261194 0.0261194 0.473881"]["matrix"][0][-1],
4.0066e-07,
)
self.assertAlmostEqual(
self.bandoverlaps1_new.bandoverlapsdict[Spin.down]["0 0 0"]["matrix"][0][-1],
1.37447e-09,
)

# maxDeviation
self.assertAlmostEqual(self.bandoverlaps1.max_deviation[0], 0.000278953)
self.assertAlmostEqual(self.bandoverlaps1_new.max_deviation[0], 0.39824)
self.assertAlmostEqual(self.bandoverlaps1.max_deviation[-1], 4.31567e-05)
self.assertAlmostEqual(self.bandoverlaps1_new.max_deviation[-1], 0.324898)

self.assertAlmostEqual(self.bandoverlaps2.max_deviation[0], 0.000473319)
self.assertAlmostEqual(self.bandoverlaps2_new.max_deviation[0], 0.403249)
self.assertAlmostEqual(self.bandoverlaps2.max_deviation[-1], 1.48451e-05)
self.assertAlmostEqual(self.bandoverlaps2_new.max_deviation[-1], 0.45154)

def test_has_good_quality(self):
self.assertFalse(self.bandoverlaps1.has_good_quality_maxDeviation(limit_maxDeviation=0.1))
self.assertFalse(self.bandoverlaps1_new.has_good_quality_maxDeviation(limit_maxDeviation=0.1))
self.assertFalse(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=9,
Expand All @@ -2282,6 +2311,14 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=9,
number_occ_bands_spin_down=5,
limit_deviation=0.1,
spin_polarized=True,
)
)
self.assertTrue(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=3,
Expand All @@ -2290,6 +2327,14 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertTrue(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=3,
number_occ_bands_spin_down=0,
limit_deviation=0.01,
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1,
Expand All @@ -2298,6 +2343,14 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1,
number_occ_bands_spin_down=1,
limit_deviation=0.000001,
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1,
Expand All @@ -2306,6 +2359,14 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1,
number_occ_bands_spin_down=0,
limit_deviation=0.000001,
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=0,
Expand All @@ -2314,6 +2375,14 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=0,
number_occ_bands_spin_down=1,
limit_deviation=0.000001,
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=4,
Expand All @@ -2322,29 +2391,65 @@ def test_has_good_quality(self):
spin_polarized=True,
)
)
self.assertFalse(
self.bandoverlaps1_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=4,
number_occ_bands_spin_down=4,
limit_deviation=0.001,
spin_polarized=True,
)
)

self.assertTrue(self.bandoverlaps1.has_good_quality_maxDeviation(limit_maxDeviation=100))
self.assertTrue(self.bandoverlaps1_new.has_good_quality_maxDeviation(limit_maxDeviation=100))
self.assertTrue(self.bandoverlaps2.has_good_quality_maxDeviation())
self.assertFalse(self.bandoverlaps2_new.has_good_quality_maxDeviation())
self.assertFalse(self.bandoverlaps2.has_good_quality_maxDeviation(limit_maxDeviation=0.0000001))
self.assertFalse(self.bandoverlaps2_new.has_good_quality_maxDeviation(limit_maxDeviation=0.0000001))
self.assertFalse(
self.bandoverlaps2.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=10, limit_deviation=0.0000001
)
)
self.assertFalse(
self.bandoverlaps2_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=10, limit_deviation=0.0000001
)
)
self.assertTrue(
self.bandoverlaps2.has_good_quality_check_occupied_bands(number_occ_bands_spin_up=1, limit_deviation=0.1)
)
self.assertTrue(
self.bandoverlaps2_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1, limit_deviation=0.1
)
)

self.assertFalse(
self.bandoverlaps2.has_good_quality_check_occupied_bands(number_occ_bands_spin_up=1, limit_deviation=1e-8)
)
self.assertFalse(
self.bandoverlaps2_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1, limit_deviation=1e-8
)
)
self.assertTrue(
self.bandoverlaps2.has_good_quality_check_occupied_bands(number_occ_bands_spin_up=10, limit_deviation=0.1)
)
self.assertTrue(
self.bandoverlaps2_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=2, limit_deviation=0.1
)
)

self.assertTrue(
self.bandoverlaps2.has_good_quality_check_occupied_bands(number_occ_bands_spin_up=1, limit_deviation=0.1)
)
self.assertTrue(
self.bandoverlaps2_new.has_good_quality_check_occupied_bands(
number_occ_bands_spin_up=1, limit_deviation=0.1
)
)


class GrosspopTest(unittest.TestCase):
Expand Down

0 comments on commit c92e3c9

Please sign in to comment.