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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-19 00:19 +0000
1import pytest
3from gpaw import GPAW
4from gpaw.directmin.derivatives import Derivatives
5import numpy as np
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
14 :param in_tmp_dir:
15 :return:
16 """
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)
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)
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))}
57 numder = Derivatives(calc.wfs.eigensolver, calc.wfs, c_ref=c_nm)
59 hess_n = numder.get_numerical_derivatives(
60 calc.wfs.eigensolver,
61 calc.hamiltonian,
62 calc.wfs,
63 calc.density,
64 what2calc='hessian'
65 )
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)