Coverage for gpaw/test/directopt/test_hess_numerically_lcao.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-19 00:19 +0000

1import pytest 

2 

3from gpaw import GPAW 

4from gpaw.directmin.derivatives import Derivatives 

5import numpy as np 

6 

7 

8@pytest.mark.do 

9def test_hess_numerically_lcao(in_tmp_dir, gpw_files): 

10 """ 

11 Test complex numerical Hessian 

12 w.r.t rotation parameters in LCAO 

13 

14 :param in_tmp_dir: 

15 :return: 

16 """ 

17 

18 calc = GPAW(gpw_files['h_hess_num_lcao']) 

19 calc.set_positions() 

20 calc.wfs.eigensolver.initialize_dm_helper( 

21 calc.wfs, calc.hamiltonian, 

22 calc.density, calc.log 

23 ) 

24 atoms = calc.atoms 

25 atoms.calc = calc 

26 numder = Derivatives(calc.wfs.eigensolver, calc.wfs) 

27 

28 hess_n = numder.get_numerical_derivatives( 

29 calc.wfs.eigensolver, 

30 calc.hamiltonian, 

31 calc.wfs, 

32 calc.density, 

33 what2calc='hessian' 

34 ) 

35 hess_a = numder.get_analytical_derivatives( 

36 calc.wfs.eigensolver, 

37 calc.hamiltonian, 

38 calc.wfs, 

39 calc.density, 

40 what2calc='hessian' 

41 ) 

42 hess_nt = np.asarray([[1.32720630e+00, -1.93947467e-11], 

43 [3.95786680e-09, 1.14599176e+00]]) 

44 assert hess_n == pytest.approx(hess_nt, abs=1e-4) 

45 assert hess_a == pytest.approx(hess_nt, abs=0.2) 

46 

47 a_mat_u = {0: [np.sqrt(2) * np.pi / 4.0 + 1.0j * np.sqrt(2) * np.pi / 4.0]} 

48 c_nm_ref = calc.wfs.eigensolver.dm_helper.reference_orbitals 

49 calc.wfs.eigensolver.rotate_wavefunctions(calc.wfs, a_mat_u, c_nm_ref) 

50 calc.wfs.eigensolver.update_ks_energy( 

51 calc.hamiltonian, calc.wfs, calc.density) 

52 calc.wfs.eigensolver.get_canonical_representation( 

53 calc.hamiltonian, calc.wfs, calc.density, sort_eigenvalues=True) 

54 c_nm = {x: calc.wfs.kpt_u[x].C_nM.copy() 

55 for x in range(len(calc.wfs.kpt_u))} 

56 

57 numder = Derivatives(calc.wfs.eigensolver, calc.wfs, c_ref=c_nm) 

58 

59 hess_n = numder.get_numerical_derivatives( 

60 calc.wfs.eigensolver, 

61 calc.hamiltonian, 

62 calc.wfs, 

63 calc.density, 

64 what2calc='hessian' 

65 ) 

66 

67 hess_a = numder.get_analytical_derivatives( 

68 calc.wfs.eigensolver, 

69 calc.hamiltonian, 

70 calc.wfs, 

71 calc.density, 

72 what2calc='hessian' 

73 ) 

74 hess_nt = np.asarray([[-1.08209601e+00, -1.11022302e-09], 

75 [8.50014503e-10, -9.37664521e-01]]) 

76 assert hess_n == pytest.approx(hess_nt, abs=1e-4) 

77 assert hess_a == pytest.approx(hess_nt, abs=0.2)