Coverage for gpaw/test/test_overlap.py: 97%

66 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-14 00:18 +0000

1import numpy as np 

2import pytest 

3from ase.build import molecule 

4from ase.parallel import parprint, world 

5 

6from gpaw import GPAW 

7from gpaw.analyse.overlap import Overlap 

8from gpaw.utilities.adjust_cell import adjust_cell 

9from gpaw.lrtddft import LrTDDFT 

10 

11"""Evaluate the overlap between two independent calculations 

12 

13Differences are forced by different eigensolvers and differing number 

14of Kohn-Sham states. 

15""" 

16 

17 

18@pytest.mark.old_gpaw_only 

19def test_overlap(in_tmp_dir): 

20 

21 def get_kwargs(nbands, **kwargs) -> dict: 

22 base_kwargs = dict( 

23 mode='fd', 

24 h=h, 

25 txt=txt, 

26 nbands=nbands, 

27 convergence={'eigenstates': nbands}) 

28 return dict(base_kwargs, **kwargs) 

29 

30 h = 0.4 

31 box = 2 

32 nbands = 4 

33 txt = '-' 

34 txt = None 

35 

36 H2 = molecule('H2') 

37 adjust_cell(H2, box, h) 

38 

39 c1 = GPAW(**get_kwargs(eigensolver='dav', nbands=nbands)) 

40 c1.calculate(H2) 

41 lr1 = LrTDDFT(c1) 

42 

43 parprint('sanity --------') 

44 ov = Overlap(c1).pseudo(c1) 

45 parprint('pseudo(normalized):\n', ov) 

46 ov = Overlap(c1).pseudo(c1, False) 

47 parprint('pseudo(not normalized):\n', ov) 

48 ov = Overlap(c1).full(c1) 

49 parprint('full:\n', ov) 

50 assert ov[0] == pytest.approx(np.eye(ov[0].shape[0], dtype=ov.dtype), 

51 abs=1e-10) 

52 

53 def show(c2): 

54 c2.calculate(H2) 

55 ov = Overlap(c1).pseudo(c2) 

56 parprint('wave function overlap (pseudo):\n', ov) 

57 ov = Overlap(c1).full(c2) 

58 parprint('wave function overlap (full):\n', ov) 

59 lr2 = LrTDDFT(c2) 

60 ovkss = lr1.kss.overlap(ov[0], lr2.kss) 

61 parprint('KSSingles overlap:\n', ovkss) 

62 ovlr = lr1.overlap(ov[0], lr2) 

63 parprint('LrTDDFT overlap:\n', ovlr) 

64 

65 parprint('cg --------') 

66 c2 = GPAW(**get_kwargs(eigensolver='cg', nbands=nbands + 1)) 

67 show(c2) 

68 

69 parprint('spin --------') 

70 H2.set_initial_magnetic_moments([1, -1]) 

71 c2 = GPAW( 

72 **get_kwargs( 

73 spinpol=True, nbands=nbands + 1, parallel={'domain': world.size})) 

74 H2.set_initial_magnetic_moments([0, 0]) 

75 try: 

76 show(c2) 

77 except AssertionError: 

78 parprint('Not ready') 

79 if 1: 

80 ov = Overlap(c1).pseudo(c2, otherspin=1) 

81 parprint('wave function overlap (pseudo other spin):\n', ov) 

82 

83 parprint('k-points --------') 

84 

85 H2.set_pbc([1, 1, 1]) 

86 c1 = GPAW(**get_kwargs(nbands=nbands, kpts=(1, 1, 3))) 

87 c1.calculate(H2) 

88 c2 = GPAW(**get_kwargs(nbands=nbands + 1, kpts=(1, 1, 3))) 

89 try: 

90 show(c2) 

91 except (AssertionError, IndexError) as e: 

92 parprint('Not ready', e)