Coverage for gpaw/test/lrtddft/test_kssingles.py: 100%
78 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1import pytest
3from ase.build import molecule
5from gpaw.mpi import world
6from gpaw import GPAW
7from gpaw.lrtddft.kssingle import KSSingles
10@pytest.mark.lrtddft
11def test_old_io(in_tmp_dir):
12 """Test reading of old style output files"""
13 fname = 'veryold.dat'
14 if world.rank == 0:
15 with open(fname, 'w') as f:
16 f.write("""# KSSingles
172
180 1 0 0 0.129018 1 -4.7624e-02 -3.2340e-01 -4.6638e-01
190 1 1 0 0.129018 1 -4.7624e-02 -3.2340e-01 -4.6638e-01
20""")
21 world.barrier()
23 kss = KSSingles.read(fname)
24 assert len(kss) == 2
26 fname = 'old.dat'
27 if world.rank == 0:
28 with open(fname, 'w') as f:
29 f.write("""# KSSingles
302 float64
310.024
320 1 0 0 0.392407 2 8.82 2.91 7.98 1.0 2.7 7.8 1.4 1.2 1.08
330 2 0 0 0.402312 2 2.24 8.49 -5.24 2.3 8.26 -4.99038e-14
34""")
35 world.barrier()
37 kss = KSSingles.read(fname)
38 assert len(kss) == 2
39 assert kss.restrict['eps'] == 0.024
42@pytest.fixture
43def ch4():
44 ch4 = molecule('CH4')
45 ch4.center(vacuum=2)
46 ch4.calc = GPAW(mode='fd', h=0.25, nbands=8, txt=None)
47 ch4.get_potential_energy()
48 return ch4
51@pytest.fixture
52def ch4_kss(ch4):
53 """Test multiplication with a number"""
54 istart, jend = 1, 4
55 kss = KSSingles(restrict={'eps': 0.9, 'istart': istart, 'jend': jend})
56 kss.calculate(ch4)
57 return kss
60@pytest.mark.lrtddft
61def test_io(in_tmp_dir, ch4):
62 # full KSSingles
63 kssfull = KSSingles(restrict={'eps': 0.9})
64 kssfull.calculate(ch4)
65 fullname = 'kssfull.dat'
66 kssfull.write(fullname)
67 world.barrier()
69 # read full
70 kss1 = KSSingles.read(fullname)
71 assert len(kss1) == 16
73 # restricted KSSingles
74 istart, jend = 1, 4
75 kss = KSSingles(restrict={'eps': 0.9, 'istart': istart, 'jend': jend})
76 kss.calculate(ch4)
77 f14name = 'kss_1_4.dat'
78 kss.write(f14name)
79 world.barrier()
81 kss2 = KSSingles.read(f14name)
82 assert len(kss2) == len(kss)
83 assert kss2.restrict['istart'] == istart
84 assert kss2.restrict['jend'] == jend
86 # restrict when reading
87 kss3 = KSSingles.read(fullname,
88 restrict={'istart': istart, 'jend': jend})
89 assert len(kss3) == len(kss)
90 assert kss3.restrict['istart'] == istart
91 assert kss3.restrict['jend'] == jend
94@pytest.mark.lrtddft
95def test_mul(ch4_kss):
96 """Test multiplication with a number"""
97 ks0 = ch4_kss[0]
98 ks1 = 1. * ks0
99 assert (ks0.me == ks1.me).all()
100 assert (ks0.magn == ks1.magn).all()
103@pytest.mark.lrtddft
104def test_add_sub(in_tmp_dir):
105 """Test adding and subtracting"""
106 fname = 'kss_with_magn.dat'
107 if world.rank == 0:
108 with open(fname, 'w') as f:
109 # output for C3H6O, see gpaw/test/lrtddft/test_lrtddft2.py
110 f.write("""# KSSingles
1112 float64
112{"istart": 10, "jend": 12}
11310 12 0 0 0.2834260231 2.000000 -6.99002e-02 3.49407e-02 3.84815e-02 -6.12491e-02 2.91457e-02 3.60540e-02 5.66737e-04 -3.65251e-04 -1.34614e-03
11411 12 0 0 0.2396446019 2.000000 8.73651e-02 -1.01160e-01 -2.82990e-01 7.60765e-02 -9.83790e-02 -2.78192e-01 6.38772e-04 -2.97370e-04 -8.74882e-04
115""") # noqa
116 world.barrier()
118 kss = KSSingles.read(fname)
120 ks_add = kss[0] + (-1 * kss[1])
121 ks_sub = kss[0] - kss[1]
123 assert ks_add.me == pytest.approx(ks_sub.me)
124 assert ks_add.mur == pytest.approx(ks_sub.mur)
125 assert ks_add.muv == pytest.approx(ks_sub.muv)
126 assert ks_add.magn == pytest.approx(ks_sub.magn)