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

1from itertools import product 

2 

3import pytest 

4import numpy as np 

5 

6from gpaw.response.pw_parallelization import block_partition 

7from gpaw.response.integrators import (TetrahedronIntegrator, Integrand, 

8 HilbertTetrahedron, Domain) 

9from gpaw.response.frequencies import FrequencyGridDescriptor 

10 

11from gpaw.response import ResponseContext 

12 

13 

14class MyIntegrand(Integrand): 

15 def matrix_element(self, point): 

16 return np.array([[1.]], complex) 

17 

18 def eigenvalues(self, point): 

19 return np.array([(point.kpt_c**2).sum()**0.5], float) 

20 

21 

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))]) 

31 

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) 

44 

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')