Coverage for gpaw/test/lcaotddft/test_replay.py: 100%
36 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-20 00:19 +0000
1import numpy as np
2import pytest
4from gpaw.lcaotddft import LCAOTDDFT
5from gpaw.lcaotddft.dipolemomentwriter import DipoleMomentWriter
6from gpaw.lcaotddft.wfwriter import WaveFunctionWriter
7from gpaw.mpi import world
8from gpaw.tddft.spectrum import photoabsorption_spectrum
11@pytest.mark.rttddft
12def test_lcaotddft_replay(gpw_files, in_tmp_dir):
13 # Time-propagation calculation
14 td_calc = LCAOTDDFT(gpw_files['na2_tddft_dzp'], txt='td.out')
15 DipoleMomentWriter(td_calc, 'dm.dat')
16 WaveFunctionWriter(td_calc, 'wf.ulm')
17 WaveFunctionWriter(td_calc, 'wf_split.ulm', split=True)
18 td_calc.absorption_kick(np.ones(3) * 1e-5)
19 td_calc.propagate(20, 3)
20 td_calc.write('td.gpw', mode='all')
21 td_calc.propagate(7, 3)
23 # Restart from the restart point
24 td_calc = LCAOTDDFT('td.gpw', txt='td2.out')
25 DipoleMomentWriter(td_calc, 'dm.dat')
26 WaveFunctionWriter(td_calc, 'wf.ulm')
27 WaveFunctionWriter(td_calc, 'wf_split.ulm')
28 td_calc.propagate(20, 3)
29 td_calc.propagate(20, 3)
30 td_calc.propagate(10, 3)
31 photoabsorption_spectrum('dm.dat', 'spec.dat')
33 world.barrier()
34 ref_i = np.loadtxt('spec.dat').ravel()
36 # Replay both wf*.ulm files
37 for tag in ['', '_split']:
38 td_calc = LCAOTDDFT(gpw_files['na2_tddft_dzp'], txt='rep%s.out' % tag)
39 DipoleMomentWriter(td_calc, 'dm_rep%s.dat' % tag)
40 td_calc.replay(name='wf%s.ulm' % tag, update='density')
41 photoabsorption_spectrum('dm_rep%s.dat' % tag, 'spec_rep%s.dat' % tag)
43 world.barrier()
45 # Check the spectrum files
46 # Do this instead of dipolemoment files in order to see that the kick
47 # was also written correctly in replaying
48 data_i = np.loadtxt('spec_rep%s.dat' % tag).ravel()
50 tol = 1e-10
51 assert data_i == pytest.approx(ref_i, abs=tol)