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

1import pytest 

2from ase import Atoms 

3from gpaw import GPAW 

4from gpaw.utilities.adjust_cell import adjust_cell 

5 

6h = 0.25 

7box = 3.0 

8 

9 

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

15 

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

25 

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

33 

34 assert contamination == pytest.approx(0.0, abs=0.01) 

35 

36 

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

42 

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

50 

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

57 

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)