(git:e7e05ae)
rpa_rse.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Routines to compute singles correction to RPA (RSE)
10 !> \par History
11 !> 08.2019 created [Vladimir Rybkin]
12 !> \author Vladimir Rybkin
13 ! **************************************************************************************************
14 MODULE rpa_rse
15 
16  USE cp_blacs_env, ONLY: cp_blacs_env_type
17  USE cp_control_types, ONLY: dft_control_type
26  cp_fm_struct_type
27  USE cp_fm_types, ONLY: cp_fm_create,&
30  cp_fm_release,&
33  cp_fm_type
34  USE dbcsr_api, ONLY: dbcsr_copy,&
35  dbcsr_create,&
36  dbcsr_init_p,&
37  dbcsr_p_type,&
38  dbcsr_release,&
39  dbcsr_scale,&
40  dbcsr_set,&
41  dbcsr_type_symmetric
43  USE hfx_exx, ONLY: exx_post_hfx,&
45  USE hfx_ri, ONLY: hfx_ri_update_ks
48  section_vals_type,&
50  USE kinds, ONLY: dp
51  USE message_passing, ONLY: mp_para_env_type
52  USE mp2_types, ONLY: mp2_type
53  USE parallel_gemm_api, ONLY: parallel_gemm
54  USE pw_types, ONLY: pw_r3d_rs_type
55  USE qs_energy_types, ONLY: qs_energy_type
56  USE qs_environment_types, ONLY: get_qs_env,&
57  qs_environment_type
58  USE qs_ks_types, ONLY: qs_ks_env_type
60  USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
61  USE qs_rho_types, ONLY: qs_rho_get,&
62  qs_rho_type
63  USE qs_vxc, ONLY: qs_vxc_create
64 
65 !$ USE OMP_LIB, ONLY: omp_get_max_threads, omp_get_thread_num, omp_get_num_threads
66 
67 #include "./base/base_uses.f90"
68 
69  IMPLICIT NONE
70 
71  PRIVATE
72 
73  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rpa_rse'
74 
75  PUBLIC :: rse_energy
76 
77 CONTAINS
78 
79 ! **************************************************************************************************
80 !> \brief Single excitations energy corrections for RPA
81 !> \param qs_env ...
82 !> \param mp2_env ...
83 !> \param para_env ...
84 !> \param dft_control ...
85 !> \param mo_coeff ...
86 !> \param nmo ...
87 !> \param homo ...
88 !> \param Eigenval ...
89 !> \author Vladimir Rybkin, 08/2019
90 ! **************************************************************************************************
91  SUBROUTINE rse_energy(qs_env, mp2_env, para_env, dft_control, &
92  mo_coeff, nmo, homo, Eigenval)
93  TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
94  TYPE(mp2_type), INTENT(INOUT) :: mp2_env
95  TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
96  TYPE(dft_control_type), INTENT(IN), POINTER :: dft_control
97  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
98  INTEGER, INTENT(IN) :: nmo
99  INTEGER, DIMENSION(:), INTENT(IN) :: homo
100  REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: eigenval
101 
102  CHARACTER(LEN=*), PARAMETER :: routinen = 'rse_energy'
103 
104  INTEGER :: dimen, handle, i_global, iib, ispin, &
105  j_global, jjb, n_rep_hf, ncol_local, &
106  nrow_local, nspins
107  INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
108  LOGICAL :: do_hfx, hfx_treat_lsd_in_core
109  REAL(kind=dp) :: coeff, corr, rse_corr
110  REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: diag_diff
111  TYPE(cp_blacs_env_type), POINTER :: blacs_env
112  TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
113  TYPE(cp_fm_type) :: fm_ao, fm_ao_mo
114  TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: fm_p_mu_nu, fm_x_mo, fm_xc_mo
115  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_mu_nu, matrix_s, rho_ao
116  TYPE(neighbor_list_set_p_type), DIMENSION(:), &
117  POINTER :: sab_orb
118  TYPE(qs_energy_type), POINTER :: energy
119  TYPE(qs_rho_type), POINTER :: rho
120  TYPE(section_vals_type), POINTER :: hfx_sections, input
121 
122  CALL timeset(routinen, handle)
123 
124  nspins = dft_control%nspins
125 
126  ! Pick the diagonal terms
127  CALL cp_fm_get_info(matrix=mo_coeff(1), &
128  nrow_local=nrow_local, &
129  ncol_local=ncol_local, &
130  row_indices=row_indices, &
131  col_indices=col_indices)
132 
133  ! start collecting stuff
134  dimen = nmo
135  NULLIFY (input, matrix_s, blacs_env, rho, energy, sab_orb)
136  CALL get_qs_env(qs_env, &
137  input=input, &
138  matrix_s=matrix_s, &
139  blacs_env=blacs_env, &
140  rho=rho, &
141  energy=energy, &
142  sab_orb=sab_orb)
143 
144  CALL qs_rho_get(rho, rho_ao=rho_ao)
145 
146  ! hfx section
147  NULLIFY (hfx_sections)
148  hfx_sections => section_vals_get_subs_vals(input, "DFT%XC%WF_CORRELATION%RI_RPA%HF")
149  CALL section_vals_get(hfx_sections, explicit=do_hfx, n_repetition=n_rep_hf)
150  IF (do_hfx) THEN
151  CALL section_vals_val_get(hfx_sections, "TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
152  i_rep_section=1)
153  END IF
154 
155  ! create work array
156  NULLIFY (mat_mu_nu)
157  CALL dbcsr_allocate_matrix_set(mat_mu_nu, nspins)
158  DO ispin = 1, nspins
159  ALLOCATE (mat_mu_nu(ispin)%matrix)
160  CALL dbcsr_create(matrix=mat_mu_nu(ispin)%matrix, template=matrix_s(1)%matrix, name="T_mu_nu", &
161  matrix_type=dbcsr_type_symmetric, nze=0)
162  CALL cp_dbcsr_alloc_block_from_nbl(mat_mu_nu(ispin)%matrix, sab_orb)
163  CALL dbcsr_set(mat_mu_nu(ispin)%matrix, 0.0_dp)
164  END DO
165 
166  ! Dense (full) matrices
167  ALLOCATE (fm_p_mu_nu(nspins))
168  NULLIFY (fm_struct_tmp)
169  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
170  nrow_global=dimen, ncol_global=dimen)
171  DO ispin = 1, nspins
172  CALL cp_fm_create(fm_p_mu_nu(ispin), fm_struct_tmp, name="P_mu_nu")
173  CALL cp_fm_set_all(fm_p_mu_nu(ispin), 0.0_dp)
174  END DO
175  CALL cp_fm_struct_release(fm_struct_tmp)
176 
177  NULLIFY (fm_struct_tmp)
178  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
179  nrow_global=dimen, ncol_global=dimen)
180  ALLOCATE (fm_x_mo(nspins), fm_xc_mo(nspins))
181  DO ispin = 1, nspins
182  CALL cp_fm_create(fm_x_mo(ispin), fm_struct_tmp, name="f_X_mo")
183  CALL cp_fm_create(fm_xc_mo(ispin), fm_struct_tmp, name="f_XC_mo")
184  CALL cp_fm_set_all(fm_x_mo(ispin), 0.0_dp)
185  CALL cp_fm_set_all(fm_xc_mo(ispin), 0.0_dp)
186  END DO
187  CALL cp_fm_struct_release(fm_struct_tmp)
188 
189  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
190  nrow_global=dimen, ncol_global=dimen)
191  CALL cp_fm_create(fm_ao, fm_struct_tmp, name="f_ao")
192  CALL cp_fm_struct_release(fm_struct_tmp)
193  CALL cp_fm_set_all(fm_ao, 0.0_dp)
194  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
195  nrow_global=dimen, ncol_global=dimen)
196  CALL cp_fm_create(fm_ao_mo, fm_struct_tmp, name="f_ao_mo")
197  CALL cp_fm_struct_release(fm_struct_tmp)
198  CALL cp_fm_set_all(fm_ao_mo, 0.0_dp)
199 
200  !
201  ! Ready with preparations, do the real staff
202  !
203 
204  ! Obtain density matrix like quantity
205 
206  coeff = 1.0_dp
207  IF (nspins == 1) coeff = 2.0_dp
208  DO ispin = 1, nspins
209  CALL parallel_gemm(transa='N', transb='T', m=dimen, n=dimen, k=homo(ispin), alpha=coeff, &
210  matrix_a=mo_coeff(ispin), matrix_b=mo_coeff(ispin), &
211  beta=0.0_dp, matrix_c=fm_p_mu_nu(ispin))
212  END DO
213 
214  ! Calculate exact exchange contribution
215  CALL exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
216  hfx_sections, n_rep_hf, &
217  rho, mat_mu_nu, fm_p_mu_nu, &
218  fm_ao, fm_x_mo, fm_ao_mo, &
219  mp2_env%ri_grad%free_hfx_buffer)
220 
221  ! Calculate DFT exchange-correlation contribution
222  CALL xc_contribution(qs_env, fm_ao, fm_ao_mo, fm_xc_mo, mo_coeff, dimen)
223 
224  ALLOCATE (diag_diff(dimen))
225  rse_corr = 0.0_dp
226 
227  DO ispin = 1, nspins
228  ! Compute the correction matrix: it is stored in fm_X_mo
229  CALL cp_fm_scale_and_add(1.0_dp, fm_x_mo(ispin), -1.0_dp, fm_xc_mo(ispin))
230 
231  ! Pick the diagonal terms
232  CALL cp_fm_get_diag(fm_x_mo(ispin), diag_diff)
233 
234  ! Compute the correction
235  CALL cp_fm_get_info(matrix=fm_x_mo(ispin), &
236  nrow_local=nrow_local, &
237  ncol_local=ncol_local, &
238  row_indices=row_indices, &
239  col_indices=col_indices)
240 
241  corr = 0.0_dp
242 
243 !$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(jjB,iiB,i_global,j_global) &
244 !$OMP REDUCTION(+: corr) &
245 !$OMP SHARED(ncol_local,nrow_local,col_indices,row_indices,diag_diff,eigenval,fm_X_mo,homo,ispin)
246  DO jjb = 1, ncol_local
247  j_global = col_indices(jjb)
248  DO iib = 1, nrow_local
249  i_global = row_indices(iib)
250  IF ((i_global .LE. homo(ispin)) .AND. (j_global .GT. homo(ispin))) THEN
251  corr = corr + fm_x_mo(ispin)%local_data(iib, jjb)**2.0_dp/ &
252  (eigenval(i_global, ispin) - eigenval(j_global, ispin) - diag_diff(i_global) + diag_diff(j_global))
253  END IF
254  END DO
255  END DO
256 !$OMP END PARALLEL DO
257 
258  rse_corr = rse_corr + corr
259  END DO
260 
261  CALL para_env%sum(rse_corr)
262 
263  IF (nspins == 1) rse_corr = rse_corr*2.0_dp
264 
265  mp2_env%ri_rpa%rse_corr_diag = rse_corr
266 
267  CALL non_diag_rse(fm_x_mo, eigenval, dimen, homo, para_env, blacs_env, rse_corr)
268 
269  IF (nspins == 1) rse_corr = rse_corr*2.0_dp
270 
271  mp2_env%ri_rpa%rse_corr = rse_corr
272 
273  ! Release staff
274  DEALLOCATE (diag_diff)
275  CALL cp_fm_release(fm_ao)
276  CALL cp_fm_release(fm_ao_mo)
277  CALL cp_fm_release(fm_p_mu_nu)
278  CALL cp_fm_release(fm_x_mo)
279  CALL cp_fm_release(fm_xc_mo)
280  DO ispin = 1, nspins
281  CALL dbcsr_release(mat_mu_nu(ispin)%matrix)
282  DEALLOCATE (mat_mu_nu(ispin)%matrix)
283  END DO
284  DEALLOCATE (mat_mu_nu)
285 
286  CALL timestop(handle)
287 
288  END SUBROUTINE rse_energy
289 
290 ! **************************************************************************************************
291 !> \brief HF exchange occupied-virtual matrix
292 !> \param qs_env ...
293 !> \param para_env ...
294 !> \param dimen ...
295 !> \param mo_coeff ...
296 !> \param hfx_sections ...
297 !> \param n_rep_hf ...
298 !> \param rho_work ...
299 !> \param mat_mu_nu ...
300 !> \param fm_P_mu_nu ...
301 !> \param fm_X_ao ...
302 !> \param fm_X_mo ...
303 !> \param fm_X_ao_mo ...
304 !> \param recalc_hfx_integrals ...
305 ! **************************************************************************************************
306  SUBROUTINE exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
307  hfx_sections, n_rep_hf, &
308  rho_work, mat_mu_nu, fm_P_mu_nu, &
309  fm_X_ao, fm_X_mo, fm_X_ao_mo, &
310  recalc_hfx_integrals)
311  TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
312  TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
313  INTEGER, INTENT(IN) :: dimen
314  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: mo_coeff
315  TYPE(section_vals_type), INTENT(IN), POINTER :: hfx_sections
316  INTEGER, INTENT(IN) :: n_rep_hf
317  TYPE(qs_rho_type), INTENT(IN), POINTER :: rho_work
318  TYPE(dbcsr_p_type), DIMENSION(:), INTENT(IN), &
319  POINTER :: mat_mu_nu
320  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_p_mu_nu
321  TYPE(cp_fm_type), INTENT(IN) :: fm_x_ao
322  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_x_mo
323  TYPE(cp_fm_type), INTENT(IN) :: fm_x_ao_mo
324  LOGICAL, INTENT(IN) :: recalc_hfx_integrals
325 
326  CHARACTER(LEN=*), PARAMETER :: routinen = 'exchange_contribution'
327 
328  INTEGER :: handle, irep, is, ns
329  LOGICAL :: my_recalc_hfx_integrals
330  REAL(kind=dp) :: ehfx
331  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_mu_nu, rho_work_ao
332  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_2d, rho_ao_2d
333 
334  CALL timeset(routinen, handle)
335 
336  my_recalc_hfx_integrals = recalc_hfx_integrals
337 
338  CALL qs_rho_get(rho_work, rho_ao=rho_work_ao)
339  ns = SIZE(rho_work_ao)
340  NULLIFY (p_mu_nu)
341  CALL dbcsr_allocate_matrix_set(p_mu_nu, ns)
342  DO is = 1, ns
343  CALL dbcsr_init_p(p_mu_nu(is)%matrix)
344  CALL dbcsr_create(p_mu_nu(is)%matrix, template=rho_work_ao(1)%matrix)
345  CALL dbcsr_copy(p_mu_nu(is)%matrix, rho_work_ao(1)%matrix)
346  CALL dbcsr_set(p_mu_nu(is)%matrix, 0.0_dp)
347  END DO
348 
349  CALL exx_pre_hfx(hfx_sections, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
350  DO is = 1, ns
351  CALL copy_fm_to_dbcsr(fm_p_mu_nu(is), p_mu_nu(1)%matrix, keep_sparsity=.true.)
352 
353  CALL dbcsr_set(mat_mu_nu(1)%matrix, 0.0_dp)
354 
355  IF (qs_env%mp2_env%ri_rpa%x_data(1, 1)%do_hfx_ri) THEN
356 
357  DO irep = 1, n_rep_hf
358  rho_ao_2d(1:ns, 1:1) => p_mu_nu(1:ns)
359  mat_2d(1:ns, 1:1) => mat_mu_nu(1:ns)
360  CALL hfx_ri_update_ks(qs_env, qs_env%mp2_env%ri_rpa%x_data(irep, 1)%ri_data, mat_2d, ehfx, &
361  rho_ao=rho_ao_2d, geometry_did_change=my_recalc_hfx_integrals, nspins=1, &
362  hf_fraction=qs_env%mp2_env%ri_rpa%x_data(irep, 1)%general_parameter%fraction)
363 
364  IF (ns == 2) CALL dbcsr_scale(mat_mu_nu(1)%matrix, 2.0_dp)
365  my_recalc_hfx_integrals = .false.
366  END DO
367 
368  ELSE
369 
370  DO irep = 1, n_rep_hf
371  rho_ao_2d(1:ns, 1:1) => p_mu_nu(1:ns)
372  mat_2d(1:ns, 1:1) => mat_mu_nu(1:ns)
373  CALL integrate_four_center(qs_env, qs_env%mp2_env%ri_rpa%x_data, mat_2d, ehfx, rho_ao_2d, hfx_sections, &
374  para_env, my_recalc_hfx_integrals, irep, .true., &
375  ispin=1)
376 
377  my_recalc_hfx_integrals = .false.
378  END DO
379  END IF
380 
381  ! copy back to fm
382  CALL cp_fm_set_all(fm_x_ao, 0.0_dp)
383  CALL copy_dbcsr_to_fm(matrix=mat_mu_nu(1)%matrix, fm=fm_x_ao)
384  CALL cp_fm_set_all(fm_x_mo(is), 0.0_dp)
385 
386  ! First index
387  CALL parallel_gemm('T', 'N', dimen, dimen, dimen, 1.0_dp, &
388  mo_coeff(is), fm_x_ao, 0.0_dp, fm_x_ao_mo)
389 
390  ! Second index
391  CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
392  fm_x_ao_mo, mo_coeff(is), 1.0_dp, fm_x_mo(is))
393 
394  END DO
395  CALL exx_post_hfx(qs_env, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
396 
397  ! Release dbcsr objects
398  DO is = 1, SIZE(p_mu_nu)
399  CALL dbcsr_release(p_mu_nu(is)%matrix)
400  DEALLOCATE (p_mu_nu(is)%matrix)
401  END DO
402  DEALLOCATE (p_mu_nu)
403 
404  CALL timestop(handle)
405 
406  END SUBROUTINE exchange_contribution
407 
408 ! **************************************************************************************************
409 !> \brief Exchange-correlation occupied-virtual matrix
410 !> \param qs_env ...
411 !> \param fm_XC_ao ...
412 !> \param fm_XC_ao_mo ...
413 !> \param fm_XC_mo ...
414 !> \param mo_coeff ...
415 !> \param dimen ...
416 ! **************************************************************************************************
417  SUBROUTINE xc_contribution(qs_env, fm_XC_ao, fm_XC_ao_mo, fm_XC_mo, mo_coeff, dimen)
418  TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
419  TYPE(cp_fm_type), INTENT(IN) :: fm_xc_ao, fm_xc_ao_mo
420  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_xc_mo, mo_coeff
421  INTEGER, INTENT(IN) :: dimen
422 
423  CHARACTER(LEN=*), PARAMETER :: routinen = 'xc_contribution'
424 
425  INTEGER :: handle, i
426  REAL(kind=dp) :: exc
427  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_vxc
428  TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: tau_rspace, v_rspace
429  TYPE(qs_ks_env_type), POINTER :: ks_env
430  TYPE(qs_rho_type), POINTER :: rho
431  TYPE(section_vals_type), POINTER :: input, xc_section
432 
433  CALL timeset(routinen, handle)
434 
435  NULLIFY (matrix_vxc, v_rspace, tau_rspace, input, xc_section, ks_env, &
436  rho)
437  CALL get_qs_env(qs_env, matrix_vxc=matrix_vxc, input=input, ks_env=ks_env, rho=rho)
438  xc_section => section_vals_get_subs_vals(input, "DFT%XC")
439 
440  ! Compute XC matrix in AO basis
441  CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=xc_section, &
442  vxc_rho=v_rspace, vxc_tau=tau_rspace, exc=exc)
443 
444  IF (ASSOCIATED(v_rspace)) THEN
445  CALL compute_matrix_vxc(qs_env=qs_env, v_rspace=v_rspace, matrix_vxc=matrix_vxc)
446 
447  DO i = 1, SIZE(v_rspace)
448  CALL v_rspace(i)%release()
449  END DO
450  DEALLOCATE (v_rspace)
451 
452  DO i = 1, SIZE(matrix_vxc)
453  CALL cp_fm_set_all(fm_xc_ao, 0.0_dp)
454  CALL copy_dbcsr_to_fm(matrix=matrix_vxc(i)%matrix, fm=fm_xc_ao)
455  CALL cp_fm_set_all(fm_xc_mo(i), 0.0_dp)
456 
457  ! First index
458  CALL parallel_gemm('T', 'N', dimen, dimen, dimen, 1.0_dp, &
459  mo_coeff(i), fm_xc_ao, 0.0_dp, fm_xc_ao_mo)
460 
461  ! Second index
462  CALL parallel_gemm('N', 'N', dimen, dimen, dimen, 1.0_dp, &
463  fm_xc_ao_mo, mo_coeff(i), 1.0_dp, fm_xc_mo(i))
464 
465  END DO
466 
467  DO i = 1, SIZE(matrix_vxc)
468  CALL dbcsr_release(matrix_vxc(i)%matrix)
469  DEALLOCATE (matrix_vxc(i)%matrix)
470  END DO
471  DEALLOCATE (matrix_vxc)
472  END IF
473 
474  CALL timestop(handle)
475 
476  END SUBROUTINE xc_contribution
477 
478 ! **************************************************************************************************
479 !> \brief ...
480 !> \param fm_F_mo ...
481 !> \param eigenval ...
482 !> \param dimen ...
483 !> \param homo ...
484 !> \param para_env ...
485 !> \param blacs_env ...
486 !> \param rse_corr ...
487 ! **************************************************************************************************
488  SUBROUTINE non_diag_rse(fm_F_mo, eigenval, dimen, homo, para_env, &
489  blacs_env, rse_corr)
490  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_f_mo
491  REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: eigenval
492  INTEGER, INTENT(IN) :: dimen
493  INTEGER, DIMENSION(:), INTENT(IN) :: homo
494  TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
495  TYPE(cp_blacs_env_type), INTENT(IN), POINTER :: blacs_env
496  REAL(kind=dp), INTENT(OUT) :: rse_corr
497 
498  CHARACTER(LEN=*), PARAMETER :: routinen = 'non_diag_rse'
499 
500  INTEGER :: handle, i_global, iib, ispin, j_global, &
501  jjb, ncol_local, nrow_local, nspins, &
502  virtual
503  INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
504  REAL(kind=dp) :: corr
505  REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eig_o, eig_semi_can, eig_v
506  TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
507  TYPE(cp_fm_type) :: fm_f_oo, fm_f_ov, fm_f_vv, fm_o, fm_tmp, &
508  fm_u
509 
510  CALL timeset(routinen, handle)
511 
512  nspins = SIZE(fm_f_mo)
513 
514  DO ispin = 1, nspins
515  ! Add eigenvalues on the diagonal
516  CALL cp_fm_get_info(matrix=fm_f_mo(ispin), &
517  nrow_local=nrow_local, &
518  ncol_local=ncol_local, &
519  row_indices=row_indices, &
520  col_indices=col_indices)
521 
522 !$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(jjB,iiB,i_global,j_global) &
523 !$OMP SHARED(ncol_local,nrow_local,col_indices,row_indices,fm_F_mo,eigenval,ispin)
524  DO jjb = 1, ncol_local
525  j_global = col_indices(jjb)
526  DO iib = 1, nrow_local
527  i_global = row_indices(iib)
528  IF (i_global .EQ. j_global) fm_f_mo(ispin)%local_data(iib, jjb) = &
529  fm_f_mo(ispin)%local_data(iib, jjb) + eigenval(i_global, ispin)
530  END DO
531  END DO
532 !$OMP END PARALLEL DO
533  END DO
534 
535  rse_corr = 0.0_dp
536 
537  DO ispin = 1, nspins
538  ! Create the occupied-occupied and virtual-virtual blocks, eigenvectors
539  NULLIFY (fm_struct_tmp)
540  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
541  nrow_global=homo(ispin), ncol_global=homo(ispin))
542  CALL cp_fm_create(fm_f_oo, fm_struct_tmp, name="F_oo")
543  CALL cp_fm_create(fm_o, fm_struct_tmp, name="O")
544  CALL cp_fm_set_all(fm_f_oo, 0.0_dp)
545  CALL cp_fm_set_all(fm_o, 0.0_dp)
546  CALL cp_fm_struct_release(fm_struct_tmp)
547 
548  CALL cp_fm_to_fm_submat(msource=fm_f_mo(ispin), mtarget=fm_f_oo, &
549  nrow=homo(ispin), ncol=homo(ispin), &
550  s_firstrow=1, s_firstcol=1, &
551  t_firstrow=1, t_firstcol=1)
552  virtual = dimen - homo(ispin)
553  NULLIFY (fm_struct_tmp)
554  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
555  nrow_global=virtual, ncol_global=virtual)
556  CALL cp_fm_create(fm_f_vv, fm_struct_tmp, name="F_vv")
557  CALL cp_fm_create(fm_u, fm_struct_tmp, name="U")
558  CALL cp_fm_set_all(fm_f_vv, 0.0_dp)
559  CALL cp_fm_set_all(fm_u, 0.0_dp)
560  CALL cp_fm_struct_release(fm_struct_tmp)
561 
562  CALL cp_fm_to_fm_submat(msource=fm_f_mo(ispin), mtarget=fm_f_vv, &
563  nrow=virtual, ncol=virtual, &
564  s_firstrow=homo(ispin) + 1, s_firstcol=homo(ispin) + 1, &
565  t_firstrow=1, t_firstcol=1)
566 
567  ! Diagonalize occupied-occupied and virtual-virtual matrices
568  ALLOCATE (eig_o(homo(ispin)))
569  ALLOCATE (eig_v(virtual))
570  eig_v = 0.0_dp
571  eig_o = 0.0_dp
572  CALL choose_eigv_solver(fm_f_oo, fm_o, eig_o)
573  CALL choose_eigv_solver(fm_f_vv, fm_u, eig_v)
574 
575  ! Collect the eigenvalues to one array
576  ALLOCATE (eig_semi_can(dimen))
577  eig_semi_can = 0.0_dp
578  eig_semi_can(1:homo(ispin)) = eig_o(:)
579  eig_semi_can(homo(ispin) + 1:dimen) = eig_v(:)
580 
581  ! Create occupied-virtual block
582  NULLIFY (fm_struct_tmp)
583  CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
584  nrow_global=homo(ispin), ncol_global=virtual)
585  CALL cp_fm_create(fm_f_ov, fm_struct_tmp, name="F_ov")
586  CALL cp_fm_create(fm_tmp, fm_struct_tmp, name="tmp")
587  CALL cp_fm_set_all(fm_f_ov, 0.0_dp)
588  CALL cp_fm_set_all(fm_tmp, 0.0_dp)
589  CALL cp_fm_struct_release(fm_struct_tmp)
590 
591  CALL cp_fm_to_fm_submat(msource=fm_f_mo(ispin), mtarget=fm_f_ov, &
592  nrow=homo(ispin), ncol=virtual, &
593  s_firstrow=1, s_firstcol=homo(ispin) + 1, &
594  t_firstrow=1, t_firstcol=1)
595 
596  CALL parallel_gemm(transa='T', transb='N', m=homo(ispin), n=virtual, k=homo(ispin), alpha=1.0_dp, &
597  matrix_a=fm_o, matrix_b=fm_f_ov, beta=0.0_dp, matrix_c=fm_tmp)
598 
599  CALL parallel_gemm(transa='N', transb='N', m=homo(ispin), n=virtual, k=virtual, alpha=1.0_dp, &
600  matrix_a=fm_tmp, matrix_b=fm_u, beta=0.0_dp, matrix_c=fm_f_ov)
601 
602  ! Compute the correction
603  CALL cp_fm_get_info(matrix=fm_f_ov, &
604  nrow_local=nrow_local, &
605  ncol_local=ncol_local, &
606  row_indices=row_indices, &
607  col_indices=col_indices)
608  corr = 0.0_dp
609 !$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(jjB,iiB,i_global,j_global) &
610 !$OMP REDUCTION(+:corr) &
611 !$OMP SHARED(ncol_local,nrow_local,col_indices,row_indices,fm_F_ov,eig_semi_can,homo,ispin)
612  DO jjb = 1, ncol_local
613  j_global = col_indices(jjb)
614  DO iib = 1, nrow_local
615  i_global = row_indices(iib)
616  corr = corr + fm_f_ov%local_data(iib, jjb)**2.0_dp/ &
617  (eig_semi_can(i_global) - eig_semi_can(j_global + homo(ispin)))
618  END DO
619  END DO
620 !$OMP END PARALLEL DO
621 
622  rse_corr = rse_corr + corr
623 
624  ! Release
625  DEALLOCATE (eig_semi_can)
626  DEALLOCATE (eig_o)
627  DEALLOCATE (eig_v)
628 
629  CALL cp_fm_release(fm_f_ov)
630  CALL cp_fm_release(fm_f_oo)
631  CALL cp_fm_release(fm_f_vv)
632  CALL cp_fm_release(fm_u)
633  CALL cp_fm_release(fm_o)
634  CALL cp_fm_release(fm_tmp)
635 
636  END DO
637 
638  CALL para_env%sum(rse_corr)
639 
640  CALL timestop(handle)
641 
642  END SUBROUTINE non_diag_rse
643 
644 END MODULE rpa_rse
methods related to the blacs parallel environment
Definition: cp_blacs_env.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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_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....
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
Definition: cp_fm_diag.F:17
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
Definition: cp_fm_diag.F:208
represent the structure of a full matrix
Definition: cp_fm_struct.F:14
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
Definition: cp_fm_struct.F:125
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
Definition: cp_fm_struct.F:320
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
Definition: cp_fm_types.F:570
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
Definition: cp_fm_types.F:1016
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
Definition: cp_fm_types.F:1473
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
Definition: cp_fm_types.F:535
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Definition: cp_fm_types.F:167
Routines to calculate HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
Routines to calculate EXX in RPA and energy correction methods.
Definition: hfx_exx.F:16
subroutine, public exx_pre_hfx(ext_hfx_section, x_data, reuse_hfx)
Prepare the external x_data for integration. Simply change the HFX fraction in case the qs_envx_data ...
Definition: hfx_exx.F:735
subroutine, public exx_post_hfx(qs_env, x_data, reuse_hfx)
Revert back to the proper HFX fraction in case qs_envx_data is reused.
Definition: hfx_exx.F:760
RI-methods for HFX.
Definition: hfx_ri.F:12
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Definition: hfx_ri.F:1033
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
Interface to the message passing library MPI.
Types needed for MP2 calculations.
Definition: mp2_types.F:14
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_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, 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, rhs)
Get the QUICKSTEP environment.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
Definition: qs_ks_utils.F:22
subroutine, public compute_matrix_vxc(qs_env, v_rspace, matrix_vxc)
compute matrix_vxc, defined via the potential created by qs_vxc_create ignores things like tau functi...
Definition: qs_ks_utils.F:1174
Define the neighbor list data types and the corresponding functionality.
superstucture that hold various representations of the density and keeps track of which ones are vali...
Definition: qs_rho_types.F:18
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Definition: qs_rho_types.F:229
Definition: qs_vxc.F:16
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Definition: qs_vxc.F:98
Routines to compute singles correction to RPA (RSE)
Definition: rpa_rse.F:14
subroutine, public rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, nmo, homo, Eigenval)
Single excitations energy corrections for RPA.
Definition: rpa_rse.F:93