Coverage for gpaw/test/symmetry/test_kpoint_mapping.py: 100%

33 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-20 00:19 +0000

1from gpaw.symmetry import map_k_points_fast, map_k_points 

2from ase.dft.kpoints import monkhorst_pack 

3from gpaw import GPAW 

4from ase.build import bulk 

5import numpy as np 

6from itertools import product 

7 

8 

9def test_symmetry_kpoint_mapping(): 

10 def test_mapping(bz2bz_ks, U_scc, bzk_kc, time_reversal=False): 

11 eps = 1e-7 

12 

13 if time_reversal: 

14 U_scc = np.concatenate([U_scc, -U_scc]) 

15 

16 for k_c, bz2bz_s in zip(bzk_kc, bz2bz_ks): 

17 delta_sc = (np.dot(U_scc, k_c) - 

18 bzk_kc[bz2bz_s, :])[bz2bz_s >= 0] 

19 delta_sc = np.abs(delta_sc - delta_sc.round()) 

20 assert delta_sc.max() < eps 

21 

22 # Test kpoint mapping functionality of the gpaw.symmetry module 

23 atoms = bulk('C') 

24 calc = GPAW(mode='pw', 

25 kpts={'size': (5, 5, 5)}, 

26 txt=None) 

27 atoms.calc = calc 

28 atoms.get_potential_energy() 

29 

30 U_scc = calc.wfs.kd.symmetry.op_scc 

31 time_reversal = False 

32 

33 for gamma in [True, False]: 

34 for time_reversal in [True, False]: 

35 for i, j, k in product(*([range(1, 7)] * 3)): 

36 

37 bzk_kc = monkhorst_pack((i, j, k)) 

38 

39 if gamma: 

40 offset = (((i + 1) % 2) / (2 * i), 

41 ((j + 1) % 2) / (2 * j), 

42 ((k + 1) % 2) / (2 * k)) 

43 bzk_kc += offset 

44 

45 bz2bz_ks = map_k_points(bzk_kc, U_scc, 

46 time_reversal, 

47 None, calc.wfs.kd.symmetry.tol) 

48 bz2bzfast_ks = map_k_points_fast(bzk_kc, U_scc, 

49 time_reversal, 

50 None, 

51 calc.wfs.kd.symmetry.tol) 

52 

53 assert ((bz2bz_ks - bz2bzfast_ks)**2 < 1e-9).all() 

54 

55 test_mapping(bz2bz_ks, U_scc, bzk_kc, time_reversal) 

56 test_mapping(bz2bzfast_ks, U_scc, bzk_kc, time_reversal)