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
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-14 00:18 +0000
1import pytest
3from ase import Atoms
5from gpaw import GPAW
6from gpaw.mpi import size
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')
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)
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)
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)
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)
50 if gpaw_new:
51 n_sR = calc.dft.densities().all_electron_densities()
52 print(n_sR)