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