Source code for ase2sprkkr.potentials.definitions.sections.mesh_information
from ...potential_definitions import PotSectionDefinition, PotValueDefinition
from ...potential_sections import UniqueListSection
from ....common.grammar_types import DefKeyword, Table, Array
from ....sprkkr.radial_meshes import ExponentialMesh
from ....sprkkr.io_data import ReadIoData, WriteIoData
from ....sprkkr.sprkkr_atoms import SPRKKRAtoms
[docs]
class MeshInformationSection(UniqueListSection):
_value_name = "meshes"
_value_class = ExponentialMesh
[docs]
def _set_from_atoms(self, atoms: SPRKKRAtoms, write_io_data: WriteIoData):
ul = getattr(write_io_data, self._value_name)
self["DATA"].set([i.to_tuple() for i in ul.iter_unique()])
fullpot = [i.fullpot_tuple() for i in ul.iter_unique()]
found = None
for i in fullpot:
if i is None:
if found is True:
break
found = False
else:
if found is False:
break
found = True
else:
if found:
self["FULLPOT"].set(fullpot)
return
raise Exception("FULLPOT mesh information missing for some meshes")
[docs]
def _update_atoms(self, atoms: SPRKKRAtoms, read_io_data: ReadIoData):
super()._update_atoms(atoms, read_io_data)
if self.FULLPOT() is not None:
for mesh, full in zip(read_io_data[self._value_name], self["FULLPOT"]()):
mesh.set_fullpot(full)
[docs]
class MeshInformationSectionDefinition(PotSectionDefinition):
[docs]
def __init__(self, name="MESH INFORMATION", **kwargs):
V = PotValueDefinition
members = [
V("MESH-TYPE", DefKeyword("EXPONENTIAL")),
V(
"DATA",
Table(
{"R(1)": 1e-6, "DX": 2e-2, "JRMT": 0, "RMT": 0.0, "JRWS": 721, "RWS": 0.0},
numbering="IM",
numbering_format=">5",
format=">16", # header_length=80
),
),
V(
"FULLPOT",
Table(
{"JRNS1": int, "JRCRI": int, "NPAN": int, "JRCUT": Array(int)},
numbering="IM",
numbering_format=">5",
format=">16",
),
is_optional=True,
),
]
super().__init__(name, members, has_hidden_members=True)
result_class = MeshInformationSection
section = MeshInformationSectionDefinition