Coverage for gpaw/test/gpu/test_fd_transformers.py: 27%
41 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 pytest
2import numpy as np
3from gpaw.grid_descriptor import GridDescriptor
4from gpaw.transformers import Transformer
5from gpaw.mpi import world
6from gpaw.gpu import cupy as cp, cupy_is_fake
9@pytest.mark.gpu
10@pytest.mark.skipif(cupy_is_fake, reason='No cupy')
11@pytest.mark.parametrize('pbc', [True, False])
12@pytest.mark.parametrize('nn', [1, 2, 3, 4])
13def test_fd_transformers(pbc, nn):
14 if world.size > 4:
15 # Grid is so small that domain decomposition cannot exceed 4 domains
16 assert world.size % 4 == 0
17 group, other = divmod(world.rank, 4)
18 ranks = np.arange(4 * group, 4 * (group + 1))
19 domain_comm = world.new_communicator(ranks)
20 else:
21 domain_comm = world
23 lat = 8.0
24 gd = GridDescriptor((32, 32, 32), (lat, lat, lat),
25 pbc_c=pbc, comm=domain_comm)
27 if pbc:
28 dtype = complex
29 phase = np.ones((3, 2), complex)
30 else:
31 dtype = float
32 phase = None
34 # Use Gaussian as input
35 x, y, z = gd.get_grid_point_coordinates()
36 sigma = 1.5
37 mu = lat / 2.0
39 a = gd.zeros(dtype=dtype)
40 a[:] = np.exp(-((x - mu)**2 + (y - mu)**2 + (z - mu)**2) / (2.0 * sigma))
42 a_gpu = cp.asarray(a)
44 # Transformers
45 coarsegd = gd.coarsen()
46 a_coarse = coarsegd.zeros(dtype=dtype)
47 a_coarse_gpu = cp.zeros_like(a_coarse)
49 # Restrict
50 Transformer(gd, coarsegd, nn, dtype=dtype).apply(a, a_coarse, phases=phase)
51 Transformer(gd, coarsegd, nn, dtype=dtype, xp=cp).apply(
52 a_gpu, a_coarse_gpu, phases=phase)
53 a_coarse_ref = a_coarse_gpu.get()
54 assert a_coarse == pytest.approx(a_coarse_ref, abs=1e-14)
56 # Interpolate
57 Transformer(coarsegd, gd, nn, dtype=dtype).apply(a_coarse, a, phases=phase)
58 Transformer(coarsegd, gd, nn, dtype=dtype, xp=cp).apply(
59 a_coarse_gpu, a_gpu, phases=phase)
60 a_ref = a_gpu.get()
61 assert a == pytest.approx(a_ref, abs=1e-14)