Coverage for gpaw/test/xc/test_tpss.py: 100%
51 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 ase.build import molecule
3from gpaw import GPAW, Davidson, Mixer, PoissonSolver
4from gpaw.utilities.tools import split_formula
7@pytest.mark.mgga
8def test_tpss(in_tmp_dir):
9 cell = [6., 6., 7.]
11 # Reference from J. Chem. Phys. Vol 120 No. 15, 15 April 2004, page 6898
12 tpss_de = {
13 'Li2': 22.5}
14 tpss_old = {
15 'Li2': 20.9}
17 exp_bonds_dE = {
18 'Li2': (2.673, 24.4)}
20 systems = ['Li2']
22 # Add atoms
23 for formula in systems:
24 temp = split_formula(formula)
25 for atom in temp:
26 if atom not in systems:
27 systems.append(atom)
28 energies = {}
30 # Calculate energies
31 for formula in systems:
32 loa = molecule(formula)
33 loa.set_cell(cell)
34 loa.center()
35 calc = GPAW(mode='fd',
36 h=0.3,
37 eigensolver=Davidson(8),
38 parallel=dict(kpt=1),
39 mixer=Mixer(0.5, 5),
40 nbands=-2,
41 poissonsolver=PoissonSolver('fd', relax='GS'),
42 xc='oldPBE',
43 txt=formula + '.txt')
44 if len(loa) == 1:
45 calc = calc.new(hund=True)
46 else:
47 pos = loa.get_positions()
48 pos[1, :] = pos[0, :] + [0.0, 0.0, exp_bonds_dE[formula][0]]
49 loa.set_positions(pos)
50 loa.center()
51 loa.calc = calc
52 energy = loa.get_potential_energy()
53 diff = calc.get_xc_difference('TPSS')
54 energies[formula] = (energy, energy + diff)
55 print(formula, energy, energy + diff)
57 # calculate atomization energies
58 print('formula\tGPAW\tRef\tGPAW-Ref\tGPAW-exp')
59 mae_ref, mae_exp, mae_pbe, count = 0.0, 0.0, 0.0, 0
60 for formula in tpss_de.keys():
61 atoms_formula = split_formula(formula)
62 de_tpss = -1.0 * energies[formula][1]
63 de_pbe = -1.0 * energies[formula][0]
64 for atom_formula in atoms_formula:
65 de_tpss += energies[atom_formula][1]
66 de_pbe += energies[atom_formula][0]
68 de_tpss *= 627.5 / 27.211
69 de_pbe *= 627.5 / 27.211
70 mae_ref += abs(de_tpss - tpss_de[formula])
71 mae_exp += abs(de_tpss - exp_bonds_dE[formula][1])
72 mae_pbe += abs(de_pbe - exp_bonds_dE[formula][1])
73 count += 1
74 out = ("%s\t%.1f\t%.1f\t%.1f\t%.1f kcal/mol" %
75 (formula, de_tpss, tpss_de[formula],
76 de_tpss - tpss_de[formula],
77 de_tpss - exp_bonds_dE[formula][1]))
78 print(out)
80 # comparison to gpaw revision 5450 version value
81 # in kcal/mol (note the grid:0.3 Ang)
82 assert de_tpss == pytest.approx(tpss_old[formula], abs=0.15)