Skip to content

Commit

Permalink
Add deltascf parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
oerc0122 committed Aug 5, 2024
1 parent 9ea1ec2 commit cff5b58
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 6 deletions.
47 changes: 45 additions & 2 deletions castep_outputs/parsers/castep_file_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from ..utilities.constants import SHELLS
from ..utilities.datatypes import (AtomIndex, AtomPropBlock, BandStructure,
BondData, CellInfo, CharTable,
ConstraintsReport, DipoleTable,
ConstraintsReport, DeltaSCFReport, DipoleTable,
ElasticProperties, FinalConfig, GeomTable,
InitialSpin, KPointsList, KPointsSpec,
MDInfo, MemoryEst, MullikenInfo,
Expand Down Expand Up @@ -51,6 +51,7 @@ class Filters(Flag):
BS = auto()
CELL = auto()
CHEM_SHIELDING = auto()
DELTA_SCF = auto()
DIPOLE = auto()
ELASTIC = auto()
ELF = auto()
Expand Down Expand Up @@ -83,7 +84,7 @@ class Filters(Flag):
ELASTIC | ELF | FINAL_CONFIG | FORCE |
MD_SUMMARY | OPTICS | POPN_ANALYSIS |
POSITION | SOLVATION | SPECIES_PROPS | SPIN |
STRESS | TDDFT | THERMODYNAMICS | TSS)
STRESS | TDDFT | THERMODYNAMICS | TSS | DELTA_SCF)

MEDIUM = LOW | PARAMETERS | GEOM_OPT | MD | PHONON

Expand Down Expand Up @@ -1189,6 +1190,18 @@ def parse_castep_file(castep_file_in: TextIO,

curr_run["elastic"].update(_process_elastic_properties(block))

# DeltaSCF

elif block := Block.from_re(line, castep_file,
"Calculating MODOS weights", r"^\s*$"):

if Filters.DELTA_SCF not in to_parse:
continue

logger("Found delta SCF data")

curr_run["delta_scf"] = _process_delta_scf(block)

# --- Extra blocks for testing

# Hugoniot data
Expand Down Expand Up @@ -2326,3 +2339,33 @@ def _process_elastic_properties(block: Block) -> ElasticProperties:
)

return accum


def _process_delta_scf(block: Block) -> DeltaSCFReport:
"""Process MODOS delta SCF block"""
accum: DeltaSCFReport = {"states": []}

for line in block:
if line.startswith("Taking band from"):
accum["file"] = line.split()[-1]
elif "MODOS state" in line:
accum["states"].append({})
elif "nr." in line:
accum["states"][-1]["band"] = int(get_numbers(line)[0])
elif "spin" in line:
accum["states"][-1]["spin"] = int(get_numbers(line)[0])
elif "Population of state" in line:
numbers = get_numbers(line)
band, spin, pop = int(numbers[0]), int(numbers[1]), float(numbers[2])

for state in accum["states"]:
if state["band"] == band and state["spin"] == spin:
state["pop"] = pop

elif "Writing file" in line:
band, spin = map(int, get_numbers(line)[-2:])
for state in accum["states"]:
if state["band"] == band and state["spin"] == spin:
state["file"] = line.split()[-1]

return accum
19 changes: 15 additions & 4 deletions castep_outputs/test/test_castep_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -901,7 +901,8 @@ def test_get_target_stress(self):

def test_delta_scf(self):
test_text = io.StringIO("""
+-------------------INPUT PARAMETERS-------------------+
Calculating MODOS weights
+-------------------INPUT PARAMETERS-------------------+
Taking band from model N2-base.check
MODOS state 1
MODOS band nr. 5
Expand All @@ -911,12 +912,22 @@ def test_delta_scf(self):
MODOS band has spin 1
|DeltaSCF| Population of state: 5 1 1.000000
|DeltaSCF| Population of state: 6 1 0.000000
Writing file N2-modos.modos_state_5_1
Writing file N2-modos.modos_state_6_1
""")
self.skipTest("Not implemented yet")

test_dict = parse_castep_file(test_text)[0]
pprint.pprint(test_dict)
self.assertEqual(test_dict, {})

self.assertEqual(test_dict, {'delta_scf': {'file': 'N2-base.check',
'states': [{'band': 5,
'file': 'N2-modos.modos_state_5_1',
'pop': 1.0,
'spin': 1},
{'band': 6,
'file': 'N2-modos.modos_state_6_1',
'pop': 0.0,
'spin': 1}]}})

def test_get_scf(self):
test_text = io.StringIO("""
Expand Down
12 changes: 12 additions & 0 deletions castep_outputs/utilities/datatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,18 @@ class SCFReport(TypedDict, total=False):
eigenvalue: List[SCFSection]


class DeltaState(TypedDict):
band: int
file: str
pop: float
spin: int


class DeltaSCFReport(TypedDict, total=False):
file: str
states: List[DeltaState]


# Bonds

class BondInfo(TypedDict):
Expand Down

0 comments on commit cff5b58

Please sign in to comment.