Branch data Line data Source code
1 : : !!****m* ABINIT/m_rttddft_driver
2 : : !! NAME
3 : : !! m_rttddft_driver
4 : : !!
5 : : !! FUNCTION
6 : : !! Real-Time Time Dependent DFT (RT-TDDFT)
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2021-2026 ABINIT group (FB)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_rttddft_driver
23 : :
24 : : use defs_basis
25 : : use defs_abitypes, only: MPI_type
26 : : use defs_datatypes, only: pseudopotential_type
27 : : use m_dtfil, only: datafiles_type
28 : : use m_dtset, only: dataset_type
29 : : use m_errors, only: msg_hndl
30 : : use m_pawang, only: pawang_type
31 : : use m_pawrad, only: pawrad_type
32 : : use m_pawtab, only: pawtab_type
33 : : use m_rttddft_output, only: rttddft_output
34 : : use m_rttddft_tdks, only: tdks_type
35 : : use m_rttddft_propagate, only: rttddft_propagate_ele
36 : : use m_rttddft_properties, only: rttddft_calc_density, &
37 : : & rttddft_calc_etot, &
38 : : & rttddft_calc_current
39 : : use m_specialmsg, only: wrtout
40 : : use m_time, only: cwtime
41 : :
42 : : implicit none
43 : :
44 : : private
45 : : !!***
46 : :
47 : : public :: rttddft
48 : : !!***
49 : :
50 : : contains
51 : : !!***
52 : :
53 : : !!****f* m_rttddft_driver/rttddft
54 : : !! NAME
55 : : !! rttddft
56 : : !!
57 : : !! FUNCTION
58 : : !! Primary routine for real-time TDDFT calculations.
59 : : !! 1) Initialization: create main tdks (Time-Dependent Kohn-Sham) object
60 : : !! - intialize various important parameters
61 : : !! - read intial KS orbitals in WFK file
62 : : !! - compute initial density from KS orbitals
63 : : !! 2) Propagation loop (rttddft_propagate):
64 : : !! for i = 1, ntime
65 : : !! - propagate KS orbitals
66 : : !! - propagate nuclei if requested (Erhenfest dynamics)
67 : : !! - compute new density
68 : : !! - Compute and print requested properties
69 : : !! 3) Final printout and finalize
70 : : !!
71 : : !! INPUTS
72 : : !! codvsn = code version
73 : : !! dtfil <type datafiles_type> = infos about file names
74 : : !! dtset <type(dataset_type)> = all input variables for this dataset
75 : : !! mpi_enreg <MPI_type> = MPI-parallelisation information
76 : : !! pawang <type(pawang_type)> = paw angular mesh and related data
77 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)> = paw radial mesh and related data
78 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)> = paw tabulated starting data
79 : : !! psps <type(pseudopotential_type)> = variables related to pseudopotentials
80 : : !!
81 : : !! OUTPUT
82 : : !!
83 : : !! SOURCE
84 : 50 : subroutine rttddft(codvsn,dtfil,dtset,mpi_enreg,pawang,pawrad,pawtab,psps)
85 : :
86 : : !Arguments ------------------------------------
87 : : !scalars
88 : : character(len=8), intent(in) :: codvsn
89 : : type(dataset_type), intent(inout) :: dtset
90 : : type(datafiles_type), intent(inout) :: dtfil
91 : : type(MPI_type), intent(inout) :: mpi_enreg
92 : : type(pawang_type), intent(inout) :: pawang
93 : : type(pseudopotential_type), intent(inout) :: psps
94 : : !arrays
95 : : type(pawrad_type), target, intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
96 : : type(pawtab_type), target, intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
97 : :
98 : : !Local variables-------------------------------
99 : : !scalars
100 : : character(len=500) :: msg
101 : : integer :: istep
102 : : real(dp) :: integrated_density, stability
103 : 50 : type(tdks_type) :: tdks
104 : : !arrays
105 : : real(dp) :: cpu, wall, gflops
106 : :
107 : : ! ***********************************************************************
108 : :
109 : 50 : write(msg,'(7a)') ch10,'---------------------------------------------------------------------------',&
110 : 50 : & ch10,'---------------- Starting real-time time dependent DFT ----------------',&
111 : 100 : & ch10,'---------------------------------------------------------------------------',ch10
112 : 50 : call wrtout(ab_out,msg)
113 [ + + ]: 50 : if (do_write_log) call wrtout(std_out,msg)
114 : 50 : write(msg,'(7a)') ch10,' RT-TDDFT is under active development and should thus be used with caution ',&
115 : 100 : & ch10,'---------------------------------------------------------------------------',ch10
116 [ + + ]: 50 : if (do_write_log) call wrtout(std_out,msg)
117 : :
118 : : !** 1) Initialization: create main tdks (Time-Dependent Kohn-Sham) object
119 : 50 : write(msg,'(3a)') ch10,'--------------------------- Initialization ----------------------------',ch10
120 : 50 : call wrtout(ab_out,msg)
121 [ + + ]: 50 : if (do_write_log) call wrtout(std_out,msg)
122 : :
123 : 50 : call tdks%init(codvsn,dtfil,dtset,mpi_enreg,pawang,pawrad,pawtab,psps)
124 : :
125 : : !Compute initial electronic density
126 : 50 : call rttddft_calc_density(dtset,mpi_enreg,psps,tdks)
127 : :
128 : : !Compute current at t=0 (or t-dt) and update vector potential accordingly
129 [ + + - + ]: 50 : if (dtset%prtcurrent/=0 .or. tdks%tdef%induced_vecpot) then
130 : 21 : call rttddft_calc_current(tdks,dtset,dtfil,psps,mpi_enreg)
131 : : end if
132 : :
133 : : !** 2) Propagation loop
134 : 50 : write(msg,'(3a)') ch10,'------------------------- Starting propagation ------------------------',ch10
135 : 50 : call wrtout(ab_out,msg)
136 [ + + ]: 50 : if (do_write_log) call wrtout(std_out,msg)
137 : :
138 [ + + ]: 1774 : do istep = tdks%first_step, tdks%first_step+tdks%ntime-1
139 : :
140 : 1725 : call cwtime(cpu,wall,gflops,"start")
141 : :
142 : : !*** Perform electronic step ***
143 : : !Compute new WF at time t and energy contribution at time t-dt
144 : 1725 : call rttddft_propagate_ele(dtset,istep,mpi_enreg,psps,tdks)
145 : :
146 : : !Compute total energy at time t-dt
147 : 1725 : call rttddft_calc_etot(dtset,tdks%energies,tdks%etot,tdks%occ)
148 : :
149 : : !Update electric field and vector potential value
150 : : call tdks%tdef%update(dtset,mpi_enreg,istep*tdks%dt,tdks%rprimd,tdks%gprimd,tdks%kg, &
151 : 1725 : & psps%mpsang,tdks%npwarr,tdks%ylm,tdks%ylmgr,tdks%current)
152 : :
153 : : !Compute new electronic density at t
154 : 1725 : call rttddft_calc_density(dtset,mpi_enreg,psps,tdks)
155 : :
156 : : !Compute current at t
157 [ + + - + ]: 1725 : if (dtset%prtcurrent/=0 .or. tdks%tdef%induced_vecpot) then
158 : 1100 : call rttddft_calc_current(tdks,dtset,dtfil,psps,mpi_enreg)
159 : : end if
160 : :
161 : : !Compute and output useful electronic values
162 : 1725 : call rttddft_output(dtfil,dtset,istep,mpi_enreg,psps,tdks)
163 : :
164 : : !Test of stability
165 [ + + ]: 29324940 : integrated_density = sum(tdks%rhor(:,1))*tdks%ucvol/tdks%nfftf
166 : 1725 : stability = abs(integrated_density-dtset%nelect)/dtset%nelect
167 [ + + ]: 1725 : if (stability > 0.1_dp) then
168 : 1 : write(msg,"(3a)") "The integrated density has changed by more than 10%!", ch10, &
169 : 2 : & "The integration is unstable, you should probably decrease the timestep dtele."
170 : 1 : ABI_ERROR(msg)
171 [ + + ]: 1724 : else if (stability > 0.05_dp) then
172 : 1 : write(msg,"(3a)") "The integrated density has changed by more than 5%!", ch10, &
173 : 2 : & "You should be careful, the integration might be unstable"
174 : 1 : ABI_WARNING(msg)
175 : : end if
176 : :
177 : : !TODO: *** Perform nuclear step ***
178 : : ! For Ehrenfest dynamics
179 : : !call rttddft_propagate_nuc(dtset,istep,mpi_enreg,psps,tdks)
180 : :
181 : 1724 : call cwtime(cpu,wall,gflops,"stop")
182 : 1724 : write(msg,'(a,2f8.2,a)') '- Time - cpu, wall (sec):', cpu, wall, ch10
183 : 1724 : call wrtout(ab_out,msg)
184 [ + + ]: 5222 : if (do_write_log) call wrtout(std_out,msg)
185 : :
186 : : end do
187 : :
188 : : !** 3) Final Output and free memory
189 : 49 : write(msg,'(7a)') ch10,'---------------------------------------------------------------------------',&
190 : 49 : & ch10,'---------------- Finished real-time time dependent DFT ----------------',&
191 : 98 : & ch10,'---------------------------------------------------------------------------',ch10
192 : 49 : call wrtout(ab_out,msg)
193 [ + + ]: 49 : if (do_write_log) call wrtout(std_out,msg)
194 : :
195 : 49 : call tdks%free(dtset,mpi_enreg,psps)
196 : :
197 [ - + - + : 49 : end subroutine rttddft
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - +
- + - + -
+ - + - -
- - - - -
- - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - - -
- - - - +
- - - - -
- - + - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - +
- - - - -
- - - - -
- - - - -
- - - - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - ]
198 : : !!***
199 : :
200 : : end module m_rttddft_driver
201 : : !!***
|