Coverage for gpaw/test/solvation/test_water_water.py: 92%
48 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
2from gpaw import GPAW, restart
3from gpaw.utilities.adjust_cell import adjust_cell
4from ase.build import molecule
5from ase.units import mol, kcal
6from gpaw.solvation import SolvationGPAW, get_HW14_water_kwargs
9@pytest.fixture
10def parameters():
11 params = {
12 'mode': 'fd',
13 'xc': 'PBE',
14 'h': 0.24,
15 'convergence': {
16 'energy': 0.05 / 8.,
17 'density': 10.,
18 'eigenstates': 10.}}
19 return params
22@pytest.fixture
23def H2O(parameters):
24 vac = 4.0
26 atoms = molecule('H2O')
27 adjust_cell(atoms, vac, parameters['h'])
29 kwargs = get_HW14_water_kwargs()
30 kwargs.update(parameters)
31 atoms.calc = SolvationGPAW(**kwargs)
32 atoms.get_potential_energy()
34 return atoms
37def test_solvation_water_water(H2O, parameters):
38 SKIP_VAC_CALC = True
40 if not SKIP_VAC_CALC:
41 atoms = H2O.copy()
42 atoms.calc = GPAW(**parameters)
43 Evac = atoms.get_potential_energy()
44 else:
45 # h=0.24, vac=4.0, setups: 0.9.11271, convergence: only energy 0.05 / 8
46 Evac = -14.857414548
48 Ewater = H2O.get_potential_energy()
49 H2O.get_forces()
50 DGSol = (Ewater - Evac) / (kcal / mol)
51 print('Delta Gsol: %s kcal / mol' % DGSol)
53 assert DGSol == pytest.approx(-6.3, abs=2.)
55 if H2O.calc.old:
56 Eelwater = H2O.calc.get_electrostatic_energy()
57 Esurfwater = H2O.calc.get_solvation_interaction_energy('surf')
58 assert Ewater == pytest.approx(Eelwater + Esurfwater, abs=1e-14)
59 else:
60 Esurfwater = H2O.calc.environment.interaction_energy()
61 assert Esurfwater == pytest.approx(0.058, abs=0.002)
64@pytest.mark.old_gpaw_only
65def test_read(H2O, in_tmp_dir):
66 """Read and check some basic properties"""
67 fname = 'solvation.gpw'
68 H2O.calc.write(fname)
69 atoms, calc = restart(fname, Class=SolvationGPAW, txt='-')
71 for method in ['get_potential_energy',
72 'get_eigenvalues', 'get_occupation_numbers']:
73 assert getattr(calc, method)() == pytest.approx(
74 getattr(H2O.calc, method)())
76 calc.calculate(atoms)
78 for method in ['get_potential_energy',
79 'get_eigenvalues', 'get_occupation_numbers']:
80 assert getattr(calc, method)() == pytest.approx(
81 getattr(H2O.calc, method)())