Coverage for gpaw/test/lfc/test_second_derivative.py: 100%
42 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
1import pytest
2import numpy as np
3from gpaw.lfc import LocalizedFunctionsCollection as LFC
4from gpaw.grid_descriptor import GridDescriptor
5from gpaw.spline import Spline
8@pytest.mark.ci
9def test_lfc_second_derivative():
10 gd = GridDescriptor([20, 16, 16], [(4, 2, 0), (0, 4, 0), (0, 0, 4)])
11 spos_ac = np.array([[0.252, 0.15, 0.35], [0.503, 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 spline_aj = [[s], [s]]
14 c = LFC(gd, spline_aj)
15 c.set_positions(spos_ac)
16 c_ai = c.dict(zero=True)
17 if 1 in c_ai:
18 c_ai[1][0] = 2.0
19 psi = gd.zeros()
20 c.add(psi, c_ai)
22 d_avv = dict([(a, np.zeros((3, 3))) for a in c.my_atom_indices])
23 c.second_derivative(psi, d_avv)
25 if 0 in d_avv:
26 print(d_avv[0])
28 eps = 0.000001
29 d_aiv = c.dict(derivative=True)
30 pos_av = np.dot(spos_ac, gd.cell_cv)
31 for v in range(3):
32 pos_av[0, v] += eps
33 c.set_positions(np.dot(pos_av, gd.icell_cv.T))
34 c.derivative(psi, d_aiv)
35 if 0 in d_aiv:
36 d0_v = d_aiv[0][0].copy()
37 pos_av[0, v] -= 2 * eps
38 c.set_positions(np.dot(pos_av, gd.icell_cv.T))
39 c.derivative(psi, d_aiv)
40 if 0 in d_aiv:
41 d0_v -= d_aiv[0][0]
42 d0_v /= -2 * eps
43 print(d0_v)
44 d_avv[0][v] -= d0_v
45 pos_av[0, v] += eps
46 if 0 in d_avv:
47 assert np.abs(d_avv[0]).max() < 1e-10