Coverage for gpaw/test/ext_potential/test_external_pw.py: 95%
66 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 import Atoms
3from ase.units import Bohr, Ha
5from gpaw import GPAW, PW
6from gpaw.external import ConstantElectricField, ConstantPotential
9@pytest.mark.old_gpaw_only
10def test_stark_pw():
11 h = Atoms('H', pbc=(1, 1, 0), magmoms=[1])
12 h.center(vacuum=3.0)
13 field = 0.2
14 params = dict(mode=PW(300))
16 h.calc = GPAW(**params)
18 e0 = h.get_potential_energy()
19 eig0 = h.calc.get_eigenvalues()[0]
21 h.calc = GPAW(**params,
22 external=ConstantElectricField(field),
23 poissonsolver={'dipolelayer': 'xy'})
25 e = h.get_potential_energy()
26 eig = h.calc.get_eigenvalues()[0]
27 dip = h.get_dipole_moment()[2]
29 to_au = Ha / Bohr**2
31 a1 = -2 * (e - e0) / field**2 * to_au
32 a2 = -(eig - eig0) / field**2 * to_au
33 a3 = dip / field * to_au
35 aref = 6.02
37 for a in [a1, a2, a3]:
38 print(a)
39 assert a == pytest.approx(aref, abs=0.1)
42@pytest.mark.old_gpaw_only
43def test_ext_potential_external_pw():
44 ConstantPotential()
46 sc = 2.9
47 R = 0.7 # approx. experimental bond length
48 R = 1.0
49 a = 2 * sc
50 c = 3 * sc
51 H2 = Atoms('HH', [(a / 2, a / 2, (c - R) / 2),
52 (a / 2, a / 2, (c + R) / 2)],
53 cell=(a, a, c),
54 pbc=False)
56 txt = None
58 convergence = {'eigenstates': 1.e-6 * 40 * 1.5**3,
59 'density': 1.e-2,
60 'energy': 0.1}
62 # without potential
63 if True:
64 if txt:
65 print('\n################## no potential')
66 c00 = GPAW(mode=PW(200), nbands=-1,
67 convergence=convergence,
68 txt=txt)
69 c00.calculate(H2)
70 c00.get_eigenvalues()
72 # 0 potential
73 if True:
74 if txt:
75 print('\n################## 0 potential')
76 cp0 = ConstantPotential(0.0)
77 c01 = GPAW(mode=PW(200), nbands=-2, external=cp0,
78 convergence=convergence,
79 txt=txt)
80 c01.calculate(H2)
82 # 1 potential
83 if True:
84 if txt:
85 print('################## 1 potential')
86 cp1 = ConstantPotential(-1.0)
87 c1 = GPAW(mode=PW(200), nbands=-2, external=cp1,
88 convergence=convergence,
89 txt=txt)
90 c1.calculate(H2)
92 for i in range(c00.get_number_of_bands()):
93 f00 = c00.get_occupation_numbers()[i]
94 if f00 > 0.01:
95 e00 = c00.get_eigenvalues()[i]
96 e1 = c1.get_eigenvalues()[i]
97 print('Eigenvalues no pot, expected, error=',
98 e00, e1 + 1, e00 - e1 - 1)
99 assert e00 == pytest.approx(e1 + 1., abs=0.02)
101 E_c00 = c00.get_potential_energy()
102 E_c1 = c1.get_potential_energy()
103 DeltaE = E_c00 - E_c1
104 assert DeltaE == pytest.approx(0, abs=0.002)