Coverage for gpaw/test/vdw/test_libvdwxc_h2.py: 100%
38 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
1import pytest
2from gpaw.utilities import compiled_with_libvdwxc
3from ase.build import molecule
4from gpaw import GPAW, Mixer, Davidson, PW
5from gpaw.xc.libvdwxc import vdw_df
6from gpaw.mpi import world
8pytestmark = pytest.mark.skipif(not compiled_with_libvdwxc(),
9 reason='not compiled_with_libvdwxc()')
12@pytest.mark.old_gpaw_only
13def test_vdw_libvdwxc_h2(in_tmp_dir):
14 system = molecule('H2')
15 system.center(vacuum=1.0)
16 system.pbc = 1
18 def calculate(mode, kwargs1):
19 kwargs = dict(mode=mode,
20 basis='sz(dzp)',
21 eigensolver=Davidson(4) if mode != 'lcao' else None,
22 xc=vdw_df(),
23 h=0.25,
24 convergence=dict(energy=1e-6),
25 mixer=Mixer(0.5, 5, 10.))
26 kwargs.update(kwargs1)
27 calc = GPAW(**kwargs)
28 system.calc = calc
29 system.get_potential_energy()
30 return calc
32 fddomainpar = min(2, world.size)
34 for mode in ['fd', 'pw', 'lcao']:
35 kwargs = {}
36 if mode == 'pw':
37 kwargs['mode'] = PW(250)
38 else:
39 kwargs['parallel'] = {'domain': fddomainpar}
40 calc = calculate(mode, kwargs)
42 E1 = calc.get_potential_energy()
43 calc.write('dump.libvdwxc.gpw')
44 _ = GPAW('dump.libvdwxc.gpw', txt='restart.txt',
45 parallel={'domain': fddomainpar})
46 system2 = calc.get_atoms()
48 # Verify same energy after restart
49 E2 = system2.get_potential_energy()
50 assert abs(E2 - E1) < 1e-14 # Should be exact
52 # Trigger recaclulation of essentially same system
53 system2.positions[0, 0] += 1e-13
54 print('reconverge')
55 E3 = system2.get_potential_energy()
56 err2 = abs(E3 - E2)
57 print('error', err2)
58 assert err2 < 1e-6 # Around SCF precision