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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-19 00:19 +0000
1from math import sqrt
2import numpy as np
4from gpaw.symmetry import Symmetry
5from ase.dft.kpoints import monkhorst_pack
7# Primitive diamond lattice, with Si lattice parameter
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))
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()
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()
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()
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))
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.])
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))
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()