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