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

1import pytest 

2from gpaw.grid_descriptor import GridDescriptor 

3from gpaw.pw.descriptor import PWDescriptor 

4from gpaw.mpi import world 

5 

6 

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] 

14 

15 a2 = gd2.zeros(dtype=pd2.dtype) 

16 a2[R2] = 1 

17 y = pd2.restrict(a2, pd1)[0][R1] * a2.size / a1.size 

18 

19 assert x == pytest.approx(y, abs=1e-9) 

20 return x 

21 

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) 

44 

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) 

55 

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)