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

1import numpy as np 

2import pytest 

3 

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 

9 

10 

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) 

22 

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') 

32 

33 world.barrier() 

34 ref_i = np.loadtxt('spec.dat').ravel() 

35 

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) 

42 

43 world.barrier() 

44 

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() 

49 

50 tol = 1e-10 

51 assert data_i == pytest.approx(ref_i, abs=tol)