Coverage for gpaw/test/pw/test_interpol.py: 100%
44 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1import pytest
2from gpaw.grid_descriptor import GridDescriptor
3from gpaw.pw.descriptor import PWDescriptor
4from gpaw.mpi import world
7@pytest.mark.ci
8def test_pw_interpol(rng):
9 def test(gd1, gd2, pd1, pd2, R1, R2):
10 a1 = gd1.zeros(dtype=pd1.dtype)
11 a1[R1] = 1
12 a2 = pd1.interpolate(a1, pd2)[0]
13 x = a2[R2]
15 a2 = gd2.zeros(dtype=pd2.dtype)
16 a2[R2] = 1
17 y = pd2.restrict(a2, pd1)[0][R1] * a2.size / a1.size
19 assert x == pytest.approx(y, abs=1e-9)
20 return x
22 if world.size == 1:
23 for size1, size2 in [
24 [(3, 3, 3), (8, 8, 8)],
25 [(4, 4, 4), (9, 9, 9)],
26 [(2, 4, 4), (5, 9, 9)],
27 [(2, 3, 4), (5, 6, 9)],
28 [(2, 3, 4), (5, 6, 8)],
29 [(4, 4, 4), (8, 8, 8)],
30 [(2, 4, 4), (4, 8, 8)],
31 [(2, 4, 2), (4, 8, 4)]]:
32 print(size1, size2)
33 gd1 = GridDescriptor(size1, size1)
34 gd2 = GridDescriptor(size2, size1)
35 pd1 = PWDescriptor(1, gd1, complex)
36 pd2 = PWDescriptor(1, gd2, complex)
37 pd1r = PWDescriptor(1, gd1)
38 pd2r = PWDescriptor(1, gd2)
39 for R1, R2 in [[(0, 0, 0), (0, 0, 0)],
40 [(0, 0, 0), (0, 0, 1)]]:
41 x = test(gd1, gd2, pd1, pd2, R1, R2)
42 y = test(gd1, gd2, pd1r, pd2r, R1, R2)
43 assert x == pytest.approx(y, abs=1e-9)
45 a1 = rng.random(size1)
46 a2 = pd1r.interpolate(a1, pd2r)[0]
47 c2 = pd1.interpolate(a1 + 0.0j, pd2)[0]
48 d2 = pd1.interpolate(a1 * 1.0j, pd2)[0]
49 assert abs(c2.imag).max() == pytest.approx(0, abs=1e-14)
50 assert abs(d2.real).max() == pytest.approx(0, abs=1e-14)
51 assert gd1.integrate(a1) == pytest.approx(gd2.integrate(a2),
52 abs=1e-13)
53 assert abs(c2 - a2).max() == pytest.approx(0, abs=1e-14)
54 assert abs(d2 - a2 * 1.0j).max() == pytest.approx(0, abs=1e-14)
56 a1 = pd2r.restrict(a2, pd1r)[0]
57 c1 = pd2.restrict(a2 + 0.0j, pd1)[0]
58 d1 = pd2.restrict(a2 * 1.0j, pd1)[0]
59 assert gd1.integrate(a1) == pytest.approx(gd2.integrate(a2),
60 abs=1e-13)
61 assert abs(c1 - a1).max() == pytest.approx(0, abs=1e-14)
62 assert abs(d1 - a1 * 1.0j).max() == pytest.approx(0, abs=1e-14)