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

1import numpy as np 

2from gpaw.lfc import LocalizedFunctionsCollection as LFC 

3from gpaw.grid_descriptor import GridDescriptor 

4from gpaw.spline import Spline 

5 

6 

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