Coverage for gpaw/test/lcaotddft/test_propagators.py: 100%

37 statements  

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

1import pytest 

2import numpy as np 

3from gpaw.lcaotddft import LCAOTDDFT 

4from gpaw.lcaotddft.dipolemomentwriter import DipoleMomentWriter 

5from gpaw.lcaotddft.dipolemomentwriter import VelocityGaugeWriter 

6 

7 

8@pytest.mark.rttddft 

9@pytest.mark.parametrize('propagator', ['sicn', 'scpc', 'ecn']) 

10def test_propagators(propagator, gpw_files, in_tmp_dir): 

11 # XXX convergence={'density': 1e-8} originally 1e-12 

12 td_calc = LCAOTDDFT(gpw_files['na2_tddft_dzp'], propagator=propagator) 

13 DipoleMomentWriter(td_calc, 'dm.dat') 

14 td_calc.absorption_kick([0.0, 0.0, 1e-5]) 

15 td_calc.propagate(40, 20) 

16 data = np.loadtxt('dm.dat') 

17 

18 # Make sure that norm and x and y components are zero 

19 assert data[:, 1:4] == pytest.approx(0, abs=1e-8) 

20 # Isolate z-directional data for comparison 

21 data_i = data[:, 4] 

22 

23 if propagator == 'sicn': 

24 ref_i = [1.440334447474e-15, 

25 1.125313930892e-15, 

26 3.584347565411e-05, 

27 7.109522259009e-05, 

28 1.051768025451e-04, 

29 1.375320463618e-04, 

30 1.676368375148e-04, 

31 1.950075908129e-04, 

32 2.192083357657e-04, 

33 2.398564722712e-04, 

34 2.566273642857e-04, 

35 2.692579717986e-04, 

36 2.775497108433e-04, 

37 2.813706965647e-04, 

38 2.806574778736e-04, 

39 2.754163145186e-04, 

40 2.657239704053e-04, 

41 2.517278993102e-04, 

42 2.336455958733e-04, 

43 2.117628070554e-04, 

44 1.864302841758e-04, 

45 1.580588287559e-04] 

46 

47 elif propagator == 'scpc': 

48 ref_i = [1.440334447474e-15, 

49 1.125313930892e-15, 

50 3.584439590353e-05, 

51 7.109886048577e-05, 

52 1.051848309578e-04, 

53 1.375459452388e-04, 

54 1.676578426631e-04, 

55 1.950366598449e-04, 

56 2.192461280005e-04, 

57 2.399033382662e-04, 

58 2.566833411562e-04, 

59 2.693227827882e-04, 

60 2.776227689310e-04, 

61 2.814510134936e-04, 

62 2.807437787678e-04, 

63 2.755072543407e-04, 

64 2.658179386847e-04, 

65 2.518229288423e-04, 

66 2.337394843530e-04, 

67 2.118531419552e-04, 

68 1.865144815236e-04, 

69 1.581341901411e-04] 

70 

71 elif propagator == 'ecn': 

72 ref_i = [1.440334447474e-15, 

73 1.125313930892e-15, 

74 3.592248075296e-05, 

75 7.140807909782e-05, 

76 1.058673077088e-04, 

77 1.387243364676e-04, 

78 1.694288472618e-04, 

79 1.974671596663e-04, 

80 2.223720449505e-04, 

81 2.437308555076e-04, 

82 2.611918303868e-04, 

83 2.744686373485e-04, 

84 2.833433443564e-04, 

85 2.876680791149e-04, 

86 2.873656575748e-04, 

87 2.824294614402e-04, 

88 2.729228248343e-04, 

89 2.589781389459e-04, 

90 2.407957786298e-04, 

91 2.186427967116e-04, 

92 1.928511441932e-04, 

93 1.638150141478e-04] 

94 

95 assert data_i == pytest.approx(ref_i, abs=1e-8) 

96 

97 

98@pytest.mark.serial # Todo:remove later 

99@pytest.mark.rttddft 

100def test_velocity(gpw_files, in_tmp_dir): 

101 

102 td_calc = LCAOTDDFT(gpw_files['na2_tddft_dzp']) 

103 

104 VelocityGaugeWriter(td_calc, 'dm_velocityGauge.dat') 

105 td_calc.absorption_kick([0.0, 0.0, 1e-5], gauge='velocity') 

106 td_calc.propagate(10, 20) 

107 data_i = np.loadtxt('dm_velocityGauge.dat')[:, 4] 

108 ref_i = [0.000000000000e+00, 

109 0.000000000000e+00, 

110 1.006067165210e-08, 

111 4.016494936588e-08, 

112 9.010441886809e-08, 

113 1.595392493537e-07, 

114 2.480091681830e-07, 

115 3.549482463863e-07, 

116 4.797029544063e-07, 

117 6.215528195238e-07, 

118 7.797329169342e-07, 

119 9.534573665756e-07, 

120 1.141942968879e-06, 

121 1.344432105004e-06, 

122 1.560214064258e-06, 

123 1.788644005768e-06, 

124 2.029158870610e-06, 

125 2.281289660947e-06, 

126 2.544669639498e-06, 

127 2.819038164914e-06, 

128 3.104240038438e-06, 

129 3.400220392727e-06] 

130 assert data_i == pytest.approx(ref_i, abs=1e-10) 

131 from gpaw.tddft.spectrum import photoabsorption_spectrum 

132 photoabsorption_spectrum('dm_velocityGauge.dat', 'spec.dat') 

133 data_i = np.loadtxt('spec.dat') 

134 assert pytest.approx(-7.68e-7, 1e-5, 1e-9) == data_i[1, 3] 

135 assert pytest.approx(-3.07e-6, 1e-5, 1e-8) == data_i[2, 3]