Fix some bugs in EIG calculator.

Now we can use either standard inversion or power method to
compute the spectral radii and plot the results.
This commit is contained in:
Sylvain Tricot 2020-03-11 11:08:17 +01:00
parent 4b63973c9f
commit ff600a2e3d
4 changed files with 39 additions and 17 deletions

View File

@ -594,7 +594,7 @@ class SpecIO(object):
else: else:
nlines = 1 nlines = 1
table = np.chararray((nlines, 4), unicode=True) table = np.chararray((nlines, 4), unicode=True)
table[:] = str(p.get_parameter('eigval_ispectrum_ne').default) table[:] = str(p.get_parameter('eigval_ispectrum_ne').value)
for i in range(nlines): for i in range(nlines):
line = create_line("I_SPECTRUM(NE)") line = create_line("I_SPECTRUM(NE)")
for j, o in enumerate((9, 19, 29, 39)): for j, o in enumerate((9, 19, 29, 39)):
@ -944,8 +944,8 @@ class SpecIO(object):
skip = rows2skip[spectro] skip = rows2skip[spectro]
data = np.loadtxt(filename, skiprows=skip, unpack=True) data = np.loadtxt(filename, skiprows=skip, unpack=True)
#if len(data.shape) <= 1: if len(data.shape) <= 1:
# data = data.reshape((1, data.shape[0])) data = data.reshape((2,-1))
return data return data
def load_facdif(self, filename='facdif1.dat'): def load_facdif(self, filename='facdif1.dat'):

View File

@ -916,6 +916,10 @@ class _EIG(_MSCALCULATOR):
self.spectroscopy_parameters.set_parameter('level', level) self.spectroscopy_parameters.set_parameter('level', level)
# ensure that if the alogorithm is 'inversion' the IPWM must be set to 0
if self.global_parameters.algorithm.lower() == 'inversion':
self.spec_parameters.eigval_ipwm = 0
self.get_tmatrix() self.get_tmatrix()
self.run_spec() self.run_spec()
@ -939,7 +943,8 @@ class _EIG(_MSCALCULATOR):
title = 'Spectral radii versus kinetic energy' title = 'Spectral radii versus kinetic energy'
xlabel = r'Kinetic energy (eV)' xlabel = r'Kinetic energy (eV)'
ylabel = r'Spectral radius' ylabel = r'Spectral radius'
view = dset.add_view("Spectral radius", title=title, xlabel=xlabel, ylabel=ylabel) view = dset.add_view("Spectral radius", title=title, xlabel=xlabel, ylabel=ylabel,
marker='o')
view.select('energy', 'spectral_radius') view.select('energy', 'spectral_radius')
# add the cluster to the dataset # add the cluster to the dataset

View File

@ -575,7 +575,7 @@ class SpecParameters(BaseParameters):
fmt='d'), fmt='d'),
Parameter('calc_igr', types=int, limits=[0, 2], default=0, fmt='d'), Parameter('calc_igr', types=int, limits=[0, 2], default=0, fmt='d'),
Parameter('calc_iren', types=int, limits=[0, 4], default=1, fmt='d'), Parameter('calc_iren', types=int, limits=[0, 5], default=1, fmt='d'),
Parameter('calc_nren', types=int, limits=[1, None], default=1, fmt='d'), Parameter('calc_nren', types=int, limits=[1, None], default=1, fmt='d'),
Parameter('calc_renr', types=float, limits=[None, None], default=1., fmt='.3f'), Parameter('calc_renr', types=float, limits=[None, None], default=1., fmt='.3f'),
Parameter('calc_reni', types=float, limits=[None, None], default=0., fmt='.3f'), Parameter('calc_reni', types=float, limits=[None, None], default=0., fmt='.3f'),
@ -1384,18 +1384,14 @@ class CalculationParameters(BaseParameters):
The scattering order. Only meaningful for the 'expansion' algorithm. The scattering order. Only meaningful for the 'expansion' algorithm.
Its value is limited to 10.""")), Its value is limited to 10.""")),
Parameter('renormalization_mode', allowed_values=(None, 'G_n', 'Sigma_n', Parameter('renormalization_mode', allowed_values=(None, 'G_n', 'Sigma_n',
'Z_n', 'K^2'), 'Z_n', 'Pi_1', 'Lowdin'),
types=(type(None), str), default=None, types=(type(None), str), default=None,
doc=textwrap.dedent(""" doc=textwrap.dedent("""
Enable the calculation of the coefficients for the renormalization of Enable the calculation of the coefficients for the renormalization of
the multiple scattering series. the multiple scattering series.
You can choose to renormalize in terms of the :math:`\\Sigma_n`, the You can choose to renormalize in terms of the :math:`G_n`, the
:math:`G_n`, the :math:`Z_n` or the Lowdin :math:`K^2` matrices. :math:`\\Sigma_n`, the :math:`Z_n`, the :math:`\\Pi_1` or the Lowdin
:math:`K^2` matrices""")),
.. note::
Please note that the last two renormalization methods only work
for the Eigen Value mode.""")),
Parameter('renormalization_omega', types=(int,float,complex), Parameter('renormalization_omega', types=(int,float,complex),
default=1.+0j, default=1.+0j,
doc=textwrap.dedent(""" doc=textwrap.dedent("""
@ -1530,18 +1526,21 @@ class CalculationParameters(BaseParameters):
'G_n' : 1, 'G_n' : 1,
'Sigma_n': 2, 'Sigma_n': 2,
'Z_n' : 3, 'Z_n' : 3,
'K^2' : 4} 'Pi_1' : 4,
'Lowdin' : 5}
# Check that the method is neither 'Z_n' nor 'K^2' for other # Check that the method is neither 'Z_n' nor 'K^2' for other
# 'spetroscopy' than EIG # 'spetroscopy' than EIG
try: try:
if (self.global_parameters.spectroscopy == 'PED' if (self.global_parameters.spectroscopy == 'PED'
and self.global_parameters.algorithm == 'expansion'): and self.global_parameters.algorithm == 'expansion'):
assert( p.value in (None, 'Sigma_n', 'G_n') ) #assert( p.value in (None, 'Sigma_n', 'G_n') )
assert( p.value in p.allowed_values)
elif (self.global_parameters.spectroscopy == 'EIG' elif (self.global_parameters.spectroscopy == 'EIG'
and self.global_parameters.algorithm == 'inversion'): and self.global_parameters.algorithm == 'power'):
assert( p.value in p.allowed_values) assert( p.value in p.allowed_values)
else: else:
assert( p.value is None ) assert( p.value is None )
print(iren_map[p.value])
self.spec_parameters.calc_iren = iren_map[p.value] self.spec_parameters.calc_iren = iren_map[p.value]
LOGGER.info("Renormalization activated with \'{}\' method".format(p.value)) LOGGER.info("Renormalization activated with \'{}\' method".format(p.value))
except AssertionError: except AssertionError:
@ -1794,6 +1793,14 @@ class EIGParameters(BaseParameters):
Parameter('kernel_matrix_spectrum', types=(bool,), default=False, doc=textwrap.dedent(""" Parameter('kernel_matrix_spectrum', types=(bool,), default=False, doc=textwrap.dedent("""
Whether to output the kernel matrix spectrum for each energy point. Whether to output the kernel matrix spectrum for each energy point.
""")), """)),
Parameter('method', types=(str,), default='EPSI',
allowed_values=['AITK', 'RICH', 'SALZ', 'EPSI', 'EPSG',
'RHOA', 'THET', 'LEGE', 'CHEB', 'OVER',
'DURB', 'DLEV', 'TLEV', 'ULEV', 'VLEV',
'ELEV', 'EULE', 'GBWT', 'VARI', 'ITHE',
'EALG'],
doc=textwrap.dedent("""The convergence acceleration scheme to be used.
""")),
) )
BaseParameters.__init__(self) BaseParameters.__init__(self)
self.add_parameters(*parameters) self.add_parameters(*parameters)
@ -1811,3 +1818,12 @@ class EIGParameters(BaseParameters):
self.spec_parameters.ped_li = li self.spec_parameters.ped_li = li
self.spec_parameters.ped_so = so self.spec_parameters.ped_so = so
self.spec_parameters.extra_level = p.value self.spec_parameters.extra_level = p.value
def bind_method(self, p):
self.spec_parameters.eigval_method = p.value
def bind_kernel_matrix_spectrum(self, p):
value = int(p.value)
self.spec_parameters.eigval_ispectrum_ne = value

View File

@ -1229,7 +1229,8 @@ c ENDIF
C C
IF((ISOM.NE.0).OR.(NFICHLEC.EQ.1)) CLOSE(IUO1) IF((ISOM.NE.0).OR.(NFICHLEC.EQ.1)) CLOSE(IUO1)
IF(ISOM.NE.0) CLOSE(IUO2) IF(ISOM.NE.0) CLOSE(IUO2)
STOP CST STOP
return
C C
1 WRITE(IUO1,60) 1 WRITE(IUO1,60)
STOP STOP