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
« 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
6from gpaw import GPAW
7from gpaw.analyse.overlap import Overlap
8from gpaw.utilities.adjust_cell import adjust_cell
9from gpaw.lrtddft import LrTDDFT
11"""Evaluate the overlap between two independent calculations
13Differences are forced by different eigensolvers and differing number
14of Kohn-Sham states.
15"""
18@pytest.mark.old_gpaw_only
19def test_overlap(in_tmp_dir):
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)
30 h = 0.4
31 box = 2
32 nbands = 4
33 txt = '-'
34 txt = None
36 H2 = molecule('H2')
37 adjust_cell(H2, box, h)
39 c1 = GPAW(**get_kwargs(eigensolver='dav', nbands=nbands))
40 c1.calculate(H2)
41 lr1 = LrTDDFT(c1)
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)
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)
65 parprint('cg --------')
66 c2 = GPAW(**get_kwargs(eigensolver='cg', nbands=nbands + 1))
67 show(c2)
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)
83 parprint('k-points --------')
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)