Coverage for gpaw/test/directopt/test_mom_directopt_lcao.py: 100%
34 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1import pytest
3from gpaw import GPAW
4from gpaw.directmin.tools import excite
5from gpaw.mom import prepare_mom_calculation
6from gpaw.directmin.etdm_lcao import LCAOETDM
7from gpaw.directmin.tools import rotate_orbitals
9import numpy as np
12@pytest.mark.mom
13@pytest.mark.do
14def test_mom_directopt_lcao(in_tmp_dir, gpw_files):
15 calc = GPAW(gpw_files['h2o_mom_do_lcao'])
16 # XXX(rg): Remove hack after tchem-gl-13
17 calc.set_positions()
18 calc.wfs.eigensolver.initialize_dm_helper(
19 calc.wfs, calc.hamiltonian,
20 calc.density, calc.log
21 )
22 H2O = calc.atoms
23 H2O.calc = calc
25 calc.set(eigensolver=LCAOETDM(excited_state=True))
26 f_sn = excite(calc, 0, 0, spin=(0, 0))
27 prepare_mom_calculation(calc, H2O, f_sn)
29 def rotate_homo_lumo(calc=calc):
30 angle = 70
31 iters = calc.get_number_of_iterations()
32 if iters == 3:
33 # Exercise rotate_orbitals
34 C_M_old = calc.wfs.kpt_u[0].C_nM.copy()
35 rotate_orbitals(calc.wfs.eigensolver, calc.wfs,
36 [[3, 4]], [angle], [0])
37 angle *= np.pi / 180.0
38 C_M_new = np.cos(angle) * C_M_old[3] + np.sin(angle) * C_M_old[4]
39 assert calc.wfs.kpt_u[0].C_nM[3] == \
40 pytest.approx(C_M_new, abs=1e-4)
42 counter = calc.wfs.eigensolver.update_ref_orbs_counter
43 calc.wfs.eigensolver.update_ref_orbs_counter = iters + 1
44 calc.wfs.eigensolver.update_ref_orbitals(calc.wfs,
45 calc.hamiltonian,
46 calc.density)
47 calc.wfs.eigensolver.update_ref_orbs_counter = counter
49 calc.attach(rotate_homo_lumo, 1)
50 e = H2O.get_potential_energy()
52 assert e == pytest.approx(-4.854496813259008, abs=1.0e-4)