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

1import pytest 

2import numpy as np 

3from gpaw.lfc import LocalizedFunctionsCollection as LFC 

4from gpaw.grid_descriptor import GridDescriptor 

5from gpaw.spline import Spline 

6 

7 

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) 

21 

22 d_avv = dict([(a, np.zeros((3, 3))) for a in c.my_atom_indices]) 

23 c.second_derivative(psi, d_avv) 

24 

25 if 0 in d_avv: 

26 print(d_avv[0]) 

27 

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