Coverage for gpaw/test/vdw/test_ar2.py: 100%
39 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
1from math import sqrt
2import pytest
3from ase import Atoms
4from gpaw import GPAW, Mixer, Davidson
5from gpaw.xc.vdw import VDWFunctional
8@pytest.mark.slow
9@pytest.mark.libxc
10def test_vdw_ar2(in_tmp_dir):
11 energy_tolerance = 0.002
13 def test():
14 vdw = VDWFunctional('vdW-DF', verbose=1)
15 d = 3.9
16 x = d / sqrt(3)
17 L = 3.0 + 2 * 4.0
18 dimer = Atoms('Ar2', [(0, 0, 0), (x, x, x)], cell=(L, L, L))
19 dimer.center()
20 calc = GPAW(mode='fd', h=0.2, xc=dict(name='revPBE', stencil=1),
21 mixer=Mixer(0.8, 7, 50.0),
22 eigensolver=Davidson(5))
23 dimer.calc = calc
24 e2 = dimer.get_potential_energy()
25 calc.write('Ar2.gpw')
26 e2vdw = calc.get_xc_difference(vdw)
27 e2vdwb = GPAW('Ar2.gpw').get_xc_difference(vdw)
28 print(e2vdwb - e2vdw)
29 assert abs(e2vdwb - e2vdw) < 1e-9
30 if 0:
31 # See ASE issue !1466
32 del dimer[1]
33 else:
34 dimer.calc = None
35 del dimer[1]
36 dimer.calc = calc
37 e = dimer.get_potential_energy()
38 evdw = calc.get_xc_difference(vdw)
40 E = 2 * e - e2
41 Evdw = E + 2 * evdw - e2vdw
42 print(E, Evdw)
43 assert abs(E - -0.0048) < 6e-4, abs(E)
44 assert abs(Evdw - +0.0223) < 3e-3, abs(Evdw)
46 print(e2, e)
47 assert e2 == pytest.approx(-0.005, abs=energy_tolerance)
48 assert e == pytest.approx(-0.005, abs=energy_tolerance)
50 test()