Source code for ase2sprkkr.input_parameters.input_parameters_definitions
"""
This file contains the classes for definitions of InputParameterss:
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 pyparsing as pp
from ..common.container_definitions import dict_from_parsed
from ..sprkkr.configuration import \
ConfigurationValueDefinition, ConfigurationSectionDefinition, ConfigurationFileDefinition, \
CustomConfigurationValue, CustomConfigurationSection
from ..common.grammar_types import mixed, flag
from ..common.grammar import generate_grammar, delimitedList
from ..common.decorators import cached_class_property, cache
from .input_parameters import InputParameters, InputSection
with generate_grammar():
section_line_ends = pp.ZeroOrMore(pp.ZeroOrMore(pp.LineEnd().setWhitespaceChars('')) + pp.White(' \t'))
[docs]
class InputValueDefinition(ConfigurationValueDefinition):
""" This class describes the format of one value of
a task configuration """
@cached_class_property
def grammar_of_delimiter():
return pp.Suppress("=").setName('=')
prefix = "\t"
name_value_delimiter = '='
type_from_type_map = { bool : flag }
type_of_dangerous = mixed
[docs]
class InputSectionDefinition(ConfigurationSectionDefinition):
""" This class describes the format of one
value of a task section """
child_class = InputValueDefinition
""" standard child class """
result_class = InputSection
""" The standard class for InputParameters section """
custom_class = staticmethod(CustomConfigurationValue.factory(InputValueDefinition, mixed))
""" Factory for custom values in the input sections. """
delimiter = '\n'
""" options are delimited by newline in ouptut. """
@cached_class_property
def grammar_of_delimiter():
out = (pp.Optional(section_line_ends) + pp.WordStart()).suppress()
return out
do_not_skip_whitespaces_before_name = True
[docs]
class InputParametersDefinition(ConfigurationFileDefinition):
""" This class describes the format of a task file. """
save_hook = None
""" Input parameters can have a save_hook defined, which is executed before saving the
parameters. The arguments of the hook are ``filename, atoms, self``. """
child_class = InputSectionDefinition
""" Sections of the :class:`InputParameters` are defined by :class:`InputSectionDefinition` """
result_class = InputParameters
""" The parsing of a potential file results in an instance of :class:`InputParameters` """
custom_class = staticmethod(CustomConfigurationSection.factory(InputSectionDefinition))
""" The class factory for custom sections in the container """
configuration_type_name = 'INPUT PARAMETERS'
""" Name of the container type in the runtime documentation """
delimiter = "\n"
""" Sections are delimited by newline in the output """
@cached_class_property
def grammar_of_delimiter():
def ws(x):
return x.setWhitespaceChars('')
out = (pp.Optional(section_line_ends) + pp.OneOrMore(ws(pp.LineEnd())) + pp.FollowedBy(ws(pp.Regex(r'[^\s]'))) ).suppress()
out.setName('<newline><printable>')
return out
[docs]
@classmethod
@cache
def custom_value_grammar(cls):
value = cls.child_class.custom_member_grammar()
delim = cls.child_class.grammar_of_delimiter()
return delimitedList(value, delim).\
setParseAction(lambda x: dict_from_parsed(x.asList()))
[docs]
def __init__(self, name, members=None,
executable='kkrscf', mpi=True, result_reader=None,
**kwargs):
"""
Parameters
---------
others:
For the meaning of the others parameters please see :class:`ConfigurationRootDefinition`
executable: str
Executable to run
mpi: bool
Whether to run MPI version of the executable
result_reader: common.process_output_reader.ProcessOutputReader
Class, that runs the process and read the results. Default NONE
means, that the class is determined from the TASK name
(see InputParameters.result_reader)
"""
self.executable = executable
self.mpi = mpi
self.result_reader = result_reader
super().__init__(name, members, **kwargs)
# if not 'TASK' in self:
# breakpoint()
# self['TASK'] = InputSectionDefinition('TASK', [ InputValueDefinition('TASK', DefKeyword(self.name), name_in_grammar=False) ] )
# elif not 'TASK' in self['TASK']:
# self['TASK']['TASK'] = InputValueDefinition(DefKeyword(self.name), name_in_grammar=False)