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

71 statements  

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

1from math import sqrt 

2import numpy as np 

3 

4from gpaw.symmetry import Symmetry 

5from ase.dft.kpoints import monkhorst_pack 

6 

7# Primitive diamond lattice, with Si lattice parameter 

8 

9 

10def test_symmetry_symmetry_ft(): 

11 a = 5.475 

12 cell_cv = .5 * a * np.array([(1, 1, 0), (1, 0, 1), (0, 1, 1)]) 

13 spos_ac = np.array([(.00, .00, .00), 

14 (.25, .25, .25)]) 

15 id_a = [1, 1] # Two identical atoms 

16 pbc_c = np.ones(3, bool) 

17 bzk_kc = monkhorst_pack((4, 4, 4)) 

18 

19 # Do check 

20 symm = Symmetry(id_a, cell_cv, pbc_c, symmorphic=False) 

21 symm.analyze(spos_ac) 

22 ibzk_kc, w_k = symm.reduce(bzk_kc)[:2] 

23 assert len(symm.op_scc) == 48 

24 assert len(w_k) == 10 

25 a = 3 / 32. 

26 b = 1 / 32. 

27 c = 6 / 32. 

28 assert np.all(w_k == [a, b, a, c, c, a, a, a, a, b]) 

29 assert not symm.op_scc.sum(0).any() 

30 

31 # Rotate unit cell and check again: 

32 cell_cv = a / sqrt(2) * np.array([(1, 0, 0), 

33 (0.5, sqrt(3) / 2, 0), 

34 (0.5, sqrt(3) / 6, sqrt(2.0 / 3))]) 

35 symm = Symmetry(id_a, cell_cv, pbc_c, symmorphic=False) 

36 symm.analyze(spos_ac) 

37 ibzkb_kc, wb_k = symm.reduce(bzk_kc)[:2] 

38 assert len(symm.op_scc) == 48 

39 assert abs(w_k - wb_k).sum() < 1e-14 

40 assert abs(ibzk_kc - ibzkb_kc).sum() < 1e-14 

41 assert not symm.op_scc.sum(0).any() 

42 

43 bzk_kc = monkhorst_pack((3, 3, 3)) 

44 symm = Symmetry(id_a, cell_cv, pbc_c) 

45 symm.analyze(spos_ac) 

46 ibzk_kc, w_k = symm.reduce(bzk_kc)[:2] 

47 assert len(symm.op_scc) == 24 

48 assert len(w_k) == 4 

49 assert abs(w_k * 27 - (1, 12, 6, 8)).sum() < 1e-14 

50 assert not symm.op_scc.sum(0).any() 

51 

52 # Rocksalt Ni2O2 

53 a = 7.92 

54 x = 2. * np.sqrt(1. / 3.) 

55 y = np.sqrt(1. / 8.) 

56 z1 = np.sqrt(1. / 24.) 

57 z2 = np.sqrt(1. / 6.) 

58 cell_cv = a * np.array([(x, y, -z1), (x, -y, -z1), (x, 0., z2)]) 

59 spos_ac = np.array([[0., 0., 0.], 

60 [1. / 2., 1. / 2., 1. / 2.], 

61 [1. / 4., 1. / 4., 1. / 4.], 

62 [3. / 4., 3. / 4., 3. / 4.]]) 

63 id_a = [1, 2, 3, 3] 

64 pbc_c = np.array([1, 1, 1], bool) 

65 bzk_kc = monkhorst_pack((2, 2, 2)) 

66 

67 # Do check 

68 symm = Symmetry(id_a, cell_cv, pbc_c, symmorphic=False) 

69 symm.analyze(spos_ac) 

70 ibzk_kc, w_k = symm.reduce(bzk_kc)[:2] 

71 assert len(symm.op_scc) == 12 

72 assert len(w_k) == 2 

73 assert np.all(w_k == [3 / 4., 1 / 4.]) 

74 

75 # AlF3 

76 a = 2.465250000 

77 b = 1.423312751 

78 c = 4.148733333 

79 a1 = np.array([a, -1.0 * b, c]) 

80 a2 = np.array([0.0, 2.0 * b, c]) 

81 a3 = np.array([-1.0 * a, -1.0 * b, c]) 

82 cell_cv = np.array([a1, a2, a3]) 

83 id_a = [1, 1, 2, 2, 2, 2, 2, 2] 

84 spos_ac = np.array([(0.000000000, 0.000000000, 0.000000000), 

85 (0.500000000, 0.500000000, 0.500000000), 

86 (0.647758346, 0.852241654, 0.250000000), 

87 (0.852241654, 0.250000000, 0.647758346), 

88 (0.250000000, 0.647758346, 0.852241654), 

89 (0.352241654, 0.147758346, 0.750000000), 

90 (0.147758346, 0.750000000, 0.352241654), 

91 (0.750000000, 0.352241654, 0.147758346)]) 

92 pbc_c = np.array([1, 1, 1], bool) 

93 bzk_kc = monkhorst_pack((3, 3, 3)) 

94 

95 # Do check 

96 symm = Symmetry(id_a, cell_cv, pbc_c, symmorphic=False) 

97 symm.analyze(spos_ac) 

98 ibzk_kc, w_k = symm.reduce(bzk_kc)[:2] 

99 assert len(symm.op_scc) == 12 

100 assert len(w_k) == 6 

101 assert np.all(w_k == [1 / 27., 2 / 9., 2 / 9., 2 / 9., 2 / 9., 2 / 27.]) 

102 assert not symm.op_scc.sum(0).any()