Coverage for gpaw/eigensolvers/__init__.py: 100%
24 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
1"""Module defining ``Eigensolver`` classes."""
3from gpaw.eigensolvers.rmmdiis import RMMDIIS
4from gpaw.eigensolvers.cg import CG
5from gpaw.eigensolvers.davidson import Davidson
6from gpaw.eigensolvers.direct import DirectPW
7from gpaw.lcao.eigensolver import DirectLCAO
8from gpaw.directmin.etdm_fdpw import FDPWETDM
9from gpaw.directmin.etdm_lcao import LCAOETDM
12def get_eigensolver(eigensolver, mode, convergence=None):
13 """Create eigensolver object."""
14 if eigensolver is None:
15 if mode.name == 'lcao':
16 eigensolver = 'lcao'
17 else:
18 eigensolver = 'dav'
20 if isinstance(eigensolver, str):
21 eigensolver = {'name': eigensolver}
23 if isinstance(eigensolver, dict):
24 eigensolver = eigensolver.copy()
25 name = eigensolver.pop('name')
26 if name == 'etdm':
27 # Compatibility with old versions
28 name = 'etdm-lcao'
29 eigensolver = {'rmm-diis': RMMDIIS,
30 'cg': CG,
31 'dav': Davidson,
32 'davidson': Davidson,
33 'lcao': DirectLCAO,
34 'direct': DirectPW,
35 'etdm-lcao': LCAOETDM,
36 'etdm-fdpw': FDPWETDM}[name](**eigensolver)
38 if isinstance(eigensolver, CG):
39 eigensolver.tolerance = convergence.get('eigenstates', 4.0e-8)
41 assert isinstance(eigensolver, DirectLCAO) == (mode.name == 'lcao') or \
42 isinstance(eigensolver, LCAOETDM) == (mode.name == 'lcao')
44 return eigensolver