Coverage for gpaw/test/test_multipoletest.py: 100%
43 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1from math import sqrt, pi
3import numpy as np
4import pytest
6from gpaw.setup import create_setup
7from gpaw.grid_descriptor import GridDescriptor
8from gpaw.lfc import LFC
9from gpaw.xc import XC
11n = 60 # 40 /8 * 10
12a = 10.0
15@pytest.mark.ci
16def test_multipole():
17 gd = GridDescriptor((n, n, n), (a, a, a))
18 c_LL = np.identity(9, float)
19 a_Lg = gd.zeros(9)
20 xc = XC('LDA')
21 for soft in [False]:
22 s = create_setup('Cu', xc, lmax=2)
23 ghat_l = s.ghat_l
24 ghat_Lg = LFC(gd, [ghat_l])
25 ghat_Lg.set_positions([(0.54321, 0.5432, 0.543)])
26 a_Lg[:] = 0.0
27 ghat_Lg.add(a_Lg, {0: c_LL} if ghat_Lg.my_atom_indices else {})
28 for l in range(3):
29 for m in range(2 * l + 1):
30 L = l**2 + m
31 a_g = a_Lg[L]
32 Q0 = gd.integrate(a_g) / sqrt(4 * pi)
33 Q1_m = -gd.calculate_dipole_moment(a_g) / sqrt(4 * pi / 3)
34 print(Q0)
35 if l == 0:
36 Q0 -= 1.0
37 Q1_m[:] = 0.0
38 elif l == 1:
39 Q1_m[(m + 1) % 3] -= 1.0
40 print(soft, l, m, Q0, Q1_m)
41 assert abs(Q0) < 2e-6
42 assert (abs(Q1_m) < 3e-5).all()
43 b_Lg = np.reshape(a_Lg, (9, -1))
44 S_LL = np.inner(b_Lg, b_Lg)
45 gd.comm.sum(S_LL)
46 S_LL.ravel()[::10] = 0.0
47 print(max(abs(S_LL).ravel()))
48 assert max(abs(S_LL).ravel()) < 3e-4