Coverage for gpaw/test/lfc/test_derivatives.py: 100%
47 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1import numpy as np
2from gpaw.lfc import LocalizedFunctionsCollection as LFC
3from gpaw.grid_descriptor import GridDescriptor
4from gpaw.spline import Spline
7def test_lfc_derivatives():
8 a = 4.0
9 gd = GridDescriptor(N_c=[16, 20, 20], cell_cv=[a, a + 1, a + 2],
10 pbc_c=(0, 1, 1))
11 spos_ac = np.array([[0.25, 0.15, 0.35], [0.5, 0.5, 0.5]])
12 s = Spline.from_data(l=0, rmax=2.0, f_g=np.array([1, 0.9, 0.1, 0.0]))
13 p = Spline.from_data(l=1, rmax=2.0, f_g=np.array([1, 0.9, 0.1, 0.0]))
14 spline_aj = [[s], [s, p]]
15 c = LFC(gd, spline_aj, cut=True, forces=True)
16 c.set_positions(spos_ac)
17 C_ani = c.dict(3, zero=True)
18 if 1 in C_ani:
19 C_ani[1][:, 1:] = np.eye(3)
20 psi = gd.zeros(3)
21 c.add(psi, C_ani)
22 c.integrate(psi, C_ani)
23 if 1 in C_ani:
24 d = C_ani[1][:, 1:].diagonal()
25 assert np.ptp(d) < 4e-6
26 C_ani[1][:, 1:] -= np.diag(d)
27 assert abs(C_ani[1]).max() < 5e-17
28 d_aniv = c.dict(3, derivative=True)
29 c.derivative(psi, d_aniv)
30 if 1 in d_aniv:
31 for v in range(3):
32 assert abs(d_aniv[1][v - 1, 0, v] + 0.2144) < 5e-5
33 d_aniv[1][v - 1, 0, v] = 0
34 assert abs(d_aniv[1]).max() < 3e-16
35 eps = 0.0001
36 pos_av = np.dot(spos_ac, gd.cell_cv)
37 for v in range(3):
38 pos_av[0, v] += eps
39 c.set_positions(np.dot(pos_av, gd.icell_cv.T))
40 c.integrate(psi, C_ani)
41 if 0 in d_aniv:
42 C0_n = C_ani[0][:, 0].copy()
43 pos_av[0, v] -= 2 * eps
44 c.set_positions(np.dot(pos_av, gd.icell_cv.T))
45 c.integrate(psi, C_ani)
46 if 0 in d_aniv:
47 C0_n -= C_ani[0][:, 0]
48 C0_n /= -2 * eps
49 assert abs(C0_n - d_aniv[0][:, 0, v]).max() < 1e-8
50 pos_av[0, v] += eps