Coverage for gpaw/test/directopt/test_mom_directopt_fd_hybrids.py: 80%
41 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
3import numpy as np
5from ase import Atoms
6from ase.units import Bohr
8from gpaw import GPAW, FD
9from gpaw.directmin.etdm_fdpw import FDPWETDM
10from gpaw.xc.hybrid import HybridXC
11from gpaw.eigensolvers import RMMDIIS
12from gpaw.mom import prepare_mom_calculation
15@pytest.mark.do
16def test_mom_directopt_fd_hybrids(in_tmp_dir):
17 d = 1.4 * Bohr
18 h2 = Atoms('H2',
19 positions=[[-d / 2, 0, 0],
20 [d / 2, 0, 0]])
21 h2.center(vacuum=3)
23 # Total and orbital energies calculated using
24 # RMMDIIS with disabled code below
25 e_ref = -5.969348
26 eig_ref = np.array([-11.94789695, 2.02930128])
27 e_ref_es = 21.861924
28 eig_ref_es = np.array([-15.98483801, -3.4381461])
30 # XXX(rg): Fails with gpwfile, see tchem-gl-14
31 calc = GPAW(mode=FD(),
32 h=0.3,
33 xc=HybridXC('PBE0', unocc=True),
34 eigensolver=FDPWETDM(converge_unocc=True),
35 mixer={'backend': 'no-mixing'},
36 occupations={'name': 'fixed-uniform'},
37 symmetry='off',
38 nbands=3,
39 convergence={'eigenstates': 4.0e-6},
40 )
41 h2.calc = calc
42 e = h2.get_potential_energy()
43 eig = calc.get_eigenvalues()
45 calc.set(eigensolver=FDPWETDM(excited_state=True,
46 converge_unocc=True))
47 f_sn = [[0, 1, 0]]
48 prepare_mom_calculation(calc, h2, f_sn)
50 e_es = h2.get_potential_energy()
51 eig_es = calc.get_eigenvalues()
53 assert e == pytest.approx(e_ref, abs=1.0e-3)
54 assert eig[:-1] == pytest.approx(eig_ref, abs=0.1)
55 assert e_es == pytest.approx(e_ref_es, abs=1.0e-3)
56 assert eig_es[:-1] == pytest.approx(eig_ref_es, abs=0.1)
58 reference_calc = False
59 if reference_calc:
60 calc = GPAW(mode=FD(),
61 h=0.3,
62 xc=HybridXC('PBE0', unocc=True),
63 symmetry='off',
64 nbands=3,
65 convergence={'eigenstates': 4.0e-6,
66 'bands': 2},
67 eigensolver=RMMDIIS()
68 )
69 h2.calc = calc
70 h2.get_potential_energy()
71 calc.get_eigenvalues()[:-1]
73 f_sn = [[0, 1, 0]]
74 prepare_mom_calculation(calc, h2, f_sn)
76 h2.get_potential_energy()
77 calc.get_eigenvalues()[:-1]