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
« 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
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')
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]
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]
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]
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]
95 assert data_i == pytest.approx(ref_i, abs=1e-8)
98@pytest.mark.serial # Todo:remove later
99@pytest.mark.rttddft
100def test_velocity(gpw_files, in_tmp_dir):
102 td_calc = LCAOTDDFT(gpw_files['na2_tddft_dzp'])
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]