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

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 

7 

8 

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 

20 

21 

22@pytest.fixture 

23def H2O(parameters): 

24 vac = 4.0 

25 

26 atoms = molecule('H2O') 

27 adjust_cell(atoms, vac, parameters['h']) 

28 

29 kwargs = get_HW14_water_kwargs() 

30 kwargs.update(parameters) 

31 atoms.calc = SolvationGPAW(**kwargs) 

32 atoms.get_potential_energy() 

33 

34 return atoms 

35 

36 

37def test_solvation_water_water(H2O, parameters): 

38 SKIP_VAC_CALC = True 

39 

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 

47 

48 Ewater = H2O.get_potential_energy() 

49 H2O.get_forces() 

50 DGSol = (Ewater - Evac) / (kcal / mol) 

51 print('Delta Gsol: %s kcal / mol' % DGSol) 

52 

53 assert DGSol == pytest.approx(-6.3, abs=2.) 

54 

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) 

62 

63 

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='-') 

70 

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)()) 

75 

76 calc.calculate(atoms) 

77 

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)())