from typing import Any, Dict, List, Union
import numpy as np
ParamDict = Dict[str, Any]
FullConfig = Dict[str, Union[ParamDict, List[ParamDict]]]
def _verify_input_params_general(params: FullConfig) -> None:
# Checks that grid parameters are specified completely
if params['general']['beta'] is not None and (params['general']['n_iw'] is None
or params['general']['n_tau'] is None):
raise ValueError('Imaginary-frequency grid chosen, specify "n_iw" and "n_tau".')
if params['general']['beta'] is None and (params['general']['eta'] is None or params['general']['n_w'] is None
or params['general']['w_range'] is None):
raise ValueError('Real-frequency grid chosen, specify "eta", "n_w", and "w_range".')
# warning if sigma mixing is used, remove in future versions
if params['general']['sigma_mix'] < 1.0 and params['general']['g0_mix'] < 1.0:
raise ValueError('You shall not use Sigma and G0 mixing together!')
if params['general']['calc_energies'] and any(entry['type'] == 'ftps' for entry in params['solver']):
raise ValueError('"calc_energies" is not valid for solver of type = "ftps"')
# Checks validity of other general params
h_int_type_options = ('density_density', 'kanamori', 'full_slater', 'crpa',
'crpa_density_density', 'dynamic', 'ntot', 'simple_intra')
if isinstance(params['general']['h_int_type'], str):
if not params['general']['h_int_type'] in h_int_type_options:
raise ValueError(f'Invalid "h_int_type" = {params["general"]["h_int_type"]}.')
elif isinstance(params['general']['h_int_type'], list):
if any(entry not in h_int_type_options for entry in params['general']['h_int_type']):
raise ValueError('Invalid "h_int_type" in input list.')
else:
raise ValueError('Invalid "h_int_type" input type. String or list expected.')
if params['general']['g0_mix_type'] not in ('linear', 'broyden'):
raise ValueError(f'Invalid "g0_mix_type" = {params["general"]["g0_mix_type"]}.')
if params['general']['calc_mu_method'] not in ('dichotomy', 'newton', 'brent'):
raise ValueError(f'Invalid "calc_mu_method" = {params["general"]["calc_mu_method"]}.')
if params['general']['set_rot'] not in (None, 'den', 'hloc'):
raise ValueError(f'Invalid "set_rot" = {params["general"]["set_rot"]}.')
if params['general']['h_int_basis'] not in ('triqs', 'wien2k', 'wannier90', 'qe', 'vasp'):
raise ValueError(f'Invalid "h_int_basis" = {params["general"]["h_int_basis"]}.')
def _verify_input_params_dft(params: FullConfig) -> None:
if params['dft']['dft_code'] not in ('vasp', 'qe', None):
raise ValueError(f'Invalid "dft.dft_code" = {params["dft"]["dft_code"]}.')
if params['dft']['mpi_env'] not in ('default', 'openmpi', 'openmpi-intra', 'mpich'):
raise ValueError(f'Invalid "dft.mpi_env" = {params["dft"]["mpi_env"]}.')
if params['dft']['projector_type'] not in ('w90', 'plo'):
raise ValueError(f'Invalid "dft.projector_type" = {params["dft"]["projector_type"]}.')
def _verify_input_params_solver(params: FullConfig) -> None:
solver_params = params['solver']
# Checks that the solver impurities index are all lists if there are multiple solvers
if len(solver_params) > 1 or solver_params[0]['idx_impurities'] is not None:
if any(not isinstance(entry['idx_impurities'], list) for entry in solver_params):
raise ValueError('All "solver.idx_impurities" need to specify the impurities '
'as a list of ints when there are multiple solvers.')
for entry in solver_params:
if any(not isinstance(imp, int) for imp in entry['idx_impurities']):
raise ValueError('All "solver.idx_impurities" need to specify the impurities '
'as a list of ints when there are multiple solvers.')
# Checks that all solvers support the specified grid
# TODO: add real-frequency support for solvers that do both (e.g., hartree)
supported_grids = {'real': ['ftps'],
'imag': ['cthyb', 'ctint', 'ctseg', 'hubbardI', 'hartree']}
if params['general']['beta'] is not None:
for entry in solver_params:
if entry['type'] not in supported_grids['imag']:
raise ValueError(f'Solver {entry["type"]} does not support real-frequency grid.')
else:
for entry in solver_params:
if entry['type'] not in supported_grids['real']:
raise ValueError(f'Solver {entry["type"]} does not support imaginary-frequency grid.')
def _verify_input_params_advanced(params: FullConfig) -> None:
pass
[docs]def verify_before_dmft_cycle(params):
""" All checks of params that can be done before dmft_cycle is called. """
_verify_input_params_general(params)
_verify_input_params_dft(params)
_verify_input_params_solver(params)
_verify_input_params_advanced(params)
[docs]def verify_h5_dependent(sum_k, solver_type_per_imp, general_params):
""" All checks of params that depend on the h5 file content that is stored in the SumkDFT object. """
# Incompatabilities for SO coupling
if sum_k.SO == 1 and general_params['magnetic'] and general_params['afm_order']:
raise ValueError('AFM order not supported with SO coupling')
# Checks that enforce_off_diag true for ftps and hartree
if any(s in ['ftps', 'hartree'] and not e for s, e in zip(solver_type_per_imp, general_params['enforce_off_diag'])):
raise ValueError('enforce_off_diag must be True for a impurities solver by ftps or hartree solvers')
# Checks that the interaction Hamiltonian and the parameters match
if any(h not in ['density_density', 'slater'] and r is not None
for h, r in zip(general_params['h_int_type'], general_params['ratio_F4_F2'])):
raise ValueError('"ratio_F4_F2" only considered for interaction Hamiltonians "density_density" and "slater". '
'Please set to None for all other Hamiltonians.')
if any(h != 'kanamori' and up is not None for h, up in zip(general_params['h_int_type'], general_params['U_prime'])):
raise ValueError('"U_prime" only considered for interaction Hamiltonian "kanamori". '
'Please set to None for all other Hamiltonians.')