(git:9cbee8b)
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
63 USE machine, ONLY: default_output_unit,&
74 USE mp2_types, ONLY: mp2_type,&
82 USE qs_kind_types, ONLY: get_qs_kind,&
85 USE qs_mo_types, ONLY: get_mo_set,&
95 USE rpa_rse, ONLY: rse_energy
96#include "./base/base_uses.f90"
97
98 IMPLICIT NONE
99
100 PRIVATE
101
102 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_gpw'
103
105
106CONTAINS
107
108! **************************************************************************************************
109!> \brief with a big bang to mp2
110!> \param qs_env ...
111!> \param mp2_env ...
112!> \param Emp2 ...
113!> \param Emp2_Cou ...
114!> \param Emp2_EX ...
115!> \param Emp2_S ...
116!> \param Emp2_T ...
117!> \param mos_mp2 ...
118!> \param para_env ...
119!> \param unit_nr ...
120!> \param calc_forces ...
121!> \param calc_ex ...
122!> \param do_ri_mp2 ...
123!> \param do_ri_rpa ...
124!> \param do_ri_sos_laplace_mp2 ...
125!> \author Mauro Del Ben and Joost VandeVondele
126! **************************************************************************************************
127 SUBROUTINE mp2_gpw_main(qs_env, mp2_env, Emp2, Emp2_Cou, Emp2_EX, Emp2_S, Emp2_T, &
128 mos_mp2, para_env, unit_nr, calc_forces, calc_ex, do_ri_mp2, do_ri_rpa, &
129 do_ri_sos_laplace_mp2)
130 TYPE(qs_environment_type), POINTER :: qs_env
131 TYPE(mp2_type) :: mp2_env
132 REAL(kind=dp), INTENT(OUT) :: emp2, emp2_cou, emp2_ex, emp2_s, emp2_t
133 TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos_mp2
134 TYPE(mp_para_env_type), POINTER :: para_env
135 INTEGER, INTENT(IN) :: unit_nr
136 LOGICAL, INTENT(IN) :: calc_forces, calc_ex
137 LOGICAL, INTENT(IN), OPTIONAL :: do_ri_mp2, do_ri_rpa, &
138 do_ri_sos_laplace_mp2
139
140 CHARACTER(LEN=*), PARAMETER :: routinen = 'mp2_gpw_main'
141
142 INTEGER :: blacs_grid_layout, color_sub, dimen_ri, dimen_ri_red, eri_method, handle, ispin, &
143 local_unit_nr, my_group_l_end, my_group_l_size, my_group_l_start, nmo, nspins, &
144 potential_type, ri_metric_type
145 INTEGER, ALLOCATABLE, DIMENSION(:) :: bse_lev_virt, ends_array_mc, ends_array_mc_block, &
146 gw_corr_lev_occ, gw_corr_lev_virt, homo, starts_array_mc, starts_array_mc_block
147 INTEGER, DIMENSION(3) :: periodic
148 LOGICAL :: blacs_repeatable, do_bse, do_im_time, do_kpoints_cubic_rpa, my_do_gw, &
149 my_do_ri_mp2, my_do_ri_rpa, my_do_ri_sos_laplace_mp2
150 REAL(kind=dp) :: emp2_ab, emp2_bb, emp2_cou_bb, &
151 emp2_ex_bb, eps_gvg_rspace_old, &
152 eps_pgf_orb_old, eps_rho_rspace_old
153 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: eigenval
154 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
155 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
156 TYPE(block_ind_type), ALLOCATABLE, &
157 DIMENSION(:, :, :) :: t_3c_o_ind
158 TYPE(cell_type), POINTER :: cell
159 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub, blacs_env_sub_mat_munu
160 TYPE(cp_fm_type) :: fm_matrix_pq
161 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: mo_coeff
162 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_matrix_l_kpoints, fm_matrix_minv, &
163 fm_matrix_minv_l_kpoints, &
164 fm_matrix_minv_vtrunc_minv
165 TYPE(cp_fm_type), POINTER :: mo_coeff_ptr
166 TYPE(cp_logger_type), POINTER :: logger, logger_sub
167 TYPE(dbcsr_p_type) :: mat_munu, mat_p_global
168 TYPE(dbcsr_p_type), ALLOCATABLE, DIMENSION(:) :: mo_coeff_all, mo_coeff_gw, mo_coeff_o, &
169 mo_coeff_o_bse, mo_coeff_v, &
170 mo_coeff_v_bse
171 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
172 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp
173 TYPE(dbt_type) :: t_3c_m
174 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_o
175 TYPE(dft_control_type), POINTER :: dft_control
176 TYPE(group_dist_d1_type) :: gd_array, gd_b_all
177 TYPE(group_dist_d1_type), ALLOCATABLE, &
178 DIMENSION(:) :: gd_b_occ_bse, gd_b_virt_bse, gd_b_virtual
179 TYPE(hfx_compression_type), ALLOCATABLE, &
180 DIMENSION(:, :, :) :: t_3c_o_compressed
181 TYPE(kpoint_type), POINTER :: kpoints, kpoints_from_dft
182 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
183 TYPE(mp_para_env_type), POINTER :: para_env_sub
184 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
185 POINTER :: sab_orb_sub
186 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
187 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
188 TYPE(qs_ks_env_type), POINTER :: ks_env
189 TYPE(three_dim_real_array), ALLOCATABLE, &
190 DIMENSION(:) :: bib_c, bib_c_bse_ab, bib_c_bse_ij, &
191 bib_c_gw
192
193 CALL timeset(routinen, handle)
194
195 ! check if we want to do ri-mp2
196 my_do_ri_mp2 = .false.
197 IF (PRESENT(do_ri_mp2)) my_do_ri_mp2 = do_ri_mp2
198
199 ! check if we want to do ri-rpa
200 my_do_ri_rpa = .false.
201 IF (PRESENT(do_ri_rpa)) my_do_ri_rpa = do_ri_rpa
202
203 ! check if we want to do ri-sos-laplace-mp2
204 my_do_ri_sos_laplace_mp2 = .false.
205 IF (PRESENT(do_ri_sos_laplace_mp2)) my_do_ri_sos_laplace_mp2 = do_ri_sos_laplace_mp2
206
207 ! GW and SOS-MP2 cannot be used together
208 IF (my_do_ri_sos_laplace_mp2) THEN
209 cpassert(.NOT. mp2_env%ri_rpa%do_ri_g0w0)
210 END IF
211
212 ! check if we want to do imaginary time
213 do_im_time = mp2_env%do_im_time
214 do_bse = qs_env%mp2_env%bse%do_bse
215 do_kpoints_cubic_rpa = qs_env%mp2_env%ri_rpa_im_time%do_im_time_kpoints
216
217 IF (do_kpoints_cubic_rpa .AND. mp2_env%ri_rpa%do_ri_g0w0) THEN
218 cpabort("Full RPA k-points (DO_KPOINTS in LOW_SCALING section) not implemented with GW")
219 END IF
220
221 ! Get the number of spins
222 nspins = SIZE(mos_mp2)
223
224 ! ... setup needed to be able to qs_integrate in a subgroup.
225 IF (do_kpoints_cubic_rpa) THEN
226 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints_from_dft)
227 mos(1:nspins) => kpoints_from_dft%kp_env(1)%kpoint_env%mos(1:nspins, 1)
228 ELSE
229 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, mos=mos)
230 END IF
231 CALL get_mo_set(mo_set=mos_mp2(1), nmo=nmo)
232 ALLOCATE (homo(nspins), eigenval(nmo, nspins), mo_coeff(nspins))
233 DO ispin = 1, nspins
234 CALL get_mo_set(mo_set=mos_mp2(ispin), &
235 eigenvalues=mo_eigenvalues, homo=homo(ispin), &
236 mo_coeff=mo_coeff_ptr)
237 mo_coeff(ispin) = mo_coeff_ptr
238 eigenval(:, ispin) = mo_eigenvalues(1:nmo)
239 END DO
240
241 ! a para_env
242 color_sub = para_env%mepos/mp2_env%mp2_num_proc
243 ALLOCATE (para_env_sub)
244 CALL para_env_sub%from_split(para_env, color_sub)
245
246 ! each of the sub groups might need to generate output
247 logger => cp_get_default_logger()
248 IF (para_env%is_source()) THEN
249 local_unit_nr = cp_logger_get_default_unit_nr(logger, local=.false.)
250 ELSE
251 local_unit_nr = default_output_unit
252 END IF
253
254 ! get stuff
255 CALL get_qs_env(qs_env, &
256 ks_env=ks_env, &
257 qs_kind_set=qs_kind_set, &
258 cell=cell, &
259 particle_set=particle_set, &
260 atomic_kind_set=atomic_kind_set, &
261 dft_control=dft_control, &
262 matrix_s_kp=matrix_s_kp)
263
264 CALL get_cell(cell=cell, periodic=periodic)
265
266 IF (do_im_time) THEN
267 IF (mp2_env%ri_metric%potential_type == ri_default) THEN
268 IF (sum(periodic) == 1 .OR. sum(periodic) == 3) THEN
269 mp2_env%ri_metric%potential_type = do_potential_id
270 ELSE
271 mp2_env%ri_metric%potential_type = do_potential_truncated
272 END IF
273 END IF
274
275 ! statically initialize libint
277
278 END IF
279
280 IF (mp2_env%ri_metric%potential_type == ri_default) THEN
281 mp2_env%ri_metric%potential_type = do_potential_coulomb
282 END IF
283
284 IF (mp2_env%eri_method == eri_default) THEN
285 IF (sum(periodic) > 0) mp2_env%eri_method = do_eri_gpw
286 IF (sum(periodic) == 0) mp2_env%eri_method = do_eri_os
287 IF (sum(mp2_env%ri_rpa_im_time%kp_grid) > 0) mp2_env%eri_method = do_eri_os
288 IF (mp2_env%method == mp2_method_gpw) mp2_env%eri_method = do_eri_gpw
289 IF (mp2_env%method == ri_mp2_method_gpw) mp2_env%eri_method = do_eri_gpw
290 IF (mp2_env%ri_rpa_im_time%do_im_time_kpoints) mp2_env%eri_method = do_eri_os
291 IF (calc_forces .AND. mp2_env%eri_method == do_eri_os) mp2_env%eri_method = do_eri_gpw
292 END IF
293 eri_method = mp2_env%eri_method
294
295 IF (unit_nr > 0 .AND. mp2_env%eri_method == do_eri_gpw) THEN
296 WRITE (unit=unit_nr, fmt="(T3,A,T71,F10.1)") &
297 "GPW_INFO| Density cutoff [a.u.]:", mp2_env%mp2_gpw%cutoff*0.5_dp
298 WRITE (unit=unit_nr, fmt="(T3,A,T71,F10.1)") &
299 "GPW_INFO| Relative density cutoff [a.u.]:", mp2_env%mp2_gpw%relative_cutoff*0.5_dp
300 CALL m_flush(unit_nr)
301 END IF
302
303 ! MG: Disable logger layer for BSE, misses some key information to print cube files properly
304 IF (.NOT. (mp2_env%ri_g0w0%print_local_bandgap .OR. mp2_env%bse%do_nto_analysis)) THEN
305 ! a logger
306 NULLIFY (logger_sub)
307 CALL cp_logger_create(logger_sub, para_env=para_env_sub, &
308 default_global_unit_nr=local_unit_nr, &
309 close_global_unit_on_dealloc=.false.)
310 CALL cp_logger_set(logger_sub, local_filename="MP2_localLog")
311 ! set to a custom print level (we could also have a different print level for para_env%source)
312 logger_sub%iter_info%print_level = mp2_env%mp2_gpw%print_level
313 CALL cp_add_default_logger(logger_sub)
314 END IF
315
316 ! a blacs_env (ignore the globenv stored defaults for now)
317 blacs_grid_layout = blacs_grid_square
318 blacs_repeatable = .true.
319 NULLIFY (blacs_env_sub)
320 CALL cp_blacs_env_create(blacs_env_sub, para_env_sub, &
321 blacs_grid_layout, &
322 blacs_repeatable)
323
324 blacs_env_sub_mat_munu => blacs_env_sub
325
326 matrix_s(1:1) => matrix_s_kp(1:1, 1)
327
328 CALL get_eps_old(dft_control, eps_pgf_orb_old, eps_rho_rspace_old, eps_gvg_rspace_old)
329
330 CALL create_mat_munu(mat_munu, qs_env, mp2_env%mp2_gpw%eps_grid, &
331 blacs_env_sub_mat_munu, do_alloc_blocks_from_nbl=.NOT. do_im_time, sab_orb_sub=sab_orb_sub, &
332 do_kpoints=mp2_env%ri_rpa_im_time%do_im_time_kpoints, &
333 dbcsr_sym_type=dbcsr_type_symmetric)
334
335 ! which RI metric we want to have
336 ri_metric_type = mp2_env%ri_metric%potential_type
337
338 ! which interaction potential
339 potential_type = mp2_env%potential_parameter%potential_type
340
341 ! check if we want to do ri-g0w0 on top of ri-rpa
342 my_do_gw = mp2_env%ri_rpa%do_ri_g0w0
343 ALLOCATE (gw_corr_lev_occ(nspins), gw_corr_lev_virt(nspins), bse_lev_virt(nspins))
344 gw_corr_lev_occ(1) = mp2_env%ri_g0w0%corr_mos_occ
345 gw_corr_lev_virt(1) = mp2_env%ri_g0w0%corr_mos_virt
346 IF (nspins == 2) THEN
347 gw_corr_lev_occ(2) = mp2_env%ri_g0w0%corr_mos_occ_beta
348 gw_corr_lev_virt(2) = mp2_env%ri_g0w0%corr_mos_virt_beta
349 END IF
350
351 IF (do_bse) THEN
352 !Keep default behavior for occupied
353 ! We do not implement an explicit bse_lev_occ here, because the small number of occupied levels
354 ! does not critically influence the memory
355 ! bse_lev_virt is per-spin (= the per-spin GW-corrected virtual count): the (ab|K) block is sized per spin
356 bse_lev_virt(:) = gw_corr_lev_virt(:)
357 END IF
358
359 ! After the components are inside of the routines, we can move this line insight the branch
360 ALLOCATE (mo_coeff_o(nspins), mo_coeff_v(nspins), mo_coeff_all(nspins), mo_coeff_gw(nspins))
361
362 ! Always allocate for usage in call of replicate_mat_to_subgroup
363 ALLOCATE (mo_coeff_o_bse(nspins), mo_coeff_v_bse(nspins))
364
365 ! for imag. time, we do not need this
366 IF (.NOT. do_im_time) THEN
367
368 ! new routine: replicate a full matrix from one para_env to a smaller one
369 ! keeping the memory usage as small as possible in this case the
370 ! output the two part of the C matrix (virtual, occupied)
371 DO ispin = 1, nspins
372
373 CALL replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff(ispin), homo(ispin), mat_munu%matrix, &
374 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
375 mo_coeff_all(ispin)%matrix, mo_coeff_gw(ispin)%matrix, &
376 my_do_gw, gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), do_bse, &
377 bse_lev_virt(ispin), mo_coeff_o_bse(ispin)%matrix, mo_coeff_v_bse(ispin)%matrix, &
378 mp2_env%mp2_gpw%eps_filter)
379
380 END DO
381
382 END IF
383
384 ! now we're kind of ready to go....
385 emp2_s = 0.0_dp
386 emp2_t = 0.0_dp
387 IF (my_do_ri_mp2 .OR. my_do_ri_rpa .OR. my_do_ri_sos_laplace_mp2) THEN
388 ! RI-GPW integrals (same stuff for both RPA and MP2)
389 IF (nspins == 2) THEN
390 ! open shell case (RI) here the (ia|K) integrals are computed for both the alpha and beta components
392 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, &
393 para_env, para_env_sub, color_sub, cell, particle_set, &
394 atomic_kind_set, qs_kind_set, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
395 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, nmo, homo, mat_munu, sab_orb_sub, &
396 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, &
397 mp2_env%mp2_gpw%eps_filter, unit_nr, &
398 mp2_env%mp2_memory, mp2_env%calc_PQ_cond_num, calc_forces, blacs_env_sub, my_do_gw .AND. .NOT. do_im_time, &
399 do_bse, gd_b_all, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, &
400 gw_corr_lev_occ(1), gw_corr_lev_virt(1), &
401 bse_lev_virt, &
402 do_im_time, do_kpoints_cubic_rpa, kpoints, &
403 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
404 mp2_env%ri_metric, &
405 gd_b_occ_bse, gd_b_virt_bse)
406 ELSE
407 ! closed shell case (RI)
408 CALL mp2_ri_gpw_compute_in(bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, gd_array, gd_b_virtual, &
409 dimen_ri, dimen_ri_red, qs_env, para_env, para_env_sub, &
410 color_sub, cell, particle_set, &
411 atomic_kind_set, qs_kind_set, fm_matrix_pq, &
412 fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
413 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, nmo, homo, &
414 mat_munu, sab_orb_sub, &
415 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, &
416 mp2_env%mp2_gpw%eps_filter, unit_nr, &
417 mp2_env%mp2_memory, mp2_env%calc_PQ_cond_num, calc_forces, &
418 blacs_env_sub, my_do_gw .AND. .NOT. do_im_time, do_bse, gd_b_all, &
419 starts_array_mc, ends_array_mc, &
420 starts_array_mc_block, ends_array_mc_block, &
421 gw_corr_lev_occ(1), gw_corr_lev_virt(1), &
422 bse_lev_virt, &
423 do_im_time, do_kpoints_cubic_rpa, kpoints, &
424 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
425 mp2_env%ri_metric, gd_b_occ_bse, gd_b_virt_bse)
426 END IF
427
428 ELSE
429 ! Canonical MP2-GPW
430 IF (nspins == 2) THEN
431 ! alpha-alpha and alpha-beta components
432 IF (unit_nr > 0) WRITE (unit_nr, *)
433 IF (unit_nr > 0) WRITE (unit_nr, '(T3,A)') 'Alpha (ia|'
434 CALL mp2_gpw_compute( &
435 emp2, emp2_cou, emp2_ex, qs_env, para_env, para_env_sub, color_sub, &
436 cell, particle_set, &
437 atomic_kind_set, qs_kind_set, eigenval, nmo, homo, mat_munu, &
438 sab_orb_sub, mo_coeff_o, mo_coeff_v, mp2_env%mp2_gpw%eps_filter, unit_nr, &
439 mp2_env%mp2_memory, calc_ex, blacs_env_sub, emp2_ab)
440
441 ! beta-beta component
442 IF (unit_nr > 0) WRITE (unit_nr, *)
443 IF (unit_nr > 0) WRITE (unit_nr, '(T3,A)') 'Beta (ia|'
444 CALL mp2_gpw_compute( &
445 emp2_bb, emp2_cou_bb, emp2_ex_bb, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, &
446 atomic_kind_set, qs_kind_set, eigenval(:, 2:2), nmo, homo(2:2), mat_munu, &
447 sab_orb_sub, mo_coeff_o(2:2), mo_coeff_v(2:2), mp2_env%mp2_gpw%eps_filter, unit_nr, &
448 mp2_env%mp2_memory, calc_ex, blacs_env_sub)
449
450 ! make order on the MP2 energy contributions
451 emp2_cou = emp2_cou*0.25_dp
452 emp2_ex = emp2_ex*0.5_dp
453
454 emp2_cou_bb = emp2_cou_bb*0.25_dp
455 emp2_ex_bb = emp2_ex_bb*0.5_dp
456
457 emp2_s = emp2_ab
458 emp2_t = emp2_cou + emp2_cou_bb + emp2_ex + emp2_ex_bb
459
460 emp2_cou = emp2_cou + emp2_cou_bb + emp2_ab
461 emp2_ex = emp2_ex + emp2_ex_bb
462 emp2 = emp2_ex + emp2_cou
463
464 ELSE
465 ! closed shell case
466 CALL mp2_gpw_compute( &
467 emp2, emp2_cou, emp2_ex, qs_env, para_env, para_env_sub, color_sub, cell, particle_set, &
468 atomic_kind_set, qs_kind_set, eigenval(:, 1:1), nmo, homo(1:1), mat_munu, &
469 sab_orb_sub, mo_coeff_o(1:1), mo_coeff_v(1:1), mp2_env%mp2_gpw%eps_filter, unit_nr, &
470 mp2_env%mp2_memory, calc_ex, blacs_env_sub)
471 END IF
472 END IF
473
474 ! Free possibly large buffers allocated by dbcsr on the GPU,
475 ! large hybrid dgemm/pdgemm's coming later will need the space.
476 CALL dbcsr_clear_mempools()
477
478 IF (calc_forces .AND. .NOT. do_im_time) THEN
479 ! make a copy of mo_coeff_o and mo_coeff_v
480 ALLOCATE (mp2_env%ri_grad%mo_coeff_o(nspins), mp2_env%ri_grad%mo_coeff_v(nspins))
481 DO ispin = 1, nspins
482 NULLIFY (mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
483 CALL dbcsr_init_p(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
484 CALL dbcsr_copy(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix, mo_coeff_o(ispin)%matrix, &
485 name="mo_coeff_o"//cp_to_string(ispin))
486 NULLIFY (mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
487 CALL dbcsr_init_p(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
488 CALL dbcsr_copy(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
489 name="mo_coeff_v"//cp_to_string(ispin))
490 END DO
491 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
492 END IF
493 ! Copy mo coeffs for RPA exchange correction
494 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none) THEN
495 ALLOCATE (mp2_env%ri_rpa%mo_coeff_o(nspins), mp2_env%ri_rpa%mo_coeff_v(nspins))
496 DO ispin = 1, nspins
497 CALL dbcsr_copy(mp2_env%ri_rpa%mo_coeff_o(ispin), mo_coeff_o(ispin)%matrix, name="mo_coeff_o")
498 CALL dbcsr_copy(mp2_env%ri_rpa%mo_coeff_v(ispin), mo_coeff_v(ispin)%matrix, name="mo_coeff_v")
499 END DO
500 END IF
501
502 IF (.NOT. do_im_time) THEN
503
504 DO ispin = 1, nspins
505 CALL dbcsr_release(mo_coeff_o(ispin)%matrix)
506 DEALLOCATE (mo_coeff_o(ispin)%matrix)
507 CALL dbcsr_release(mo_coeff_v(ispin)%matrix)
508 DEALLOCATE (mo_coeff_v(ispin)%matrix)
509 IF (my_do_gw) THEN
510 CALL dbcsr_release(mo_coeff_all(ispin)%matrix)
511 DEALLOCATE (mo_coeff_all(ispin)%matrix)
512 END IF
513 END DO
514 DEALLOCATE (mo_coeff_o, mo_coeff_v)
515 IF (my_do_gw) DEALLOCATE (mo_coeff_all)
516
517 END IF
518 IF (do_bse) THEN
519 DO ispin = 1, nspins
520 CALL dbcsr_release(mo_coeff_o_bse(ispin)%matrix)
521 CALL dbcsr_release(mo_coeff_v_bse(ispin)%matrix)
522 DEALLOCATE (mo_coeff_o_bse(ispin)%matrix)
523 DEALLOCATE (mo_coeff_v_bse(ispin)%matrix)
524 END DO
525 END IF
526 DEALLOCATE (mo_coeff_o_bse, mo_coeff_v_bse)
527
528 ! Release some memory for RPA exchange correction
529 IF (calc_forces .AND. do_im_time .OR. &
530 (.NOT. calc_forces .AND. mp2_env%ri_rpa%exchange_correction == rpa_exchange_none)) THEN
531
532 CALL dbcsr_release(mat_munu%matrix)
533 DEALLOCATE (mat_munu%matrix)
534
535 CALL release_neighbor_list_sets(sab_orb_sub)
536
537 END IF
538
539 ! decide if to do RI-RPA or RI-MP2
540 IF (my_do_ri_rpa .OR. my_do_ri_sos_laplace_mp2) THEN
541
542 IF (do_im_time) CALL create_matrix_p(mat_p_global, qs_env, mp2_env, para_env)
543
544 IF (.NOT. ALLOCATED(bib_c)) ALLOCATE (bib_c(nspins))
545 IF (.NOT. ALLOCATED(bib_c_gw)) ALLOCATE (bib_c_gw(nspins))
546 IF (.NOT. ALLOCATED(gd_b_virtual)) ALLOCATE (gd_b_virtual(nspins))
547
548 ! RI-RPA
549 CALL rpa_ri_compute_en(qs_env, emp2, mp2_env, bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, &
550 para_env, para_env_sub, color_sub, &
551 gd_array, gd_b_virtual, gd_b_all, gd_b_occ_bse, gd_b_virt_bse, &
552 mo_coeff, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
553 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, kpoints, &
554 eigenval, nmo, homo, dimen_ri, dimen_ri_red, gw_corr_lev_occ, gw_corr_lev_virt, &
555 bse_lev_virt, &
556 unit_nr, my_do_ri_sos_laplace_mp2, my_do_gw, do_im_time, do_bse, matrix_s, &
557 mat_munu, mat_p_global, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
558 starts_array_mc, ends_array_mc, &
559 starts_array_mc_block, ends_array_mc_block, calc_forces)
560
561 IF (mp2_env%ri_rpa%do_rse) THEN
562 CALL rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, homo, eigenval)
563 END IF
564
565 IF (do_im_time) THEN
566 IF (ASSOCIATED(mat_p_global%matrix)) THEN
567 CALL dbcsr_release(mat_p_global%matrix)
568 DEALLOCATE (mat_p_global%matrix)
569 END IF
570
572 IF (calc_forces) CALL cp_fm_release(fm_matrix_pq)
573 END IF
574
575 ! Release some memory for RPA exchange correction
576 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none) THEN
577
578 CALL dbcsr_release(mat_munu%matrix)
579 DEALLOCATE (mat_munu%matrix)
580
581 CALL release_neighbor_list_sets(sab_orb_sub)
582
583 END IF
584
585 ELSE
586 IF (my_do_ri_mp2) THEN
587 emp2 = 0.0_dp
588 emp2_cou = 0.0_dp
589 emp2_ex = 0.0_dp
590
591 ! RI-MP2-GPW compute energy
593 emp2_cou, emp2_ex, emp2_s, emp2_t, bib_c, mp2_env, para_env, para_env_sub, color_sub, &
594 gd_array, gd_b_virtual, &
595 eigenval, nmo, homo, dimen_ri_red, unit_nr, calc_forces, calc_ex)
596
597 END IF
598 END IF
599
600 ! if we need forces time to calculate the MP2 non-separable contribution
601 ! and start computing the Lagrangian
602 IF (calc_forces .AND. .NOT. do_im_time) THEN
603
604 CALL calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, &
605 particle_set, atomic_kind_set, qs_kind_set, &
606 mo_coeff, dimen_ri, eigenval, &
607 my_group_l_start, my_group_l_end, my_group_l_size, &
608 sab_orb_sub, mat_munu, blacs_env_sub)
609
610 DO ispin = 1, nspins
611 CALL dbcsr_release(mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
612 DEALLOCATE (mp2_env%ri_grad%mo_coeff_o(ispin)%matrix)
613
614 CALL dbcsr_release(mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
615 DEALLOCATE (mp2_env%ri_grad%mo_coeff_v(ispin)%matrix)
616 END DO
617 DEALLOCATE (mp2_env%ri_grad%mo_coeff_o, mp2_env%ri_grad%mo_coeff_v)
618
619 CALL dbcsr_release(mat_munu%matrix)
620 DEALLOCATE (mat_munu%matrix)
621
622 CALL release_neighbor_list_sets(sab_orb_sub)
623
624 END IF
625
626 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
627 ! moved from above
628 IF (my_do_gw .AND. .NOT. do_im_time) THEN
629 DO ispin = 1, nspins
630 CALL dbcsr_release(mo_coeff_gw(ispin)%matrix)
631 DEALLOCATE (mo_coeff_gw(ispin)%matrix)
632 END DO
633 DEALLOCATE (mo_coeff_gw)
634 END IF
635
636 ! re-init the radii to be able to generate pair lists with MP2-appropriate screening
637 dft_control%qs_control%eps_pgf_orb = eps_pgf_orb_old
638 dft_control%qs_control%eps_rho_rspace = eps_rho_rspace_old
639 dft_control%qs_control%eps_gvg_rspace = eps_gvg_rspace_old
640 CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
641
642 CALL cp_blacs_env_release(blacs_env_sub)
643
644 IF (.NOT. (mp2_env%ri_g0w0%print_local_bandgap .OR. mp2_env%bse%do_nto_analysis)) THEN
646 CALL cp_logger_release(logger_sub)
647 END IF
648
649 CALL mp_para_env_release(para_env_sub)
650
651 ! finally solve the z-vector equation if forces are required
652 IF (calc_forces .AND. .NOT. do_im_time) THEN
653 CALL solve_z_vector_eq(qs_env, mp2_env, para_env, dft_control, &
654 mo_coeff, homo, eigenval, unit_nr)
655 END IF
656
657 DEALLOCATE (eigenval, mo_coeff)
658
659 CALL timestop(handle)
660
661 END SUBROUTINE mp2_gpw_main
662
663! **************************************************************************************************
664!> \brief ...
665!> \param para_env ...
666!> \param para_env_sub ...
667!> \param mo_coeff ...
668!> \param homo ...
669!> \param mat_munu ...
670!> \param mo_coeff_o ...
671!> \param mo_coeff_v ...
672!> \param mo_coeff_all ...
673!> \param mo_coeff_gw ...
674!> \param my_do_gw ...
675!> \param gw_corr_lev_occ ...
676!> \param gw_corr_lev_virt ...
677!> \param my_do_bse ...
678!> \param bse_lev_virt ...
679!> \param mo_coeff_o_bse ...
680!> \param mo_coeff_v_bse ...
681!> \param eps_filter ...
682! **************************************************************************************************
683 SUBROUTINE replicate_mat_to_subgroup(para_env, para_env_sub, mo_coeff, homo, mat_munu, &
684 mo_coeff_o, mo_coeff_v, mo_coeff_all, mo_coeff_gw, my_do_gw, &
685 gw_corr_lev_occ, gw_corr_lev_virt, my_do_bse, &
686 bse_lev_virt, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter)
687 TYPE(mp_para_env_type), INTENT(IN) :: para_env, para_env_sub
688 TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
689 INTEGER, INTENT(IN) :: homo
690 TYPE(dbcsr_type), INTENT(INOUT) :: mat_munu
691 TYPE(dbcsr_type), POINTER :: mo_coeff_o, mo_coeff_v, mo_coeff_all, &
692 mo_coeff_gw
693 LOGICAL, INTENT(IN) :: my_do_gw
694 INTEGER, INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt
695 LOGICAL, INTENT(IN) :: my_do_bse
696 INTEGER, INTENT(IN) :: bse_lev_virt
697 TYPE(dbcsr_type), POINTER :: mo_coeff_o_bse, mo_coeff_v_bse
698 REAL(kind=dp), INTENT(IN) :: eps_filter
699
700 CHARACTER(LEN=*), PARAMETER :: routinen = 'replicate_mat_to_subgroup'
701
702 INTEGER :: handle
703 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: c
704 TYPE(group_dist_d1_type) :: gd_array
705
706 CALL timeset(routinen, handle)
707
708 CALL grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, c)
709
710 ! create and fill mo_coeff_o, mo_coeff_v and mo_coeff_all
711 ALLOCATE (mo_coeff_o)
712 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_o, c(:, 1:homo), &
713 mat_munu, gd_array, eps_filter)
714
715 ALLOCATE (mo_coeff_v)
716 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v, c(:, homo + 1:), &
717 mat_munu, gd_array, eps_filter)
718
719 IF (my_do_gw) THEN
720 ALLOCATE (mo_coeff_gw)
721 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_gw, c(:, homo - gw_corr_lev_occ + 1:homo + gw_corr_lev_virt), &
722 mat_munu, gd_array, eps_filter)
723
724 ! all levels
725 ALLOCATE (mo_coeff_all)
726 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_all, c, &
727 mat_munu, gd_array, eps_filter)
728
729 END IF
730
731 IF (my_do_bse) THEN
732
733 ALLOCATE (mo_coeff_o_bse)
734 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_o_bse, c(:, 1:homo), &
735 mat_munu, gd_array, eps_filter)
736
737 ALLOCATE (mo_coeff_v_bse)
738 CALL build_dbcsr_from_rows(para_env_sub, mo_coeff_v_bse, c(:, homo + 1:homo + bse_lev_virt), &
739 mat_munu, gd_array, eps_filter)
740
741 END IF
742 DEALLOCATE (c)
743 CALL release_group_dist(gd_array)
744
745 CALL timestop(handle)
746
747 END SUBROUTINE replicate_mat_to_subgroup
748
749! **************************************************************************************************
750!> \brief ...
751!> \param para_env ...
752!> \param para_env_sub ...
753!> \param mo_coeff ...
754!> \param gd_array ...
755!> \param C ...
756! **************************************************************************************************
757 SUBROUTINE grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, C)
758 TYPE(mp_para_env_type), INTENT(IN) :: para_env, para_env_sub
759 TYPE(cp_fm_type), INTENT(IN) :: mo_coeff
760 TYPE(group_dist_d1_type), INTENT(OUT) :: gd_array
761 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :), &
762 INTENT(OUT) :: c
763
764 CHARACTER(LEN=*), PARAMETER :: routinen = 'grep_rows_in_subgroups'
765
766 INTEGER :: handle, i_global, iib, j_global, jjb, max_row_col_local, my_mu_end, my_mu_size, &
767 my_mu_start, ncol_global, ncol_local, ncol_rec, nrow_global, nrow_local, nrow_rec, &
768 proc_receive_static, proc_send_static, proc_shift
769 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: local_col_row_info, rec_col_row_info
770 INTEGER, DIMENSION(:), POINTER :: col_indices, col_indices_rec, &
771 row_indices, row_indices_rec
772 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: local_c, rec_c
773 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :), &
774 POINTER :: local_c_internal
775
776 CALL timeset(routinen, handle)
777
778 CALL cp_fm_get_info(matrix=mo_coeff, &
779 ncol_global=ncol_global, &
780 nrow_global=nrow_global, &
781 nrow_local=nrow_local, &
782 ncol_local=ncol_local, &
783 row_indices=row_indices, &
784 col_indices=col_indices, &
785 local_data=local_c_internal)
786
787 CALL create_group_dist(gd_array, para_env_sub%num_pe, nrow_global)
788 CALL get_group_dist(gd_array, para_env_sub%mepos, my_mu_start, my_mu_end, my_mu_size)
789
790 ! local storage for the C matrix
791 ALLOCATE (c(my_mu_size, ncol_global))
792 c = 0.0_dp
793
794 ALLOCATE (local_c(nrow_local, ncol_local))
795 local_c(:, :) = local_c_internal(1:nrow_local, 1:ncol_local)
796 NULLIFY (local_c_internal)
797
798 max_row_col_local = max(nrow_local, ncol_local)
799 CALL para_env%max(max_row_col_local)
800
801 ALLOCATE (local_col_row_info(0:max_row_col_local, 2))
802 local_col_row_info = 0
803 ! 0,1 nrows
804 local_col_row_info(0, 1) = nrow_local
805 local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
806 ! 0,2 ncols
807 local_col_row_info(0, 2) = ncol_local
808 local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
809
810 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
811
812 ! accumulate data on C buffer starting from myself
813 DO iib = 1, nrow_local
814 i_global = row_indices(iib)
815 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
816 DO jjb = 1, ncol_local
817 j_global = col_indices(jjb)
818 c(i_global - my_mu_start + 1, j_global) = local_c(iib, jjb)
819 END DO
820 END IF
821 END DO
822
823 ! start ring communication for collecting the data from the other
824 proc_send_static = modulo(para_env%mepos + 1, para_env%num_pe)
825 proc_receive_static = modulo(para_env%mepos - 1, para_env%num_pe)
826 DO proc_shift = 1, para_env%num_pe - 1
827 ! first exchange information on the local data
828 rec_col_row_info = 0
829 CALL para_env%sendrecv(local_col_row_info, proc_send_static, rec_col_row_info, proc_receive_static)
830 nrow_rec = rec_col_row_info(0, 1)
831 ncol_rec = rec_col_row_info(0, 2)
832
833 ALLOCATE (row_indices_rec(nrow_rec))
834 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
835
836 ALLOCATE (col_indices_rec(ncol_rec))
837 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
838
839 ALLOCATE (rec_c(nrow_rec, ncol_rec))
840 rec_c = 0.0_dp
841
842 ! then send and receive the real data
843 CALL para_env%sendrecv(local_c, proc_send_static, rec_c, proc_receive_static)
844
845 ! accumulate the received data on C buffer
846 DO iib = 1, nrow_rec
847 i_global = row_indices_rec(iib)
848 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
849 DO jjb = 1, ncol_rec
850 j_global = col_indices_rec(jjb)
851 c(i_global - my_mu_start + 1, j_global) = rec_c(iib, jjb)
852 END DO
853 END IF
854 END DO
855
856 local_col_row_info(:, :) = rec_col_row_info
857 DEALLOCATE (local_c)
858 ALLOCATE (local_c(nrow_rec, ncol_rec))
859 local_c(:, :) = rec_c
860
861 DEALLOCATE (col_indices_rec)
862 DEALLOCATE (row_indices_rec)
863 DEALLOCATE (rec_c)
864 END DO
865
866 DEALLOCATE (local_c)
867 DEALLOCATE (local_col_row_info)
868 DEALLOCATE (rec_col_row_info)
869
870 CALL timestop(handle)
871
872 END SUBROUTINE grep_rows_in_subgroups
873
874! **************************************************************************************************
875!> \brief Encapsulate the building of dbcsr_matrices mo_coeff_(v,o,all)
876!> \param para_env_sub ...
877!> \param mo_coeff_to_build ...
878!> \param Cread ...
879!> \param mat_munu ...
880!> \param gd_array ...
881!> \param eps_filter ...
882!> \author Jan Wilhelm, Code by Mauro Del Ben
883! **************************************************************************************************
884 SUBROUTINE build_dbcsr_from_rows(para_env_sub, mo_coeff_to_build, Cread, &
885 mat_munu, gd_array, eps_filter)
886 TYPE(mp_para_env_type), INTENT(IN) :: para_env_sub
887 TYPE(dbcsr_type) :: mo_coeff_to_build
888 REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: cread
889 TYPE(dbcsr_type), INTENT(INOUT) :: mat_munu
890 TYPE(group_dist_d1_type), INTENT(IN) :: gd_array
891 REAL(kind=dp), INTENT(IN) :: eps_filter
892
893 CHARACTER(LEN=*), PARAMETER :: routinen = 'build_dbcsr_from_rows'
894
895 INTEGER :: col, col_offset, col_size, handle, i, i_global, j, j_global, my_mu_end, &
896 my_mu_start, ncol_global, proc_receive, proc_send, proc_shift, rec_mu_end, rec_mu_size, &
897 rec_mu_start, row, row_offset, row_size
898 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: rec_c
899 REAL(kind=dp), DIMENSION(:, :), POINTER :: data_block
900 TYPE(dbcsr_iterator_type) :: iter
901
902 CALL timeset(routinen, handle)
903
904 ncol_global = SIZE(cread, 2)
905
906 CALL get_group_dist(gd_array, para_env_sub%mepos, my_mu_start, my_mu_end)
907
908 CALL cp_dbcsr_m_by_n_from_row_template(mo_coeff_to_build, template=mat_munu, n=ncol_global, &
909 sym=dbcsr_type_no_symmetry)
910 CALL dbcsr_reserve_all_blocks(mo_coeff_to_build)
911
912 ! accumulate data on mo_coeff_to_build starting from myself
913 CALL dbcsr_iterator_start(iter, mo_coeff_to_build)
914 DO WHILE (dbcsr_iterator_blocks_left(iter))
915 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
916 row_size=row_size, col_size=col_size, &
917 row_offset=row_offset, col_offset=col_offset)
918 DO i = 1, row_size
919 i_global = row_offset + i - 1
920 IF (i_global >= my_mu_start .AND. i_global <= my_mu_end) THEN
921 DO j = 1, col_size
922 j_global = col_offset + j - 1
923 data_block(i, j) = cread(i_global - my_mu_start + 1, col_offset + j - 1)
924 END DO
925 END IF
926 END DO
927 END DO
928 CALL dbcsr_iterator_stop(iter)
929
930 ! start ring communication in the subgroup for collecting the data from the other
931 ! proc (occupied)
932 DO proc_shift = 1, para_env_sub%num_pe - 1
933 proc_send = modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
934 proc_receive = modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
935
936 CALL get_group_dist(gd_array, proc_receive, rec_mu_start, rec_mu_end, rec_mu_size)
937
938 ALLOCATE (rec_c(rec_mu_size, ncol_global))
939 rec_c = 0.0_dp
940
941 ! then send and receive the real data
942 CALL para_env_sub%sendrecv(cread, proc_send, rec_c, proc_receive)
943
944 ! accumulate data on mo_coeff_to_build the data received from proc_rec
945 CALL dbcsr_iterator_start(iter, mo_coeff_to_build)
946 DO WHILE (dbcsr_iterator_blocks_left(iter))
947 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
948 row_size=row_size, col_size=col_size, &
949 row_offset=row_offset, col_offset=col_offset)
950 DO i = 1, row_size
951 i_global = row_offset + i - 1
952 IF (i_global >= rec_mu_start .AND. i_global <= rec_mu_end) THEN
953 DO j = 1, col_size
954 j_global = col_offset + j - 1
955 data_block(i, j) = rec_c(i_global - rec_mu_start + 1, col_offset + j - 1)
956 END DO
957 END IF
958 END DO
959 END DO
960 CALL dbcsr_iterator_stop(iter)
961
962 DEALLOCATE (rec_c)
963
964 END DO
965 CALL dbcsr_filter(mo_coeff_to_build, eps_filter)
966
967 CALL timestop(handle)
968
969 END SUBROUTINE build_dbcsr_from_rows
970
971! **************************************************************************************************
972!> \brief Encapsulate the building of dbcsr_matrix mat_munu
973!> \param mat_munu ...
974!> \param qs_env ...
975!> \param eps_grid ...
976!> \param blacs_env_sub ...
977!> \param do_ri_aux_basis ...
978!> \param do_mixed_basis ...
979!> \param group_size_prim ...
980!> \param do_alloc_blocks_from_nbl ...
981!> \param do_kpoints ...
982!> \param sab_orb_sub ...
983!> \param dbcsr_sym_type ...
984!> \author Jan Wilhelm, code by Mauro Del Ben
985! **************************************************************************************************
986 SUBROUTINE create_mat_munu(mat_munu, qs_env, eps_grid, blacs_env_sub, &
987 do_ri_aux_basis, do_mixed_basis, group_size_prim, &
988 do_alloc_blocks_from_nbl, do_kpoints, sab_orb_sub, dbcsr_sym_type)
989
990 TYPE(dbcsr_p_type), INTENT(OUT) :: mat_munu
991 TYPE(qs_environment_type), POINTER :: qs_env
992 REAL(kind=dp) :: eps_grid
993 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub
994 LOGICAL, INTENT(IN), OPTIONAL :: do_ri_aux_basis, do_mixed_basis
995 INTEGER, INTENT(IN), OPTIONAL :: group_size_prim
996 LOGICAL, INTENT(IN), OPTIONAL :: do_alloc_blocks_from_nbl, do_kpoints
997 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
998 OPTIONAL, POINTER :: sab_orb_sub
999 CHARACTER, OPTIONAL :: dbcsr_sym_type
1000
1001 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_mat_munu'
1002
1003 CHARACTER :: my_dbcsr_sym_type
1004 INTEGER :: handle, ikind, natom, nkind
1005 INTEGER, DIMENSION(:), POINTER :: col_blk_sizes, row_blk_sizes
1006 LOGICAL :: my_do_alloc_blocks_from_nbl, &
1007 my_do_kpoints, my_do_mixed_basis, &
1008 my_do_ri_aux_basis
1009 LOGICAL, ALLOCATABLE, DIMENSION(:) :: orb_present
1010 REAL(dp), ALLOCATABLE, DIMENSION(:) :: orb_radius
1011 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: pair_radius
1012 REAL(kind=dp) :: subcells
1013 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1014 TYPE(cell_type), POINTER :: cell
1015 TYPE(dbcsr_distribution_type), POINTER :: dbcsr_dist_sub
1016 TYPE(dft_control_type), POINTER :: dft_control
1017 TYPE(distribution_1d_type), POINTER :: local_molecules_sub, local_particles_sub
1018 TYPE(distribution_2d_type), POINTER :: distribution_2d_sub
1019 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_ri_aux
1020 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
1021 TYPE(local_atoms_type), ALLOCATABLE, DIMENSION(:) :: atom2d
1022 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
1023 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
1024 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1025 POINTER :: my_sab_orb_sub
1026 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1027 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1028
1029 CALL timeset(routinen, handle)
1030
1031 NULLIFY (basis_set_ri_aux)
1032
1033 my_do_ri_aux_basis = .false.
1034 IF (PRESENT(do_ri_aux_basis)) THEN
1035 my_do_ri_aux_basis = do_ri_aux_basis
1036 END IF
1037
1038 my_do_mixed_basis = .false.
1039 IF (PRESENT(do_mixed_basis)) THEN
1040 my_do_mixed_basis = do_mixed_basis
1041 END IF
1042
1043 my_do_alloc_blocks_from_nbl = .false.
1044 IF (PRESENT(do_alloc_blocks_from_nbl)) THEN
1045 my_do_alloc_blocks_from_nbl = do_alloc_blocks_from_nbl
1046 END IF
1047
1048 my_do_kpoints = .false.
1049 IF (PRESENT(do_kpoints)) THEN
1050 my_do_kpoints = do_kpoints
1051 END IF
1052
1053 my_dbcsr_sym_type = dbcsr_type_no_symmetry
1054 IF (PRESENT(dbcsr_sym_type)) THEN
1055 my_dbcsr_sym_type = dbcsr_sym_type
1056 END IF
1057
1058 CALL get_qs_env(qs_env, &
1059 qs_kind_set=qs_kind_set, &
1060 cell=cell, &
1061 particle_set=particle_set, &
1062 atomic_kind_set=atomic_kind_set, &
1063 molecule_set=molecule_set, &
1064 molecule_kind_set=molecule_kind_set, &
1065 dft_control=dft_control)
1066
1067 IF (my_do_kpoints) THEN
1068 ! please choose EPS_PGF_ORB in QS section smaller than EPS_GRID in WFC_GPW section
1069 IF (eps_grid < dft_control%qs_control%eps_pgf_orb) THEN
1070 eps_grid = dft_control%qs_control%eps_pgf_orb
1071 cpwarn("WFC_GPW%EPS_GRID has been set to QS%EPS_PGF_ORB")
1072 END IF
1073 END IF
1074
1075 ! hack hack hack XXXXXXXXXXXXXXX ... to be fixed
1076 dft_control%qs_control%eps_pgf_orb = eps_grid
1077 dft_control%qs_control%eps_rho_rspace = eps_grid
1078 dft_control%qs_control%eps_gvg_rspace = eps_grid
1079 CALL init_interaction_radii(dft_control%qs_control, qs_kind_set)
1080
1081 ! get a distribution_1d
1082 NULLIFY (local_particles_sub, local_molecules_sub)
1083 CALL distribute_molecules_1d(atomic_kind_set=atomic_kind_set, &
1084 particle_set=particle_set, &
1085 local_particles=local_particles_sub, &
1086 molecule_kind_set=molecule_kind_set, &
1087 molecule_set=molecule_set, &
1088 local_molecules=local_molecules_sub, &
1089 force_env_section=qs_env%input)
1090
1091 ! get a distribution_2d
1092 NULLIFY (distribution_2d_sub)
1093 CALL distribute_molecules_2d(cell=cell, &
1094 atomic_kind_set=atomic_kind_set, &
1095 qs_kind_set=qs_kind_set, &
1096 particle_set=particle_set, &
1097 molecule_kind_set=molecule_kind_set, &
1098 molecule_set=molecule_set, &
1099 distribution_2d=distribution_2d_sub, &
1100 blacs_env=blacs_env_sub, &
1101 force_env_section=qs_env%input)
1102
1103 ! Build the sub orbital-orbital overlap neighbor lists
1104 CALL section_vals_val_get(qs_env%input, "DFT%SUBCELLS", r_val=subcells)
1105 nkind = SIZE(atomic_kind_set)
1106 ALLOCATE (atom2d(nkind))
1107
1108 CALL atom2d_build(atom2d, local_particles_sub, distribution_2d_sub, atomic_kind_set, &
1109 molecule_set, molecule_only=.false., particle_set=particle_set)
1110
1111 ALLOCATE (orb_present(nkind))
1112 ALLOCATE (orb_radius(nkind))
1113 ALLOCATE (pair_radius(nkind, nkind))
1114
1115 DO ikind = 1, nkind
1116 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1117 IF (ASSOCIATED(orb_basis_set)) THEN
1118 orb_present(ikind) = .true.
1119 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, kind_radius=orb_radius(ikind))
1120 ELSE
1121 orb_present(ikind) = .false.
1122 orb_radius(ikind) = 0.0_dp
1123 END IF
1124 END DO
1125
1126 CALL pair_radius_setup(orb_present, orb_present, orb_radius, orb_radius, pair_radius)
1127
1128 IF (PRESENT(sab_orb_sub)) THEN
1129 NULLIFY (sab_orb_sub)
1130 ! for cubic RPA/GW with kpoints, we need all neighbors and not only the symmetric ones
1131 IF (my_do_kpoints) THEN
1132 CALL build_neighbor_lists(sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1133 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub", &
1134 symmetric=.false.)
1135 ELSE
1136 CALL build_neighbor_lists(sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1137 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub")
1138 END IF
1139 ELSE
1140 NULLIFY (my_sab_orb_sub)
1141 ! for cubic RPA/GW with kpoints, we need all neighbors and not only the symmetric ones
1142 IF (my_do_kpoints) THEN
1143 CALL build_neighbor_lists(my_sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1144 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub", &
1145 symmetric=.false.)
1146 ELSE
1147 CALL build_neighbor_lists(my_sab_orb_sub, particle_set, atom2d, cell, pair_radius, &
1148 mic=.false., subcells=subcells, molecular=.false., nlname="sab_orb_sub")
1149 END IF
1150 END IF
1151 CALL atom2d_cleanup(atom2d)
1152 DEALLOCATE (atom2d)
1153 DEALLOCATE (orb_present, orb_radius, pair_radius)
1154
1155 ! a dbcsr_dist
1156 ALLOCATE (dbcsr_dist_sub)
1157 CALL cp_dbcsr_dist2d_to_dist(distribution_2d_sub, dbcsr_dist_sub)
1158
1159 ! build a dbcsr matrix the hard way
1160 natom = SIZE(particle_set)
1161 ALLOCATE (row_blk_sizes(natom))
1162 IF (my_do_ri_aux_basis) THEN
1163
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
1169 ELSE IF (my_do_mixed_basis) THEN
1170
1171 ALLOCATE (basis_set_ri_aux(nkind))
1172 CALL basis_set_list_setup(basis_set_ri_aux, "RI_AUX", qs_kind_set)
1173 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes, basis=basis_set_ri_aux)
1174 DEALLOCATE (basis_set_ri_aux)
1175
1176 ALLOCATE (col_blk_sizes(natom))
1177
1178 CALL get_particle_set(particle_set, qs_kind_set, nsgf=col_blk_sizes)
1179 col_blk_sizes = col_blk_sizes*group_size_prim
1180
1181 ELSE
1182 CALL get_particle_set(particle_set, qs_kind_set, nsgf=row_blk_sizes)
1183 END IF
1184
1185 NULLIFY (mat_munu%matrix)
1186 ALLOCATE (mat_munu%matrix)
1187
1188 IF (my_do_ri_aux_basis) THEN
1189
1190 CALL dbcsr_create(matrix=mat_munu%matrix, &
1191 name="(ai|munu)", &
1192 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1193 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes)
1194
1195 ELSE IF (my_do_mixed_basis) THEN
1196
1197 CALL dbcsr_create(matrix=mat_munu%matrix, &
1198 name="(ai|munu)", &
1199 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1200 row_blk_size=row_blk_sizes, col_blk_size=col_blk_sizes)
1201
1202 ELSE
1203
1204 CALL dbcsr_create(matrix=mat_munu%matrix, &
1205 name="(ai|munu)", &
1206 dist=dbcsr_dist_sub, matrix_type=my_dbcsr_sym_type, &
1207 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes)
1208
1209 IF (my_do_alloc_blocks_from_nbl) THEN
1210
1211 IF (PRESENT(sab_orb_sub)) THEN
1212 CALL cp_dbcsr_alloc_block_from_nbl(mat_munu%matrix, sab_orb_sub)
1213 ELSE
1214 CALL cp_dbcsr_alloc_block_from_nbl(mat_munu%matrix, my_sab_orb_sub)
1215 END IF
1216
1217 END IF
1218
1219 END IF
1220
1221 DEALLOCATE (row_blk_sizes)
1222
1223 IF (my_do_mixed_basis) THEN
1224 DEALLOCATE (col_blk_sizes)
1225 END IF
1226
1227 CALL dbcsr_distribution_release(dbcsr_dist_sub)
1228 DEALLOCATE (dbcsr_dist_sub)
1229
1230 CALL distribution_2d_release(distribution_2d_sub)
1231
1232 CALL distribution_1d_release(local_particles_sub)
1233 CALL distribution_1d_release(local_molecules_sub)
1234
1235 IF (.NOT. PRESENT(sab_orb_sub)) THEN
1236 CALL release_neighbor_list_sets(my_sab_orb_sub)
1237 END IF
1238
1239 CALL timestop(handle)
1240
1241 END SUBROUTINE create_mat_munu
1242
1243! **************************************************************************************************
1244!> \brief ...
1245!> \param mat_P_global ...
1246!> \param qs_env ...
1247!> \param mp2_env ...
1248!> \param para_env ...
1249! **************************************************************************************************
1250 SUBROUTINE create_matrix_p(mat_P_global, qs_env, mp2_env, para_env)
1251
1252 TYPE(dbcsr_p_type), INTENT(OUT) :: mat_p_global
1253 TYPE(qs_environment_type), POINTER :: qs_env
1254 TYPE(mp2_type) :: mp2_env
1255 TYPE(mp_para_env_type), POINTER :: para_env
1256
1257 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_matrix_P'
1258
1259 INTEGER :: blacs_grid_layout, handle
1260 LOGICAL :: blacs_repeatable
1261 TYPE(cp_blacs_env_type), POINTER :: blacs_env_global
1262
1263 CALL timeset(routinen, handle)
1264
1265 blacs_grid_layout = blacs_grid_square
1266 blacs_repeatable = .true.
1267 NULLIFY (blacs_env_global)
1268 CALL cp_blacs_env_create(blacs_env_global, para_env, &
1269 blacs_grid_layout, &
1270 blacs_repeatable)
1271
1272 CALL create_mat_munu(mat_p_global, qs_env, mp2_env%mp2_gpw%eps_grid, &
1273 blacs_env_global, do_ri_aux_basis=.true., &
1274 do_kpoints=mp2_env%ri_rpa_im_time%do_im_time_kpoints)
1275
1276 CALL dbcsr_reserve_all_blocks(mat_p_global%matrix)
1277 CALL cp_blacs_env_release(blacs_env_global)
1278
1279 CALL timestop(handle)
1280
1281 END SUBROUTINE create_matrix_p
1282
1283! **************************************************************************************************
1284!> \brief ...
1285!> \param dft_control ...
1286!> \param eps_pgf_orb_old ...
1287!> \param eps_rho_rspace_old ...
1288!> \param eps_gvg_rspace_old ...
1289! **************************************************************************************************
1290 PURE SUBROUTINE get_eps_old(dft_control, eps_pgf_orb_old, eps_rho_rspace_old, eps_gvg_rspace_old)
1291
1292 TYPE(dft_control_type), INTENT(INOUT) :: dft_control
1293 REAL(kind=dp), INTENT(OUT) :: eps_pgf_orb_old, eps_rho_rspace_old, &
1294 eps_gvg_rspace_old
1295
1296 ! re-init the radii to be able to generate pair lists with MP2-appropriate screening
1297 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
1298 eps_rho_rspace_old = dft_control%qs_control%eps_rho_rspace
1299 eps_gvg_rspace_old = dft_control%qs_control%eps_gvg_rspace
1300
1301 END SUBROUTINE get_eps_old
1302
1303END 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:210
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.
Interface to the Libint-Library or a c++ wrapper.
subroutine, public cp_libint_static_cleanup()
subroutine, public cp_libint_static_init()
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:130
subroutine, public grep_rows_in_subgroups(para_env, para_env_sub, mo_coeff, gd_array, c)
...
Definition mp2_gpw.F:758
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:886
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)
Encapsulate the building of dbcsr_matrix mat_munu.
Definition mp2_gpw.F:989
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, 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, 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, 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)
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:190
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 ...