(git:691081d)
Loading...
Searching...
No Matches
mp2_gpw.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Calls routines to get RI integrals and calculate total energies
10!> \par History
11!> 10.2011 created [Joost VandeVondele and Mauro Del Ben]
12!> 07.2019 split from mp2_gpw.F [Frederick Stein]
13! **************************************************************************************************
14MODULE mp2_gpw
19 USE cell_types, ONLY: cell_type,&
26 USE cp_dbcsr_api, ONLY: &
27 dbcsr_clear_mempools, dbcsr_copy, dbcsr_create, dbcsr_distribution_release, &
30 dbcsr_p_type, dbcsr_release, dbcsr_type, dbcsr_type_no_symmetry, dbcsr_type_symmetric
35 USE cp_fm_types, ONLY: cp_fm_get_info,&
38 USE cp_log_handling, ONLY: &
42 USE dbt_api, ONLY: dbt_type
53 USE hfx_types, ONLY: block_ind_type,&
55 USE input_constants, ONLY: &
59 USE kinds, ONLY: dp
60 USE kpoint_types, ONLY: kpoint_type
61 USE machine, ONLY: default_output_unit,&
72 USE mp2_types, ONLY: mp2_type,&
80 USE qs_kind_types, ONLY: get_qs_kind,&
83 USE qs_mo_types, ONLY: get_mo_set,&
93 USE rpa_rse, ONLY: rse_energy
94#include "./base/base_uses.f90"
95
96 IMPLICIT NONE
97
98 PRIVATE
99
100 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_gpw'
101
103
104CONTAINS
105
106! **************************************************************************************************
107!> \brief with a big bang to mp2
108!> \param qs_env ...
109!> \param mp2_env ...
110!> \param Emp2 ...
111!> \param Emp2_Cou ...
112!> \param Emp2_EX ...
113!> \param Emp2_S ...
114!> \param Emp2_T ...
115!> \param mos_mp2 ...
116!> \param para_env ...
117!> \param unit_nr ...
118!> \param calc_forces ...
119!> \param calc_ex ...
120!> \param do_ri_mp2 ...
121!> \param do_ri_rpa ...
122!> \param do_ri_sos_laplace_mp2 ...
123!> \author Mauro Del Ben and Joost VandeVondele
124! **************************************************************************************************
125 SUBROUTINE mp2_gpw_main(qs_env, mp2_env, Emp2, Emp2_Cou, Emp2_EX, Emp2_S, Emp2_T, &
126 mos_mp2, para_env, unit_nr, calc_forces, calc_ex, do_ri_mp2, do_ri_rpa, &
127 do_ri_sos_laplace_mp2)
128 TYPE(qs_environment_type), POINTER :: qs_env
129 TYPE(mp2_type) :: mp2_env
130 REAL(kind=dp), INTENT(OUT) :: emp2, emp2_cou, emp2_ex, emp2_s, emp2_t
131 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos_mp2
132 TYPE(mp_para_env_type), POINTER :: para_env
133 INTEGER, INTENT(IN) :: unit_nr
134 LOGICAL, INTENT(IN) :: calc_forces, calc_ex
135 LOGICAL, INTENT(IN), OPTIONAL :: do_ri_mp2, do_ri_rpa, &
136 do_ri_sos_laplace_mp2
137
138 CHARACTER(LEN=*), PARAMETER :: routinen = 'mp2_gpw_main'
139
140 INTEGER :: blacs_grid_layout, color_sub, dimen_ri, dimen_ri_red, eri_method, handle, ispin, &
141 local_unit_nr, my_group_l_end, my_group_l_size, my_group_l_start, nmo, nspins, &
142 potential_type, ri_metric_type
143 INTEGER, ALLOCATABLE, DIMENSION(:) :: bse_lev_virt, ends_array_mc, ends_array_mc_block, &
144 gw_corr_lev_occ, gw_corr_lev_virt, homo, starts_array_mc, starts_array_mc_block
145 INTEGER, DIMENSION(3) :: periodic
146 LOGICAL :: blacs_repeatable, do_bse, do_im_time, do_kpoints_cubic_rpa, my_do_gw, &
147 my_do_ri_mp2, my_do_ri_rpa, my_do_ri_sos_laplace_mp2
148 REAL(kind=dp) :: emp2_ab, emp2_bb, emp2_cou_bb, &
149 emp2_ex_bb, eps_gvg_rspace_old, &
150 eps_pgf_orb_old, eps_rho_rspace_old
151 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: eigenval
152 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
153 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
154 TYPE(block_ind_type), ALLOCATABLE, &
155 DIMENSION(:, :, :) :: t_3c_o_ind
156 TYPE(cell_type), POINTER :: cell
157 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub, blacs_env_sub_mat_munu
158 TYPE(cp_fm_type) :: fm_matrix_pq
159 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: mo_coeff
160 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_matrix_l_kpoints, fm_matrix_minv, &
161 fm_matrix_minv_l_kpoints, &
162 fm_matrix_minv_vtrunc_minv
163 TYPE(cp_fm_type), POINTER :: mo_coeff_ptr
164 TYPE(cp_logger_type), POINTER :: logger, logger_sub
165 TYPE(dbcsr_p_type) :: mat_munu, mat_p_global
166 TYPE(dbcsr_p_type), ALLOCATABLE, DIMENSION(:) :: mo_coeff_all, mo_coeff_gw, mo_coeff_o, &
167 mo_coeff_o_bse, mo_coeff_v, &
168 mo_coeff_v_bse
169 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
170 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp
171 TYPE(dbt_type) :: t_3c_m
172 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_o
173 TYPE(dft_control_type), POINTER :: dft_control
174 TYPE(group_dist_d1_type) :: gd_array, gd_b_all
175 TYPE(group_dist_d1_type), ALLOCATABLE, &
176 DIMENSION(:) :: gd_b_occ_bse, gd_b_virt_bse, gd_b_virtual
177 TYPE(hfx_compression_type), ALLOCATABLE, &
178 DIMENSION(:, :, :) :: t_3c_o_compressed
179 TYPE(kpoint_type), POINTER :: kpoints, kpoints_from_dft
180 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
181 TYPE(mp_para_env_type), POINTER :: para_env_sub
182 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
183 POINTER :: sab_orb_sub
184 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
185 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
186 TYPE(qs_ks_env_type), POINTER :: ks_env
187 TYPE(three_dim_real_array), ALLOCATABLE, &
188 DIMENSION(:) :: bib_c, bib_c_bse_ab, bib_c_bse_ij, &
189 bib_c_gw
190
191 CALL timeset(routinen, handle)
192
193 ! check if we want to do ri-mp2
194 my_do_ri_mp2 = .false.
195 IF (PRESENT(do_ri_mp2)) my_do_ri_mp2 = do_ri_mp2
196
197 ! check if we want to do ri-rpa
198 my_do_ri_rpa = .false.
199 IF (PRESENT(do_ri_rpa)) my_do_ri_rpa = do_ri_rpa
200
201 ! check if we want to do ri-sos-laplace-mp2
202 my_do_ri_sos_laplace_mp2 = .false.
203 IF (PRESENT(do_ri_sos_laplace_mp2)) my_do_ri_sos_laplace_mp2 = do_ri_sos_laplace_mp2
204
205 ! GW and SOS-MP2 cannot be used together
206 IF (my_do_ri_sos_laplace_mp2) THEN
207 cpassert(.NOT. mp2_env%ri_rpa%do_ri_g0w0)
208 END IF
209
210 ! check if we want to do imaginary time
211 do_im_time = mp2_env%do_im_time
212 do_bse = qs_env%mp2_env%bse%do_bse
213 do_kpoints_cubic_rpa = qs_env%mp2_env%ri_rpa_im_time%do_im_time_kpoints
214
215 IF (do_kpoints_cubic_rpa .AND. mp2_env%ri_rpa%do_ri_g0w0) THEN
216 cpabort("Full RPA k-points (DO_KPOINTS in LOW_SCALING section) not implemented with GW")
217 END IF
218
219 ! Get the number of spins
220 nspins = SIZE(mos_mp2)
221
222 ! ... setup needed to be able to qs_integrate in a subgroup.
223 IF (do_kpoints_cubic_rpa) THEN
224 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints_from_dft)
225 mos(1:nspins) => kpoints_from_dft%kp_env(1)%kpoint_env%mos(1:nspins, 1)
226 ELSE
227 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, mos=mos)
228 END IF
229 CALL get_mo_set(mo_set=mos_mp2(1), nmo=nmo)
230 ALLOCATE (homo(nspins), eigenval(nmo, nspins), mo_coeff(nspins))
231 DO ispin = 1, nspins
232 CALL get_mo_set(mo_set=mos_mp2(ispin), &
233 eigenvalues=mo_eigenvalues, homo=homo(ispin), &
234 mo_coeff=mo_coeff_ptr)
235 mo_coeff(ispin) = mo_coeff_ptr
236 eigenval(:, ispin) = mo_eigenvalues(1:nmo)
237 END DO
238
239 ! a para_env
240 color_sub = para_env%mepos/mp2_env%mp2_num_proc
241 ALLOCATE (para_env_sub)
242 CALL para_env_sub%from_split(para_env, color_sub)
243
244 ! each of the sub groups might need to generate output
245 logger => cp_get_default_logger()
246 IF (para_env%is_source()) THEN
247 local_unit_nr = cp_logger_get_default_unit_nr(logger, local=.false.)
248 ELSE
249 local_unit_nr = default_output_unit
250 END IF
251
252 ! get stuff
253 CALL get_qs_env(qs_env, &
254 ks_env=ks_env, &
255 qs_kind_set=qs_kind_set, &
256 cell=cell, &
257 particle_set=particle_set, &
258 atomic_kind_set=atomic_kind_set, &
259 dft_control=dft_control, &
260 matrix_s_kp=matrix_s_kp)
261
262 CALL get_cell(cell=cell, periodic=periodic)
263
264 IF (do_im_time) THEN
265 IF (mp2_env%ri_metric%potential_type == ri_default) THEN
266 IF (sum(periodic) == 1 .OR. sum(periodic) == 3) THEN
267 mp2_env%ri_metric%potential_type = do_potential_id
268 ELSE
269 mp2_env%ri_metric%potential_type = do_potential_truncated
270 END IF
271 END IF
272
273 END IF
274
275 IF (mp2_env%ri_metric%potential_type == ri_default) THEN
276 mp2_env%ri_metric%potential_type = do_potential_coulomb
277 END IF
278
279 IF (mp2_env%eri_method == eri_default) THEN
280 IF (sum(periodic) > 0) mp2_env%eri_method = do_eri_gpw
281 IF (sum(periodic) == 0) mp2_env%eri_method = do_eri_os
282 IF (sum(mp2_env%ri_rpa_im_time%kp_grid) > 0) mp2_env%eri_method = do_eri_os
283 IF (mp2_env%method == mp2_method_gpw) mp2_env%eri_method = do_eri_gpw
284 IF (mp2_env%method == ri_mp2_method_gpw) mp2_env%eri_method = do_eri_gpw
285 IF (mp2_env%ri_rpa_im_time%do_im_time_kpoints) mp2_env%eri_method = do_eri_os
286 IF (calc_forces .AND. mp2_env%eri_method == do_eri_os) mp2_env%eri_method = do_eri_gpw
287 END IF
288 eri_method = mp2_env%eri_method
289
290 IF (unit_nr > 0 .AND. mp2_env%eri_method == do_eri_gpw) THEN
291 WRITE (unit=unit_nr, fmt="(T3,A,T71,F10.1)") &
292 "GPW_INFO| Density cutoff [a.u.]:", mp2_env%mp2_gpw%cutoff*0.5_dp
293 WRITE (unit=unit_nr, fmt="(T3,A,T71,F10.1)") &
294 "GPW_INFO| Relative density cutoff [a.u.]:", mp2_env%mp2_gpw%relative_cutoff*0.5_dp
295 CALL m_flush(unit_nr)
296 END IF
297
298 ! MG: Disable logger layer for BSE, misses some key information to print cube files properly
299 IF (.NOT. (mp2_env%ri_g0w0%print_local_bandgap .OR. mp2_env%bse%do_nto_analysis)) THEN
300 ! a logger
301 NULLIFY (logger_sub)
302 CALL cp_logger_create(logger_sub, para_env=para_env_sub, &
303 default_global_unit_nr=local_unit_nr, &
304 close_global_unit_on_dealloc=.false.)
305 CALL cp_logger_set(logger_sub, local_filename="MP2_localLog")
306 ! set to a custom print level (we could also have a different print level for para_env%source)
307 logger_sub%iter_info%print_level = mp2_env%mp2_gpw%print_level
308 CALL cp_add_default_logger(logger_sub)
309 END IF
310
311 ! a blacs_env (ignore the globenv stored defaults for now)
312 blacs_grid_layout = blacs_grid_square
313 blacs_repeatable = .true.
314 NULLIFY (blacs_env_sub)
315 CALL cp_blacs_env_create(blacs_env_sub, para_env_sub, &
316 blacs_grid_layout, &
317 blacs_repeatable)
318
319 blacs_env_sub_mat_munu => blacs_env_sub
320
321 matrix_s(1:1) => matrix_s_kp(1:1, 1)
322
323 CALL get_eps_old(dft_control, eps_pgf_orb_old, eps_rho_rspace_old, eps_gvg_rspace_old)
324
325 CALL create_mat_munu(mat_munu, qs_env, mp2_env%mp2_gpw%eps_grid, &
326 blacs_env_sub_mat_munu, do_alloc_blocks_from_nbl=.NOT. do_im_time, sab_orb_sub=sab_orb_sub, &
327 do_kpoints=mp2_env%ri_rpa_im_time%do_im_time_kpoints, &
328 dbcsr_sym_type=dbcsr_type_symmetric)
329
330 ! which RI metric we want to have
331 ri_metric_type = mp2_env%ri_metric%potential_type
332
333 ! which interaction potential
334 potential_type = mp2_env%potential_parameter%potential_type
335
336 ! check if we want to do ri-g0w0 on top of ri-rpa
337 my_do_gw = mp2_env%ri_rpa%do_ri_g0w0
338 ALLOCATE (gw_corr_lev_occ(nspins), gw_corr_lev_virt(nspins), bse_lev_virt(nspins))
339 gw_corr_lev_occ(1) = mp2_env%ri_g0w0%corr_mos_occ
340 gw_corr_lev_virt(1) = mp2_env%ri_g0w0%corr_mos_virt
341 IF (nspins == 2) THEN
342 gw_corr_lev_occ(2) = mp2_env%ri_g0w0%corr_mos_occ_beta
343 gw_corr_lev_virt(2) = mp2_env%ri_g0w0%corr_mos_virt_beta
344 END IF
345
346 IF (do_bse) THEN
347 !Keep default behavior for occupied
348 ! We do not implement an explicit bse_lev_occ here, because the small number of occupied levels
349 ! does not critically influence the memory
350 ! bse_lev_virt is per-spin (= the per-spin GW-corrected virtual count): the (ab|K) block is sized per spin
351 bse_lev_virt(:) = gw_corr_lev_virt(:)
352 END IF
353
354 ! After the components are inside of the routines, we can move this line insight the branch
355 ALLOCATE (mo_coeff_o(nspins), mo_coeff_v(nspins), mo_coeff_all(nspins), mo_coeff_gw(nspins))
356
357 ! Always allocate for usage in call of replicate_mat_to_subgroup
358 ALLOCATE (mo_coeff_o_bse(nspins), mo_coeff_v_bse(nspins))
359
360 ! for imag. time, we do not need this
361 IF (.NOT. do_im_time) THEN
362
363 ! new routine: replicate a full matrix from one para_env to a smaller one
364 ! keeping the memory usage as small as possible in this case the
365 ! output the two part of the C matrix (virtual, occupied)
366 DO ispin = 1, nspins
367
368 CALL replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff(ispin), homo(ispin), mat_munu%matrix, &
369 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
370 mo_coeff_all(ispin)%matrix, mo_coeff_gw(ispin)%matrix, &
371 my_do_gw, gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), do_bse, &
372 bse_lev_virt(ispin), mo_coeff_o_bse(ispin)%matrix, mo_coeff_v_bse(ispin)%matrix, &
373 mp2_env%mp2_gpw%eps_filter)
374
375 END DO
376
377 END IF
378
379 ! now we're kind of ready to go....
380 emp2_s = 0.0_dp
381 emp2_t = 0.0_dp
382 IF (my_do_ri_mp2 .OR. my_do_ri_rpa .OR. my_do_ri_sos_laplace_mp2) THEN
383 ! RI-GPW integrals (same stuff for both RPA and MP2)
384 IF (nspins == 2) THEN
385 ! open shell case (RI) here the (ia|K) integrals are computed for both the alpha and beta components
387 bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, gd_array, gd_b_virtual, dimen_ri, dimen_ri_red, qs_env, &
388 para_env, para_env_sub, color_sub, cell, particle_set, &
389 atomic_kind_set, qs_kind_set, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
390 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, nmo, homo, mat_munu, sab_orb_sub, &
391 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, &
392 mp2_env%mp2_gpw%eps_filter, unit_nr, &
393 mp2_env%mp2_memory, mp2_env%calc_PQ_cond_num, calc_forces, blacs_env_sub, my_do_gw .AND. .NOT. do_im_time, &
394 do_bse, gd_b_all, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, &
395 gw_corr_lev_occ(1), gw_corr_lev_virt(1), &
396 bse_lev_virt, &
397 do_im_time, do_kpoints_cubic_rpa, kpoints, &
398 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
399 mp2_env%ri_metric, &
400 gd_b_occ_bse, gd_b_virt_bse)
401 ELSE
402 ! closed shell case (RI)
403 CALL mp2_ri_gpw_compute_in(bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, gd_array, gd_b_virtual, &
404 dimen_ri, dimen_ri_red, qs_env, para_env, para_env_sub, &
405 color_sub, cell, particle_set, &
406 atomic_kind_set, qs_kind_set, fm_matrix_pq, &
407 fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
408 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, nmo, homo, &
409 mat_munu, sab_orb_sub, &
410 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, &
411 mp2_env%mp2_gpw%eps_filter, unit_nr, &
412 mp2_env%mp2_memory, mp2_env%calc_PQ_cond_num, calc_forces, &
413 blacs_env_sub, my_do_gw .AND. .NOT. do_im_time, do_bse, gd_b_all, &
414 starts_array_mc, ends_array_mc, &
415 starts_array_mc_block, ends_array_mc_block, &
416 gw_corr_lev_occ(1), gw_corr_lev_virt(1), &
417 bse_lev_virt, &
418 do_im_time, do_kpoints_cubic_rpa, kpoints, &
419 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
420 mp2_env%ri_metric, gd_b_occ_bse, gd_b_virt_bse)
421 END IF
422
423 ELSE
424 ! Canonical MP2-GPW
425 IF (nspins == 2) THEN
426 ! alpha-alpha and alpha-beta components
427 IF (unit_nr > 0) WRITE (unit_nr, *)
428 IF (unit_nr > 0) WRITE (unit_nr, '(T3,A)') 'Alpha (ia|'
429 CALL mp2_gpw_compute( &
430 emp2, emp2_cou, emp2_ex, qs_env, para_env, para_env_sub, color_sub, &
431 cell, particle_set, &
432 atomic_kind_set, qs_kind_set, eigenval, nmo, homo, mat_munu, &
433 sab_orb_sub, mo_coeff_o, mo_coeff_v, mp2_env%mp2_gpw%eps_filter, unit_nr, &
434 mp2_env%mp2_memory, calc_ex, blacs_env_sub, emp2_ab)
435
436 ! beta-beta component
437 IF (unit_nr > 0) WRITE (unit_nr, *)
438 IF (unit_nr > 0) WRITE (unit_nr, '(T3,A)') 'Beta (ia|'
439 CALL mp2_gpw_compute( &
440 emp2_bb, emp2_cou_bb, emp2_ex_bb, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, &
441 atomic_kind_set, qs_kind_set, eigenval(:, 2:2), nmo, homo(2:2), mat_munu, &
442 sab_orb_sub, mo_coeff_o(2:2), mo_coeff_v(2:2), mp2_env%mp2_gpw%eps_filter, unit_nr, &
443 mp2_env%mp2_memory, calc_ex, blacs_env_sub)
444
445 ! make order on the MP2 energy contributions
446 emp2_cou = emp2_cou*0.25_dp
447 emp2_ex = emp2_ex*0.5_dp
448
449 emp2_cou_bb = emp2_cou_bb*0.25_dp
450 emp2_ex_bb = emp2_ex_bb*0.5_dp
451
452 emp2_s = emp2_ab
453 emp2_t = emp2_cou + emp2_cou_bb + emp2_ex + emp2_ex_bb
454
455 emp2_cou = emp2_cou + emp2_cou_bb + emp2_ab
456 emp2_ex = emp2_ex + emp2_ex_bb
457 emp2 = emp2_ex + emp2_cou
458
459 ELSE
460 ! closed shell case
461 CALL mp2_gpw_compute( &
462 emp2, emp2_cou, emp2_ex, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, &
463 atomic_kind_set, qs_kind_set, eigenval(:, 1:1), nmo, homo(1:1), mat_munu, &
464 sab_orb_sub, mo_coeff_o(1:1), mo_coeff_v(1:1), mp2_env%mp2_gpw%eps_filter, unit_nr, &
465 mp2_env%mp2_memory, calc_ex, blacs_env_sub)
466 END IF
467 END IF
468
469 ! Free possibly large buffers allocated by dbcsr on the GPU,
470 ! large hybrid dgemm/pdgemm's coming later will need the space.
471 CALL dbcsr_clear_mempools()
472
473 IF (calc_forces .AND. .NOT. do_im_time) THEN
474 ! make a copy of mo_coeff_o and mo_coeff_v
475 ALLOCATE (mp2_env%ri_grad%mo_coeff_o(nspins), mp2_env%ri_grad%mo_coeff_v(nspins))
476 DO ispin = 1, nspins
477 NULLIFY (mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
478 CALL dbcsr_init_p(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
479 CALL dbcsr_copy(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix, mo_coeff_o(ispin)%matrix, &
480 name="mo_coeff_o"//cp_to_string(ispin))
481 NULLIFY (mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
482 CALL dbcsr_init_p(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
483 CALL dbcsr_copy(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
484 name="mo_coeff_v"//cp_to_string(ispin))
485 END DO
486 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
487 END IF
488 ! Copy mo coeffs for RPA exchange correction
489 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none) THEN
490 ALLOCATE (mp2_env%ri_rpa%mo_coeff_o(nspins), mp2_env%ri_rpa%mo_coeff_v(nspins))
491 DO ispin = 1, nspins
492 CALL dbcsr_copy(mp2_env%ri_rpa%mo_coeff_o(ispin), mo_coeff_o(ispin)%matrix, name="mo_coeff_o")
493 CALL dbcsr_copy(mp2_env%ri_rpa%mo_coeff_v(ispin), mo_coeff_v(ispin)%matrix, name="mo_coeff_v")
494 END DO
495 END IF
496
497 IF (.NOT. do_im_time) THEN
498
499 DO ispin = 1, nspins
500 CALL dbcsr_release(mo_coeff_o(ispin)%matrix)
501 DEALLOCATE (mo_coeff_o(ispin)%matrix)
502 CALL dbcsr_release(mo_coeff_v(ispin)%matrix)
503 DEALLOCATE (mo_coeff_v(ispin)%matrix)
504 IF (my_do_gw) THEN
505 CALL dbcsr_release(mo_coeff_all(ispin)%matrix)
506 DEALLOCATE (mo_coeff_all(ispin)%matrix)
507 END IF
508 END DO
509 DEALLOCATE (mo_coeff_o, mo_coeff_v)
510 IF (my_do_gw) DEALLOCATE (mo_coeff_all)
511
512 END IF
513 IF (do_bse) THEN
514 DO ispin = 1, nspins
515 CALL dbcsr_release(mo_coeff_o_bse(ispin)%matrix)
516 CALL dbcsr_release(mo_coeff_v_bse(ispin)%matrix)
517 DEALLOCATE (mo_coeff_o_bse(ispin)%matrix)
518 DEALLOCATE (mo_coeff_v_bse(ispin)%matrix)
519 END DO
520 END IF
521 DEALLOCATE (mo_coeff_o_bse, mo_coeff_v_bse)
522
523 ! Release some memory for RPA exchange correction
524 IF (calc_forces .AND. do_im_time .OR. &
525 (.NOT. calc_forces .AND. mp2_env%ri_rpa%exchange_correction == rpa_exchange_none)) THEN
526
527 CALL dbcsr_release(mat_munu%matrix)
528 DEALLOCATE (mat_munu%matrix)
529
530 CALL release_neighbor_list_sets(sab_orb_sub)
531
532 END IF
533
534 ! decide if to do RI-RPA or RI-MP2
535 IF (my_do_ri_rpa .OR. my_do_ri_sos_laplace_mp2) THEN
536
537 IF (do_im_time) CALL create_matrix_p(mat_p_global, qs_env, mp2_env, para_env)
538
539 IF (.NOT. ALLOCATED(bib_c)) ALLOCATE (bib_c(nspins))
540 IF (.NOT. ALLOCATED(bib_c_gw)) ALLOCATE (bib_c_gw(nspins))
541 IF (.NOT. ALLOCATED(gd_b_virtual)) ALLOCATE (gd_b_virtual(nspins))
542
543 ! RI-RPA
544 CALL rpa_ri_compute_en(qs_env, emp2, mp2_env, bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, &
545 para_env, para_env_sub, color_sub, &
546 gd_array, gd_b_virtual, gd_b_all, gd_b_occ_bse, gd_b_virt_bse, &
547 mo_coeff, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
548 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, kpoints, &
549 eigenval, nmo, homo, dimen_ri, dimen_ri_red, gw_corr_lev_occ, gw_corr_lev_virt, &
550 bse_lev_virt, &
551 unit_nr, my_do_ri_sos_laplace_mp2, my_do_gw, do_im_time, do_bse, matrix_s, &
552 mat_munu, mat_p_global, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
553 starts_array_mc, ends_array_mc, &
554 starts_array_mc_block, ends_array_mc_block, calc_forces)
555
556 IF (mp2_env%ri_rpa%do_rse) THEN
557 CALL rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, homo, eigenval)
558 END IF
559
560 IF (do_im_time) THEN
561 IF (ASSOCIATED(mat_p_global%matrix)) THEN
562 CALL dbcsr_release(mat_p_global%matrix)
563 DEALLOCATE (mat_p_global%matrix)
564 END IF
565
566 IF (calc_forces) CALL cp_fm_release(fm_matrix_pq)
567 END IF
568
569 ! Release some memory for RPA exchange correction
570 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none) THEN
571
572 CALL dbcsr_release(mat_munu%matrix)
573 DEALLOCATE (mat_munu%matrix)
574
575 CALL release_neighbor_list_sets(sab_orb_sub)
576
577 END IF
578
579 ELSE
580 IF (my_do_ri_mp2) THEN
581 emp2 = 0.0_dp
582 emp2_cou = 0.0_dp
583 emp2_ex = 0.0_dp
584
585 ! RI-MP2-GPW compute energy
587 emp2_cou, emp2_ex, emp2_s, emp2_t, bib_c, mp2_env, para_env, para_env_sub, color_sub, &
588 gd_array, gd_b_virtual, &
589 eigenval, nmo, homo, dimen_ri_red, unit_nr, calc_forces, calc_ex)
590
591 END IF
592 END IF
593
594 ! if we need forces time to calculate the MP2 non-separable contribution
595 ! and start computing the Lagrangian
596 IF (calc_forces .AND. .NOT. do_im_time) THEN
597
598 CALL calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, &
599 particle_set, atomic_kind_set, qs_kind_set, &
600 mo_coeff, dimen_ri, eigenval, &
601 my_group_l_start, my_group_l_end, my_group_l_size, &
602 sab_orb_sub, mat_munu, blacs_env_sub)
603
604 DO ispin = 1, nspins
605 CALL dbcsr_release(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
606 DEALLOCATE (mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
607
608 CALL dbcsr_release(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
609 DEALLOCATE (mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
610 END DO
611 DEALLOCATE (mp2_env%ri_grad%mo_coeff_o, mp2_env%ri_grad%mo_coeff_v)
612
613 CALL dbcsr_release(mat_munu%matrix)
614 DEALLOCATE (mat_munu%matrix)
615
616 CALL release_neighbor_list_sets(sab_orb_sub)
617
618 END IF
619
620 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
621 ! moved from above
622 IF (my_do_gw .AND. .NOT. do_im_time) THEN
623 DO ispin = 1, nspins
624 CALL dbcsr_release(mo_coeff_gw(ispin)%matrix)
625 DEALLOCATE (mo_coeff_gw(ispin)%matrix)
626 END DO
627 DEALLOCATE (mo_coeff_gw)
628 END IF
629
630 ! re-init the radii to be able to generate pair lists with MP2-appropriate screening
631 dft_control%qs_control%eps_pgf_orb = eps_pgf_orb_old
632 dft_control%qs_control%eps_rho_rspace = eps_rho_rspace_old
633 dft_control%qs_control%eps_gvg_rspace = eps_gvg_rspace_old
634 CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
635
636 CALL cp_blacs_env_release(blacs_env_sub)
637
638 IF (.NOT. (mp2_env%ri_g0w0%print_local_bandgap .OR. mp2_env%bse%do_nto_analysis)) THEN
640 CALL cp_logger_release(logger_sub)
641 END IF
642
643 CALL mp_para_env_release(para_env_sub)
644
645 ! finally solve the z-vector equation if forces are required
646 IF (calc_forces .AND. .NOT. do_im_time) THEN
647 CALL solve_z_vector_eq(qs_env, mp2_env, para_env, dft_control, &
648 mo_coeff, homo, eigenval, unit_nr)
649 END IF
650
651 DEALLOCATE (eigenval, mo_coeff)
652
653 CALL timestop(handle)
654
655 END SUBROUTINE mp2_gpw_main
656
657! **************************************************************************************************
658!> \brief ...
659!> \param para_env ...
660!> \param para_env_sub ...
661!> \param mo_coeff ...
662!> \param homo ...
663!> \param mat_munu ...
664!> \param mo_coeff_o ...
665!> \param mo_coeff_v ...
666!> \param mo_coeff_all ...
667!> \param mo_coeff_gw ...
668!> \param my_do_gw ...
669!> \param gw_corr_lev_occ ...
670!> \param gw_corr_lev_virt ...
671!> \param my_do_bse ...
672!> \param bse_lev_virt ...
673!> \param mo_coeff_o_bse ...
674!> \param mo_coeff_v_bse ...
675!> \param eps_filter ...
676! **************************************************************************************************
677 SUBROUTINE replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff, homo, mat_munu, &
678 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, my_do_gw, &
679 gw_corr_lev_occ, gw_corr_lev_virt, my_do_bse, &
680 bse_lev_virt, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter)
681 TYPE(mp_para_env_type), INTENT(IN) :: para_env, para_env_sub
682 TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
683 INTEGER, INTENT(IN) :: homo
684 TYPE(dbcsr_type), INTENT(INOUT) :: mat_munu
685 TYPE(dbcsr_type), POINTER :: mo_coeff_o, mo_coeff_v, mo_coeff_all, &
686 mo_coeff_gw
687 LOGICAL, INTENT(IN) :: my_do_gw
688 INTEGER, INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt
689 LOGICAL, INTENT(IN) :: my_do_bse
690 INTEGER, INTENT(IN) :: bse_lev_virt
691 TYPE(dbcsr_type), POINTER :: mo_coeff_o_bse, mo_coeff_v_bse
692 REAL(kind=dp), INTENT(IN) :: eps_filter
693
694 CHARACTER(LEN=*), PARAMETER :: routinen = 'replicate_mat_to_subgroup'
695
696 INTEGER :: handle
697 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: c
698 TYPE(group_dist_d1_type) :: gd_array
699
700 CALL timeset(routinen, handle)
701
702 CALL grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, c)
703
704 ! create and fill mo_coeff_o, mo_coeff_v and mo_coeff_all
705 ALLOCATE (mo_coeff_o)
706 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_o, c(:, 1:homo), &
707 mat_munu, gd_array, eps_filter)
708
709 ALLOCATE (mo_coeff_v)
710 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v, c(:, homo + 1:), &
711 mat_munu, gd_array, eps_filter)
712
713 IF (my_do_gw) THEN
714 ALLOCATE (mo_coeff_gw)
715 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_gw, c(:, homo - gw_corr_lev_occ + 1:homo + gw_corr_lev_virt), &
716 mat_munu, gd_array, eps_filter)
717
718 ! all levels
719 ALLOCATE (mo_coeff_all)
720 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_all, c, &
721 mat_munu, gd_array, eps_filter)
722
723 END IF
724
725 IF (my_do_bse) THEN
726
727 ALLOCATE (mo_coeff_o_bse)
728 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_o_bse, c(:, 1:homo), &
729 mat_munu, gd_array, eps_filter)
730
731 ALLOCATE (mo_coeff_v_bse)
732 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v_bse, c(:, homo + 1:homo + bse_lev_virt), &
733 mat_munu, gd_array, eps_filter)
734
735 END IF
736 DEALLOCATE (c)
737 CALL release_group_dist(gd_array)
738
739 CALL timestop(handle)
740
741 END SUBROUTINE replicate_mat_to_subgroup
742
743! **************************************************************************************************
744!> \brief ...
745!> \param para_env ...
746!> \param para_env_sub ...
747!> \param mo_coeff ...
748!> \param gd_array ...
749!> \param C ...
750! **************************************************************************************************
751 SUBROUTINE grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, C)
752 TYPE(mp_para_env_type), INTENT(IN) :: para_env, para_env_sub
753 TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
754 TYPE(group_dist_d1_type), INTENT(OUT) :: gd_array
755 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :), &
756 INTENT(OUT) :: c
757
758 CHARACTER(LEN=*), PARAMETER :: routinen = 'grep_rows_in_subgroups'
759
760 INTEGER :: handle, i_global, iib, j_global, jjb, max_row_col_local, my_mu_end, my_mu_size, &
761 my_mu_start, ncol_global, ncol_local, ncol_rec, nrow_global, nrow_local, nrow_rec, &
762 proc_receive_static, proc_send_static, proc_shift
763 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: local_col_row_info, rec_col_row_info
764 INTEGER, DIMENSION(:), POINTER :: col_indices, col_indices_rec, &
765 row_indices, row_indices_rec
766 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: local_c, rec_c
767 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :), &
768 POINTER :: local_c_internal
769
770 CALL timeset(routinen, handle)
771
772 CALL cp_fm_get_info(matrix=mo_coeff, &
773 ncol_global=ncol_global, &
774 nrow_global=nrow_global, &
775 nrow_local=nrow_local, &
776 ncol_local=ncol_local, &
777 row_indices=row_indices, &
778 col_indices=col_indices, &
779 local_data=local_c_internal)
780
781 CALL create_group_dist(gd_array, para_env_sub%num_pe, nrow_global)
782 CALL get_group_dist(gd_array, para_env_sub%mepos, my_mu_start, my_mu_end, my_mu_size)
783
784 ! local storage for the C matrix
785 ALLOCATE (c(my_mu_size, ncol_global))
786 c = 0.0_dp
787
788 ALLOCATE (local_c(nrow_local, ncol_local))
789 local_c(:, :) = local_c_internal(1:nrow_local, 1:ncol_local)
790 NULLIFY (local_c_internal)
791
792 max_row_col_local = max(nrow_local, ncol_local)
793 CALL para_env%max(max_row_col_local)
794
795 ALLOCATE (local_col_row_info(0:max_row_col_local, 2))
796 local_col_row_info = 0
797 ! 0,1 nrows
798 local_col_row_info(0, 1) = nrow_local
799 local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
800 ! 0,2 ncols
801 local_col_row_info(0, 2) = ncol_local
802 local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
803
804 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
805
806 ! accumulate data on C buffer starting from myself
807 DO iib = 1, nrow_local
808 i_global = row_indices(iib)
809 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
810 DO jjb = 1, ncol_local
811 j_global = col_indices(jjb)
812 c(i_global - my_mu_start + 1, j_global) = local_c(iib, jjb)
813 END DO
814 END IF
815 END DO
816
817 ! start ring communication for collecting the data from the other
818 proc_send_static = modulo(para_env%mepos + 1, para_env%num_pe)
819 proc_receive_static = modulo(para_env%mepos - 1, para_env%num_pe)
820 DO proc_shift = 1, para_env%num_pe - 1
821 ! first exchange information on the local data
822 rec_col_row_info = 0
823 CALL para_env%sendrecv(local_col_row_info, proc_send_static, rec_col_row_info, proc_receive_static)
824 nrow_rec = rec_col_row_info(0, 1)
825 ncol_rec = rec_col_row_info(0, 2)
826
827 ALLOCATE (row_indices_rec(nrow_rec))
828 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
829
830 ALLOCATE (col_indices_rec(ncol_rec))
831 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
832
833 ALLOCATE (rec_c(nrow_rec, ncol_rec))
834 rec_c = 0.0_dp
835
836 ! then send and receive the real data
837 CALL para_env%sendrecv(local_c, proc_send_static, rec_c, proc_receive_static)
838
839 ! accumulate the received data on C buffer
840 DO iib = 1, nrow_rec
841 i_global = row_indices_rec(iib)
842 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
843 DO jjb = 1, ncol_rec
844 j_global = col_indices_rec(jjb)
845 c(i_global - my_mu_start + 1, j_global) = rec_c(iib, jjb)
846 END DO
847 END IF
848 END DO
849
850 local_col_row_info(:, :) = rec_col_row_info
851 DEALLOCATE (local_c)
852 ALLOCATE (local_c(nrow_rec, ncol_rec))
853 local_c(:, :) = rec_c
854
855 DEALLOCATE (col_indices_rec)
856 DEALLOCATE (row_indices_rec)
857 DEALLOCATE (rec_c)
858 END DO
859
860 DEALLOCATE (local_c)
861 DEALLOCATE (local_col_row_info)
862 DEALLOCATE (rec_col_row_info)
863
864 CALL timestop(handle)
865
866 END SUBROUTINE grep_rows_in_subgroups
867
868! **************************************************************************************************
869!> \brief Encapsulate the building of dbcsr_matrices mo_coeff_(v,o,all)
870!> \param para_env_sub ...
871!> \param mo_coeff_to_build ...
872!> \param Cread ...
873!> \param mat_munu ...
874!> \param gd_array ...
875!> \param eps_filter ...
876!> \author Jan Wilhelm, Code by Mauro Del Ben
877! **************************************************************************************************
878 SUBROUTINE build_dbcsr_from_rows(para_env_sub, mo_coeff_to_build, Cread, &
879 mat_munu, gd_array, eps_filter)
880 TYPE(mp_para_env_type), INTENT(IN) :: para_env_sub
881 TYPE(dbcsr_type) :: mo_coeff_to_build
882 REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: cread
883 TYPE(dbcsr_type), INTENT(INOUT) :: mat_munu
884 TYPE(group_dist_d1_type), INTENT(IN) :: gd_array
885 REAL(kind=dp), INTENT(IN) :: eps_filter
886
887 CHARACTER(LEN=*), PARAMETER :: routinen = 'build_dbcsr_from_rows'
888
889 INTEGER :: col, col_offset, col_size, handle, i, i_global, j, j_global, my_mu_end, &
890 my_mu_start, ncol_global, proc_receive, proc_send, proc_shift, rec_mu_end, rec_mu_size, &
891 rec_mu_start, row, row_offset, row_size
892 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: rec_c
893 REAL(kind=dp), DIMENSION(:, :), POINTER :: data_block
894 TYPE(dbcsr_iterator_type) :: iter
895
896 CALL timeset(routinen, handle)
897
898 ncol_global = SIZE(cread, 2)
899
900 CALL get_group_dist(gd_array, para_env_sub%mepos, my_mu_start, my_mu_end)
901
902 CALL cp_dbcsr_m_by_n_from_row_template(mo_coeff_to_build, template=mat_munu, n=ncol_global, &
903 sym=dbcsr_type_no_symmetry)
904 CALL dbcsr_reserve_all_blocks(mo_coeff_to_build)
905
906 ! accumulate data on mo_coeff_to_build starting from myself
907 CALL dbcsr_iterator_start(iter, mo_coeff_to_build)
908 DO WHILE (dbcsr_iterator_blocks_left(iter))
909 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
910 row_size=row_size, col_size=col_size, &
911 row_offset=row_offset, col_offset=col_offset)
912 DO i = 1, row_size
913 i_global = row_offset + i - 1
914 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
915 DO j = 1, col_size
916 j_global = col_offset + j - 1
917 data_block(i, j) = cread(i_global - my_mu_start + 1, col_offset + j - 1)
918 END DO
919 END IF
920 END DO
921 END DO
922 CALL dbcsr_iterator_stop(iter)
923
924 ! start ring communication in the subgroup for collecting the data from the other
925 ! proc (occupied)
926 DO proc_shift = 1, para_env_sub%num_pe - 1
927 proc_send = modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
928 proc_receive = modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
929
930 CALL get_group_dist(gd_array, proc_receive, rec_mu_start, rec_mu_end, rec_mu_size)
931
932 ALLOCATE (rec_c(rec_mu_size, ncol_global))
933 rec_c = 0.0_dp
934
935 ! then send and receive the real data
936 CALL para_env_sub%sendrecv(cread, proc_send, rec_c, proc_receive)
937
938 ! accumulate data on mo_coeff_to_build the data received from proc_rec
939 CALL dbcsr_iterator_start(iter, mo_coeff_to_build)
940 DO WHILE (dbcsr_iterator_blocks_left(iter))
941 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
942 row_size=row_size, col_size=col_size, &
943 row_offset=row_offset, col_offset=col_offset)
944 DO i = 1, row_size
945 i_global = row_offset + i - 1
946 IF (i_global >= rec_mu_start .AND. i_global <= rec_mu_end) THEN
947 DO j = 1, col_size
948 j_global = col_offset + j - 1
949 data_block(i, j) = rec_c(i_global - rec_mu_start + 1, col_offset + j - 1)
950 END DO
951 END IF
952 END DO
953 END DO
954 CALL dbcsr_iterator_stop(iter)
955
956 DEALLOCATE (rec_c)
957
958 END DO
959 CALL dbcsr_filter(mo_coeff_to_build, eps_filter)
960
961 CALL timestop(handle)
962
963 END SUBROUTINE build_dbcsr_from_rows
964
965! **************************************************************************************************
966!> \brief Encapsulate the building of dbcsr_matrix mat_munu
967!> \param mat_munu ...
968!> \param qs_env ...
969!> \param eps_grid ...
970!> \param blacs_env_sub ...
971!> \param do_ri_aux_basis ...
972!> \param do_mixed_basis ...
973!> \param group_size_prim ...
974!> \param do_alloc_blocks_from_nbl ...
975!> \param do_kpoints ...
976!> \param sab_orb_sub ...
977!> \param dbcsr_sym_type ...
978!> \param custom_row_blk_sizes ...
979!> \author Jan Wilhelm, code by Mauro Del Ben
980! **************************************************************************************************
981 SUBROUTINE create_mat_munu(mat_munu, qs_env, eps_grid, blacs_env_sub, &
982 do_ri_aux_basis, do_mixed_basis, group_size_prim, &
983 do_alloc_blocks_from_nbl, do_kpoints, sab_orb_sub, dbcsr_sym_type, &
984 custom_row_blk_sizes)
985
986 TYPE(dbcsr_p_type), INTENT(OUT) :: mat_munu
987 TYPE(qs_environment_type), POINTER :: qs_env
988 REAL(kind=dp) :: eps_grid
989 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub
990 LOGICAL, INTENT(IN), OPTIONAL :: do_ri_aux_basis, do_mixed_basis
991 INTEGER, INTENT(IN), OPTIONAL :: group_size_prim
992 LOGICAL, INTENT(IN), OPTIONAL :: do_alloc_blocks_from_nbl, do_kpoints
993 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
994 OPTIONAL, POINTER :: sab_orb_sub
995 CHARACTER, OPTIONAL :: dbcsr_sym_type
996 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: custom_row_blk_sizes
997
998 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_mat_munu'
999
1000 CHARACTER :: my_dbcsr_sym_type
1001 INTEGER :: handle, ikind, natom, nkind
1002 INTEGER, DIMENSION(:), POINTER :: col_blk_sizes, row_blk_sizes
1003 LOGICAL :: my_do_alloc_blocks_from_nbl, &
1004 my_do_kpoints, my_do_mixed_basis, &
1005 my_do_ri_aux_basis
1006 LOGICAL, ALLOCATABLE, DIMENSION(:) :: orb_present
1007 REAL(dp), ALLOCATABLE, DIMENSION(:) :: orb_radius
1008 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: pair_radius
1009 REAL(kind=dp) :: subcells
1010 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1011 TYPE(cell_type), POINTER :: cell
1012 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist_sub
1013 TYPE(dft_control_type), POINTER :: dft_control
1014 TYPE(distribution_1d_type), POINTER :: local_molecules_sub, local_particles_sub
1015 TYPE(distribution_2d_type), POINTER :: distribution_2d_sub
1016 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_ri_aux
1017 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
1018 TYPE(local_atoms_type), ALLOCATABLE, DIMENSION(:) :: atom2d
1019 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
1020 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
1021 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1022 POINTER :: my_sab_orb_sub
1023 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1024 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1025
1026 CALL timeset(routinen, handle)
1027
1028 NULLIFY (basis_set_ri_aux)
1029
1030 my_do_ri_aux_basis = .false.
1031 IF (PRESENT(do_ri_aux_basis)) THEN
1032 my_do_ri_aux_basis = do_ri_aux_basis
1033 END IF
1034
1035 my_do_mixed_basis = .false.
1036 IF (PRESENT(do_mixed_basis)) THEN
1037 my_do_mixed_basis = do_mixed_basis
1038 END IF
1039
1040 my_do_alloc_blocks_from_nbl = .false.
1041 IF (PRESENT(do_alloc_blocks_from_nbl)) THEN
1042 my_do_alloc_blocks_from_nbl = do_alloc_blocks_from_nbl
1043 END IF
1044
1045 my_do_kpoints = .false.
1046 IF (PRESENT(do_kpoints)) THEN
1047 my_do_kpoints = do_kpoints
1048 END IF
1049
1050 my_dbcsr_sym_type = dbcsr_type_no_symmetry
1051 IF (PRESENT(dbcsr_sym_type)) THEN
1052 my_dbcsr_sym_type = dbcsr_sym_type
1053 END IF
1054
1055 CALL get_qs_env(qs_env, &
1056 qs_kind_set=qs_kind_set, &
1057 cell=cell, &
1058 particle_set=particle_set, &
1059 atomic_kind_set=atomic_kind_set, &
1060 molecule_set=molecule_set, &
1061 molecule_kind_set=molecule_kind_set, &
1062 dft_control=dft_control)
1063
1064 IF (my_do_kpoints) THEN
1065 ! please choose EPS_PGF_ORB in QS section smaller than EPS_GRID in WFC_GPW section
1066 IF (eps_grid < dft_control%qs_control%eps_pgf_orb) THEN
1067 eps_grid = dft_control%qs_control%eps_pgf_orb
1068 cpwarn("WFC_GPW%EPS_GRID has been set to QS%EPS_PGF_ORB")
1069 END IF
1070 END IF
1071
1072 ! hack hack hack XXXXXXXXXXXXXXX ... to be fixed
1073 dft_control%qs_control%eps_pgf_orb = eps_grid
1074 dft_control%qs_control%eps_rho_rspace = eps_grid
1075 dft_control%qs_control%eps_gvg_rspace = eps_grid
1076 CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
1077
1078 ! get a distribution_1d
1079 NULLIFY (local_particles_sub, local_molecules_sub)
1080 CALL distribute_molecules_1d(atomic_kind_set=atomic_kind_set, &
1081 particle_set=particle_set, &
1082 local_particles=local_particles_sub, &
1083 molecule_kind_set=molecule_kind_set, &
1084 molecule_set=molecule_set, &
1085 local_molecules=local_molecules_sub, &
1086 force_env_section=qs_env%input)
1087
1088 ! get a distribution_2d
1089 NULLIFY (distribution_2d_sub)
1090 CALL distribute_molecules_2d(cell=cell, &
1091 atomic_kind_set=atomic_kind_set, &
1092 qs_kind_set=qs_kind_set, &
1093 particle_set=particle_set, &
1094 molecule_kind_set=molecule_kind_set, &
1095 molecule_set=molecule_set, &
1096 distribution_2d=distribution_2d_sub, &
1097 blacs_env=blacs_env_sub, &
1098 force_env_section=qs_env%input)
1099
1100 ! Build the sub orbital-orbital overlap neighbor lists
1101 CALL section_vals_val_get(qs_env%input, "DFT%SUBCELLS", r_val=subcells)
1102 nkind = SIZE(atomic_kind_set)
1103 ALLOCATE (atom2d(nkind))
1104
1105 CALL atom2d_build(atom2d, local_particles_sub, distribution_2d_sub, atomic_kind_set, &
1106 molecule_set, molecule_only=.false., particle_set=particle_set)
1107
1108 ALLOCATE (orb_present(nkind))
1109 ALLOCATE (orb_radius(nkind))
1110 ALLOCATE (pair_radius(nkind, nkind))
1111
1112 DO ikind = 1, nkind
1113 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1114 IF (ASSOCIATED(orb_basis_set)) THEN
1115 orb_present(ikind) = .true.
1116 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, kind_radius=orb_radius(ikind))
1117 ELSE
1118 orb_present(ikind) = .false.
1119 orb_radius(ikind) = 0.0_dp
1120 END IF
1121 END DO
1122
1123 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
1124
1125 IF (PRESENT(sab_orb_sub)) THEN
1126 NULLIFY (sab_orb_sub)
1127 ! for cubic RPA/GW with kpoints, we need all neighbors and not only the symmetric ones
1128 IF (my_do_kpoints) THEN
1129 CALL build_neighbor_lists(sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1130 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub", &
1131 symmetric=.false.)
1132 ELSE
1133 CALL build_neighbor_lists(sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1134 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub")
1135 END IF
1136 ELSE
1137 NULLIFY (my_sab_orb_sub)
1138 ! for cubic RPA/GW with kpoints, we need all neighbors and not only the symmetric ones
1139 IF (my_do_kpoints) THEN
1140 CALL build_neighbor_lists(my_sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1141 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub", &
1142 symmetric=.false.)
1143 ELSE
1144 CALL build_neighbor_lists(my_sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1145 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub")
1146 END IF
1147 END IF
1148 CALL atom2d_cleanup(atom2d)
1149 DEALLOCATE (atom2d)
1150 DEALLOCATE (orb_present, orb_radius, pair_radius)
1151
1152 ! a dbcsr_dist
1153 ALLOCATE (dbcsr_dist_sub)
1154 CALL cp_dbcsr_dist2d_to_dist(distribution_2d_sub, dbcsr_dist_sub)
1155
1156 ! build a dbcsr matrix the hard way
1157 natom = SIZE(particle_set)
1158 ALLOCATE (row_blk_sizes(natom))
1159 IF (my_do_ri_aux_basis) THEN
1160 IF (PRESENT(custom_row_blk_sizes)) THEN
1161 cpassert(SIZE(custom_row_blk_sizes) == natom)
1162 row_blk_sizes(:) = custom_row_blk_sizes
1163 ELSE
1164 ALLOCATE (basis_set_ri_aux(nkind))
1165 CALL basis_set_list_setup(basis_set_ri_aux, "RI_AUX", qs_kind_set)
1166 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes, basis=basis_set_ri_aux)
1167 DEALLOCATE (basis_set_ri_aux)
1168 END IF
1169
1170 ELSE IF (my_do_mixed_basis) THEN
1171
1172 ALLOCATE (basis_set_ri_aux(nkind))
1173 CALL basis_set_list_setup(basis_set_ri_aux, "RI_AUX", qs_kind_set)
1174 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes, basis=basis_set_ri_aux)
1175 DEALLOCATE (basis_set_ri_aux)
1176
1177 ALLOCATE (col_blk_sizes(natom))
1178
1179 CALL get_particle_set(particle_set, qs_kind_set, nsgf=col_blk_sizes)
1180 col_blk_sizes = col_blk_sizes*group_size_prim
1181
1182 ELSE
1183 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes)
1184 END IF
1185
1186 NULLIFY (mat_munu%matrix)
1187 ALLOCATE (mat_munu%matrix)
1188
1189 IF (my_do_ri_aux_basis) THEN
1190
1191 CALL dbcsr_create(matrix=mat_munu%matrix, &
1192 name="(ai|munu)", &
1193 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1194 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes)
1195
1196 ELSE IF (my_do_mixed_basis) THEN
1197
1198 CALL dbcsr_create(matrix=mat_munu%matrix, &
1199 name="(ai|munu)", &
1200 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1201 row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes)
1202
1203 ELSE
1204
1205 CALL dbcsr_create(matrix=mat_munu%matrix, &
1206 name="(ai|munu)", &
1207 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1208 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes)
1209
1210 IF (my_do_alloc_blocks_from_nbl) THEN
1211
1212 IF (PRESENT(sab_orb_sub)) THEN
1213 CALL cp_dbcsr_alloc_block_from_nbl(mat_munu%matrix, sab_orb_sub)
1214 ELSE
1215 CALL cp_dbcsr_alloc_block_from_nbl(mat_munu%matrix, my_sab_orb_sub)
1216 END IF
1217
1218 END IF
1219
1220 END IF
1221
1222 DEALLOCATE (row_blk_sizes)
1223
1224 IF (my_do_mixed_basis) THEN
1225 DEALLOCATE (col_blk_sizes)
1226 END IF
1227
1228 CALL dbcsr_distribution_release(dbcsr_dist_sub)
1229 DEALLOCATE (dbcsr_dist_sub)
1230
1231 CALL distribution_2d_release(distribution_2d_sub)
1232
1233 CALL distribution_1d_release(local_particles_sub)
1234 CALL distribution_1d_release(local_molecules_sub)
1235
1236 IF (.NOT. PRESENT(sab_orb_sub)) THEN
1237 CALL release_neighbor_list_sets(my_sab_orb_sub)
1238 END IF
1239
1240 CALL timestop(handle)
1241
1242 END SUBROUTINE create_mat_munu
1243
1244! **************************************************************************************************
1245!> \brief ...
1246!> \param mat_P_global ...
1247!> \param qs_env ...
1248!> \param mp2_env ...
1249!> \param para_env ...
1250! **************************************************************************************************
1251 SUBROUTINE create_matrix_p(mat_P_global, qs_env, mp2_env, para_env)
1252
1253 TYPE(dbcsr_p_type), INTENT(OUT) :: mat_p_global
1254 TYPE(qs_environment_type), POINTER :: qs_env
1255 TYPE(mp2_type) :: mp2_env
1256 TYPE(mp_para_env_type), POINTER :: para_env
1257
1258 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_matrix_P'
1259
1260 INTEGER :: blacs_grid_layout, handle
1261 LOGICAL :: blacs_repeatable
1262 TYPE(cp_blacs_env_type), POINTER :: blacs_env_global
1263
1264 CALL timeset(routinen, handle)
1265
1266 blacs_grid_layout = blacs_grid_square
1267 blacs_repeatable = .true.
1268 NULLIFY (blacs_env_global)
1269 CALL cp_blacs_env_create(blacs_env_global, para_env, &
1270 blacs_grid_layout, &
1271 blacs_repeatable)
1272
1273 CALL create_mat_munu(mat_p_global, qs_env, mp2_env%mp2_gpw%eps_grid, &
1274 blacs_env_global, do_ri_aux_basis=.true., &
1275 do_kpoints=mp2_env%ri_rpa_im_time%do_im_time_kpoints)
1276
1277 CALL dbcsr_reserve_all_blocks(mat_p_global%matrix)
1278 CALL cp_blacs_env_release(blacs_env_global)
1279
1280 CALL timestop(handle)
1281
1282 END SUBROUTINE create_matrix_p
1283
1284! **************************************************************************************************
1285!> \brief ...
1286!> \param dft_control ...
1287!> \param eps_pgf_orb_old ...
1288!> \param eps_rho_rspace_old ...
1289!> \param eps_gvg_rspace_old ...
1290! **************************************************************************************************
1291 PURE SUBROUTINE get_eps_old(dft_control, eps_pgf_orb_old, eps_rho_rspace_old, eps_gvg_rspace_old)
1292
1293 TYPE(dft_control_type), INTENT(INOUT) :: dft_control
1294 REAL(kind=dp), INTENT(OUT) :: eps_pgf_orb_old, eps_rho_rspace_old, &
1295 eps_gvg_rspace_old
1296
1297 ! re-init the radii to be able to generate pair lists with MP2-appropriate screening
1298 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
1299 eps_rho_rspace_old = dft_control%qs_control%eps_rho_rspace
1300 eps_gvg_rspace_old = dft_control%qs_control%eps_gvg_rspace
1301
1302 END SUBROUTINE get_eps_old
1303
1304END MODULE mp2_gpw
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Define the atomic kind types and their sub types.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
Definition cell_types.F:233
methods related to the blacs parallel environment
integer, parameter, public blacs_grid_square
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_dist2d_to_dist(dist2d, dist)
Creates a DBCSR distribution from a distribution_2d.
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
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
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
subroutine, public cp_logger_set(logger, local_filename, global_filename)
sets various attributes of the given logger
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_logger_release(logger)
releases this logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
This is the start of a dbt_api, all publically needed functions are exported here....
Definition dbt_api.F:17
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
subroutine, public distribution_1d_release(distribution_1d)
releases the given distribution_1d
stores a mapping of 2D info (e.g. matrix) on a 2D processor distribution (i.e. blacs grid) where cpus...
subroutine, public distribution_2d_release(distribution_2d)
...
Distribution methods for atoms, particles, or molecules.
subroutine, public distribute_molecules_1d(atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, force_env_section, prev_molecule_kind_set, prev_local_molecules)
Distribute molecules and particles.
subroutine, public distribute_molecules_2d(cell, atomic_kind_set, particle_set, qs_kind_set, molecule_kind_set, molecule_set, distribution_2d, blacs_env, force_env_section)
Distributes the particle pairs creating a 2d distribution optimally suited for quickstep.
Types to describe group distributions.
Types and set/get functions for HFX.
Definition hfx_types.F:16
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public rpa_exchange_none
integer, parameter, public do_eri_os
integer, parameter, public ri_mp2_method_gpw
integer, parameter, public do_potential_truncated
integer, parameter, public mp2_method_gpw
integer, parameter, public do_potential_id
integer, parameter, public eri_default
integer, parameter, public ri_default
integer, parameter, public do_potential_coulomb
integer, parameter, public do_eri_gpw
objects that represent the structure of input sections and the data contained in an input section
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
Types and basic routines needed for a kpoint calculation.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
integer, parameter, public default_output_unit
Definition machine.F:46
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Define the molecule kind structure types and the corresponding functionality.
Define the data structure for the molecule information.
Routines to calculate CPHF like update and solve Z-vector equation for MP2 gradients (only GPW).
Definition mp2_cphf.F:14
subroutine, public solve_z_vector_eq(qs_env, mp2_env, para_env, dft_control, mo_coeff, homo, eigenval, unit_nr)
Solve Z-vector equations necessary for the calculation of the MP2 gradients, in order to be consisten...
Definition mp2_cphf.F:155
Routines to calculate MP2 energy using GPW method.
subroutine, public mp2_gpw_compute(emp2, emp2_cou, emp2_ex, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, atomic_kind_set, qs_kind_set, eigenval, nmo, homo, mat_munu, sab_orb_sub, mo_coeff_o, mo_coeff_v, eps_filter, unit_nr, mp2_memory, calc_ex, blacs_env_sub, emp2_ab)
...
Calls routines to get RI integrals and calculate total energies.
Definition mp2_gpw.F:14
subroutine, public mp2_gpw_main(qs_env, mp2_env, emp2, emp2_cou, emp2_ex, emp2_s, emp2_t, mos_mp2, para_env, unit_nr, calc_forces, calc_ex, do_ri_mp2, do_ri_rpa, do_ri_sos_laplace_mp2)
with a big bang to mp2
Definition mp2_gpw.F:128
subroutine, public grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, c)
...
Definition mp2_gpw.F:752
subroutine, public build_dbcsr_from_rows(para_env_sub, mo_coeff_to_build, cread, mat_munu, gd_array, eps_filter)
Encapsulate the building of dbcsr_matrices mo_coeff_(v,o,all).
Definition mp2_gpw.F:880
subroutine, public create_mat_munu(mat_munu, qs_env, eps_grid, blacs_env_sub, do_ri_aux_basis, do_mixed_basis, group_size_prim, do_alloc_blocks_from_nbl, do_kpoints, sab_orb_sub, dbcsr_sym_type, custom_row_blk_sizes)
Encapsulate the building of dbcsr_matrix mat_munu.
Definition mp2_gpw.F:985
Routines to calculate and distribute 2c- and 3c- integrals for RI.
subroutine, public mp2_ri_gpw_compute_in(bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, gd_array, gd_b_virtual, dimen_ri, dimen_ri_red, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, atomic_kind_set, qs_kind_set, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, nmo, homo, mat_munu, sab_orb_sub, mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter, unit_nr, mp2_memory, calc_pq_cond_num, calc_forces, blacs_env_sub, my_do_gw, do_bse, gd_b_all, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, gw_corr_lev_occ, gw_corr_lev_virt, bse_lev_virt, do_im_time, do_kpoints_cubic_rpa, kpoints, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, ri_metric, gd_b_occ_bse, gd_b_virt_bse)
with ri mp2 gpw
Routines to calculate RI-GPW-MP2 energy using pw.
Definition mp2_ri_gpw.F:14
subroutine, public mp2_ri_gpw_compute_en(emp2_cou, emp2_ex, emp2_s, emp2_t, bib_c, mp2_env, para_env, para_env_sub, color_sub, gd_array, gd_b_virtual, eigenval, nmo, homo, dimen_ri, unit_nr, calc_forces, calc_ex)
...
Definition mp2_ri_gpw.F:75
Routines to calculate gradients of RI-GPW-MP2 energy using pw.
Definition mp2_ri_grad.F:13
subroutine, public calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, particle_set, atomic_kind_set, qs_kind_set, mo_coeff, dimen_ri, eigenval, my_group_l_start, my_group_l_end, my_group_l_size, sab_orb_sub, mat_munu, blacs_env_sub)
Calculate the non-separable part of the gradients and update the Lagrangian.
Types needed for MP2 calculations.
Definition mp2_types.F:14
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis, ncgf)
Get the components of a particle set.
Define the data structure for the particle information.
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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.
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii(qs_control, qs_kind_set)
Initialize all the atomic kind radii for a given threshold value.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public atom2d_cleanup(atom2d)
free the internals of atom2d
subroutine, public pair_radius_setup(present_a, present_b, radius_a, radius_b, pair_radius, prmin)
...
subroutine, public build_neighbor_lists(ab_list, particle_set, atom, cell, pair_radius, subcells, mic, symmetric, molecular, subset_of_mol, current_subset, operator_type, nlname, atomb_to_keep, stable_images)
Build simple pair neighbor lists.
subroutine, public atom2d_build(atom2d, distribution_1d, distribution_2d, atomic_kind_set, molecule_set, molecule_only, particle_set)
Build some distribution structure of atoms, refactored from build_qs_neighbor_lists.
Routines to calculate RI-RPA energy.
Definition rpa_main.F:17
subroutine, public rpa_ri_compute_en(qs_env, erpa, mp2_env, bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, para_env, para_env_sub, color_sub, gd_array, gd_b_virtual, gd_b_all, gd_b_occ_bse, gd_b_virt_bse, mo_coeff, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, kpoints, eigenval, nmo, homo, dimen_ri, dimen_ri_red, gw_corr_lev_occ, gw_corr_lev_virt, bse_lev_virt, unit_nr, do_ri_sos_laplace_mp2, my_do_gw, do_im_time, do_bse, matrix_s, mat_munu, mat_p_global, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, calc_forces)
...
Definition rpa_main.F:199
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, homo, eigenval)
Single excitations energy corrections for RPA.
Definition rpa_rse.F:92
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
structure to store local (to a processor) ordered lists of integers.
distributes pairs on a 2d grid of processors
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...