Allow the use of external potential files.

A new keyword in TMatrixParameters allows to use an external
file for the potential energy of atoms. It should be used like
this:
    calc.tmatrix_parameters.potential = 'spkkr'
    calc.tmatrix_parameters.potential_file = 'Cu.pot' # the name does not matter
This commit is contained in:
Sylvain Tricot 2020-03-26 18:26:27 +01:00
parent 15b344cf5f
commit 927ac8a8a3
3 changed files with 130 additions and 108 deletions

View File

@ -1,5 +1,5 @@
# coding: utf-8 # coding: utf-8
# vim: set et sw=4 ts=4 sts=4 nu ai cc=+0 fdm=indent mouse=a: # vim: set et sw=4 ts=4 sts=4 nu ai cc=+0 fdm=indent mouse=a tw=80:
""" """
Module calculator Module calculator
================= =================
@ -47,7 +47,8 @@ import numpy as np
from msspec import iodata from msspec import iodata
from msspec.data import electron_be from msspec.data import electron_be
from msspec.config import Config from msspec.config import Config
from msspec.misc import (UREG, LOGGER, get_call_info, get_level_from_electron_configuration, from msspec.misc import (UREG, LOGGER, get_call_info,
get_level_from_electron_configuration,
XRaySource, set_log_output, log_process_output) XRaySource, set_log_output, log_process_output)
from msspec.utils import get_atom_index from msspec.utils import get_atom_index
@ -62,9 +63,9 @@ from msspec.calcio import PhagenIO, SpecIO
from msspec.phagen.fortran.libphagen import main as do_phagen from msspec.phagen.fortran.libphagen import main as do_phagen
from msspec.spec.fortran import phd_se_noso_nosp_nosym, phd_mi_noso_nosp_nosym from msspec.spec.fortran import _phd_se_noso_nosp_nosym, _phd_mi_noso_nosp_nosym
from msspec.spec.fortran import eig_mi from msspec.spec.fortran import _eig_mi
from msspec.spec.fortran import eig_pw from msspec.spec.fortran import _eig_pw
from terminaltables.ascii_table import AsciiTable from terminaltables.ascii_table import AsciiTable
@ -289,14 +290,21 @@ class _MSCALCULATOR(Calculator):
# run phagen # run phagen
#self._make('tmatrix') #self._make('tmatrix')
os.chdir(os.path.join(self.tmp_folder, 'output')) os.chdir(os.path.join(self.tmp_folder, 'output'))
# copy external potential file to the workspace
if self.tmatrix_parameters.potential in ('lmto', 'spkkr', 'msf'):
fname = os.path.join(self.init_folder,
self.tmatrix_parameters.potential_file)
shutil.copy(fname, 'fort.2')
do_phagen() do_phagen()
# rename some output files to be more explicit # rename some output files to be more explicit
#os.rename('fort.10', 'cluster.clu') #os.rename('fort.10', 'cluster.clu')
#os.rename('fort.35', 'tmatrix.tl') #os.rename('fort.35', 'tmatrix.tl')
#os.rename('fort.55', 'tmatrix.rad') #os.rename('fort.55', 'tmatrix.rad')
shutil.copy('fort.10', 'cluster.clu') #shutil.copy('fort.10', 'cluster.clu')
shutil.copy('clus/clus.out', 'cluster.clu')
shutil.copy('fort.35', 'tmatrix.tl') shutil.copy('fort.35', 'tmatrix.tl')
shutil.copy('fort.55', 'tmatrix.rad') shutil.copy('fort.55', 'tmatrix.rad')
os.chdir(self.init_folder) os.chdir(self.init_folder)
@ -362,9 +370,9 @@ class _MSCALCULATOR(Calculator):
# Get the spec function to launch # Get the spec function to launch
if self.global_parameters.spectroscopy == 'PED': if self.global_parameters.spectroscopy == 'PED':
if self.global_parameters.algorithm == 'expansion': if self.global_parameters.algorithm == 'expansion':
do_spec = phd_se_noso_nosp_nosym.run do_spec = _phd_se_noso_nosp_nosym.run
elif self.global_parameters.algorithm == 'inversion': elif self.global_parameters.algorithm == 'inversion':
do_spec = phd_mi_noso_nosp_nosym.run do_spec = _phd_mi_noso_nosp_nosym.run
else: else:
LOGGER.error("\'{}\' spectroscopy with \'{}\' algorithm is not " LOGGER.error("\'{}\' spectroscopy with \'{}\' algorithm is not "
"an allowed combination.".format(self.global_parameters.spectroscopy, "an allowed combination.".format(self.global_parameters.spectroscopy,
@ -372,9 +380,9 @@ class _MSCALCULATOR(Calculator):
raise ValueError raise ValueError
elif self.global_parameters.spectroscopy == 'EIG': elif self.global_parameters.spectroscopy == 'EIG':
if self.global_parameters.algorithm == 'inversion': if self.global_parameters.algorithm == 'inversion':
do_spec = eig_mi.run do_spec = _eig_mi.run
elif self.global_parameters.algorithm == 'power': elif self.global_parameters.algorithm == 'power':
do_spec = eig_pw.run do_spec = _eig_pw.run
else: else:
LOGGER.error("\'{}\' spectroscopy with \'{}\' algorithm is not " LOGGER.error("\'{}\' spectroscopy with \'{}\' algorithm is not "
"an allowed combination.".format(self.global_parameters.spectroscopy, "an allowed combination.".format(self.global_parameters.spectroscopy,
@ -745,7 +753,10 @@ class _PED(_MSCALCULATOR):
filename = os.path.join(self.tmp_folder, 'output/cluster.clu') filename = os.path.join(self.tmp_folder, 'output/cluster.clu')
self.phagenio.load_cluster_file(filename) self.phagenio.load_cluster_file(filename)
filename = os.path.join(self.tmp_folder, 'bin/plot/plot_vc.dat') if self.phagen_parameters.potgen in ('in'):
filename = os.path.join(self.tmp_folder, 'output/plot/plot_vc.dat')
else:
filename = os.path.join(self.tmp_folder, 'output/plot/plot_v.dat')
pot_data = self.phagenio.load_potential_file(filename) pot_data = self.phagenio.load_potential_file(filename)
cluster = self.phagen_parameters.get_parameter('atoms').value cluster = self.phagen_parameters.get_parameter('atoms').value

View File

@ -1,4 +1,5 @@
# coding: utf-8 # coding: utf-8
# vim: set fdm=indent ts=4 sw=4 sts=4 et tw=80 ai cc=+0 mouse=a nu : #
""" """
Module misc Module misc
=========== ===========
@ -9,6 +10,7 @@ from pint import UnitRegistry
import numpy as np import numpy as np
import inspect import inspect
import re import re
import os
class XRaySource(object): class XRaySource(object):
MG_KALPHA = 1253.6 MG_KALPHA = 1253.6

View File

@ -265,6 +265,7 @@ class BaseParameters(object):
class PhagenParameters(BaseParameters): class PhagenParameters(BaseParameters):
def __init__(self): def __init__(self):
parameters = ( parameters = (
Parameter('version', types=(str,), fmt='>3s', default='1.1'),
Parameter('calctype', allowed_values=('xpd', 'xas', 'aed', 'led', Parameter('calctype', allowed_values=('xpd', 'xas', 'aed', 'led',
'rex', 'els', 'e2e'#, 'dos' 'rex', 'els', 'e2e'#, 'dos'
), ),
@ -273,7 +274,7 @@ class PhagenParameters(BaseParameters):
types=(str,), default='cis'), types=(str,), default='cis'),
Parameter('coor', allowed_values=('angs', 'au'), types=(str,), Parameter('coor', allowed_values=('angs', 'au'), types=(str,),
default='angs'), default='angs'),
Parameter('enunit', allowed_values=('ryd', 'eV'), fmt='3>s', Parameter('enunit', allowed_values=('ryd', 'eV'), fmt='>3s',
types=(str,), default='ryd'), types=(str,), default='ryd'),
Parameter('einc', types=(int, float), limits=(0, None), fmt='.1f', Parameter('einc', types=(int, float), limits=(0, None), fmt='.1f',
default=700.), default=700.),
@ -281,7 +282,7 @@ class PhagenParameters(BaseParameters):
default=580.), default=580.),
Parameter('scangl', types=(int, float), limits=(0, 360), fmt='.2f', Parameter('scangl', types=(int, float), limits=(0, 360), fmt='.2f',
default=0.), default=0.),
Parameter('lambda', types=(int, float), fmt='.2f', default=20.), Parameter('lambda', types=(int, float), fmt='.1f', default=0.),
Parameter('emin', types=(int, float), limits=(0, None), fmt='.4f', Parameter('emin', types=(int, float), limits=(0, None), fmt='.4f',
default=13.5236), default=13.5236),
Parameter('emax', types=(int, float), limits=(0, None), fmt='.4f', Parameter('emax', types=(int, float), limits=(0, None), fmt='.4f',
@ -294,9 +295,9 @@ class PhagenParameters(BaseParameters):
default='in'), default='in'),
Parameter('potype', allowed_values=('hdrel', 'hedin', 'xalph', Parameter('potype', allowed_values=('hdrel', 'hedin', 'xalph',
'dhrel', 'dhcmp', 'dhrel', 'dhcmp',
#'lmto', 'msf', 'spkkr' 'lmto', 'msf', 'spkkr'
), ),
types=(str,), fmt='5>s', default='hedin'), types=(str,), fmt='>5s', default='hedin'),
Parameter('relc', allowed_values=('nr', 'sr', 'so'), types=(str,), Parameter('relc', allowed_values=('nr', 'sr', 'so'), types=(str,),
default='nr'), default='nr'),
Parameter('norman', allowed_values=('stdcrm', 'scaled', 'extrad'), Parameter('norman', allowed_values=('stdcrm', 'scaled', 'extrad'),
@ -308,9 +309,9 @@ class PhagenParameters(BaseParameters):
Parameter('charelx', allowed_values=('ex', 'gs'), types=(str,), Parameter('charelx', allowed_values=('ex', 'gs'), types=(str,),
default='gs'), default='gs'),
Parameter('ionzst', allowed_values=('neutral', 'ionic'), Parameter('ionzst', allowed_values=('neutral', 'ionic'),
types=(str,), fmt='7>s', default='neutral'), types=(str,), fmt='>7s', default='neutral'),
Parameter('eikappr', allowed_values=('yes', 'no'), types=(str,), Parameter('eikappr', allowed_values=('yes', 'no'), types=(str,),
fmt='3>s', default='no'), fmt='>3s', default='no'),
Parameter('db', types=(int, float), fmt='.2f', default=0.01), Parameter('db', types=(int, float), fmt='.2f', default=0.01),
Parameter('optrsh', allowed_values=('y', 'n'), types=(str,), Parameter('optrsh', allowed_values=('y', 'n'), types=(str,),
default='n'), default='n'),
@ -885,11 +886,12 @@ class TMatrixParameters(BaseParameters):
def __init__(self, phagen_parameters): def __init__(self, phagen_parameters):
parameters = ( parameters = (
Parameter('potential', types=str, Parameter('potential', types=str,
allowed_values=('muffin_tin', 'lmto'), allowed_values=('muffin_tin', 'lmto', 'spkkr', 'msf'),
default='muffin_tin', doc=textwrap.dedent(""" default='muffin_tin', doc=textwrap.dedent("""
This option allows to choose which kind of potential is used to compute the T-Matrix. For now, This option allows to choose which kind of potential is used to compute the T-Matrix. For now,
only the internal *Muffin-Tin* potential is supported. only the internal *Muffin-Tin* potential is supported.
""")), """)),
Parameter('potential_file', types=(str,type(None)), default=None),
Parameter('exchange_correlation', types=str, Parameter('exchange_correlation', types=str,
allowed_values=('hedin_lundqvist_real', allowed_values=('hedin_lundqvist_real',
'hedin_lundqvist_complex', 'hedin_lundqvist_complex',
@ -955,8 +957,12 @@ class TMatrixParameters(BaseParameters):
self.freeze() self.freeze()
def bind_potential(self, p): def bind_potential(self, p):
mapping = {'muffin_tin': 'in', 'lmto': 'ex'} mapping = {'muffin_tin': 'in', 'lmto': 'ex', 'spkkr': 'ex', 'msf': 'ex'}
self.phagen_parameters.potgen = mapping[p.value] if p.value.lower() in ('muffin_tin'):
self.phagen_parameters.potgen = 'in'
elif p.value.lower() in ('spkkr', 'lmto', 'msf'):
self.phagen_parameters.potgen = 'ex'
self.phagen_parameters.potype = p.value.lower()
def bind_exchange_correlation(self, p): def bind_exchange_correlation(self, p):
potential = self.get_parameter('potential').value potential = self.get_parameter('potential').value
@ -969,8 +975,11 @@ class TMatrixParameters(BaseParameters):
'dirac_hara_complex': 'dhcmp' 'dirac_hara_complex': 'dhcmp'
} }
self.phagen_parameters.potype = mapping[p.value] self.phagen_parameters.potype = mapping[p.value]
elif potential == 'lmto': else:
self.phagen_parameters.potype = 'lmto' self.phagen_parameters.potype = potential
def bind_potential_file(self, p):
pass
def bind_imaginery_part(self, p): def bind_imaginery_part(self, p):
self.phagen_parameters.gamma = p.value self.phagen_parameters.gamma = p.value