Coverage for gpaw/test/response/test_unit_sphere_area.py: 100%
24 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
1from itertools import product
3import pytest
4import numpy as np
6from gpaw.response.pw_parallelization import block_partition
7from gpaw.response.integrators import (TetrahedronIntegrator, Integrand,
8 HilbertTetrahedron, Domain)
9from gpaw.response.frequencies import FrequencyGridDescriptor
11from gpaw.response import ResponseContext
14class MyIntegrand(Integrand):
15 def matrix_element(self, point):
16 return np.array([[1.]], complex)
18 def eigenvalues(self, point):
19 return np.array([(point.kpt_c**2).sum()**0.5], float)
22@pytest.mark.tetrahedron
23@pytest.mark.response
24def test_tetrahedron_integrator():
25 cell_cv = np.eye(3)
26 context = ResponseContext()
27 integrator = TetrahedronIntegrator(
28 cell_cv, context, *block_partition(context.comm, nblocks=1))
29 x_g = np.linspace(-1, 1, 30)
30 x_gc = np.array([comb for comb in product(*([x_g] * 3))])
32 # XXX we now hardcode "spins" as [0] but the previous API
33 # could do any extra *args.
34 #
35 # After refactoring it should again be possible to do any args,
36 # so this test isn't forced to specify the "spins"
37 domain = Domain(x_gc, [0])
38 out_wxx = np.zeros((1, 1, 1), complex)
39 integrator.integrate(task=HilbertTetrahedron(integrator.blockcomm),
40 domain=domain,
41 integrand=MyIntegrand(),
42 wd=FrequencyGridDescriptor([-1.0]),
43 out_wxx=out_wxx)
45 assert abs(out_wxx[0, 0, 0] - 4 * np.pi) < 1e-2
46 # equal(out_wxx[0, 0, 0], 4 * np.pi, 1e-2,
47 # msg='Integrated area of unit sphere is not 4 * pi')