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

20 statements  

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

1import pytest 

2 

3from gpaw import GPAW 

4from gpaw.directmin.derivatives import Derivatives 

5from gpaw.directmin.etdm_fdpw import FDPWETDM 

6from gpaw.mom import prepare_mom_calculation 

7 

8 

9@pytest.mark.do 

10def test_hess_numerically_pw(in_tmp_dir, gpw_files): 

11 """ 

12 Test complex numerical Hessian 

13 w.r.t rotation parameters in LCAO 

14 

15 :param in_tmp_dir: 

16 :return: 

17 """ 

18 

19 calc = GPAW(gpw_files['h_hess_num_pw']) 

20 atoms = calc.atoms 

21 atoms.calc = calc 

22 

23 calc.set(eigensolver=FDPWETDM(excited_state=True)) 

24 f_sn = [calc.get_occupation_numbers(spin=s).copy() / 2 

25 for s in range(calc.wfs.nspins)] 

26 prepare_mom_calculation(calc, atoms, f_sn) 

27 atoms.get_potential_energy() 

28 

29 numder = Derivatives(calc.wfs.eigensolver.outer_iloop, calc.wfs) 

30 

31 hess_n = numder.get_numerical_derivatives( 

32 calc.wfs.eigensolver.outer_iloop, 

33 calc.hamiltonian, 

34 calc.wfs, 

35 calc.density, 

36 what2calc='hessian' 

37 ) 

38 hess_a = numder.get_analytical_derivatives( 

39 calc.wfs.eigensolver.outer_iloop, 

40 calc.hamiltonian, 

41 calc.wfs, 

42 calc.density, 

43 what2calc='hessian' 

44 ) 

45 

46 hess_nt = 0.464586 

47 assert hess_n[0] == pytest.approx(hess_nt, abs=1e-3) 

48 assert hess_a == pytest.approx(hess_n[0], abs=0.2)