Coverage for gpaw/test/noncollinear/test_o2.py: 21%

39 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-14 00:18 +0000

1import pytest 

2 

3from ase import Atoms 

4 

5from gpaw import GPAW 

6from gpaw.mpi import size 

7 

8 

9def test_noncollinear_o2(in_tmp_dir, gpaw_new): 

10 if size > 2: 

11 pytest.skip('mpi world size >2') 

12 if not gpaw_new: 

13 pytest.skip('fatal crash with old code') 

14 

15 a = Atoms('OO', [[0, 0, 0], [0, 0, 1.1]], magmoms=[1, 1], pbc=(1, 0, 0)) 

16 a.center(vacuum=2.5) 

17 a.calc = GPAW(mode='pw', 

18 kpts=(2, 1, 1)) 

19 f0 = a.get_forces() 

20 e0 = a.calc.get_eigenvalues(0, 0)[5] 

21 p0 = a.calc.get_pseudo_wave_function(5, periodic=True) 

22 

23 a.calc = GPAW(mode='pw', 

24 kpts=(2, 1, 1), 

25 symmetry='off', 

26 experimental={'magmoms': [[0, 0.5, 0.5], [0, 0, 1]]}) 

27 f = a.get_forces() 

28 e = a.calc.get_eigenvalues(0, 0)[10] 

29 p = a.calc.get_pseudo_wave_function(10, periodic=True) 

30 assert abs(f - f0).max() < 0.01 

31 assert e == pytest.approx(e0, abs=0.002) 

32 assert abs(p0)**2 == pytest.approx((abs(p)**2).sum(axis=0), abs=2e-4) 

33 

34 m1_v = a.calc.get_non_collinear_magnetic_moment() 

35 m1_av = a.calc.get_non_collinear_magnetic_moments() 

36 a.calc.write('o2.gpw') 

37 a.calc.write('o2w.gpw', 'all') 

38 calc = GPAW('o2w.gpw') 

39 m2_v = calc.get_non_collinear_magnetic_moment() 

40 m2_av = calc.get_non_collinear_magnetic_moments() 

41 m3_v, m3_av = calc.dft.magmoms() # recompute 

42 assert m1_v == pytest.approx(m2_v) 

43 assert m1_av == pytest.approx(m2_av) 

44 assert m1_v == pytest.approx(m3_v) 

45 assert m1_av == pytest.approx(m3_av) 

46 

47 p = calc.get_pseudo_wave_function(10, periodic=True) 

48 assert abs(p0)**2 == pytest.approx((abs(p)**2).sum(axis=0), abs=2e-4) 

49 

50 if gpaw_new: 

51 n_sR = calc.dft.densities().all_electron_densities() 

52 print(n_sR)