Coverage for gpaw/test/test_unfold.py: 100%

49 statements  

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

1from ase import Atoms 

2import pytest 

3from gpaw.new.ase_interface import GPAW 

4from gpaw.unfold import Unfold, find_K_from_k 

5 

6 

7@pytest.mark.soc 

8def test_unfold_Ni(gpw_files, in_tmp_dir): 

9 # Collinear calculation 

10 gpw = 'fcc_Ni_col' 

11 calc_col = GPAW(gpw_files[gpw], 

12 parallel={'domain': 1, 'band': 1}) 

13 

14 pc = calc_col.atoms.get_cell(complete=True) 

15 bp = pc.get_bravais_lattice().bandpath('GX', npoints=3) 

16 

17 M = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] 

18 

19 # Spin 0 

20 unfold = Unfold(name='Ni_defect_s0', 

21 calc=gpw_files[gpw], 

22 M=M, 

23 spin=0, 

24 spinorbit=False) 

25 e_mk, P_mk = unfold.get_spectral_weights(bp.kpts) 

26 N0 = len(e_mk) 

27 assert P_mk == pytest.approx(1, abs=1.0e-6) 

28 

29 # Spin 1 

30 unfold = Unfold(name='Ni_defect_s1', 

31 calc=gpw_files[gpw], 

32 M=M, 

33 spin=1, 

34 spinorbit=False) 

35 e_mk, P_mk = unfold.get_spectral_weights(bp.kpts) 

36 N1 = len(e_mk) 

37 assert P_mk == pytest.approx(1, abs=1.0e-6) 

38 

39 # Full bands including nscf spin-orbit 

40 unfold = Unfold(name='Ni_defect_soc', 

41 calc=gpw_files[gpw], 

42 M=M, 

43 spinorbit=True) 

44 e_mk, P_mk = unfold.get_spectral_weights(bp.kpts) 

45 Nm = len(e_mk) 

46 assert P_mk == pytest.approx(1, abs=1.0e-6) 

47 assert Nm == N0 + N1 

48 

49 # Non-collinear calculation with self-consistent spin–orbit 

50 gpw = 'fcc_Ni_ncolsoc' 

51 calc_ncol = GPAW(gpw_files[gpw], 

52 parallel={'domain': 1, 'band': 1}) 

53 pc = calc_ncol.atoms.get_cell(complete=True) 

54 

55 bp = pc.get_bravais_lattice().bandpath('GX', npoints=3) 

56 

57 M = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] 

58 

59 unfold = Unfold(name='Ni_defect_nc', 

60 calc=gpw_files[gpw], 

61 M=M) 

62 e_mk, P_mk = unfold.get_spectral_weights(bp.kpts) 

63 assert P_mk == pytest.approx(1, abs=1.0e-6) 

64 

65 

66def test_lcao(in_tmp_dir): 

67 atoms = Atoms('H', [[2.0, 2.0, 0.0]], cell=[4.0, 4.0, 0.9], pbc=True) 

68 atoms *= (1, 1, 2) 

69 atoms.calc = GPAW(mode='lcao', 

70 basis='dzp', 

71 kpts=(1, 1, 4), 

72 txt='gs.txt') 

73 atoms.get_potential_energy() 

74 atoms.calc.write('gs.gpw', 'all') 

75 

76 M = [[1, 0, 0], [0, 1, 0], [0, 0, 2]] 

77 

78 kpts = [[0, 0, 0], [0, 0, 0.25]] 

79 Kpts = [] 

80 for k in kpts: 

81 K = find_K_from_k(k, M)[0] 

82 Kpts.append(K) 

83 

84 print(Kpts) 

85 

86 calc_bands = GPAW('gs.gpw').fixed_density( 

87 kpts=Kpts, 

88 symmetry='off', 

89 nbands=4, 

90 convergence={'bands': 2}) 

91 

92 calc_bands.write('bands.gpw', 'all') 

93 

94 unfold = Unfold(name='2', 

95 calc='bands.gpw', 

96 M=M, 

97 spinorbit=False) 

98 unfold.get_spectral_weights(kpts)