Coverage for gpaw/test/lcaotddft/test_restart.py: 100%
48 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-08 00:17 +0000
1import pytest
2import numpy as np
3import ase.io.ulm as ulm
5from gpaw.lcaotddft import LCAOTDDFT
6from gpaw.lcaotddft.dipolemomentwriter import DipoleMomentWriter
7from gpaw.lcaotddft.densitymatrix import DensityMatrix
8from gpaw.lcaotddft.frequencydensitymatrix import FrequencyDensityMatrix
9from gpaw.mpi import world
10from gpaw.tddft.folding import frequencies
13@pytest.mark.gllb
14@pytest.mark.libxc
15@pytest.mark.rttddft
16def test_lcaotddft_restart(gpw_files, in_tmp_dir):
17 # Time-propagation calculation
18 td_calc = LCAOTDDFT(gpw_files['sih4_xc_gllbsc_lcao'], txt='td.out')
19 DipoleMomentWriter(td_calc, 'dm.dat')
20 dmat = DensityMatrix(td_calc)
21 freqs = frequencies(np.arange(0.05, 6.01, 1.0), None, None)
22 fdm = FrequencyDensityMatrix(td_calc, dmat, frequencies=freqs)
23 td_calc.absorption_kick(np.ones(3) * 1e-5)
24 td_calc.propagate(20, 3)
26 # Write a restart point
27 td_calc.write('td.gpw', mode='all')
28 fdm.write('fdm_restart_point.ulm')
30 # Keep propagating
31 td_calc.propagate(20, 3)
32 fdm.write('fdm_final_ref.ulm')
34 # Restart from the restart point
35 td_calc = LCAOTDDFT('td.gpw', txt='td2.out')
36 DipoleMomentWriter(td_calc, 'dm.dat')
37 dmat = DensityMatrix(td_calc)
38 fdm = FrequencyDensityMatrix(td_calc, dmat,
39 filename='fdm_restart_point.ulm')
40 td_calc.propagate(20, 3)
41 fdm.write('fdm_final_check.ulm')
42 world.barrier()
44 # Check dipole moment file
45 data_tj = np.loadtxt('dm.dat')
46 # Original run
47 ref_i = data_tj[4:8].ravel()
48 # Restarted steps
49 data_i = data_tj[8:].ravel()
51 tol = 1e-10
52 assert data_i == pytest.approx(ref_i, abs=tol)
54 tol = 1e-8
55 # Check frequency density matrix file
56 with ulm.open('fdm_final_ref.ulm') as fdm_ref:
57 with ulm.open('fdm_final_check.ulm') as fdm_check:
58 for key in ['FReDrho_wuMM', 'FImDrho_wuMM', 'rho0_uMM', 'time']:
59 assert fdm_ref.get(key) == pytest.approx(fdm_check.get(key),
60 abs=tol)
62 # Test the absolute values
63 data = np.loadtxt('dm.dat')[:8].ravel()
64 if 0:
65 from gpaw.test import print_reference
66 print_reference(data, 'ref', '%.12le')
68 ref = [0.000000000000e+00,
69 1.440746980000e-15,
70 -5.150207058975e-14,
71 -2.111502433286e-14,
72 -7.898943127163e-15,
73 0.000000000000e+00,
74 2.611197480000e-15,
75 -8.396549188150e-14,
76 -2.905622138206e-14,
77 -3.511635310469e-14,
78 8.268274700000e-01,
79 7.301260440000e-17,
80 6.205222369795e-05,
81 6.205222375484e-05,
82 6.205222374486e-05,
83 1.653654930000e+00,
84 -2.352185940000e-15,
85 1.001902218476e-04,
86 1.001902218874e-04,
87 1.001902218743e-04,
88 2.480482400000e+00,
89 1.199595930000e-15,
90 1.069904191357e-04,
91 1.069904191591e-04,
92 1.069904191494e-04,
93 3.307309870000e+00,
94 1.993145110000e-16,
95 9.190706194380e-05,
96 9.190706194210e-05,
97 9.190706193849e-05,
98 4.134137330000e+00,
99 1.527615730000e-15,
100 6.808273775138e-05,
101 6.808273772079e-05,
102 6.808273772212e-05,
103 4.960964800000e+00,
104 1.490415960000e-15,
105 4.135613094036e-05,
106 4.135613089495e-05,
107 4.135613089985e-05]
109 print('result')
110 print(data.tolist())
112 tol = 1e-9
113 assert data == pytest.approx(ref, abs=tol)