(git:ed6f26b)
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, &
23 USE cp_cfm_types, ONLY: cp_cfm_p_type, &
37 USE cp_dbcsr_api, ONLY: dbcsr_type, &
42 dbcsr_copy, &
43 dbcsr_set, &
46 USE dbt_api, ONLY: dbt_type, &
47 dbt_pgrid_type, &
48 dbt_pgrid_create, &
49 dbt_pgrid_destroy, &
50 dbt_mp_environ_pgrid, &
51 dbt_default_distvec, &
52 dbt_distribution_type, &
53 dbt_distribution_new, &
54 dbt_distribution_destroy, &
55 dbt_create, &
56 dbt_copy_matrix_to_tensor, &
57 dbt_get_num_blocks, &
58 dbt_destroy
61 USE qs_mo_types, ONLY: mo_set_type
89 do_taylor, &
90 do_bch, &
92 USE physcon, ONLY: angstrom
93 USE mathconstants, ONLY: z_zero
98
99#include "../base/base_uses.f90"
100
101 IMPLICIT NONE
102
103 PRIVATE
104
105 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = "rt_bse"
106
107
108
109
110 PUBLIC :: rtbse_env_type, &
117
118 ! Created so that we can have an array of pointers to arrays
119 TYPE series_real_type
120 REAL(kind=dp), DIMENSION(:), POINTER :: series => null()
121 END TYPE series_real_type
122 TYPE series_complex_type
123 COMPLEX(kind=dp), DIMENSION(:), POINTER :: series => null()
124 END TYPE series_complex_type
125
126! **************************************************************************************************
127!> \param n_spin Number of spin channels that are present
128!> \param n_ao Number of atomic orbitals
129!> \param n_RI Number of RI orbitals
130!> \param n_occ Number of occupied orbitals, spin dependent
131!> \param spin_degeneracy Number of electrons per orbital
132!> \param field Electric field calculated at the given timestep
133!> \param moments Moment operators along cartesian directions - centered at zero charge - used for plotting
134!> \param moments_field Moment operators along cartesian directions - used to coupling to the field -
135!> origin bound to unit cell
136!> \param sim_step Current step of the simulation
137!> \param sim_start Starting step of the simulation
138!> \param sim_nsteps Number of steps of the simulation
139!> \param sim_time Current time of the simulation
140!> \param sim_dt Timestep of the simulation
141!> \param etrs_threshold Self-consistency threshold for enforced time reversal symmetry propagation
142!> \param exp_accuracy Threshold for matrix exponential calculation
143!> \param dft_control DFT control parameters
144!> \param ham_effective Real and imaginary part of the effective Hamiltonian used to propagate
145!> the density matrix
146!> \param ham_reference Reference Hamiltonian, which does not change in the propagation = DFT+G0W0 - initial Hartree - initial COHSEX
147!> \param ham_workspace Workspace matrices for use with the Hamiltonian propagation - storage of
148!> exponential propagators etc.
149!> \param rho Density matrix at the current time step
150!> \param rho_new Density matrix - workspace in ETRS
151!> \param rho_last Density matrix - workspace in ETRS
152!> \param rho_new_last Density matrix - workspace in ETRS
153!> \param rho_M Density matrix - workspace in ETRS
154!> \param S_inv_fm Inverse overlap matrix, full matrix
155!> \param S_fm Overlap matrix, full matrix
156!> \param S_inv Inverse overlap matrix, sparse matrix
157!> \param rho_dbcsr Density matrix, sparse matrix
158!> \param rho_workspace Matrices for storage of density matrix at different timesteps for
159!> interpolation and self-consistency checks etc.
160!> \param complex_workspace Workspace for complex density (exact diagonalisation)
161!> \param complex_s Complex overlap matrix (exact diagonalisation)
162!> \param real_eigvals Eigenvalues of hermitian matrix (exact diagonalisation)
163!> \param exp_eigvals Exponentiated eigenvalues (exact diagonalisation)
164!> \param v_dbcsr Sparse matrix with bare Coulomb in RI basis
165!> \param w_dbcsr Sparse matrix with correlation part of dressed Coulomb in RI basis (without bare Coulomb)
166!> \param screened_dbt Tensor for screened Coulomb interaction
167!> \param greens_dbt Tensor for greens function/density matrix
168!> \param t_3c_w Tensor containing 3c integrals
169!> \param t_3c_work_RI_AO__AO Tensor sigma contraction
170!> \param t_3c_work2_RI_AO__AO Tensor sigma contraction
171!> \param sigma_SEX Screened exchange self-energy
172!> \param sigma_COH Coulomb hole self-energy
173!> \param hartree_curr Current Hartree matrix
174!> \param etrs_max_iter Maximum number of ETRS iterations
175!> \param ham_reference_type Which Hamiltonian to use as single particle basis
176!> \param mat_exp_method Which method to use for matrix exponentiation
177!> \param unit_nr Number of output unit
178!> \param int_3c_array Array containing the local 3c integrals
179!> \author Stepan Marek (01.24)
180! **************************************************************************************************
182 INTEGER :: n_spin = 1, &
183 n_ao = -1, &
184 n_ri = -1
185 INTEGER, DIMENSION(2) :: n_occ = -1
186 REAL(kind=dp) :: spin_degeneracy = 2
187 REAL(kind=dp), DIMENSION(3) :: field = 0.0_dp
188 TYPE(cp_fm_type), DIMENSION(:), POINTER :: moments => null(), &
189 moments_field => null()
190 INTEGER :: sim_step = 0, &
191 sim_start = 0, &
192 ! Needed for continuation runs for loading of previous moments trace
193 sim_start_orig = 0, &
194 sim_nsteps = -1
195 REAL(kind=dp) :: sim_time = 0.0_dp, &
196 sim_dt = 0.1_dp, &
197 etrs_threshold = 1.0e-7_dp, &
198 exp_accuracy = 1.0e-10_dp, &
199 ft_damping = 0.0_dp, &
200 ft_start = 0.0_dp
201 ! Which element of polarizability to print out
202 INTEGER, DIMENSION(:, :), POINTER :: pol_elements => null()
203 TYPE(dft_control_type), POINTER :: dft_control => null()
204 ! DEBUG : Trying keeping the reference to previous environments inside this one
205 TYPE(qs_environment_type), POINTER :: qs_env => null()
206 TYPE(post_scf_bandstructure_type), POINTER :: bs_env => null()
207 ! Stores data needed for reading/writing to the restart files
208 TYPE(section_vals_type), POINTER :: restart_section => null(), &
209 field_section => null(), &
210 rho_section => null(), &
211 ft_section => null(), &
212 pol_section => null(), &
213 moments_section => null()
214 LOGICAL :: restart_extracted = .false.
215
216 ! Different indices signify different spins
217 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_effective => null()
218 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_reference => null()
219 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: ham_workspace => null()
220 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: sigma_sex => null()
221 TYPE(cp_fm_type), DIMENSION(:), POINTER :: sigma_coh => null(), &
222 hartree_curr => null()
223
224 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: rho => null(), &
225 rho_new => null(), &
226 rho_new_last => null(), &
227 rho_m => null(), &
228 rho_orig => null()
229 TYPE(cp_fm_type) :: s_inv_fm = cp_fm_type(), &
230 s_fm = cp_fm_type()
231 ! Many routines require overlap in the complex format
232 TYPE(cp_cfm_type) :: s_cfm = cp_cfm_type()
233 TYPE(dbcsr_type) :: rho_dbcsr = dbcsr_type(), &
234 v_ao_dbcsr = dbcsr_type()
235 ! Indices only correspond to different workspaces
236 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: rho_workspace => null()
237 ! Many methods use real and imaginary parts separately - prevent unnecessary reallocation
238 TYPE(cp_fm_type), DIMENSION(:), POINTER :: real_workspace => null()
239 ! Workspace required for exact matrix exponentiation
240 REAL(kind=dp), DIMENSION(:), POINTER :: real_eigvals => null()
241 COMPLEX(kind=dp), DIMENSION(:), POINTER :: exp_eigvals => null()
242 ! Workspace for saving the values for FT
243 TYPE(series_complex_type), DIMENSION(3) :: moments_trace = series_complex_type()
244 TYPE(series_real_type) :: time_trace = series_real_type()
245 TYPE(series_real_type), DIMENSION(3) :: field_trace = series_real_type()
246 ! Workspace required for hartree_pw
247 TYPE(dbcsr_type) :: v_dbcsr = dbcsr_type(), &
248 w_dbcsr = dbcsr_type()
249#if defined(FTN_NO_DEFAULT_INIT)
250 TYPE(dbt_type) :: screened_dbt, &
251 greens_dbt, &
252 t_3c_w, &
253 t_3c_work_ri_ao__ao, &
254 t_3c_work2_ri_ao__ao
255#else
256 TYPE(dbt_type) :: screened_dbt = dbt_type(), &
257 greens_dbt = dbt_type(), &
258 t_3c_w = dbt_type(), &
259 t_3c_work_ri_ao__ao = dbt_type(), &
260 t_3c_work2_ri_ao__ao = dbt_type()
261#endif
262 ! These matrices are always real
263 INTEGER :: etrs_max_iter = 10
264 INTEGER :: ham_reference_type = 2
265 INTEGER :: mat_exp_method = 4
266 INTEGER :: unit_nr = -1
267 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: int_3c_array => null()
268
269 END TYPE rtbse_env_type
270
271CONTAINS
272
273! **************************************************************************************************
274!> \brief Allocates structures and prepares rtbse_env for run
275!> \param rtbse_env rtbse_env_type that is initialised
276!> \param qs_env Entry point of the calculation
277!> \author Stepan Marek
278!> \date 02.2024
279! **************************************************************************************************
280 SUBROUTINE create_rtbse_env(rtbse_env, qs_env, force_env)
281 TYPE(rtbse_env_type), POINTER :: rtbse_env
282 TYPE(qs_environment_type), POINTER :: qs_env
283 TYPE(force_env_type), POINTER :: force_env
284 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
285 TYPE(rt_prop_type), POINTER :: rtp
286 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
287 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
288 INTEGER :: i, j, k, single_pol_index
289 TYPE(section_vals_type), POINTER :: input, bs_sec, md_sec
290 INTEGER, DIMENSION(:), POINTER :: pol_tmp
291 LOGICAL :: pol_elements_explicit, &
292 pol_vector_known
293 REAL(kind=dp), DIMENSION(3) :: pol_vector
294
295 ! Allocate the storage for the gwbse environment
296 NULLIFY (rtbse_env)
297 ALLOCATE (rtbse_env)
298 ! Extract the other types first
299 CALL get_qs_env(qs_env, &
300 bs_env=bs_env, &
301 rtp=rtp, &
302 matrix_s=matrix_s, &
303 mos=mos, &
304 dft_control=rtbse_env%dft_control, &
305 input=input)
306 bs_sec => section_vals_get_subs_vals(input, "PROPERTIES%BANDSTRUCTURE")
307 IF (.NOT. ASSOCIATED(bs_env)) THEN
308 cpabort("Cannot run RT-BSE without running GW calculation (PROPERTIES) before")
309 END IF
310 ! Number of spins
311 rtbse_env%n_spin = bs_env%n_spin
312 ! Number of atomic orbitals
313 rtbse_env%n_ao = bs_env%n_ao
314 ! Number of auxiliary basis orbitals
315 rtbse_env%n_RI = bs_env%n_RI
316 ! Number of occupied orbitals - for closed shell equals to half the number of electrons
317 rtbse_env%n_occ(:) = bs_env%n_occ(:)
318 ! Spin degeneracy - number of spins per orbital
319 rtbse_env%spin_degeneracy = bs_env%spin_degeneracy
320 ! Default field is zero
321 rtbse_env%field(:) = 0.0_dp
322 ! Default time is zero
323 rtbse_env%sim_step = 0
324 rtbse_env%sim_time = 0
325 ! Time step is taken from rtp
326 md_sec => section_vals_get_subs_vals(force_env%root_section, "MOTION%MD")
327 CALL section_vals_val_get(md_sec, "TIMESTEP", r_val=rtbse_env%sim_dt)
328 ! rtbse_env%sim_dt = rtp%dt
329 ! Threshold for etrs is taken from the eps_energy from RT propagation
330 rtbse_env%etrs_threshold = rtbse_env%dft_control%rtp_control%eps_ener
331 rtbse_env%exp_accuracy = rtbse_env%dft_control%rtp_control%eps_exp
332 ! Recover custom options
333 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%RTBSE%RTBSE_HAMILTONIAN", &
334 i_val=rtbse_env%ham_reference_type)
335 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%MAX_ITER", &
336 i_val=rtbse_env%etrs_max_iter)
337 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%MAT_EXP", &
338 i_val=rtbse_env%mat_exp_method)
339 ! Output unit number, recovered from the post_scf_bandstructure_type
340 rtbse_env%unit_nr = bs_env%unit_nr
341 ! Sim start index and total number of steps as well
342 CALL section_vals_val_get(md_sec, "STEP_START_VAL", i_val=rtbse_env%sim_start)
343 ! Copy this value to sim_start_orig for continuation runs
344 rtbse_env%sim_start_orig = rtbse_env%sim_start
345 CALL section_vals_val_get(md_sec, "STEPS", i_val=rtbse_env%sim_nsteps)
346 ! Get the values for the FT
347 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%RTBSE%FT_DAMPING", &
348 r_val=rtbse_env%ft_damping)
349 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%RTBSE%FT_START_TIME", &
350 r_val=rtbse_env%ft_start)
351 ! Handle ELEMENT keywords
352 ! By default, if the keywords are not present, check whether just one element in polarization/delta_pulse direction
353 ! is non-zero. If that is the case, print 3 finite elements of polarizability. Otherwise, warn and print
354 ! just diagonal elements for each non-zero e-field element
355 ! Iterate over all ELEMENT keywords
356 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%PRINT%POLARIZABILITY%ELEMENT", &
357 n_rep_val=k, explicit=pol_elements_explicit)
358 IF (pol_elements_explicit) THEN
359 ! By default, fill with 1 1 elements
360 ALLOCATE (rtbse_env%pol_elements(k, 2), source=1)
361 DO i = 1, k
362 CALL section_vals_val_get(input, "DFT%REAL_TIME_PROPAGATION%PRINT%POLARIZABILITY%ELEMENT", &
363 i_vals=pol_tmp, i_rep_val=i)
364 IF (SIZE(pol_tmp) < 2) cpabort("Less than two elements provided for polarizability")
365 rtbse_env%pol_elements(i, :) = pol_tmp(:)
366 END DO
367 ! Do basic sanity checks for pol_element
368 DO j = 1, k
369 DO i = 1, 2
370 IF (rtbse_env%pol_elements(j, i) > 3 .OR. rtbse_env%pol_elements(j, i) < 1) &
371 cpabort("Polarisation tensor element not 1,2 or 3 in at least one index")
372 END DO
373 END DO
374 ELSE
375 ! Figure out whether delta direction or polarization is applicable
376 pol_vector_known = .false.
377 IF (rtbse_env%dft_control%rtp_control%apply_delta_pulse) THEN
378 ! Delta pulse polarization
379 pol_vector(:) = rtbse_env%dft_control%rtp_control%delta_pulse_direction(:)
380 pol_vector_known = .true.
381 ELSE IF (SIZE(rtbse_env%dft_control%efield_fields) > 0) THEN
382 ! real time field polarization
383 ! Maybe generalize for all fields?
384 pol_vector(:) = rtbse_env%dft_control%efield_fields(1)%efield%polarisation(:)
385 pol_vector_known = .true.
386 END IF
387 ! Check whether the vector is not explicitly zero
388 IF (dot_product(pol_vector, pol_vector) == 0.0_dp) pol_vector_known = .false.
389 IF (pol_vector_known) THEN
390 ! Iterate over the pol vector, check whether just one is non-zero
391 single_pol_index = -1
392 DO i = 1, 3
393 IF (pol_vector(i) /= 0.0_dp .AND. &
394 pol_vector(modulo(i, 3) + 1) == 0.0_dp .AND. &
395 pol_vector(modulo(i + 1, 3) + 1) == 0.0_dp) THEN
396 single_pol_index = i
397 EXIT
398 END IF
399 END DO
400 IF (single_pol_index > 0) THEN
401 ! Print 3 elements
402 ALLOCATE (rtbse_env%pol_elements(3, 2), source=1)
403 DO i = 1, 3
404 rtbse_env%pol_elements(i, 1) = i
405 rtbse_env%pol_elements(i, 2) = single_pol_index
406 END DO
407 ELSE
408 ! More than one non-zero efield component - abort
409 cpabort("RTBSE : Guess for polarizability elements failed - please specify")
410 END IF
411 ELSE
412 ! Pol vector is unknown, but polarizability is requested - abort and request an element
413 cpabort("RTBSE : Guess for polarizability elements failed - please specify")
414 END IF
415 END IF
416
417 ! Get the restart section
418 rtbse_env%restart_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%RESTART")
419 rtbse_env%restart_extracted = .false.
420 rtbse_env%field_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%FIELD")
421 rtbse_env%moments_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%MOMENTS")
422 rtbse_env%rho_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%DENSITY_MATRIX")
423 rtbse_env%ft_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%MOMENTS_FT")
424 rtbse_env%pol_section => section_vals_get_subs_vals(input, "DFT%REAL_TIME_PROPAGATION%PRINT%POLARIZABILITY")
425 ! Warn the user about print sections which are not yet implemented in the RTBSE run
426 CALL warn_section_unused(input, "DFT%REAL_TIME_PROPAGATION%PRINT%CURRENT", &
427 "CURRENT print section not yet implemented for RTBSE.")
428 CALL warn_section_unused(input, "DFT%REAL_TIME_PROPAGATION%PRINT%E_CONSTITUENTS", &
429 "E_CONSTITUENTS print section not yet implemented for RTBSE.")
430 CALL warn_section_unused(input, "DFT%REAL_TIME_PROPAGATION%PRINT%PROGRAM_RUN_INFO", &
431 "PROGRAM_RUN_INFO print section not yet implemented for RTBSE.")
432 CALL warn_section_unused(input, "DFT%REAL_TIME_PROPAGATION%PRINT%PROJECTION_MO", &
433 "PROJECTION_MO print section not yet implemented for RTBSE.")
434 CALL warn_section_unused(input, "DFT%REAL_TIME_PROPAGATION%PRINT%RESTART_HISTORY", &
435 "RESTART_HISTORY print section not yet implemented for RTBSE.")
436 ! DEBUG : References to previous environments
437 rtbse_env%qs_env => qs_env
438 rtbse_env%bs_env => bs_env
439
440 ! Allocate moments matrices
441 NULLIFY (rtbse_env%moments)
442 ALLOCATE (rtbse_env%moments(3))
443 NULLIFY (rtbse_env%moments_field)
444 ALLOCATE (rtbse_env%moments_field(3))
445 DO k = 1, 3
446 ! Matrices are created from overlap template
447 ! Values are initialized in initialize_rtbse_env
448 CALL cp_fm_create(rtbse_env%moments(k), bs_env%fm_s_Gamma%matrix_struct)
449 CALL cp_fm_create(rtbse_env%moments_field(k), bs_env%fm_s_Gamma%matrix_struct)
450 END DO
451
452 ! Allocate space for density propagation and other operations
453 NULLIFY (rtbse_env%rho_workspace)
454 ALLOCATE (rtbse_env%rho_workspace(4))
455 DO i = 1, SIZE(rtbse_env%rho_workspace)
456 CALL cp_cfm_create(rtbse_env%rho_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
457 CALL cp_cfm_set_all(rtbse_env%rho_workspace(i), cmplx(0.0, 0.0, kind=dp))
458 END DO
459 ! Allocate real workspace
460 NULLIFY (rtbse_env%real_workspace)
461 SELECT CASE (rtbse_env%mat_exp_method)
462 CASE (do_exact)
463 ALLOCATE (rtbse_env%real_workspace(4))
464 CASE (do_bch)
465 ALLOCATE (rtbse_env%real_workspace(2))
466 CASE DEFAULT
467 cpabort("Only exact and BCH matrix propagation implemented in RT-BSE")
468 END SELECT
469 DO i = 1, SIZE(rtbse_env%real_workspace)
470 CALL cp_fm_create(rtbse_env%real_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
471 CALL cp_fm_set_all(rtbse_env%real_workspace(i), 0.0_dp)
472 END DO
473 ! Allocate density matrix
474 NULLIFY (rtbse_env%rho)
475 ALLOCATE (rtbse_env%rho(rtbse_env%n_spin))
476 DO i = 1, rtbse_env%n_spin
477 CALL cp_cfm_create(rtbse_env%rho(i), matrix_struct=bs_env%fm_s_Gamma%matrix_struct)
478 END DO
479 ! Create the inverse overlap matrix, for use in density propagation
480 ! Start by creating the actual overlap matrix
481 CALL cp_fm_create(rtbse_env%S_fm, bs_env%fm_s_Gamma%matrix_struct)
482 CALL cp_fm_create(rtbse_env%S_inv_fm, bs_env%fm_s_Gamma%matrix_struct)
483 CALL cp_cfm_create(rtbse_env%S_cfm, bs_env%fm_s_Gamma%matrix_struct)
484
485 ! Create the single particle hamiltonian
486 ! Allocate workspace
487 NULLIFY (rtbse_env%ham_workspace)
488 ALLOCATE (rtbse_env%ham_workspace(rtbse_env%n_spin))
489 DO i = 1, rtbse_env%n_spin
490 CALL cp_cfm_create(rtbse_env%ham_workspace(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
491 CALL cp_cfm_set_all(rtbse_env%ham_workspace(i), cmplx(0.0, 0.0, kind=dp))
492 END DO
493 ! Now onto the Hamiltonian itself
494 NULLIFY (rtbse_env%ham_reference)
495 ALLOCATE (rtbse_env%ham_reference(rtbse_env%n_spin))
496 DO i = 1, rtbse_env%n_spin
497 CALL cp_cfm_create(rtbse_env%ham_reference(i), bs_env%fm_ks_Gamma(i)%matrix_struct)
498 END DO
499
500 ! Create the matrices and workspaces for ETRS propagation
501 NULLIFY (rtbse_env%ham_effective)
502 NULLIFY (rtbse_env%rho_new)
503 NULLIFY (rtbse_env%rho_new_last)
504 NULLIFY (rtbse_env%rho_M)
505 NULLIFY (rtbse_env%rho_orig)
506 ALLOCATE (rtbse_env%ham_effective(rtbse_env%n_spin))
507 ALLOCATE (rtbse_env%rho_new(rtbse_env%n_spin))
508 ALLOCATE (rtbse_env%rho_new_last(rtbse_env%n_spin))
509 ALLOCATE (rtbse_env%rho_M(rtbse_env%n_spin))
510 ALLOCATE (rtbse_env%rho_orig(rtbse_env%n_spin))
511 DO i = 1, rtbse_env%n_spin
512 CALL cp_cfm_create(rtbse_env%ham_effective(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
513 CALL cp_cfm_set_all(rtbse_env%ham_effective(i), cmplx(0.0, 0.0, kind=dp))
514 CALL cp_cfm_create(rtbse_env%rho_new(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
515 CALL cp_cfm_set_all(rtbse_env%rho_new(i), cmplx(0.0, 0.0, kind=dp))
516 CALL cp_cfm_create(rtbse_env%rho_new_last(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
517 CALL cp_cfm_set_all(rtbse_env%rho_new_last(i), cmplx(0.0, 0.0, kind=dp))
518 CALL cp_cfm_create(rtbse_env%rho_M(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
519 CALL cp_cfm_set_all(rtbse_env%rho_M(i), cmplx(0.0, 0.0, kind=dp))
520 CALL cp_cfm_create(rtbse_env%rho_orig(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
521 END DO
522
523 ! Fields for exact diagonalisation
524 NULLIFY (rtbse_env%real_eigvals)
525 ALLOCATE (rtbse_env%real_eigvals(rtbse_env%n_ao))
526 rtbse_env%real_eigvals(:) = 0.0_dp
527 NULLIFY (rtbse_env%exp_eigvals)
528 ALLOCATE (rtbse_env%exp_eigvals(rtbse_env%n_ao))
529 rtbse_env%exp_eigvals(:) = cmplx(0.0, 0.0, kind=dp)
530
531 ! Workspace for FT - includes (in principle) the zeroth step and the extra last step
532 DO i = 1, 3
533 NULLIFY (rtbse_env%moments_trace(i)%series)
534 ALLOCATE (rtbse_env%moments_trace(i)%series(rtbse_env%sim_nsteps + 2), source=z_zero)
535 NULLIFY (rtbse_env%field_trace(i)%series)
536 ALLOCATE (rtbse_env%field_trace(i)%series(rtbse_env%sim_nsteps + 2), source=0.0_dp)
537 END DO
538 NULLIFY (rtbse_env%time_trace%series)
539 ALLOCATE (rtbse_env%time_trace%series(rtbse_env%sim_nsteps + 2), source=0.0_dp)
540
541 ! Allocate self-energy parts and dynamic Hartree potential
542 NULLIFY (rtbse_env%hartree_curr)
543 NULLIFY (rtbse_env%sigma_SEX)
544 NULLIFY (rtbse_env%sigma_COH)
545 ALLOCATE (rtbse_env%hartree_curr(rtbse_env%n_spin))
546 ALLOCATE (rtbse_env%sigma_SEX(rtbse_env%n_spin))
547 ALLOCATE (rtbse_env%sigma_COH(rtbse_env%n_spin))
548 DO i = 1, rtbse_env%n_spin
549 CALL cp_fm_create(rtbse_env%sigma_COH(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
550 CALL cp_cfm_create(rtbse_env%sigma_SEX(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
551 CALL cp_fm_create(rtbse_env%hartree_curr(i), bs_env%fm_ks_Gamma(1)%matrix_struct)
552 CALL cp_fm_set_all(rtbse_env%sigma_COH(i), 0.0_dp)
553 CALL cp_cfm_set_all(rtbse_env%sigma_SEX(i), cmplx(0.0, 0.0, kind=dp))
554 CALL cp_fm_set_all(rtbse_env%hartree_curr(i), 0.0_dp)
555 END DO
556
557 ! Allocate workspaces for get_sigma
558 CALL create_sigma_workspace(rtbse_env, qs_env)
559
560 ! Depending on the chosen methods, allocate extra workspace
561 CALL create_hartree_ri_workspace(rtbse_env, qs_env)
562
563 END SUBROUTINE
564
565! **************************************************************************************************
566!> \brief Simple reimplementation of cp_fm_release_pp1 for complex matrices
567!> \param matrices cp_cfm_p_type(:)
568!> \author Stepan Marek
569!> \date 02.2024
570! **************************************************************************************************
571 SUBROUTINE cp_cfm_release_pa1(matrices)
572 TYPE(cp_cfm_type), DIMENSION(:), POINTER :: matrices
573 INTEGER :: i
574
575 DO i = 1, SIZE(matrices)
576 CALL cp_cfm_release(matrices(i))
577 END DO
578 DEALLOCATE (matrices)
579 NULLIFY (matrices)
580 END SUBROUTINE cp_cfm_release_pa1
581
582! **************************************************************************************************
583!> \brief Releases the environment allocated structures
584!> \param rtbse_env
585!> \author Stepan Marek
586!> \date 02.2024
587! **************************************************************************************************
588 SUBROUTINE release_rtbse_env(rtbse_env)
589 TYPE(rtbse_env_type), POINTER :: rtbse_env
590 INTEGER :: i
591
592 CALL cp_cfm_release_pa1(rtbse_env%ham_effective)
593 CALL cp_cfm_release_pa1(rtbse_env%ham_workspace)
594 CALL cp_fm_release(rtbse_env%sigma_COH)
595 CALL cp_cfm_release_pa1(rtbse_env%sigma_SEX)
596 CALL cp_fm_release(rtbse_env%hartree_curr)
597 CALL cp_cfm_release_pa1(rtbse_env%ham_reference)
598 CALL cp_cfm_release_pa1(rtbse_env%rho)
599 CALL cp_cfm_release_pa1(rtbse_env%rho_workspace)
600 CALL cp_cfm_release_pa1(rtbse_env%rho_new)
601 CALL cp_cfm_release_pa1(rtbse_env%rho_new_last)
602 CALL cp_cfm_release_pa1(rtbse_env%rho_M)
603 CALL cp_cfm_release_pa1(rtbse_env%rho_orig)
604 CALL cp_fm_release(rtbse_env%real_workspace)
605 CALL cp_fm_release(rtbse_env%S_inv_fm)
606 CALL cp_fm_release(rtbse_env%S_fm)
607 CALL cp_cfm_release(rtbse_env%S_cfm)
608
609 ! DO i = 1, 3
610 ! CALL cp_fm_release(rtbse_env%moments(i)%matrix)
611 ! CALL cp_fm_release(rtbse_env%moments_field(i)%matrix)
612 ! END DO
613 CALL cp_fm_release(rtbse_env%moments)
614 CALL cp_fm_release(rtbse_env%moments_field)
615
616 CALL release_sigma_workspace(rtbse_env)
617
618 CALL release_hartree_ri_workspace(rtbse_env)
619
620 DEALLOCATE (rtbse_env%real_eigvals)
621 DEALLOCATE (rtbse_env%exp_eigvals)
622 DO i = 1, 3
623 DEALLOCATE (rtbse_env%moments_trace(i)%series)
624 DEALLOCATE (rtbse_env%field_trace(i)%series)
625 END DO
626 DEALLOCATE (rtbse_env%time_trace%series)
627
628 DEALLOCATE (rtbse_env%pol_elements)
629
630 ! Deallocate the neighbour list that is not deallocated in gw anymore
631 IF (ASSOCIATED(rtbse_env%bs_env%nl_3c%ij_list)) CALL neighbor_list_3c_destroy(rtbse_env%bs_env%nl_3c)
632 ! Deallocate the storage for the environment itself
633 DEALLOCATE (rtbse_env)
634 ! Nullify to make sure it is not used again
635 NULLIFY (rtbse_env)
636
637 END SUBROUTINE
638! **************************************************************************************************
639!> \brief Allocates the workspaces for Hartree RI method
640!> \note RI method calculates the Hartree contraction without the use of DBT, as it cannot emulate vectors
641!> \param rtbse_env
642!> \param qs_env Quickstep environment - entry point of calculation
643!> \author Stepan Marek
644!> \date 05.2024
645! **************************************************************************************************
646 SUBROUTINE create_hartree_ri_workspace(rtbse_env, qs_env)
647 TYPE(rtbse_env_type) :: rtbse_env
648 TYPE(qs_environment_type), POINTER :: qs_env
649 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
650
651 CALL get_qs_env(qs_env, bs_env=bs_env)
652
653 CALL dbcsr_create(rtbse_env%rho_dbcsr, name="Sparse density", template=bs_env%mat_ao_ao%matrix)
654 CALL dbcsr_create(rtbse_env%v_ao_dbcsr, name="Sparse Hartree", template=bs_env%mat_ao_ao%matrix)
655
656 CALL create_hartree_ri_3c(rtbse_env%rho_dbcsr, rtbse_env%int_3c_array, rtbse_env%n_ao, rtbse_env%n_RI, &
657 bs_env%basis_set_AO, bs_env%basis_set_RI, bs_env%i_RI_start_from_atom, &
658 bs_env%ri_metric, qs_env, rtbse_env%unit_nr)
659 END SUBROUTINE create_hartree_ri_workspace
660! **************************************************************************************************
661!> \brief Separated method for allocating the 3c integrals for RI Hartree
662!> \note RI method calculates the Hartree contraction without the use of DBT, as it cannot emulate vectors
663!> \param rho_dbcsr matrix used for the description of shape of 3c array
664!> \param int_3c 3-center integral array to be allocated and filled
665!> \param n_ao Number of atomic orbitals
666!> \param n_RI Number of auxiliary RI orbitals
667!> \param basis_set_AO AO basis set
668!> \param basis_set_RI RI auxiliary basis set
669!> \param i_RI_start_from_atom Array of indices where functions of a given atom in RI basis start
670!> \param unit_nr Unit number used for printing information about the size of int_3c
671!> \author Stepan Marek
672!> \date 01.2025
673! **************************************************************************************************
674 SUBROUTINE create_hartree_ri_3c(rho_dbcsr, int_3c, n_ao, n_RI, basis_set_AO, basis_set_RI, &
675 i_RI_start_from_atom, ri_metric, qs_env, unit_nr)
676 TYPE(dbcsr_type) :: rho_dbcsr
677 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: int_3c
678 INTEGER :: n_ao, n_ri
679 TYPE(gto_basis_set_p_type), DIMENSION(:) :: basis_set_ao, &
680 basis_set_ri
681 INTEGER, DIMENSION(:) :: i_ri_start_from_atom
682 TYPE(libint_potential_type) :: ri_metric
683 TYPE(qs_environment_type), POINTER :: qs_env
684 INTEGER :: unit_nr
685 REAL(kind=dp) :: size_mb
686 INTEGER :: nblkrows_local, &
687 nblkcols_local, &
688 i_blk_local, &
689 j_blk_local, &
690 nrows_local, &
691 ncols_local, &
692 col_local_offset, &
693 row_local_offset, &
694 start_col_index, &
695 end_col_index, &
696 start_row_index, &
697 end_row_index
698 INTEGER, DIMENSION(:), POINTER :: local_blk_rows, &
699 local_blk_cols, &
700 row_blk_size, &
701 col_blk_size
702 ! TODO : Implement option/decision to not precompute all the 3c integrals
703 size_mb = real(n_ao, kind=dp)*real(n_ao, kind=dp)*real(n_ri, kind=dp)* &
704 REAL(storage_size(size_mb), kind=dp)/8.0_dp/1024.0_dp/1024.0_dp
705 IF (unit_nr > 0) WRITE (unit_nr, '(A44,E32.2E3,A4)') &
706 " RTBSE| Approximate size of the 3c integrals", size_mb, " MiB"
707
708 ! Get the number of block rows and columns
709 CALL dbcsr_get_info(rho_dbcsr, nblkrows_local=nblkrows_local, nblkcols_local=nblkcols_local)
710 ! Get the global indices of local rows and columns
711 CALL dbcsr_get_info(rho_dbcsr, local_rows=local_blk_rows, local_cols=local_blk_cols)
712 ! Get the sizes of all blocks
713 CALL dbcsr_get_info(rho_dbcsr, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
714
715 ! Get the total required local rows and cols
716 nrows_local = 0
717 DO i_blk_local = 1, nblkrows_local
718 nrows_local = nrows_local + row_blk_size(local_blk_rows(i_blk_local))
719 END DO
720 ncols_local = 0
721 DO j_blk_local = 1, nblkcols_local
722 ncols_local = ncols_local + col_blk_size(local_blk_cols(j_blk_local))
723 END DO
724
725 ! Allocate the appropriate storage
726 ALLOCATE (int_3c(nrows_local, ncols_local, n_ri))
727
728 ! Fill the storage with appropriate values, block by block
729 row_local_offset = 1
730 DO i_blk_local = 1, nblkrows_local
731 col_local_offset = 1
732 DO j_blk_local = 1, nblkcols_local
733 start_row_index = row_local_offset
734 end_row_index = start_row_index + row_blk_size(local_blk_rows(i_blk_local)) - 1
735 start_col_index = col_local_offset
736 end_col_index = start_col_index + col_blk_size(local_blk_cols(j_blk_local)) - 1
737 CALL build_3c_integral_block(int_3c(start_row_index:end_row_index, &
738 start_col_index:end_col_index, &
739 1:n_ri), &
740 qs_env, potential_parameter=ri_metric, &
741 basis_j=basis_set_ao, basis_k=basis_set_ao, &
742 basis_i=basis_set_ri, &
743 atom_j=local_blk_rows(i_blk_local), &
744 atom_k=local_blk_cols(j_blk_local), &
745 i_bf_start_from_atom=i_ri_start_from_atom)
746 col_local_offset = col_local_offset + col_blk_size(local_blk_cols(j_blk_local))
747 END DO
748 row_local_offset = row_local_offset + row_blk_size(local_blk_rows(i_blk_local))
749 END DO
750 END SUBROUTINE create_hartree_ri_3c
751! **************************************************************************************************
752!> \brief Releases the workspace for the Hartree RI method
753!> \param rtbse_env RT-BSE Environment, containing specific RI Hartree storage
754!> \author Stepan Marek
755!> \date 09.2024
756! **************************************************************************************************
757 SUBROUTINE release_hartree_ri_workspace(rtbse_env)
758 TYPE(rtbse_env_type) :: rtbse_env
759
760 DEALLOCATE (rtbse_env%int_3c_array)
761
762 CALL dbcsr_release(rtbse_env%rho_dbcsr)
763
764 CALL dbcsr_release(rtbse_env%v_dbcsr)
765
766 CALL dbcsr_release(rtbse_env%v_ao_dbcsr)
767
768 END SUBROUTINE release_hartree_ri_workspace
769! **************************************************************************************************
770!> \brief Allocates the workspaces for self-energy determination routine
771!> \param rtbse_env Structure for holding information and workspace structures
772!> \param qs_env Quickstep environment - entry point of calculation
773!> \author Stepan Marek
774!> \date 02.2024
775! **************************************************************************************************
776 SUBROUTINE create_sigma_workspace(rtbse_env, qs_env)
777 TYPE(rtbse_env_type) :: rtbse_env
778 TYPE(qs_environment_type), POINTER :: qs_env
779
780 CALL create_sigma_workspace_qs_only(qs_env, rtbse_env%screened_dbt, rtbse_env%w_dbcsr, &
781 rtbse_env%t_3c_w, rtbse_env%t_3c_work_RI_AO__AO, &
782 rtbse_env%t_3c_work2_RI_AO__AO, rtbse_env%greens_dbt)
783 END SUBROUTINE create_sigma_workspace
784! **************************************************************************************************
785!> \brief Allocates the workspaces for self-energy determination routine
786!> \note Does so without referencing the rtbse_env
787!> \note References bs_env
788!> \param rtbse_env Structure for holding information and workspace structures
789!> \param qs_env Quickstep environment - entry point of calculation
790!> \author Stepan Marek
791!> \date 02.2024
792! **************************************************************************************************
793 SUBROUTINE create_sigma_workspace_qs_only(qs_env, screened_dbt, screened_dbcsr, int_3c_dbt, &
794 work_dbt_3c_1, work_dbt_3c_2, work_dbt_2c)
795 TYPE(qs_environment_type), POINTER :: qs_env
796 TYPE(dbcsr_type) :: screened_dbcsr
797 TYPE(dbt_type) :: screened_dbt, &
798 int_3c_dbt, &
799 work_dbt_3c_1, &
800 work_dbt_3c_2, &
801 work_dbt_2c
802 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
803
804 CALL get_qs_env(qs_env, bs_env=bs_env)
805
806 ! t_3c_w
807 CALL dbt_create(bs_env%t_RI__AO_AO, int_3c_dbt)
808 ! TODO : Provide option/decision whether to store the 3c integrals precomputed
809 CALL compute_3c_integrals(qs_env, bs_env, int_3c_dbt)
810 ! t_3c_work_RI_AO__AO
811 CALL dbt_create(bs_env%t_RI_AO__AO, work_dbt_3c_1)
812 ! t_3c_work2_RI_AO__AO
813 CALL dbt_create(bs_env%t_RI_AO__AO, work_dbt_3c_2)
814 ! t_W
815 ! Populate screened_dbt from gw run
816 CALL dbcsr_create(screened_dbcsr, name="W", template=bs_env%mat_RI_RI%matrix)
817 CALL dbt_create(screened_dbcsr, screened_dbt)
818 ! greens_dbt
819 CALL dbt_create(bs_env%mat_ao_ao%matrix, work_dbt_2c)
820 END SUBROUTINE
821! **************************************************************************************************
822!> \brief Releases the workspaces for self-energy determination
823!> \param rtbse_env
824!> \author Stepan Marek
825!> \date 02.2024
826! **************************************************************************************************
827 SUBROUTINE release_sigma_workspace(rtbse_env)
828 TYPE(rtbse_env_type) :: rtbse_env
829
830 CALL dbt_destroy(rtbse_env%t_3c_w)
831 CALL dbt_destroy(rtbse_env%t_3c_work_RI_AO__AO)
832 CALL dbt_destroy(rtbse_env%t_3c_work2_RI_AO__AO)
833 CALL dbt_destroy(rtbse_env%screened_dbt)
834 CALL dbt_destroy(rtbse_env%greens_dbt)
835 CALL dbcsr_release(rtbse_env%w_dbcsr)
836 END SUBROUTINE
837! **************************************************************************************************
838!> \brief Multiplies real matrix by a complex matrix from the right
839!> \note So far only converts the real matrix to complex one, potentially doubling the work
840!> \param rtbse_env
841!> \author Stepan Marek
842!> \date 09.2024
843! **************************************************************************************************
844 SUBROUTINE multiply_fm_cfm(trans_r, trans_c, na, nb, nc, &
845 alpha, matrix_r, matrix_c, beta, res)
846 ! Transposition
847 CHARACTER(len=1) :: trans_r, trans_c
848 INTEGER :: na, nb, nc
849 ! accept real numbers
850 ! TODO : Just use complex numbers and import z_one, z_zero etc.
851 REAL(kind=dp) :: alpha, beta
852 TYPE(cp_fm_type) :: matrix_r
853 TYPE(cp_cfm_type) :: matrix_c, res
854 TYPE(cp_fm_type) :: work_re, work_im, res_re, res_im
855 REAL(kind=dp) :: i_unit
856 CHARACTER(len=1) :: trans_cr
857
858 CALL cp_fm_create(work_re, matrix_c%matrix_struct)
859 CALL cp_fm_create(work_im, matrix_c%matrix_struct)
860 CALL cp_fm_create(res_re, res%matrix_struct)
861 CALL cp_fm_create(res_im, res%matrix_struct)
862 CALL cp_cfm_to_fm(matrix_c, work_re, work_im)
863 SELECT CASE (trans_c)
864 CASE ("C")
865 i_unit = -1.0_dp
866 trans_cr = "T"
867 CASE ("T")
868 i_unit = 1.0_dp
869 trans_cr = "T"
870 CASE default
871 i_unit = 1.0_dp
872 trans_cr = "N"
873 END SELECT
874 ! Actual multiplication
875 CALL parallel_gemm(trans_r, trans_cr, na, nb, nc, &
876 alpha, matrix_r, work_re, beta, res_re)
877 CALL parallel_gemm(trans_r, trans_cr, na, nb, nc, &
878 i_unit*alpha, matrix_r, work_im, beta, res_im)
879 CALL cp_fm_to_cfm(res_re, res_im, res)
880 CALL cp_fm_release(work_re)
881 CALL cp_fm_release(work_im)
882 CALL cp_fm_release(res_re)
883 CALL cp_fm_release(res_im)
884
885 END SUBROUTINE multiply_fm_cfm
886! **************************************************************************************************
887!> \brief Multiplies complex matrix by a real matrix from the right
888!> \note So far only converts the real matrix to complex one, potentially doubling the work
889!> \param rtbse_env
890!> \author Stepan Marek
891!> \date 09.2024
892! **************************************************************************************************
893 SUBROUTINE multiply_cfm_fm(trans_c, trans_r, na, nb, nc, &
894 alpha, matrix_c, matrix_r, beta, res)
895 ! Transposition
896 CHARACTER(len=1) :: trans_c, trans_r
897 INTEGER :: na, nb, nc
898 ! accept real numbers
899 ! TODO : complex number support via interface?
900 REAL(kind=dp) :: alpha, beta
901 TYPE(cp_cfm_type) :: matrix_c, res
902 TYPE(cp_fm_type) :: matrix_r
903 TYPE(cp_fm_type) :: work_re, work_im, res_re, res_im
904 REAL(kind=dp) :: i_unit
905 CHARACTER(len=1) :: trans_cr
906
907 CALL cp_fm_create(work_re, matrix_c%matrix_struct)
908 CALL cp_fm_create(work_im, matrix_c%matrix_struct)
909 CALL cp_fm_create(res_re, res%matrix_struct)
910 CALL cp_fm_create(res_im, res%matrix_struct)
911 CALL cp_cfm_to_fm(matrix_c, work_re, work_im)
912 SELECT CASE (trans_c)
913 CASE ("C")
914 i_unit = -1.0_dp
915 trans_cr = "T"
916 CASE ("T")
917 i_unit = 1.0_dp
918 trans_cr = "T"
919 CASE default
920 i_unit = 1.0_dp
921 trans_cr = "N"
922 END SELECT
923 ! Actual multiplication
924 CALL parallel_gemm(trans_cr, trans_r, na, nb, nc, &
925 alpha, work_re, matrix_r, beta, res_re)
926 CALL parallel_gemm(trans_cr, trans_r, na, nb, nc, &
927 i_unit*alpha, work_im, matrix_r, beta, res_im)
928 CALL cp_fm_to_cfm(res_re, res_im, res)
929 CALL cp_fm_release(work_re)
930 CALL cp_fm_release(work_im)
931 CALL cp_fm_release(res_re)
932 CALL cp_fm_release(res_im)
933
934 END SUBROUTINE multiply_cfm_fm
935END MODULE
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_print(matrix, variable_name, unit_nr)
Prints given matrix in matlab format (only present blocks).
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
subroutine, public cp_fm_invert(matrix_a, matrix_inverse, det_a, eps_svd, eigval)
Inverts a cp_fm_type matrix, optionally returning the determinant of the input matrix.
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
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
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
subroutine, public cp_fm_write_formatted(fm, unit, header, value_format)
Write out a full matrix in plain text.
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 use_mom_ref_user
integer, parameter, public use_mom_ref_com
integer, parameter, public do_exact
integer, parameter, public use_mom_ref_zero
integer, parameter, public rtp_bse_ham_g0w0
integer, parameter, public do_taylor
integer, parameter, public rtp_bse_ham_ks
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_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
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: ...
Interface to the Libint-Library or a c++ wrapper.
subroutine, public cp_libint_static_init()
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_zero
Routines for calculating a complex matrix exponential.
Definition matrix_exp.F:13
subroutine, public get_nsquare_norder(norm, nsquare, norder, eps_exp, method, do_emd)
optimization function for pade/taylor order and number of squaring steps
Definition matrix_exp.F:244
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
basic linear algebra operations for full matrixes
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
subroutine, public create_and_init_bs_env(qs_env, bs_env, post_scf_bandstructure_section)
...
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, 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, ecoul_1c, rho0_s_rs, rho0_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)
Get the QUICKSTEP environment.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Definition qs_moments.F:560
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:383
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.
Routines for propagating the orbitals.
subroutine, public s_matrices_create(s_mat, rtp)
calculates the needed overlap-like matrices depending on the way the exponential is calculated,...
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public get_rtp(rtp, exp_h_old, exp_h_new, h_last_iter, rho_old, rho_next, rho_new, mos, mos_new, mos_old, mos_next, s_inv, s_half, s_minus_half, b_mat, c_mat, propagator_matrix, mixing, mixing_factor, s_der, dt, nsteps, sinvh, sinvh_imag, sinvb, admm_mos)
...
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.
Routines for that prepare rtp and EMD.
subroutine, public rt_initialize_rho_from_mos(rtp, mos, mos_old)
Computes the density matrix from the mos Update: Initialized the density matrix from complex mos (for...
Just to build arrays of pointers to matrices.
Represent a complex full matrix.
just to build arrays of pointers to matrices
represent a full matrix
wrapper to abstract the force evaluation of the various methods