Skip to content

[Code scan] Validate all TBPM config sections used by solvers #21

Description

@njzjz

This issue comes from a Codex global scan of deepmodeling/tbplas at commit 4d3652b.

Severity: Low

Config exposes DC_conductivity and quasi_eigenstates, and solver/analysis code reads both sections later. However, set_legal_params() and check_params() only validate generic, LDOS, dyn_pol, and dckb. Typos in the omitted sections can pass configuration checks and fail later as ignored settings or KeyError.

Code references:

'delta': 0.01,
'recursion_depth': 2000}
# DC conductivity
self.DC_conductivity = {'energy_limits': (-0.5, 0.5)}
# quasi-eigenstates
self.quasi_eigenstates = {'energies': [-0.1, 0., 0.1]}
# dynamical polarization
self.dyn_pol = {'q_points': [[1., 0., 0.]],
'coulomb_constant': 1.0,
'background_dielectric_constant': 1.0}
# dckb, Hall conductivity
self.dckb = {'energies': [i * 0.01 - 0.2 for i in range(0, 41)],
'n_kernel': 2048,
'direction': 1,
'ne_integral': 2048}
# Set legal parameter names
self._legal_params = dict()

self._legal_params = {
'generic': set(self.generic.keys()),
'LDOS': set(self.LDOS.keys()),
'dyn_pol': set(self.dyn_pol.keys()),
'dckb': set(self.dckb.keys())
}
def check_params(self) -> None:
"""
Check the sanity of parameters.
:return: None
:raises ValueError: if illegal parameters are detected.
"""
def _check(attr, attr_name):
set_check = set(attr.keys())
set_ref = self._legal_params[attr_name]
set_diff = set_check.difference(set_ref)
for key in set_diff:
raise ValueError(f"Undefined parameter {key} in"
f" config.{attr_name}")
_check(self.generic, 'generic')
_check(self.LDOS, 'LDOS')
_check(self.dyn_pol, 'dyn_pol')
_check(self.dckb, 'dckb')

def calc_corr_dc_cond(self) -> Tuple[np.ndarray, np.ndarray]:
"""
Calculate correlation function of electronic (DC) conductivity.
:return: (corr_dos, corr_dc)
corr_dos: (nr_time_steps,) complex128 array
dimensionless DOS correlation function
corr_dc: (2, n_energies, nr_time_steps) complex128 array
DC conductivity correlation function in e^2/h_bar^2 * (eV)^2 * nm^2
"""
# Get parameters
tnr = self._config.generic['nr_time_steps']
en_range = self._sample.energy_range
energies_dos = np.array([0.5 * i * en_range / tnr - en_range / 2.
for i in range(tnr * 2)])
en_limit = self._config.DC_conductivity['energy_limits']
qe_indices = np.where((energies_dos >= en_limit[0]) &
(energies_dos <= en_limit[1]))[0]

self._config.quasi_eigenstates['energies'],
self.rank,
self._config.generic['wfn_check_steps'],
self._config.generic['wfn_check_thr']
)
states = self.all_average(states)
if save_data:
self._save_data(states, self._output['qe'])
return states
def calc_ldos_haydock(self) -> Tuple[np.ndarray, np.ndarray]:
"""
Calculate local density of states (LDOS) using Haydock recursion method.
CAUTION: this method works for only one site. Although it can be adopted
to deal with multiple sites, the time usage will be unaffordable.
Use TBPM instead if you want to calculate LDOS for multiple sites.
Ref: https://journals.jps.jp/doi/10.1143/JPSJ.80.054710
:return: (energies, ldos)
energies: (2*nr_time_steps+1,) float64 array
energies in eV
ldos: (2*nr_time_steps+1,) float64 array
LDOS value to corresponding energies in 1/eV
:raises RuntimeError: if more than 1 mpi process is used
"""

Suggested fix: include every public config section in _legal_params and validate them in check_params().

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions