Coverage for gpaw/test/spin/test_spin_contamination.py: 86%
29 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
1import pytest
2from ase import Atoms
3from gpaw import GPAW
4from gpaw.utilities.adjust_cell import adjust_cell
6h = 0.25
7box = 3.0
10def test_spin_spin_contamination_B(gpaw_new):
11 # B should not have spin contamination
12 s = Atoms('B')
13 adjust_cell(s, box, h=h)
14 s.set_initial_magnetic_moments([-1])
16 s.calc = GPAW(mode='fd', xc='LDA', nbands=-3,
17 basis='dzp',
18 hund=True,
19 h=h,
20 # mixer=MixerDif(beta=0.05, nmaxold=5, weight=50.0),
21 convergence={'eigenstates': 0.078,
22 'density': 5e-3,
23 'energy': 0.1})
24 s.get_potential_energy()
26 if gpaw_new:
27 dens = s.calc.dft.densities()
28 contamination = min(dens.spin_contamination(0),
29 dens.spin_contamination(0))
30 else:
31 contamination = min(s.calc.density.get_spin_contamination(s, 0),
32 s.calc.density.get_spin_contamination(s, 1))
34 assert contamination == pytest.approx(0.0, abs=0.01)
37def test_spin_spin_contamination_H2(gpaw_new):
38 # setup H2 at large distance with different spins for the atoms
39 s = Atoms('H2', positions=[[0, 0, 0], [0, 0, 3.0]])
40 adjust_cell(s, box, h=h)
41 s.set_initial_magnetic_moments([-1, 1])
43 s.calc = GPAW(mode='fd', xc='LDA',
44 nbands=-3,
45 h=h,
46 convergence={'eigenstates': 0.078,
47 'density': 1e-2,
48 'energy': 0.1})
49 s.get_potential_energy()
51 if gpaw_new:
52 dens = s.calc.dft.densities()
53 scont_s = [dens.spin_contamination(0), dens.spin_contamination(0)]
54 else:
55 scont_s = [s.calc.density.get_spin_contamination(s),
56 s.calc.density.get_spin_contamination(s, 1)]
58 assert scont_s[0] == pytest.approx(scont_s[1], abs=2e-4) # symmetry
59 assert scont_s[0] == pytest.approx(0.967, abs=2e-3)