Coverage for gpaw/test/lrtddft/test_kssingles.py: 100%

78 statements  

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

1import pytest 

2 

3from ase.build import molecule 

4 

5from gpaw.mpi import world 

6from gpaw import GPAW 

7from gpaw.lrtddft.kssingle import KSSingles 

8 

9 

10@pytest.mark.lrtddft 

11def test_old_io(in_tmp_dir): 

12 """Test reading of old style output files""" 

13 fname = 'veryold.dat' 

14 if world.rank == 0: 

15 with open(fname, 'w') as f: 

16 f.write("""# KSSingles 

172 

180 1 0 0 0.129018 1 -4.7624e-02 -3.2340e-01 -4.6638e-01 

190 1 1 0 0.129018 1 -4.7624e-02 -3.2340e-01 -4.6638e-01 

20""") 

21 world.barrier() 

22 

23 kss = KSSingles.read(fname) 

24 assert len(kss) == 2 

25 

26 fname = 'old.dat' 

27 if world.rank == 0: 

28 with open(fname, 'w') as f: 

29 f.write("""# KSSingles 

302 float64 

310.024 

320 1 0 0 0.392407 2 8.82 2.91 7.98 1.0 2.7 7.8 1.4 1.2 1.08 

330 2 0 0 0.402312 2 2.24 8.49 -5.24 2.3 8.26 -4.99038e-14 

34""") 

35 world.barrier() 

36 

37 kss = KSSingles.read(fname) 

38 assert len(kss) == 2 

39 assert kss.restrict['eps'] == 0.024 

40 

41 

42@pytest.fixture 

43def ch4(): 

44 ch4 = molecule('CH4') 

45 ch4.center(vacuum=2) 

46 ch4.calc = GPAW(mode='fd', h=0.25, nbands=8, txt=None) 

47 ch4.get_potential_energy() 

48 return ch4 

49 

50 

51@pytest.fixture 

52def ch4_kss(ch4): 

53 """Test multiplication with a number""" 

54 istart, jend = 1, 4 

55 kss = KSSingles(restrict={'eps': 0.9, 'istart': istart, 'jend': jend}) 

56 kss.calculate(ch4) 

57 return kss 

58 

59 

60@pytest.mark.lrtddft 

61def test_io(in_tmp_dir, ch4): 

62 # full KSSingles 

63 kssfull = KSSingles(restrict={'eps': 0.9}) 

64 kssfull.calculate(ch4) 

65 fullname = 'kssfull.dat' 

66 kssfull.write(fullname) 

67 world.barrier() 

68 

69 # read full 

70 kss1 = KSSingles.read(fullname) 

71 assert len(kss1) == 16 

72 

73 # restricted KSSingles 

74 istart, jend = 1, 4 

75 kss = KSSingles(restrict={'eps': 0.9, 'istart': istart, 'jend': jend}) 

76 kss.calculate(ch4) 

77 f14name = 'kss_1_4.dat' 

78 kss.write(f14name) 

79 world.barrier() 

80 

81 kss2 = KSSingles.read(f14name) 

82 assert len(kss2) == len(kss) 

83 assert kss2.restrict['istart'] == istart 

84 assert kss2.restrict['jend'] == jend 

85 

86 # restrict when reading 

87 kss3 = KSSingles.read(fullname, 

88 restrict={'istart': istart, 'jend': jend}) 

89 assert len(kss3) == len(kss) 

90 assert kss3.restrict['istart'] == istart 

91 assert kss3.restrict['jend'] == jend 

92 

93 

94@pytest.mark.lrtddft 

95def test_mul(ch4_kss): 

96 """Test multiplication with a number""" 

97 ks0 = ch4_kss[0] 

98 ks1 = 1. * ks0 

99 assert (ks0.me == ks1.me).all() 

100 assert (ks0.magn == ks1.magn).all() 

101 

102 

103@pytest.mark.lrtddft 

104def test_add_sub(in_tmp_dir): 

105 """Test adding and subtracting""" 

106 fname = 'kss_with_magn.dat' 

107 if world.rank == 0: 

108 with open(fname, 'w') as f: 

109 # output for C3H6O, see gpaw/test/lrtddft/test_lrtddft2.py 

110 f.write("""# KSSingles 

1112 float64 

112{"istart": 10, "jend": 12} 

11310 12 0 0 0.2834260231 2.000000 -6.99002e-02 3.49407e-02 3.84815e-02 -6.12491e-02 2.91457e-02 3.60540e-02 5.66737e-04 -3.65251e-04 -1.34614e-03 

11411 12 0 0 0.2396446019 2.000000 8.73651e-02 -1.01160e-01 -2.82990e-01 7.60765e-02 -9.83790e-02 -2.78192e-01 6.38772e-04 -2.97370e-04 -8.74882e-04 

115""") # noqa 

116 world.barrier() 

117 

118 kss = KSSingles.read(fname) 

119 

120 ks_add = kss[0] + (-1 * kss[1]) 

121 ks_sub = kss[0] - kss[1] 

122 

123 assert ks_add.me == pytest.approx(ks_sub.me) 

124 assert ks_add.mur == pytest.approx(ks_sub.mur) 

125 assert ks_add.muv == pytest.approx(ks_sub.muv) 

126 assert ks_add.magn == pytest.approx(ks_sub.magn)