(git:5b564c2)
Loading...
Searching...
No Matches
rt_bse_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Data storage and other types for propagation via RT-BSE method.
10!> \author Stepan Marek (01.24)
11! **************************************************************************************************
12
14
15 USE kinds, ONLY: dp
16 USE cp_fm_types, ONLY: cp_fm_type, &
20 USE cp_cfm_types, ONLY: cp_cfm_type, &
26 USE cp_dbcsr_api, ONLY: dbcsr_type, &
32 USE dbt_api, ONLY: dbt_type, &
33 dbt_create, &
34 dbt_destroy
35 USE qs_mo_types, ONLY: mo_set_type
49 do_bch, &
51 USE mathconstants, ONLY: z_zero
55
56#include "../base/base_uses.f90"
57
58 IMPLICIT NONE
59
60 PRIVATE
61
62 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = "rt_bse"
63
64
65
66
67 PUBLIC :: rtbse_env_type, &
74
75 ! ! Created so that we can have an array of pointers to arrays
76 ! TYPE series_real_type
77 ! REAL(kind=dp), DIMENSION(:), POINTER :: series => NULL()
78 ! END TYPE series_real_type
79 ! TYPE series_complex_type
80 ! COMPLEX(kind=dp), DIMENSION(:), POINTER :: series => NULL()
81 ! END TYPE series_complex_type
82
83! **************************************************************************************************
84!> \param n_spin Number of spin channels that are present
85!> \param n_ao Number of atomic orbitals
86!> \param n_RI Number of RI orbitals
87!> \param n_occ Number of occupied orbitals, spin dependent
88!> \param spin_degeneracy Number of electrons per orbital
89!> \param field Electric field calculated at the given timestep
90!> \param moments Moment operators along cartesian directions - centered at zero charge - used for plotting
91!> \param moments_field Moment operators along cartesian directions - used to coupling to the field -
92!> origin bound to unit cell
93!> \param sim_step Current step of the simulation
94!> \param sim_start Starting step of the simulation
95!> \param sim_nsteps Number of steps of the simulation
96!> \param sim_time Current time of the simulation
97!> \param sim_dt Timestep of the simulation
98!> \param etrs_threshold Self-consistency threshold for enforced time reversal symmetry propagation
99!> \param exp_accuracy Threshold for matrix exponential calculation
100!> \param dft_control DFT control parameters
101!> \param ham_effective Real and imaginary part of the effective Hamiltonian used to propagate
102!> the density matrix
103!> \param ham_reference Reference Hamiltonian, which does not change in the propagation = DFT+G0W0 - initial Hartree - initial COHSEX
104!> \param ham_workspace Workspace matrices for use with the Hamiltonian propagation - storage of
105!> exponential propagators etc.
106!> \param rho Density matrix at the current time step
107!> \param rho_new Density matrix - workspace in ETRS
108!> \param rho_last Density matrix - workspace in ETRS
109!> \param rho_new_last Density matrix - workspace in ETRS
110!> \param rho_M Density matrix - workspace in ETRS
111!> \param S_inv_fm Inverse overlap matrix, full matrix
112!> \param S_fm Overlap matrix, full matrix
113!> \param S_inv Inverse overlap matrix, sparse matrix
114!> \param rho_dbcsr Density matrix, sparse matrix
115!> \param rho_workspace Matrices for storage of density matrix at different timesteps for
116!> interpolation and self-consistency checks etc.
117!> \param complex_workspace Workspace for complex density (exact diagonalisation)
118!> \param complex_s Complex overlap matrix (exact diagonalisation)
119!> \param real_eigvals Eigenvalues of hermitian matrix (exact diagonalisation)
120!> \param exp_eigvals Exponentiated eigenvalues (exact diagonalisation)
121!> \param v_dbcsr Sparse matrix with bare Coulomb in RI basis
122!> \param w_dbcsr Sparse matrix with correlation part of dressed Coulomb in RI basis (without bare Coulomb)
123!> \param screened_dbt Tensor for screened Coulomb interaction
124!> \param greens_dbt Tensor for greens function/density matrix
125!> \param t_3c_w Tensor containing 3c integrals
126!> \param t_3c_work_RI_AO__AO Tensor sigma contraction
127!> \param t_3c_work2_RI_AO__AO Tensor sigma contraction
128!> \param sigma_SEX Screened exchange self-energy
129!> \param sigma_COH Coulomb hole self-energy
130!> \param hartree_curr Current Hartree matrix
131!> \param etrs_max_iter Maximum number of ETRS iterations
132!> \param ham_reference_type Which Hamiltonian to use as single particle basis
133!> \param mat_exp_method Which method to use for matrix exponentiation
134!> \param unit_nr Number of output unit
135!> \param int_3c_array Array containing the local 3c integrals
136!> \author Stepan Marek (01.24)
137! **************************************************************************************************
139 INTEGER :: n_spin = 1, &
140 n_ao = -1, &
141 n_ri = -1
142 INTEGER, DIMENSION(2) :: n_occ = -1
143 REAL(kind=dp) :: spin_degeneracy = 2
144 REAL(kind=dp), DIMENSION(3) :: field = 0.0_dp
145 TYPE(cp_fm_type), DIMENSION(:), POINTER :: moments => null(), &
146 moments_field => null()
147 INTEGER :: sim_step = 0, &
148 sim_start = 0, &
149 ! Needed for continuation runs for loading of previous moments trace
150 sim_start_orig = 0, &
151 sim_nsteps = -1, &
152 ! Default reference point type for output moments
153 ! Field moments always use zero reference
154 moment_ref_type = use_mom_ref_coac
155 REAL(kind=dp), DIMENSION(:), POINTER :: user_moment_ref_point => null()
156 REAL(kind=dp) :: sim_time = 0.0_dp, &
157 sim_dt = 0.1_dp, &
158 etrs_threshold = 1.0e-7_dp, &
159 exp_accuracy = 1.0e-10_dp, &
160 ft_damping = 0.0_dp, &
161 ft_start = 0.0_dp
162 ! Which element of polarizability to print out
163 INTEGER, DIMENSION(:, :), POINTER :: pol_elements => null()
164 TYPE(dft_control_type), POINTER :: dft_control => null()
165 ! DEBUG : Trying keeping the reference to previous environments inside this one
166 TYPE(qs_environment_type), POINTER :: qs_env => null()
167 TYPE(post_scf_bandstructure_type), POINTER :: bs_env => null()
168 ! Stores data needed for reading/writing to the restart files
169 TYPE(section_vals_type), POINTER :: restart_section => null(), &
170 field_section => null(), &
171 rho_section => null(), &
172 ft_section => null(), &
173 pol_section => null(), &
174 moments_section => null(), &
175 rtp_section => null()
176 LOGICAL :: restart_extracted = .false.
177
178 ! Different indices signify different spins
179 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_effective => null()
180 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_reference => null()
181 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_workspace => null()
182 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: sigma_sex => null()
183 TYPE(cp_fm_type), DIMENSION(:), POINTER :: sigma_coh => null(), &
184 hartree_curr => null()
185
186 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: rho => null(), &
187 rho_new => null(), &
188 rho_new_last => null(), &
189 rho_m => null(), &
190 rho_orig => null()
191 TYPE(cp_fm_type) :: s_inv_fm = cp_fm_type(), &
192 s_fm = cp_fm_type()
193 ! Many routines require overlap in the complex format
194 TYPE(cp_cfm_type) :: s_cfm = cp_cfm_type()
195 TYPE(dbcsr_type) :: rho_dbcsr = dbcsr_type(), &
196 v_ao_dbcsr = dbcsr_type()
197 ! Indices only correspond to different workspaces
198 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: rho_workspace => null()
199 ! Many methods use real and imaginary parts separately - prevent unnecessary reallocation
200 TYPE(cp_fm_type), DIMENSION(:), POINTER :: real_workspace => null()
201 ! Workspace required for exact matrix exponentiation
202 REAL(kind=dp), DIMENSION(:), POINTER :: real_eigvals => null()
203 COMPLEX(kind=dp), DIMENSION(:), POINTER :: exp_eigvals => null()
204 ! Workspace for saving the values for FT
205 ! TODO : Change back to multi-dimensional arrays
206 ! Index 1 : spin, Index 2 : direction, Index 3 : time point
207 COMPLEX(kind=dp), DIMENSION(:, :, :), POINTER :: moments_trace => null()
208 REAL(kind=dp), DIMENSION(:), POINTER :: time_trace => null()
209 ! Index 1 : direction, Index 2 : time point
210 COMPLEX(kind=dp), DIMENSION(:, :), POINTER :: field_trace => null()
211 ! Workspace required for hartree_pw
212 TYPE(dbcsr_type) :: v_dbcsr = dbcsr_type(), &
213 w_dbcsr = dbcsr_type()
214#if defined(FTN_NO_DEFAULT_INIT)
215 TYPE(dbt_type) :: screened_dbt, &
216 greens_dbt, &
217 t_3c_w, &
218 t_3c_work_ri_ao__ao, &
219 t_3c_work2_ri_ao__ao
220#else
221 TYPE(dbt_type) :: screened_dbt = dbt_type(), &
222 greens_dbt = dbt_type(), &
223 t_3c_w = dbt_type(), &
224 t_3c_work_ri_ao__ao = dbt_type(), &
225 t_3c_work2_ri_ao__ao = dbt_type()
226#endif
227 ! These matrices are always real
228 INTEGER :: etrs_max_iter = 10
229 INTEGER :: ham_reference_type = 2
230 INTEGER :: mat_exp_method = 4
231 INTEGER :: unit_nr = -1
232 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: int_3c_array => null()
233 ! Parameters for Padé refinement
234 REAL(kind=dp) :: pade_e_min = 0.0_dp, &
235 pade_e_max = 100.0_dp, &
236 pade_e_step = 0.05_dp, &
237 pade_fit_e_min = 0.0_dp, &
238 pade_fit_e_max = -1.0_dp
239 INTEGER :: pade_npoints = 0
240 LOGICAL :: pade_requested = .false.
241 COMPLEX(kind=dp), DIMENSION(:), POINTER :: pade_x_eval => null()
242
243 END TYPE rtbse_env_type
244
245CONTAINS
246
247! **************************************************************************************************
248!> \brief Allocates structures and prepares rtbse_env for run
249!> \param rtbse_env rtbse_env_type that is initialised
250!> \param qs_env Entry point of the calculation
251!> \author Stepan Marek
252!> \date 02.2024
253! **************************************************************************************************
254 SUBROUTINE create_rtbse_env(rtbse_env, qs_env, force_env)
255 TYPE(rtbse_env_type), POINTER :: rtbse_env
256 TYPE(qs_environment_type), POINTER :: qs_env
257 TYPE(force_env_type), POINTER :: force_env
258 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
259 TYPE(rt_prop_type), POINTER :: rtp
260 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
261 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
262 INTEGER :: i, k
263 TYPE(section_vals_type), POINTER :: input, bs_sec, md_sec
264
265 ! Allocate the storage for the gwbse environment
266 NULLIFY (rtbse_env)
267 ALLOCATE (rtbse_env)
268 ! Extract the other types first
269 CALL get_qs_env(qs_env, &
270 bs_env=bs_env, &
271 rtp=rtp, &
272 matrix_s=matrix_s, &
273 mos=mos, &
274 dft_control=rtbse_env%dft_control, &
275 input=input)
276 bs_sec => section_vals_get_subs_vals(input, "PROPERTIES%BANDSTRUCTURE")
277 IF (.NOT. ASSOCIATED(bs_env)) THEN
278 cpabort("Cannot run RT-BSE without running GW calculation (PROPERTIES) before")
279 END IF
280 ! Number of spins
281 rtbse_env%n_spin = bs_env%n_spin
282 ! Number of atomic orbitals
283 rtbse_env%n_ao = bs_env%n_ao
284 ! Number of auxiliary basis orbitals
285 rtbse_env%n_RI = bs_env%n_RI
286 ! Number of occupied orbitals - for closed shell equals to half the number of electrons
287 rtbse_env%n_occ(:) = bs_env%n_occ(:)
288 ! Spin degeneracy - number of spins per orbital
289 rtbse_env%spin_degeneracy = bs_env%spin_degeneracy
290 ! Default field is zero
291 rtbse_env%field(:) = 0.0_dp
292 ! Default time is zero
293 rtbse_env%sim_step = 0
294 rtbse_env%sim_time = 0
295 ! Time step is taken from rtp
296 md_sec => section_vals_get_subs_vals(force_env%root_section, "MOTION%MD")
297 CALL section_vals_val_get(md_sec, "TIMESTEP", r_val=rtbse_env%sim_dt)
298 ! rtbse_env%sim_dt = rtp%dt
299 ! Threshold for etrs is taken from the eps_energy from RT propagation
300 rtbse_env%etrs_threshold = rtbse_env%dft_control%rtp_control%eps_ener
301 rtbse_env%exp_accuracy = rtbse_env%dft_control%rtp_control%eps_exp
302 ! Recover custom options
303 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%RTBSE%RTBSE_HAMILTONIAN", &
304 i_val=rtbse_env%ham_reference_type)
305 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%MAX_ITER", &
306 i_val=rtbse_env%etrs_max_iter)
307 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%MAT_EXP", &
308 i_val=rtbse_env%mat_exp_method)
309 ! Output unit number, recovered from the post_scf_bandstructure_type
310 rtbse_env%unit_nr = bs_env%unit_nr
311 ! Sim start index and total number of steps as well
312 CALL section_vals_val_get(md_sec, "STEP_START_VAL", i_val=rtbse_env%sim_start)
313 ! Copy this value to sim_start_orig for continuation runs
314 rtbse_env%sim_start_orig = rtbse_env%sim_start
315 CALL section_vals_val_get(md_sec, "STEPS", i_val=rtbse_env%sim_nsteps)
316 ! Get the values for the FT
317 rtbse_env%ft_damping = rtbse_env%dft_control%rtp_control%ft_damping
318 rtbse_env%ft_damping = rtbse_env%dft_control%rtp_control%ft_t0
319 rtbse_env%pol_elements => rtbse_env%dft_control%rtp_control%print_pol_elements
320
321 rtbse_env%rtp_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION")
322 ! Get the restart section
323 rtbse_env%restart_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%RESTART")
324 rtbse_env%restart_extracted = .false.
325 rtbse_env%field_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%FIELD")
326 rtbse_env%moments_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%MOMENTS")
327 ! Moment specification
328 CALL section_vals_val_get(rtbse_env%rtp_section, "PRINT%MOMENTS%REFERENCE", &
329 i_val=rtbse_env%moment_ref_type)
330 CALL section_vals_val_get(rtbse_env%rtp_section, "PRINT%MOMENTS%REFERENCE_POINT", &
331 r_vals=rtbse_env%user_moment_ref_point)
332 rtbse_env%rho_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%DENSITY_MATRIX")
333 rtbse_env%ft_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%MOMENTS_FT")
334 rtbse_env%pol_section => section_vals_get_subs_vals(rtbse_env%rtp_section, "PRINT%POLARIZABILITY")
335 ! Warn the user about print sections which are not yet implemented in the RTBSE run
336 CALL warn_section_unused(rtbse_env%rtp_section, "PRINT%CURRENT", &
337 "CURRENT print section not yet implemented for RTBSE.")
338 CALL warn_section_unused(rtbse_env%rtp_section, "PRINT%E_CONSTITUENTS", &
339 "E_CONSTITUENTS print section not yet implemented for RTBSE.")
340 CALL warn_section_unused(rtbse_env%rtp_section, "PRINT%PROGRAM_RUN_INFO", &
341 "PROGRAM_RUN_INFO print section not yet implemented for RTBSE.")
342 CALL warn_section_unused(rtbse_env%rtp_section, "PRINT%PROJECTION_MO", &
343 "PROJECTION_MO print section not yet implemented for RTBSE.")
344 CALL warn_section_unused(rtbse_env%rtp_section, "PRINT%RESTART_HISTORY", &
345 "RESTART_HISTORY print section not yet implemented for RTBSE.")
346 ! DEBUG : References to previous environments
347 rtbse_env%qs_env => qs_env
348 rtbse_env%bs_env => bs_env
349 ! Padé refinement
350 rtbse_env%pade_requested = rtbse_env%dft_control%rtp_control%pade_requested
351 rtbse_env%pade_e_min = rtbse_env%dft_control%rtp_control%pade_e_min
352 rtbse_env%pade_e_step = rtbse_env%dft_control%rtp_control%pade_e_step
353 rtbse_env%pade_e_max = rtbse_env%dft_control%rtp_control%pade_e_max
354 rtbse_env%pade_fit_e_min = rtbse_env%dft_control%rtp_control%pade_fit_e_min
355 rtbse_env%pade_fit_e_max = rtbse_env%dft_control%rtp_control%pade_fit_e_max
356 rtbse_env%pade_npoints = int((rtbse_env%pade_e_max - rtbse_env%pade_e_min)/rtbse_env%pade_e_step)
357 ! Evaluate the evaluation grid
358 IF (rtbse_env%pade_requested) THEN
359 NULLIFY (rtbse_env%pade_x_eval)
360 ALLOCATE (rtbse_env%pade_x_eval(rtbse_env%pade_npoints))
361 DO i = 1, rtbse_env%pade_npoints
362 rtbse_env%pade_x_eval(i) = cmplx(rtbse_env%pade_e_step*real(i - 1, kind=dp), 0.0, kind=dp)
363 END DO
364 END IF
365
366 ! Allocate moments matrices
367 NULLIFY (rtbse_env%moments)
368 ALLOCATE (rtbse_env%moments(3))
369 NULLIFY (rtbse_env%moments_field)
370 ALLOCATE (rtbse_env%moments_field(3))
371 DO k = 1, 3
372 ! Matrices are created from overlap template
373 ! Values are initialized in initialize_rtbse_env
374 CALL cp_fm_create(rtbse_env%moments(k), bs_env%fm_s_Gamma%matrix_struct)
375 CALL cp_fm_create(rtbse_env%moments_field(k), bs_env%fm_s_Gamma%matrix_struct)
376 END DO
377
378 ! Allocate space for density propagation and other operations
379 NULLIFY (rtbse_env%rho_workspace)
380 ALLOCATE (rtbse_env%rho_workspace(4))
381 DO i = 1, SIZE(rtbse_env%rho_workspace)
382 CALL cp_cfm_create(rtbse_env%rho_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
383 CALL cp_cfm_set_all(rtbse_env%rho_workspace(i), cmplx(0.0, 0.0, kind=dp))
384 END DO
385 ! Allocate real workspace
386 NULLIFY (rtbse_env%real_workspace)
387 SELECT CASE (rtbse_env%mat_exp_method)
388 CASE (do_exact)
389 ALLOCATE (rtbse_env%real_workspace(4))
390 CASE (do_bch)
391 ALLOCATE (rtbse_env%real_workspace(2))
392 CASE DEFAULT
393 cpabort("Only exact and BCH matrix propagation implemented in RT-BSE")
394 END SELECT
395 DO i = 1, SIZE(rtbse_env%real_workspace)
396 CALL cp_fm_create(rtbse_env%real_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
397 CALL cp_fm_set_all(rtbse_env%real_workspace(i), 0.0_dp)
398 END DO
399 ! Allocate density matrix
400 NULLIFY (rtbse_env%rho)
401 ALLOCATE (rtbse_env%rho(rtbse_env%n_spin))
402 DO i = 1, rtbse_env%n_spin
403 CALL cp_cfm_create(rtbse_env%rho(i), matrix_struct=bs_env%fm_s_Gamma%matrix_struct)
404 END DO
405 ! Create the inverse overlap matrix, for use in density propagation
406 ! Start by creating the actual overlap matrix
407 CALL cp_fm_create(rtbse_env%S_fm, bs_env%fm_s_Gamma%matrix_struct)
408 CALL cp_fm_create(rtbse_env%S_inv_fm, bs_env%fm_s_Gamma%matrix_struct)
409 CALL cp_cfm_create(rtbse_env%S_cfm, bs_env%fm_s_Gamma%matrix_struct)
410
411 ! Create the single particle hamiltonian
412 ! Allocate workspace
413 NULLIFY (rtbse_env%ham_workspace)
414 ALLOCATE (rtbse_env%ham_workspace(rtbse_env%n_spin))
415 DO i = 1, rtbse_env%n_spin
416 CALL cp_cfm_create(rtbse_env%ham_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
417 CALL cp_cfm_set_all(rtbse_env%ham_workspace(i), cmplx(0.0, 0.0, kind=dp))
418 END DO
419 ! Now onto the Hamiltonian itself
420 NULLIFY (rtbse_env%ham_reference)
421 ALLOCATE (rtbse_env%ham_reference(rtbse_env%n_spin))
422 DO i = 1, rtbse_env%n_spin
423 CALL cp_cfm_create(rtbse_env%ham_reference(i), bs_env%fm_ks_Gamma(i)%matrix_struct)
424 END DO
425
426 ! Create the matrices and workspaces for ETRS propagation
427 NULLIFY (rtbse_env%ham_effective)
428 NULLIFY (rtbse_env%rho_new)
429 NULLIFY (rtbse_env%rho_new_last)
430 NULLIFY (rtbse_env%rho_M)
431 NULLIFY (rtbse_env%rho_orig)
432 ALLOCATE (rtbse_env%ham_effective(rtbse_env%n_spin))
433 ALLOCATE (rtbse_env%rho_new(rtbse_env%n_spin))
434 ALLOCATE (rtbse_env%rho_new_last(rtbse_env%n_spin))
435 ALLOCATE (rtbse_env%rho_M(rtbse_env%n_spin))
436 ALLOCATE (rtbse_env%rho_orig(rtbse_env%n_spin))
437 DO i = 1, rtbse_env%n_spin
438 CALL cp_cfm_create(rtbse_env%ham_effective(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
439 CALL cp_cfm_set_all(rtbse_env%ham_effective(i), cmplx(0.0, 0.0, kind=dp))
440 CALL cp_cfm_create(rtbse_env%rho_new(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
441 CALL cp_cfm_set_all(rtbse_env%rho_new(i), cmplx(0.0, 0.0, kind=dp))
442 CALL cp_cfm_create(rtbse_env%rho_new_last(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
443 CALL cp_cfm_set_all(rtbse_env%rho_new_last(i), cmplx(0.0, 0.0, kind=dp))
444 CALL cp_cfm_create(rtbse_env%rho_M(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
445 CALL cp_cfm_set_all(rtbse_env%rho_M(i), cmplx(0.0, 0.0, kind=dp))
446 CALL cp_cfm_create(rtbse_env%rho_orig(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
447 END DO
448
449 ! Fields for exact diagonalisation
450 NULLIFY (rtbse_env%real_eigvals)
451 ALLOCATE (rtbse_env%real_eigvals(rtbse_env%n_ao))
452 rtbse_env%real_eigvals(:) = 0.0_dp
453 NULLIFY (rtbse_env%exp_eigvals)
454 ALLOCATE (rtbse_env%exp_eigvals(rtbse_env%n_ao))
455 rtbse_env%exp_eigvals(:) = cmplx(0.0, 0.0, kind=dp)
456
457 ! Workspace for FT - includes (in principle) the zeroth step and the extra last step
458 NULLIFY (rtbse_env%moments_trace)
459 ! TODO : Unite the number of steps with TD-DFT
460 ALLOCATE (rtbse_env%moments_trace(rtbse_env%n_spin, 3, rtbse_env%sim_nsteps + 1), source=z_zero)
461 NULLIFY (rtbse_env%field_trace)
462 ALLOCATE (rtbse_env%field_trace(3, rtbse_env%sim_nsteps + 1), source=z_zero)
463 NULLIFY (rtbse_env%time_trace)
464 ALLOCATE (rtbse_env%time_trace(rtbse_env%sim_nsteps + 1), source=0.0_dp)
465
466 ! Allocate self-energy parts and dynamic Hartree potential
467 NULLIFY (rtbse_env%hartree_curr)
468 NULLIFY (rtbse_env%sigma_SEX)
469 NULLIFY (rtbse_env%sigma_COH)
470 ALLOCATE (rtbse_env%hartree_curr(rtbse_env%n_spin))
471 ALLOCATE (rtbse_env%sigma_SEX(rtbse_env%n_spin))
472 ALLOCATE (rtbse_env%sigma_COH(rtbse_env%n_spin))
473 DO i = 1, rtbse_env%n_spin
474 CALL cp_fm_create(rtbse_env%sigma_COH(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
475 CALL cp_cfm_create(rtbse_env%sigma_SEX(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
476 CALL cp_fm_create(rtbse_env%hartree_curr(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
477 CALL cp_fm_set_all(rtbse_env%sigma_COH(i), 0.0_dp)
478 CALL cp_cfm_set_all(rtbse_env%sigma_SEX(i), cmplx(0.0, 0.0, kind=dp))
479 CALL cp_fm_set_all(rtbse_env%hartree_curr(i), 0.0_dp)
480 END DO
481
482 ! Allocate workspaces for get_sigma
483 CALL create_sigma_workspace(rtbse_env, qs_env)
484
485 ! Depending on the chosen methods, allocate extra workspace
486 CALL create_hartree_ri_workspace(rtbse_env, qs_env)
487
488 END SUBROUTINE create_rtbse_env
489
490! **************************************************************************************************
491!> \brief Simple reimplementation of cp_fm_release_pp1 for complex matrices
492!> \param matrices cp_cfm_type(:)
493!> \author Stepan Marek
494!> \date 02.2024
495! **************************************************************************************************
496 SUBROUTINE cp_cfm_release_pa1(matrices)
497 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: matrices
498 INTEGER :: i
499
500 DO i = 1, SIZE(matrices)
501 CALL cp_cfm_release(matrices(i))
502 END DO
503 DEALLOCATE (matrices)
504 NULLIFY (matrices)
505 END SUBROUTINE cp_cfm_release_pa1
506
507! **************************************************************************************************
508!> \brief Releases the environment allocated structures
509!> \param rtbse_env
510!> \author Stepan Marek
511!> \date 02.2024
512! **************************************************************************************************
513 SUBROUTINE release_rtbse_env(rtbse_env)
514 TYPE(rtbse_env_type), POINTER :: rtbse_env
515
516 CALL cp_cfm_release_pa1(rtbse_env%ham_effective)
517 CALL cp_cfm_release_pa1(rtbse_env%ham_workspace)
518 CALL cp_fm_release(rtbse_env%sigma_COH)
519 CALL cp_cfm_release_pa1(rtbse_env%sigma_SEX)
520 CALL cp_fm_release(rtbse_env%hartree_curr)
521 CALL cp_cfm_release_pa1(rtbse_env%ham_reference)
522 CALL cp_cfm_release_pa1(rtbse_env%rho)
523 CALL cp_cfm_release_pa1(rtbse_env%rho_workspace)
524 CALL cp_cfm_release_pa1(rtbse_env%rho_new)
525 CALL cp_cfm_release_pa1(rtbse_env%rho_new_last)
526 CALL cp_cfm_release_pa1(rtbse_env%rho_M)
527 CALL cp_cfm_release_pa1(rtbse_env%rho_orig)
528 CALL cp_fm_release(rtbse_env%real_workspace)
529 CALL cp_fm_release(rtbse_env%S_inv_fm)
530 CALL cp_fm_release(rtbse_env%S_fm)
531 CALL cp_cfm_release(rtbse_env%S_cfm)
532
533 CALL cp_fm_release(rtbse_env%moments)
534 CALL cp_fm_release(rtbse_env%moments_field)
535
536 CALL release_sigma_workspace(rtbse_env)
537
538 CALL release_hartree_ri_workspace(rtbse_env)
539
540 DEALLOCATE (rtbse_env%real_eigvals)
541 DEALLOCATE (rtbse_env%exp_eigvals)
542 DEALLOCATE (rtbse_env%moments_trace)
543 DEALLOCATE (rtbse_env%field_trace)
544 DEALLOCATE (rtbse_env%time_trace)
545
546 IF (ASSOCIATED(rtbse_env%pol_elements)) DEALLOCATE (rtbse_env%pol_elements)
547 IF (ASSOCIATED(rtbse_env%pade_x_eval)) DEALLOCATE (rtbse_env%pade_x_eval)
548
549 ! Deallocate the neighbour list that is not deallocated in gw anymore
550 IF (ASSOCIATED(rtbse_env%bs_env%nl_3c%ij_list)) CALL neighbor_list_3c_destroy(rtbse_env%bs_env%nl_3c)
551 ! Deallocate the storage for the environment itself
552 DEALLOCATE (rtbse_env)
553 ! Nullify to make sure it is not used again
554 NULLIFY (rtbse_env)
555
556 END SUBROUTINE release_rtbse_env
557! **************************************************************************************************
558!> \brief Allocates the workspaces for Hartree RI method
559!> \note RI method calculates the Hartree contraction without the use of DBT, as it cannot emulate vectors
560!> \param rtbse_env
561!> \param qs_env Quickstep environment - entry point of calculation
562!> \author Stepan Marek
563!> \date 05.2024
564! **************************************************************************************************
565 SUBROUTINE create_hartree_ri_workspace(rtbse_env, qs_env)
566 TYPE(rtbse_env_type) :: rtbse_env
567 TYPE(qs_environment_type), POINTER :: qs_env
568 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
569
570 CALL get_qs_env(qs_env, bs_env=bs_env)
571
572 CALL dbcsr_create(rtbse_env%rho_dbcsr, name="Sparse density", template=bs_env%mat_ao_ao%matrix)
573 CALL dbcsr_create(rtbse_env%v_ao_dbcsr, name="Sparse Hartree", template=bs_env%mat_ao_ao%matrix)
574
575 CALL create_hartree_ri_3c(rtbse_env%rho_dbcsr, rtbse_env%int_3c_array, rtbse_env%n_ao, rtbse_env%n_RI, &
576 bs_env%basis_set_AO, bs_env%basis_set_RI, bs_env%i_RI_start_from_atom, &
577 bs_env%ri_metric, qs_env, rtbse_env%unit_nr)
578 END SUBROUTINE create_hartree_ri_workspace
579! **************************************************************************************************
580!> \brief Separated method for allocating the 3c integrals for RI Hartree
581!> \note RI method calculates the Hartree contraction without the use of DBT, as it cannot emulate vectors
582!> \param rho_dbcsr matrix used for the description of shape of 3c array
583!> \param int_3c 3-center integral array to be allocated and filled
584!> \param n_ao Number of atomic orbitals
585!> \param n_RI Number of auxiliary RI orbitals
586!> \param basis_set_AO AO basis set
587!> \param basis_set_RI RI auxiliary basis set
588!> \param i_RI_start_from_atom Array of indices where functions of a given atom in RI basis start
589!> \param unit_nr Unit number used for printing information about the size of int_3c
590!> \author Stepan Marek
591!> \date 01.2025
592! **************************************************************************************************
593 SUBROUTINE create_hartree_ri_3c(rho_dbcsr, int_3c, n_ao, n_RI, basis_set_AO, basis_set_RI, &
594 i_RI_start_from_atom, ri_metric, qs_env, unit_nr)
595 TYPE(dbcsr_type) :: rho_dbcsr
596 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: int_3c
597 INTEGER :: n_ao, n_ri
598 TYPE(gto_basis_set_p_type), DIMENSION(:) :: basis_set_ao, &
599 basis_set_ri
600 INTEGER, DIMENSION(:) :: i_ri_start_from_atom
601 TYPE(libint_potential_type) :: ri_metric
602 TYPE(qs_environment_type), POINTER :: qs_env
603 INTEGER :: unit_nr
604 REAL(kind=dp) :: size_mb
605 INTEGER :: nblkrows_local, &
606 nblkcols_local, &
607 i_blk_local, &
608 j_blk_local, &
609 nrows_local, &
610 ncols_local, &
611 col_local_offset, &
612 row_local_offset, &
613 start_col_index, &
614 end_col_index, &
615 start_row_index, &
616 end_row_index
617 INTEGER, DIMENSION(:), POINTER :: local_blk_rows, &
618 local_blk_cols, &
619 row_blk_size, &
620 col_blk_size
621 ! TODO : Implement option/decision to not precompute all the 3c integrals
622 size_mb = real(n_ao, kind=dp)*real(n_ao, kind=dp)*real(n_ri, kind=dp)* &
623 REAL(storage_size(size_mb), kind=dp)/8.0_dp/1024.0_dp/1024.0_dp
624 IF (unit_nr > 0) WRITE (unit_nr, '(A44,E32.2E3,A4)') &
625 " RTBSE| Approximate size of the 3c integrals", size_mb, " MiB"
626
627 ! Get the number of block rows and columns
628 CALL dbcsr_get_info(rho_dbcsr, nblkrows_local=nblkrows_local, nblkcols_local=nblkcols_local)
629 ! Get the global indices of local rows and columns
630 CALL dbcsr_get_info(rho_dbcsr, local_rows=local_blk_rows, local_cols=local_blk_cols)
631 ! Get the sizes of all blocks
632 CALL dbcsr_get_info(rho_dbcsr, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
633
634 ! Get the total required local rows and cols
635 nrows_local = 0
636 DO i_blk_local = 1, nblkrows_local
637 nrows_local = nrows_local + row_blk_size(local_blk_rows(i_blk_local))
638 END DO
639 ncols_local = 0
640 DO j_blk_local = 1, nblkcols_local
641 ncols_local = ncols_local + col_blk_size(local_blk_cols(j_blk_local))
642 END DO
643
644 ! Allocate the appropriate storage
645 ALLOCATE (int_3c(nrows_local, ncols_local, n_ri))
646
647 ! Fill the storage with appropriate values, block by block
648 row_local_offset = 1
649 DO i_blk_local = 1, nblkrows_local
650 col_local_offset = 1
651 DO j_blk_local = 1, nblkcols_local
652 start_row_index = row_local_offset
653 end_row_index = start_row_index + row_blk_size(local_blk_rows(i_blk_local)) - 1
654 start_col_index = col_local_offset
655 end_col_index = start_col_index + col_blk_size(local_blk_cols(j_blk_local)) - 1
656 CALL build_3c_integral_block(int_3c(start_row_index:end_row_index, &
657 start_col_index:end_col_index, &
658 1:n_ri), &
659 qs_env, potential_parameter=ri_metric, &
660 basis_j=basis_set_ao, basis_k=basis_set_ao, &
661 basis_i=basis_set_ri, &
662 atom_j=local_blk_rows(i_blk_local), &
663 atom_k=local_blk_cols(j_blk_local), &
664 i_bf_start_from_atom=i_ri_start_from_atom)
665 col_local_offset = col_local_offset + col_blk_size(local_blk_cols(j_blk_local))
666 END DO
667 row_local_offset = row_local_offset + row_blk_size(local_blk_rows(i_blk_local))
668 END DO
669 END SUBROUTINE create_hartree_ri_3c
670! **************************************************************************************************
671!> \brief Releases the workspace for the Hartree RI method
672!> \param rtbse_env RT-BSE Environment, containing specific RI Hartree storage
673!> \author Stepan Marek
674!> \date 09.2024
675! **************************************************************************************************
676 SUBROUTINE release_hartree_ri_workspace(rtbse_env)
677 TYPE(rtbse_env_type) :: rtbse_env
678
679 DEALLOCATE (rtbse_env%int_3c_array)
680
681 CALL dbcsr_release(rtbse_env%rho_dbcsr)
682
683 CALL dbcsr_release(rtbse_env%v_dbcsr)
684
685 CALL dbcsr_release(rtbse_env%v_ao_dbcsr)
686
687 END SUBROUTINE release_hartree_ri_workspace
688! **************************************************************************************************
689!> \brief Allocates the workspaces for self-energy determination routine
690!> \param rtbse_env Structure for holding information and workspace structures
691!> \param qs_env Quickstep environment - entry point of calculation
692!> \author Stepan Marek
693!> \date 02.2024
694! **************************************************************************************************
695 SUBROUTINE create_sigma_workspace(rtbse_env, qs_env)
696 TYPE(rtbse_env_type) :: rtbse_env
697 TYPE(qs_environment_type), POINTER :: qs_env
698
699 CALL create_sigma_workspace_qs_only(qs_env, rtbse_env%screened_dbt, rtbse_env%w_dbcsr, &
700 rtbse_env%t_3c_w, rtbse_env%t_3c_work_RI_AO__AO, &
701 rtbse_env%t_3c_work2_RI_AO__AO, rtbse_env%greens_dbt)
702 END SUBROUTINE create_sigma_workspace
703! **************************************************************************************************
704!> \brief Allocates the workspaces for self-energy determination routine
705!> \note Does so without referencing the rtbse_env
706!> \note References bs_env
707!> \param rtbse_env Structure for holding information and workspace structures
708!> \param qs_env Quickstep environment - entry point of calculation
709!> \author Stepan Marek
710!> \date 02.2024
711! **************************************************************************************************
712 SUBROUTINE create_sigma_workspace_qs_only(qs_env, screened_dbt, screened_dbcsr, int_3c_dbt, &
713 work_dbt_3c_1, work_dbt_3c_2, work_dbt_2c)
714 TYPE(qs_environment_type), POINTER :: qs_env
715 TYPE(dbcsr_type) :: screened_dbcsr
716 TYPE(dbt_type) :: screened_dbt, &
717 int_3c_dbt, &
718 work_dbt_3c_1, &
719 work_dbt_3c_2, &
720 work_dbt_2c
721 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
722
723 CALL get_qs_env(qs_env, bs_env=bs_env)
724
725 ! t_3c_w
726 CALL dbt_create(bs_env%t_RI__AO_AO, int_3c_dbt)
727 ! TODO : Provide option/decision whether to store the 3c integrals precomputed
728 CALL compute_3c_integrals(qs_env, bs_env, int_3c_dbt)
729 ! t_3c_work_RI_AO__AO
730 CALL dbt_create(bs_env%t_RI_AO__AO, work_dbt_3c_1)
731 ! t_3c_work2_RI_AO__AO
732 CALL dbt_create(bs_env%t_RI_AO__AO, work_dbt_3c_2)
733 ! t_W
734 ! Populate screened_dbt from gw run
735 CALL dbcsr_create(screened_dbcsr, name="W", template=bs_env%mat_RI_RI%matrix)
736 CALL dbt_create(screened_dbcsr, screened_dbt)
737 ! greens_dbt
738 CALL dbt_create(bs_env%mat_ao_ao%matrix, work_dbt_2c)
739 END SUBROUTINE create_sigma_workspace_qs_only
740! **************************************************************************************************
741!> \brief Releases the workspaces for self-energy determination
742!> \param rtbse_env
743!> \author Stepan Marek
744!> \date 02.2024
745! **************************************************************************************************
746 SUBROUTINE release_sigma_workspace(rtbse_env)
747 TYPE(rtbse_env_type) :: rtbse_env
748
749 CALL dbt_destroy(rtbse_env%t_3c_w)
750 CALL dbt_destroy(rtbse_env%t_3c_work_RI_AO__AO)
751 CALL dbt_destroy(rtbse_env%t_3c_work2_RI_AO__AO)
752 CALL dbt_destroy(rtbse_env%screened_dbt)
753 CALL dbt_destroy(rtbse_env%greens_dbt)
754 CALL dbcsr_release(rtbse_env%w_dbcsr)
755 END SUBROUTINE release_sigma_workspace
756! **************************************************************************************************
757!> \brief Multiplies real matrix by a complex matrix from the right
758!> \note So far only converts the real matrix to complex one, potentially doubling the work
759!> \param rtbse_env
760!> \author Stepan Marek
761!> \date 09.2024
762! **************************************************************************************************
763 SUBROUTINE multiply_fm_cfm(trans_r, trans_c, na, nb, nc, &
764 alpha, matrix_r, matrix_c, beta, res)
765 ! Transposition
766 CHARACTER(len=1) :: trans_r, trans_c
767 INTEGER :: na, nb, nc
768 ! accept real numbers
769 ! TODO : Just use complex numbers and import z_one, z_zero etc.
770 REAL(kind=dp) :: alpha, beta
771 TYPE(cp_fm_type) :: matrix_r
772 TYPE(cp_cfm_type) :: matrix_c, res
773 TYPE(cp_fm_type) :: work_re, work_im, res_re, res_im
774 REAL(kind=dp) :: i_unit
775 CHARACTER(len=1) :: trans_cr
776
777 CALL cp_fm_create(work_re, matrix_c%matrix_struct)
778 CALL cp_fm_create(work_im, matrix_c%matrix_struct)
779 CALL cp_fm_create(res_re, res%matrix_struct)
780 CALL cp_fm_create(res_im, res%matrix_struct)
781 CALL cp_cfm_to_fm(matrix_c, work_re, work_im)
782 SELECT CASE (trans_c)
783 CASE ("C")
784 i_unit = -1.0_dp
785 trans_cr = "T"
786 CASE ("T")
787 i_unit = 1.0_dp
788 trans_cr = "T"
789 CASE default
790 i_unit = 1.0_dp
791 trans_cr = "N"
792 END SELECT
793 ! Actual multiplication
794 CALL parallel_gemm(trans_r, trans_cr, na, nb, nc, &
795 alpha, matrix_r, work_re, beta, res_re)
796 CALL parallel_gemm(trans_r, trans_cr, na, nb, nc, &
797 i_unit*alpha, matrix_r, work_im, beta, res_im)
798 CALL cp_fm_to_cfm(res_re, res_im, res)
799 CALL cp_fm_release(work_re)
800 CALL cp_fm_release(work_im)
801 CALL cp_fm_release(res_re)
802 CALL cp_fm_release(res_im)
803
804 END SUBROUTINE multiply_fm_cfm
805! **************************************************************************************************
806!> \brief Multiplies complex matrix by a real matrix from the right
807!> \note So far only converts the real matrix to complex one, potentially doubling the work
808!> \param rtbse_env
809!> \author Stepan Marek
810!> \date 09.2024
811! **************************************************************************************************
812 SUBROUTINE multiply_cfm_fm(trans_c, trans_r, na, nb, nc, &
813 alpha, matrix_c, matrix_r, beta, res)
814 ! Transposition
815 CHARACTER(len=1) :: trans_c, trans_r
816 INTEGER :: na, nb, nc
817 ! accept real numbers
818 ! TODO : complex number support via interface?
819 REAL(kind=dp) :: alpha, beta
820 TYPE(cp_cfm_type) :: matrix_c, res
821 TYPE(cp_fm_type) :: matrix_r
822 TYPE(cp_fm_type) :: work_re, work_im, res_re, res_im
823 REAL(kind=dp) :: i_unit
824 CHARACTER(len=1) :: trans_cr
825
826 CALL cp_fm_create(work_re, matrix_c%matrix_struct)
827 CALL cp_fm_create(work_im, matrix_c%matrix_struct)
828 CALL cp_fm_create(res_re, res%matrix_struct)
829 CALL cp_fm_create(res_im, res%matrix_struct)
830 CALL cp_cfm_to_fm(matrix_c, work_re, work_im)
831 SELECT CASE (trans_c)
832 CASE ("C")
833 i_unit = -1.0_dp
834 trans_cr = "T"
835 CASE ("T")
836 i_unit = 1.0_dp
837 trans_cr = "T"
838 CASE default
839 i_unit = 1.0_dp
840 trans_cr = "N"
841 END SELECT
842 ! Actual multiplication
843 CALL parallel_gemm(trans_cr, trans_r, na, nb, nc, &
844 alpha, work_re, matrix_r, beta, res_re)
845 CALL parallel_gemm(trans_cr, trans_r, na, nb, nc, &
846 i_unit*alpha, work_im, matrix_r, beta, res_im)
847 CALL cp_fm_to_cfm(res_re, res_im, res)
848 CALL cp_fm_release(work_re)
849 CALL cp_fm_release(work_im)
850 CALL cp_fm_release(res_re)
851 CALL cp_fm_release(res_im)
852
853 END SUBROUTINE multiply_cfm_fm
854END MODULE rt_bse_types
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, set_zero)
Creates a new full matrix with the given structure.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_release(matrix)
...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
This is the start of a dbt_api, all publically needed functions are exported here....
Definition dbt_api.F:17
Interface for the force calculations.
Utility method to build 3-center integrals for small cell GW.
subroutine, public build_3c_integral_block(int_3c, qs_env, potential_parameter, basis_j, basis_k, basis_i, cell_j, cell_k, cell_i, atom_j, atom_k, atom_i, j_bf_start_from_atom, k_bf_start_from_atom, i_bf_start_from_atom)
...
Routines from paper [Graml2024].
subroutine, public compute_3c_integrals(qs_env, bs_env, t_3c, atoms_ao_1, atoms_ao_2, atoms_ri)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public use_mom_ref_coac
integer, parameter, public do_bch
integer, parameter, public do_exact
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_zero
basic linear algebra operations for full matrixes
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
Utility methods to build 3-center integral tensors of various types.
Definition qs_tensors.F:11
subroutine, public neighbor_list_3c_destroy(ijk_list)
Destroy 3c neighborlist.
Definition qs_tensors.F:381
Data storage and other types for propagation via RT-BSE method.
subroutine, public release_rtbse_env(rtbse_env)
Releases the environment allocated structures.
subroutine, public create_hartree_ri_3c(rho_dbcsr, int_3c, n_ao, n_ri, basis_set_ao, basis_set_ri, i_ri_start_from_atom, ri_metric, qs_env, unit_nr)
Separated method for allocating the 3c integrals for RI Hartree.
subroutine, public multiply_cfm_fm(trans_c, trans_r, na, nb, nc, alpha, matrix_c, matrix_r, beta, res)
Multiplies complex matrix by a real matrix from the right.
subroutine, public create_sigma_workspace_qs_only(qs_env, screened_dbt, screened_dbcsr, int_3c_dbt, work_dbt_3c_1, work_dbt_3c_2, work_dbt_2c)
Allocates the workspaces for self-energy determination routine.
subroutine, public create_rtbse_env(rtbse_env, qs_env, force_env)
Allocates structures and prepares rtbse_env for run.
subroutine, public multiply_fm_cfm(trans_r, trans_c, na, nb, nc, alpha, matrix_r, matrix_c, beta, res)
Multiplies real matrix by a complex matrix from the right.
Types and set_get for real time propagation depending on runtype and diagonalization method different...
Routines needed for EMD.
subroutine, public warn_section_unused(section, subsection_name, error_message)
Warn about unused sections of the print section - only implemented for some of the methods.
Represent a complex full matrix.
represent a full matrix
wrapper to abstract the force evaluation of the various methods