Source code for ase2sprkkr.input_parameters.definitions.sections

""" Definitions of sections to be used in definitions of input parameters
(input files for SPR-KKR tasks) """

from ...common.grammar_types import SetOf, DefKeyword, flag, energy, Integer, Array, Keyword

from ..input_parameters_definitions import \
      InputSectionDefinition as Section, \
      InputValueDefinition as V
from ...sprkkr.sprkkr_grammar_types import Site, AtomicType
from types import MethodType


[docs] def CONTROL(ADSI): """ Create the definition of the CONTROL section of the task input file. Parameters ---------- ADSI: string the default value for the ADSI parameter of the resulting section Return ------ CONTROL: InputSectionDefinition """ return Section('CONTROL',[ V('DATASET', str, 'case', is_required = True, result_is_visible=True, info="The custom field for the description of the problem - the output files will have called 'DATASET.<ext>'."), V('ADSI', DefKeyword(ADSI), is_required = True, info="Type of the computation."), V('POTFIL', str, is_required='save', info="The potential file (see SPRKKR documentation for its format). It isn't necessary to set it, it will be set by the calculator."), V('KRWS', Integer(min=0, max=1), 1, info='If it is 0, RWS is taken from the potential file and scaled. If 1, RWS is calculated by scaling the muffin-tin radii by a common scaling factor. (This setting is forced in the case of FULLPOT.)'), V('KRMT', { '0' : 'RMT is taken from the potential file', '1' : 'RMT = min( x*RWS )', '2' : 'RMT = min( d_ij / 2 )', '3' : 'RMT from atomic charge density (=> KRWS=1)', '4' : 'RMT from atomic Hartree potential (=> KRWS=1)', '5' : 'RMT from total atomic potential (=> KRWS=1)', '6' : 'take average of 3 and 4 (=> KRWS=1)', }, default_value=None, info='It controls how the muffin-tin radii are calculated.',is_required=False), V('PRINT', Integer(min=0, max=5), default_value=0, info="Verbosity of the output (0-5). Do not affect the results in any way, just the amount of the printed output."), V('NONMAG', False, info="Set this flag, if it is known that the system considered is non-magnetic. This leads to a higher symmetry and a faster calculation. "), V('NOHFF', False, info="Set this flag, if you want to include hyper fine field calculation. This leads to a slower calculation. "), V('NOSYM', False, info="Set this flag, if you want to supress all symetry consideration. This leads to a slower calculation. "), ])
[docs] class TauSection(Section): """ TAU Section of input parameters. """
[docs] def set_from_atoms(self, section, atoms, io_data): """ NKTAB[xD] values has to be set according to the type of the problem.""" for i in (section.NKTAB, section.NKTAB2D, section.NKTAB3D, section.KKRMODE): i.clear_result() if atoms is not None: pbc = atoms.pbc.sum() # setting the dangerous value to the non-used options # prevents them to use its default values and so to be # writed to the output file if pbc == 3: section.NKTAB2D.result = section.NKTAB2D._create_dangerous_value(None) section.NKTAB3D.result = section.NKTAB3D._create_dangerous_value(None) else: section.NKTAB2D.result = section.NKTAB2D() section.NKTAB3D.result = section.NKTAB3D() section.NKTAB.result = section.NKTAB._create_dangerous_value(None) if not section.KKRMODE(): section.KKRMODE.result = 'TB-KKR'
[docs] def _nktab_value(option): return option._container.NKTAB()
TAU = TauSection('TAU',[ V('BZINT', Keyword({'POINTS' : 'special points method', 'WEYL' : 'Weyl method', 'CLUSTER': 'Cluster method'}, description= """ The Weyl method (BZINT=WEYL) is a point sampling method using more or less ran- dom points. The number of k-points used for the integration varies quadratically be- tween 0.0 and ImE according to the imaginary part of the energy. The special point method (BZINT=POINTS) uses a regular k-point grid with NKTAB points. It is the standard method and gives a good compromise concerning accuracy and efficiency. For BZINT=POINTS the parameter NKTAB will be adjusted to allow a regular mesh. """), is_required=False, default_value = lambda c: None if c._container.CLUSTER() or c._container.MOL() else 'POINTS', info='The mode of BZ-integration used for calculation of the scattering ' ' path operator τ'), V('NKTAB', 250, info='Number of points for the special points method', is_optional=True, description='For 2D problem, it serves only as default value for NKTABxD.'), V('NKTAB2D', int, _nktab_value, info='Number of points for the special points method for 2D region of 2D problem', is_optional=True, description='If it is not specified, NKTAB is used.'), V('NKTAB3D', int, _nktab_value, info='Number of points for the special points method for 3D region of 2D problem', is_optional=True, description='If it is not specified, NKTAB is used'), V('NKMIN', 300, info='Minimal number of k-points used for Weyl integration', write_condition= lambda o: o._container.BZINT() == 'WEYL'), V('NKMAX', 500, info='Maximal number of k-points used for Weyl integration', write_condition= lambda o: o._container.BZINT() == 'WEYL'), # expert V('CLUSTER', flag, expert=False, info="""Do cluster type calculation.""", description= "Cluster type calculation calculate τ by inverting the real space KKR matrix. " "Specify cluster center using IQCNTR or ITCNTR and its size using NSHLCLU or CLURAD." ), V('NSHLCLU', int, is_expert=True, is_optional=True, info="Number of atomic shells around the central atom of a cluster"), V('CLURAD', float, is_expert=True, is_optional=True, info="Radius of the cluster in multiples of ALAT."), V('IQCNTR', Site.I, is_expert=True, is_optional=True, info="The center of the cluster is set at the site position with number IQCNTR of the specified basis."), V('ITCNTR', AtomicType.I, is_expert=True, is_optional=True, info="The center of the cluster is set at one of the site positions that is occupied by the atomic type ITCNTR."), V('NLOUT', expert=3, info="The calculated τ -matrix is printed up to lmax=NLOUT."), V('MOL', expert=False, info="Cluster type calculation but for a molecular system. The system is specified as for CLUSTER."), V('KKRMODE', Keyword("STANDARD-KKR", "TB-KKR", "LAYER-KKR"), is_optional=True) ]) """The definition of the TAU section of the task input file """
[docs] def ENERGY( emin = (-0.2, "The real part of the lowest E-value", None), emax = None, add = [], defaults = {} ): """The definition of the ENERGY section of the task input file """ vals = [ V('GRID', SetOf(int), defaults.get('GRID', [5]), is_required=True, info='Type of the grid for the energy-mesh', description= """ 0 only real energies -- Gauss integration mesh 1 only real energies -- equidistant path 2 rectangular complex path 3 straight complex path parallel to real axis 4 rectangular complex grid, return to real axis on log scale 5 arc in the complex plain 6 standard X-ray mesh from E_Fermi to 3.5 Ry 7 X-ray mesh 8 arc in the complex plane (logarithim) 9 arc in the complex plane (Akai's scheme) 10 ellipse in the complex plain 11 semi circle (5) plus straight line (3)""" ), V('NE', SetOf(int), defaults.get('NE', [32]), is_required=True, info='Number of points in energy-mesh'), V('ImE', energy, defaults.get('ImE', 0.0)), ] if emin: vals += [ V('EMIN', float, lambda o: None if o._container.EMINEV() is not None else emin[0], info=emin[1], is_optional=lambda o:o._container.EMINEV() is not None), V('EMINEV', float, emin[2], info='EMIN, given in eV with respect to the Fermi level', is_optional=True), ] if emax == 'emin': vals += [ V('EMAX', float, lambda o: o._container.EMIN(), info='The same value as EMIN', is_hidden=True, is_optional=lambda o: o._container.EMAXEV() is not None), V('EMAXEV', float, lambda o: o._container.EMINEV(), info='The same value as EMAXEV', is_hidden=True, is_optional=True), ] elif emax: vals += [ V('EMAX', float, lambda o: None if o._container.EMAXEV() is not None else emax[0], info=emax[1], is_optional=lambda o:o._container.EMAXEV() is not None), V('EMAXEV', float, emax[2], info='EMAX in eV with respect to the Fermi level', is_optional=True), ] vals += add return Section('ENERGY', vals)
[docs] def xc(*args, **kwargs): xc = V(*args, **kwargs) xc_info = { 'VWN' : ( 'LDA', 'LDA_C_VWN'), # TODO: which one? 'MJW' : ( 'LDA', '-'), # NOT in LibXC ? 'VBH' :( 'LDA', 'LDA_C_VBH'), 'PBE' :( 'GGA', 'GGA_X_PBE'), # TODO: which one 'PW92' : ('GGA', 'GGA_X_PW91'), 'EV-GGA':('GGA', 'GGA_X_EV93'), 'BJ' :('metaGGA', 'MGGA_X_BJ06'), # TODO: one of the two is wrong.... 'MBJ' :('metaGGA', 'MGGA_X_BJ06'), } def enrich(xc): def libxc_name(self): """ Return libxc name of the potential """ return xc_info.get(self(), (None, None))[1] def jacobs_ladder(self): """ Return NOMAD xc classification """ return xc_info.get(self(), (None, None))[0] xc.libxc_name = MethodType(libxc_name, xc) xc.jacobs_ladder = MethodType(jacobs_ladder, xc) xc.xc_info = xc_info xc.enrich = enrich for k,v in xc.type.choices.items(): info = xc_info[k] xc.type.choices[k] = v + f" (type: {info[0]}, libxc equivalent: {info[1] or '-'})" return xc
SCF = Section('SCF', [ V('NITER', 200, info='Maximal number of iterations of the SCF cycle'), V('MIX', 0.2, info='Mixing parameter'), V('MIXOP', float, is_required=False), xc('VXC', DefKeyword({ 'VWN' : 'Vosko, Wilk, Nusair', 'MJW' : 'Janak, Williams, Moruzzigit g', 'VBH' : 'von Barth, Hedin', 'PBE' : 'Perdew, Burke, Ernzendorfer GGA', 'PW92' : 'Perdew Wang', 'EV-GGA' : 'Engel and Vosko GGA', 'BJ' : 'Becke-Johnson', 'MBJ' : 'modified Becke-Johnson' }), info='parametrisation of the exchange-correlation potential'), V('ALG', DefKeyword({ 'BROYDEN2': 'Broyden’s second method', 'TCHEBY': 'Tchebychev' }), info='Mixing algorithm'), V('EFGUESS', float, is_required=False, info='Skip the Fermi energy search in the beginning.'), V('TOL', 0.00001, info='Tolerance threshold for the mixing algorithm'), V('ISTBRY', 1, info='Start Broyden after ISTBRY iterations'), V('FULLPOT', False, info='Non-spherical callculation (full-potential) instead of ASA'), V('ITDEPT', 40, info='Iteration depth for Broyden algorithm (length of used history)'), V('QION', SetOf(float), is_required=False, info='Guess for the ionic charges Qt for atomic types'), V('QIONSCL', float, is_required=False, info='Guess for the ionic charges Qt for atomic types'), V('MSPIN', SetOf(float), is_required=False, info='Guess for the magnetic moment μ_{spin,t} for atomic types'), V('USEVMATT', False, info='Set up the starting potential using the original Mattheiss' 'construction for the potential V instead of the charge density') ]) """The definition of the SCF section of the task input file """ STRCONST = Section('STRCONST', [ V('ETA', float, is_optional=True, info='Ewald parameter'), V('RMAX', float, is_optional=True, info='Convergency radius in real space'), V('GMAX', float, is_optional=True, info='Convergency radius in reciprocal space'), ], is_expert=True, is_optional=True, info= "The calculation of the ~k-dependent KKR structure constant matrix G(~k, E) is controlled by " "three convergence parameters. ETA determines the relative weight of the real and reciprocal " "space lattice sums, that are determined by the convergence radii RMAX and GMAX, respectively. " "These convergence parameters have to be optimised anew if the lattice structure, the " "lattice parameter or the energy or ~k-range used is changed. This is done by the program if " "no values are applied via the input file. In some cases, in particular if one works at high " "energies, it might be necessery to set the convergence by hand. For this purpose one can start " "from the values set by kkrgen or kkrscf (see the output file)." ) """The definition of the STRCONST section of the task input file """ SITES = Section('SITES', [ V('NL', [3], info='Angula momentum cutoff (the first discarded l-space)', description= "The KKR-method is a minimum basis set method. This means that the angular-momentum " "expansion can be chosen according to the atomic properties of the atomic types. For transition " "metals it is therefore normally sufficient to have a maximum l-value of 2 (NL = 3). " "For systems with many atoms per unit cell it is in principle possible to set the l-expansion " "according to the atom types on the lattice sites. For US having the NaCl-structure one could " "choose NL = 4 for the U-site and NL = 2 for the S-site. At the moment this possibility, that " "would save storage and computer time, is not supported by all subroutines. For this reason " "a common l-expansion cutoff is used, that is fixed by the highest that occurs. For US " "this implies that NL = 4 is used for all sites.") ]) """The definition of the SITES section of the task input file """ CPA = Section('CPA', [ V('NITER', 20, info="Maximum number of CPA iterations"), V('TOL', 0.0001, info="Threshold for stopping CPA-cycle"), ], is_expert=True, is_optional=True, info="""For a system with substitutional disorder, the CPA is used. The listed variables control the CPA cycle """, ) """CPA section definition""" MODE = Section('MODE', [ V('MODE', Keyword({ 'NREL' : "work in the nonrelativistic mode", 'SREL' : "work in the scalar-relativistic mode", 'SP-SREL' : "work in the spin-polarized scalar-relativistic mode"}, aliases= {'FREL' : None } ), None, is_required=False, name_in_grammar=False, info='Using this option you can switch on the spin polarization and relativistic mode. If it''s not set (or set to ''FREL''), the ''full'' relativity mode is used.'), V('LLOYD', False, info='Use LLoyd formula for scattering operator. It can improve the accuracy of the Fermi energy.'), V('MDIR', SetOf(float, length=3), is_required=False, info="Common magnetisation direction vector with x, y and z in Cartesian coordinates. The normalisation is arbitrary.", is_repeated='DEFAULTDICT', is_always_added=False ), V('MALF',float , is_required=False, info="the (first) angle characterizing the orientation of the magnetic moment direction n.", description='If it is not set, angle of MDIR is used'), V('MBET',float , is_required=False, info="the (second) angle characterizing the orientation of the magnetic moment direction n.", description='If it is not set, angle of MDIR is used'), V('MGAM',float , is_required=False, info="the (third) angle characterizing the orientation of the magnetic moment direction n."), V('C', 1.0, info='Scale the speed of light for a given atom type.', is_repeated='DEFAULTDICT', is_required=False, is_always_added=False), V('SOC', 1.0, info='Scale the strength of the spin-orbit coupling for atom type.', is_repeated='DEFAULTDICT', is_required=False, is_always_added=False), ], is_expert=True, is_optional=True, info= "This section contains options that describe, how to consider relativity and/or spin. If the MODE is not specified otherwise the programs of the SPRKKR-package " "assume that a magnetic system should be treated in a fully relativistic way. By setting the parameter SP-SREL a slightly faster scalar relativistic calculation " "can be done instead for a magnetic system.", ) """MODE Section definition""" SPEC=Section('SPEC',[ V('FEGFINAL', flag, is_required=False) ], is_expert=True, is_optional=True, info='Sets the final state as a free electron gas final state. By default it is TRLEED final state which is time reverse low energy electron diffraction final state.' )
[docs] def TASK(task, add = []): """ Create the definition of the CONTROL section of the task input file. Parameters ---------- TASK: string the default value for the TASK parameter of the resulting section Return ------ TASK: InputSectionDefinition """ if isinstance(task, str): task = DefKeyword(task) return Section('TASK', [ V('TASK', task, name_in_grammar=False) ] + add)
__all__ = [ 'CONTROL', 'TAU', 'ENERGY', 'SCF', 'SITES', 'TASK', 'STRCONST', 'CPA', 'MODE' ]