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

1"""Module defining ``Eigensolver`` classes.""" 

2 

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 

10 

11 

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' 

19 

20 if isinstance(eigensolver, str): 

21 eigensolver = {'name': eigensolver} 

22 

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) 

37 

38 if isinstance(eigensolver, CG): 

39 eigensolver.tolerance = convergence.get('eigenstates', 4.0e-8) 

40 

41 assert isinstance(eigensolver, DirectLCAO) == (mode.name == 'lcao') or \ 

42 isinstance(eigensolver, LCAOETDM) == (mode.name == 'lcao') 

43 

44 return eigensolver