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., 'JRWS': 721, 'RWS': 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