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

1import pytest 

2import numpy as np 

3import ase.io.ulm as ulm 

4 

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 

11 

12 

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) 

25 

26 # Write a restart point 

27 td_calc.write('td.gpw', mode='all') 

28 fdm.write('fdm_restart_point.ulm') 

29 

30 # Keep propagating 

31 td_calc.propagate(20, 3) 

32 fdm.write('fdm_final_ref.ulm') 

33 

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

43 

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

50 

51 tol = 1e-10 

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

53 

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) 

61 

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

67 

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] 

108 

109 print('result') 

110 print(data.tolist()) 

111 

112 tol = 1e-9 

113 assert data == pytest.approx(ref, abs=tol)