Source code for ase2sprkkr.potentials.potential_definitions

"""
This file contains the classes for definitions of Potentials:
the list of sections and their allowed (or standard) options
and their value formats. InputParameterss and potentials have a simlilar
structure, so they share common functionalities from
sprkkr.common.configuration_definitions
"""

import functools
import pyparsing as pp
from ..common.grammar import line_end, separator as separator_grammar
from ..common.grammar_types import separator, pot_mixed
from ..common.options import CustomOption
from ..sprkkr.configuration import \
         ConfigurationValueDefinition, ConfigurationSectionDefinition, ConfigurationFileDefinition, \
         CustomConfigurationValue
from .custom_potential_section import CustomPotentialSection, CustomPotentialSectionDefinition, SectionString
from .potentials import Potential
from .potential_sections import PotentialSection, ASEArraySection
from ..common.decorators import cached_class_property, cache
from ..common.decorators import add_to_signature

[docs]class PotValueDefinition(ConfigurationValueDefinition): """ Definition of a configuration option in a potential """ @cached_class_property def grammar_of_delimiter(): return pp.Empty().setName(' ') prefix = '' name_value_delimiter = '\t'
[docs] def __init__(self, *args, required=None, **kwargs): super().__init__(*args, required=required, **kwargs)
type_of_dangerous = pot_mixed
[docs]class Separator(PotValueDefinition): """ A special (hidden) value, that appears in a potential header section. The separator is a line of stars """ _counter = 0
[docs] def __init__(self, name = None): if not name: Separator._counter += 1 name = f'_Separator_{Separator._counter}' super().__init__(name, separator, is_hidden=True, name_in_grammar=False)
[docs]class PotSectionDefinition(ConfigurationSectionDefinition): """ This class describes the format of one value of a standard potential section """ force_order = True """ The order of items in potential file is fixed """ value_name_format = '<12' child_class = PotValueDefinition """ standard child class """ custom_class = staticmethod(CustomConfigurationValue.factory(PotValueDefinition, pot_mixed)) """ Adding a custom values is allowed """ delimiter = '\n' """ options are delimited by newline in ouptut. """
[docs] @staticmethod def grammar_of_delimiter(): return line_end
[docs] def depends_on(self): """ The order of processing of sections during reading can be different than the order during a write. So, if the function should not be processed before given named sections, name then. Return ------ prerequisites: [ str, str, ... ] """ return []
result_class = PotentialSection
[docs] def __init__(self, *args, mandatory:bool=True, **kwargs): """ For the documentation of the other parameters, see :meth:`ase2sprkkr.common.SectionDefinition` Parameters ---------- mandatory Is the section mandatory? I.e. the potential file is required to contain this sections. """ self.mandatory = mandatory super().__init__(*args, **kwargs)
[docs]class ASEArraySectionDefinition(PotSectionDefinition): """ A definition of a section, that contains an ASE datas (Atoms.setArray) """
[docs] @add_to_signature(PotSectionDefinition.__init__) def __init__(self, *args, array_name, **kwargs): """ For the documentation of the other parameters, see :meth:`ase2sprkkr.potential_definitions.PotSectionDefinition` and its predecessor :meth:`ase2sprkkr.common.SectionDefinition` Parameters ---------- array_name: str The name of the ASE array that contains the section's data """ super().__init__(*args, **kwargs) self.array_name = array_name
[docs] def depends_on(self): """ Array size is required """ return [ 'SITES' ]
result_class = ASEArraySection
[docs]class PotentialDefinition(ConfigurationFileDefinition): """ This class describes the format of a potential file """ child_class = PotSectionDefinition """ Definition of the standard child class: """ result_class = Potential """ The parsing of a potential file results in an instance of Potential. """ configuration_type_name = 'POTENTIAL FILE' """ Name of the container type in the runtime documentation """ force_order = True """ The order of items in potential file is fixed """ delimiter="*"*79 + "\n" """ Sections delimiter """ @cached_class_property def grammar_of_delimiter(): """ Grammar of the sections delimiter """ return SectionString.grammar_of_delimiter() custom_class = CustomPotentialSection """ Unknown sections will be of this type """
[docs] def _generic_info(self): return f"Definition of the format of SPRKKR potential file"
[docs] @classmethod @cache def custom_value_grammar(cls): """ Unknown sections are parsed by this grammar """ return SectionString._grammar
custom_name_characters = ConfigurationFileDefinition.custom_name_characters + ' ' """ There can be space in a potential-section name """