(git:66ce584)
Loading...
Searching...
No Matches
mp2_integrals.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 Routines to calculate and distribute 2c- and 3c- integrals for RI
10!> \par History
11!> 06.2012 created [Mauro Del Ben]
12!> 03.2019 separated from mp2_ri_gpw [Frederick Stein]
13! **************************************************************************************************
15 USE omp_lib, ONLY: omp_get_num_threads,&
16 omp_get_thread_num
20 USE bibliography, ONLY: delben2013,&
21 cite_reference
22 USE cell_types, ONLY: cell_type,&
26 USE cp_dbcsr_api, ONLY: &
28 dbcsr_release_p, dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry
36 USE cp_fm_types, ONLY: cp_fm_create,&
42 USE dbt_api, ONLY: &
43 dbt_clear, dbt_contract, dbt_copy, dbt_create, dbt_destroy, dbt_distribution_destroy, &
44 dbt_distribution_new, dbt_distribution_type, dbt_filter, dbt_get_block, dbt_get_info, &
45 dbt_get_stored_coordinates, dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, &
46 dbt_pgrid_type, dbt_put_block, dbt_reserve_blocks, dbt_scale, dbt_split_blocks, dbt_type
50 USE hfx_types, ONLY: alloc_containers,&
53 USE input_constants, ONLY: &
60 USE kinds, ONLY: default_string_length,&
61 dp,&
62 int_8
64 USE kpoint_types, ONLY: kpoint_type
66 libint_potential_type
67 USE machine, ONLY: m_flush
68 USE message_passing, ONLY: mp_cart_type,&
72 USE mp2_eri_gpw, ONLY: cleanup_gpw,&
79 USE pw_env_types, ONLY: pw_env_type
82 USE pw_types, ONLY: pw_c1d_gs_type,&
103 USE util, ONLY: get_limit
104#include "./base/base_uses.f90"
105
106 IMPLICIT NONE
107
108 PRIVATE
109
110 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_integrals'
111
113
114 TYPE intermediate_matrix_type
115 TYPE(dbcsr_type) :: matrix_ia_jnu, matrix_ia_jb
116 INTEGER :: max_row_col_local = 0
117 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: local_col_row_info
118 TYPE(cp_fm_type) :: fm_BIb_jb = cp_fm_type()
119 CHARACTER(LEN=default_string_length) :: descr = ""
120 END TYPE intermediate_matrix_type
121
122CONTAINS
123
124! **************************************************************************************************
125!> \brief with ri mp2 gpw
126!> \param BIb_C ...
127!> \param BIb_C_gw ...
128!> \param BIb_C_bse_ij ...
129!> \param BIb_C_bse_ab ...
130!> \param gd_array ...
131!> \param gd_B_virtual ...
132!> \param dimen_RI ...
133!> \param dimen_RI_red ...
134!> \param qs_env ...
135!> \param para_env ...
136!> \param para_env_sub ...
137!> \param color_sub ...
138!> \param cell ...
139!> \param particle_set ...
140!> \param atomic_kind_set ...
141!> \param qs_kind_set ...
142!> \param fm_matrix_PQ ...
143!> \param fm_matrix_L_kpoints ...
144!> \param fm_matrix_Minv_L_kpoints ...
145!> \param fm_matrix_Minv ...
146!> \param fm_matrix_Minv_Vtrunc_Minv ...
147!> \param nmo ...
148!> \param homo ...
149!> \param mat_munu ...
150!> \param sab_orb_sub ...
151!> \param mo_coeff_o ...
152!> \param mo_coeff_v ...
153!> \param mo_coeff_all ...
154!> \param mo_coeff_gw ...
155!> \param mo_coeff_o_bse ...
156!> \param mo_coeff_v_bse ...
157!> \param eps_filter ...
158!> \param unit_nr ...
159!> \param mp2_memory ...
160!> \param calc_PQ_cond_num ...
161!> \param calc_forces ...
162!> \param blacs_env_sub ...
163!> \param my_do_gw ...
164!> \param do_bse ...
165!> \param gd_B_all ...
166!> \param starts_array_mc ...
167!> \param ends_array_mc ...
168!> \param starts_array_mc_block ...
169!> \param ends_array_mc_block ...
170!> \param gw_corr_lev_occ ...
171!> \param gw_corr_lev_virt ...
172!> \param bse_lev_virt ...
173!> \param do_im_time ...
174!> \param do_kpoints_cubic_RPA ...
175!> \param kpoints ...
176!> \param t_3c_M ...
177!> \param t_3c_O ...
178!> \param t_3c_O_compressed ...
179!> \param t_3c_O_ind ...
180!> \param ri_metric ...
181!> \param gd_B_occ_bse ...
182!> \param gd_B_virt_bse ...
183!> \author Mauro Del Ben
184! **************************************************************************************************
185 SUBROUTINE mp2_ri_gpw_compute_in(BIb_C, BIb_C_gw, BIb_C_bse_ij, BIb_C_bse_ab, gd_array, gd_B_virtual, &
186 dimen_RI, dimen_RI_red, qs_env, para_env, para_env_sub, color_sub, &
187 cell, particle_set, atomic_kind_set, qs_kind_set, &
188 fm_matrix_PQ, fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, &
189 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, &
190 nmo, homo, mat_munu, &
191 sab_orb_sub, mo_coeff_o, mo_coeff_v, mo_coeff_all, &
192 mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter, unit_nr, &
193 mp2_memory, calc_PQ_cond_num, calc_forces, blacs_env_sub, my_do_gw, do_bse, &
194 gd_B_all, starts_array_mc, ends_array_mc, &
195 starts_array_mc_block, ends_array_mc_block, &
196 gw_corr_lev_occ, gw_corr_lev_virt, &
197 bse_lev_virt, &
198 do_im_time, do_kpoints_cubic_RPA, kpoints, &
199 t_3c_M, t_3c_O, t_3c_O_compressed, t_3c_O_ind, &
200 ri_metric, gd_B_occ_bse, gd_B_virt_bse)
201
202 TYPE(three_dim_real_array), ALLOCATABLE, &
203 DIMENSION(:), INTENT(OUT) :: bib_c, bib_c_gw, bib_c_bse_ij, &
204 bib_c_bse_ab
205 TYPE(group_dist_d1_type), INTENT(OUT) :: gd_array
206 TYPE(group_dist_d1_type), ALLOCATABLE, &
207 DIMENSION(:), INTENT(OUT) :: gd_b_virtual
208 INTEGER, INTENT(OUT) :: dimen_ri, dimen_ri_red
209 TYPE(qs_environment_type), POINTER :: qs_env
210 TYPE(mp_para_env_type), POINTER :: para_env, para_env_sub
211 INTEGER, INTENT(IN) :: color_sub
212 TYPE(cell_type), POINTER :: cell
213 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
214 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
215 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
216 TYPE(cp_fm_type), INTENT(OUT) :: fm_matrix_pq
217 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_matrix_l_kpoints, &
218 fm_matrix_minv_l_kpoints, &
219 fm_matrix_minv, &
220 fm_matrix_minv_vtrunc_minv
221 INTEGER, INTENT(IN) :: nmo
222 INTEGER, DIMENSION(:), INTENT(IN) :: homo
223 TYPE(dbcsr_p_type), INTENT(INOUT) :: mat_munu
224 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
225 INTENT(IN), POINTER :: sab_orb_sub
226 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(IN) :: mo_coeff_o, mo_coeff_v, mo_coeff_all, &
227 mo_coeff_gw, mo_coeff_o_bse, &
228 mo_coeff_v_bse
229 REAL(kind=dp), INTENT(IN) :: eps_filter
230 INTEGER, INTENT(IN) :: unit_nr
231 REAL(kind=dp), INTENT(IN) :: mp2_memory
232 LOGICAL, INTENT(IN) :: calc_pq_cond_num, calc_forces
233 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub
234 LOGICAL, INTENT(IN) :: my_do_gw, do_bse
235 TYPE(group_dist_d1_type), INTENT(OUT) :: gd_b_all
236 INTEGER, ALLOCATABLE, DIMENSION(:), INTENT(OUT) :: starts_array_mc, ends_array_mc, &
237 starts_array_mc_block, &
238 ends_array_mc_block
239 INTEGER, INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt
240 INTEGER, DIMENSION(:), INTENT(IN) :: bse_lev_virt
241 LOGICAL, INTENT(IN) :: do_im_time, do_kpoints_cubic_rpa
242 TYPE(kpoint_type), POINTER :: kpoints
243 TYPE(dbt_type), INTENT(OUT) :: t_3c_m
244 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :), &
245 INTENT(OUT) :: t_3c_o
246 TYPE(hfx_compression_type), ALLOCATABLE, &
247 DIMENSION(:, :, :), INTENT(INOUT) :: t_3c_o_compressed
248 TYPE(block_ind_type), ALLOCATABLE, &
249 DIMENSION(:, :, :) :: t_3c_o_ind
250 TYPE(libint_potential_type), INTENT(IN) :: ri_metric
251 TYPE(group_dist_d1_type), ALLOCATABLE, &
252 DIMENSION(:), INTENT(OUT) :: gd_b_occ_bse, gd_b_virt_bse
253
254 CHARACTER(LEN=*), PARAMETER :: routinen = 'mp2_ri_gpw_compute_in'
255
256 INTEGER :: cm, cut_memory, cut_memory_int, eri_method, gw_corr_lev_total, handle, handle2, &
257 handle4, i, i_counter, i_mem, ibasis, ispin, itmp(2), j, jcell, kcell, lll, min_bsize, &
258 my_b_all_end, my_b_all_size, my_b_all_start, my_group_l_end, my_group_l_size, &
259 my_group_l_start, n_rep, natom, ngroup, nimg, nkind, nspins, potential_type, &
260 ri_metric_type
261 INTEGER(int_8) :: nze
262 INTEGER, ALLOCATABLE, DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri, &
263 ends_array_mc_block_int, ends_array_mc_int, my_b_occ_bse_end, my_b_occ_bse_size, &
264 my_b_occ_bse_start, my_b_size, my_b_virt_bse_end, my_b_virt_bse_size, &
265 my_b_virt_bse_start, my_b_virtual_end, my_b_virtual_start, sizes_ao, sizes_ao_split, &
266 sizes_ri, sizes_ri_split, starts_array_mc_block_int, starts_array_mc_int, virtual
267 INTEGER, DIMENSION(2, 3) :: bounds
268 INTEGER, DIMENSION(3) :: bounds_3c, pcoord, pdims, pdims_t3c, &
269 periodic
270 LOGICAL :: do_gpw, do_kpoints_from_gamma, do_svd, &
271 memory_info
272 REAL(kind=dp) :: compression_factor, cutoff_old, eps_pgf_orb, eps_pgf_orb_old, eps_svd, &
273 mem_for_abk, mem_for_iak, mem_for_ijk, memory_3c, occ, omega_pot, rc_ang, &
274 relative_cutoff_old
275 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: e_cutoff_old
276 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: my_lrows, my_vrows
277 TYPE(cp_eri_mme_param), POINTER :: eri_param
278 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_munu_local_l
279 TYPE(dbt_pgrid_type) :: pgrid_t3c_m, pgrid_t3c_overl
280 TYPE(dbt_type) :: t_3c_overl_int_template, t_3c_tmp
281 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_overl_int
282 TYPE(dft_control_type), POINTER :: dft_control
283 TYPE(distribution_3d_type) :: dist_3d
284 TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_ao, basis_set_ri_aux
285 TYPE(gto_basis_set_type), POINTER :: orb_basis, ri_basis
286 TYPE(intermediate_matrix_type), ALLOCATABLE, &
287 DIMENSION(:) :: intermed_mat, intermed_mat_bse_ab, &
288 intermed_mat_bse_ij, intermed_mat_gw
289 TYPE(mp_cart_type) :: mp_comm_t3c_2
290 TYPE(neighbor_list_3c_type) :: nl_3c
291 TYPE(pw_c1d_gs_type) :: pot_g, rho_g
292 TYPE(pw_env_type), POINTER :: pw_env_sub
293 TYPE(pw_poisson_type), POINTER :: poisson_env
294 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
295 TYPE(pw_r3d_rs_type) :: psi_l, rho_r
296 TYPE(section_vals_type), POINTER :: qs_section
297 TYPE(task_list_type), POINTER :: task_list_sub
298
299 CALL timeset(routinen, handle)
300
301 CALL cite_reference(delben2013)
302
303 nspins = SIZE(homo)
304
305 ALLOCATE (virtual(nspins))
306 virtual(:) = nmo - homo(:)
307 gw_corr_lev_total = gw_corr_lev_virt + gw_corr_lev_occ
308
309 eri_method = qs_env%mp2_env%eri_method
310 eri_param => qs_env%mp2_env%eri_mme_param
311 do_svd = qs_env%mp2_env%do_svd
312 eps_svd = qs_env%mp2_env%eps_svd
313 potential_type = qs_env%mp2_env%potential_parameter%potential_type
314 ri_metric_type = ri_metric%potential_type
315 omega_pot = qs_env%mp2_env%potential_parameter%omega
316
317 ! whether we need gpw integrals (plus pw stuff)
318 do_gpw = (eri_method == do_eri_gpw) .OR. &
319 ((potential_type == do_potential_long .OR. ri_metric_type == do_potential_long) &
320 .AND. qs_env%mp2_env%eri_method == do_eri_os) &
321 .OR. (ri_metric_type == do_potential_id .AND. qs_env%mp2_env%eri_method == do_eri_mme)
322
323 IF (do_svd .AND. calc_forces) THEN
324 cpabort("SVD not implemented for forces.!")
325 END IF
326
327 do_kpoints_from_gamma = qs_env%mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma
328 IF (do_kpoints_cubic_rpa .OR. do_kpoints_from_gamma) THEN
329 CALL get_qs_env(qs_env=qs_env, &
330 kpoints=kpoints)
331 END IF
332 IF (do_kpoints_from_gamma) THEN
333 CALL compute_kpoints(qs_env, kpoints, unit_nr)
334 END IF
335
336 IF (do_bse) THEN
337 IF (.NOT. my_do_gw) THEN
338 CALL cp_abort(__location__, "BSE calculations require prior GW calculations.")
339 END IF
340 IF (do_im_time) THEN
341 CALL cp_abort(__location__, "BSE calculations are not implemented for low-scaling GW.")
342 END IF
343 ! GPW integrals have to be implemented later
344 IF (eri_method == do_eri_gpw) THEN
345 CALL cp_abort(__location__, &
346 "BSE calculations are not implemented for GPW integrals. "// &
347 "This is probably caused by invoking a periodic calculation. "// &
348 "Use PERIODIC NONE for BSE calculations.")
349 END IF
350 END IF
351
352 ngroup = para_env%num_pe/para_env_sub%num_pe
353
354 ! Preparations for MME method to compute ERIs
355 IF (qs_env%mp2_env%eri_method == do_eri_mme) THEN
356 ! cell might have changed, so we need to reset parameters
357 CALL cp_eri_mme_set_params(eri_param, cell, qs_kind_set, basis_type_1="ORB", basis_type_2="RI_AUX", para_env=para_env)
358 END IF
359
360 CALL get_cell(cell=cell, periodic=periodic)
361 ! for minimax Ewald summation, full periodicity is required
362 IF (eri_method == do_eri_mme) THEN
363 cpassert(periodic(1) == 1 .AND. periodic(2) == 1 .AND. periodic(3) == 1)
364 END IF
365
366 IF (do_svd .AND. (do_kpoints_from_gamma .OR. do_kpoints_cubic_rpa)) THEN
367 cpabort("SVD with kpoints not implemented yet!")
368 END IF
369
370 CALL get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, &
371 my_lrows, my_vrows, fm_matrix_pq, ngroup, color_sub, dimen_ri, dimen_ri_red, &
372 kpoints, my_group_l_size, my_group_l_start, my_group_l_end, &
373 gd_array, calc_pq_cond_num .AND. .NOT. do_svd, do_svd, eps_svd, &
374 qs_env%mp2_env%potential_parameter, ri_metric, &
375 fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, &
376 do_im_time, do_kpoints_from_gamma .OR. do_kpoints_cubic_rpa, qs_env%mp2_env%mp2_gpw%eps_pgf_orb_S, &
377 qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
378
379 IF (unit_nr > 0) THEN
380 associate(ri_metric => qs_env%mp2_env%ri_metric)
381 SELECT CASE (ri_metric%potential_type)
383 WRITE (unit_nr, fmt="(/T3,A,T74,A)") &
384 "RI_INFO| RI metric: ", "COULOMB"
385 CASE (do_potential_short)
386 WRITE (unit_nr, fmt="(T3,A,T71,A)") &
387 "RI_INFO| RI metric: ", "SHORTRANGE"
388 WRITE (unit_nr, '(T3,A,T61,F20.10)') &
389 "RI_INFO| Omega: ", ri_metric%omega
390 rc_ang = cp_unit_from_cp2k(ri_metric%cutoff_radius, "angstrom")
391 WRITE (unit_nr, '(T3,A,T61,F20.10)') &
392 "RI_INFO| Cutoff Radius [angstrom]: ", rc_ang
393 CASE (do_potential_long)
394 WRITE (unit_nr, fmt="(T3,A,T72,A)") &
395 "RI_INFO| RI metric: ", "LONGRANGE"
396 WRITE (unit_nr, '(T3,A,T61,F20.10)') &
397 "RI_INFO| Omega: ", ri_metric%omega
398 CASE (do_potential_id)
399 WRITE (unit_nr, fmt="(T3,A,T74,A)") &
400 "RI_INFO| RI metric: ", "OVERLAP"
402 WRITE (unit_nr, fmt="(T3,A,T64,A)") &
403 "RI_INFO| RI metric: ", "TRUNCATED COULOMB"
404 rc_ang = cp_unit_from_cp2k(ri_metric%cutoff_radius, "angstrom")
405 WRITE (unit_nr, '(T3,A,T61,F20.2)') &
406 "RI_INFO| Cutoff Radius [angstrom]: ", rc_ang
407 END SELECT
408 END associate
409 END IF
410
411 IF (calc_forces .AND. .NOT. do_im_time) THEN
412 ! we need (P|Q)^(-1/2) for future use, just save it
413 ! in a fully (home made) distributed way
414 itmp = get_limit(dimen_ri, para_env_sub%num_pe, para_env_sub%mepos)
415 lll = itmp(2) - itmp(1) + 1
416 ALLOCATE (qs_env%mp2_env%ri_grad%PQ_half(lll, my_group_l_size))
417 qs_env%mp2_env%ri_grad%PQ_half(:, :) = my_lrows(itmp(1):itmp(2), 1:my_group_l_size)
418 IF (.NOT. compare_potential_types(qs_env%mp2_env%ri_metric, qs_env%mp2_env%potential_parameter)) THEN
419 ALLOCATE (qs_env%mp2_env%ri_grad%operator_half(lll, my_group_l_size))
420 qs_env%mp2_env%ri_grad%operator_half(:, :) = my_vrows(itmp(1):itmp(2), 1:my_group_l_size)
421 DEALLOCATE (my_vrows)
422 END IF
423 END IF
424
425 IF (unit_nr > 0) THEN
426 WRITE (unit=unit_nr, fmt="(T3,A,T75,i6)") &
427 "RI_INFO| Number of auxiliary basis functions:", dimen_ri, &
428 "GENERAL_INFO| Number of basis functions:", nmo, &
429 "GENERAL_INFO| Number of occupied orbitals:", homo(1), &
430 "GENERAL_INFO| Number of virtual orbitals:", virtual(1)
431 IF (do_svd) THEN
432 WRITE (unit=unit_nr, fmt="(T3,A,T75,i6)") &
433 "RI_INFO| Reduced auxiliary basis set size:", dimen_ri_red
434 END IF
435
436 mem_for_iak = dimen_ri*real(sum(homo*virtual), kind=dp)*8.0_dp/(1024_dp**2)
437 mem_for_ijk = dimen_ri*real(sum(homo(1:nspins)**2), kind=dp)*8.0_dp/(1024_dp**2)
438 mem_for_abk = dimen_ri*real(sum(bse_lev_virt(1:nspins)**2), kind=dp)*8.0_dp/(1024_dp**2)
439
440 IF (.NOT. do_im_time) THEN
441 WRITE (unit_nr, '(T3,A,T66,F11.2,A4)') 'RI_INFO| Total memory for (ia|K) integrals:', &
442 mem_for_iak, ' MiB'
443 IF (my_do_gw .AND. .NOT. do_im_time) THEN
444 mem_for_iak = dimen_ri*real(nmo, kind=dp)*gw_corr_lev_total*8.0_dp/(1024_dp**2)
445
446 WRITE (unit_nr, '(T3,A,T66,F11.2,A4)') 'RI_INFO| Total memory for G0W0-(nm|K) integrals:', &
447 mem_for_iak, ' MiB'
448 END IF
449 END IF
450 IF (do_bse) THEN
451 WRITE (unit_nr, '(T3,A,T66,F11.2,A4)') 'RI_INFO| Total memory for (ij|K) integrals:', &
452 mem_for_ijk, ' MiB'
453 WRITE (unit_nr, '(T3,A,T66,F11.2,A4)') 'RI_INFO| Total memory for (ab|K) integrals:', &
454 mem_for_abk, ' MiB'
455 END IF
456 CALL m_flush(unit_nr)
457 END IF
458
459 CALL para_env%sync() ! sync to see memory output
460
461 ! in case we do imaginary time, we need the overlap tensor (alpha beta P) or trunc. Coulomb tensor
462 IF (.NOT. do_im_time) THEN
463
464 ALLOCATE (gd_b_virtual(nspins), intermed_mat(nspins))
465 ALLOCATE (my_b_virtual_start(nspins), my_b_virtual_end(nspins), my_b_size(nspins))
466 DO ispin = 1, nspins
467
468 CALL create_intermediate_matrices(intermed_mat(ispin), mo_coeff_o(ispin)%matrix, virtual(ispin), homo(ispin), &
469 trim(adjustl(cp_to_string(ispin))), blacs_env_sub, para_env_sub)
470
471 CALL create_group_dist(gd_b_virtual(ispin), para_env_sub%num_pe, virtual(ispin))
472 CALL get_group_dist(gd_b_virtual(ispin), para_env_sub%mepos, my_b_virtual_start(ispin), my_b_virtual_end(ispin), &
473 my_b_size(ispin))
474
475 END DO
476
477 ! in the case of G0W0, we need (K|nm), n,m may be occ or virt (m restricted to corrected levels)
478 IF (my_do_gw) THEN
479
480 ALLOCATE (intermed_mat_gw(nspins))
481 DO ispin = 1, nspins
482 CALL create_intermediate_matrices(intermed_mat_gw(ispin), mo_coeff_gw(ispin)%matrix, &
483 nmo, gw_corr_lev_total, &
484 "gw_"//trim(adjustl(cp_to_string(ispin))), &
485 blacs_env_sub, para_env_sub)
486
487 END DO
488
489 CALL create_group_dist(gd_b_all, para_env_sub%num_pe, nmo)
490 CALL get_group_dist(gd_b_all, para_env_sub%mepos, my_b_all_start, my_b_all_end, my_b_all_size)
491
492 IF (do_bse) THEN
493 ! virt x virt slab size bse_lev_virt(ispin) is per-spin, so gd_B_virt_bse is an array;
494 ! the occupied count homo(ispin) is per-spin, so gd_B_occ_bse and the bse intermediates are arrays
495 ALLOCATE (intermed_mat_bse_ab(nspins), intermed_mat_bse_ij(nspins), gd_b_occ_bse(nspins), gd_b_virt_bse(nspins))
496 ALLOCATE (my_b_occ_bse_start(nspins), my_b_occ_bse_end(nspins), my_b_occ_bse_size(nspins))
497 ALLOCATE (my_b_virt_bse_start(nspins), my_b_virt_bse_end(nspins), my_b_virt_bse_size(nspins))
498 DO ispin = 1, nspins
499 CALL create_group_dist(gd_b_virt_bse(ispin), para_env_sub%num_pe, bse_lev_virt(ispin))
500 CALL get_group_dist(gd_b_virt_bse(ispin), para_env_sub%mepos, my_b_virt_bse_start(ispin), &
501 my_b_virt_bse_end(ispin), my_b_virt_bse_size(ispin))
502 ! virt x virt matrices
503 CALL create_intermediate_matrices(intermed_mat_bse_ab(ispin), mo_coeff_v_bse(ispin)%matrix, &
504 bse_lev_virt(ispin), bse_lev_virt(ispin), &
505 "bse_ab_"//trim(adjustl(cp_to_string(ispin))), blacs_env_sub, para_env_sub)
506
507 ! occ x occ matrices
508 ! We do not implement bse_lev_occ here, because the small number of occupied levels
509 ! does not critically influence the memory
510 CALL create_intermediate_matrices(intermed_mat_bse_ij(ispin), mo_coeff_o_bse(ispin)%matrix, &
511 homo(ispin), homo(ispin), &
512 "bse_ij_"//trim(adjustl(cp_to_string(ispin))), blacs_env_sub, para_env_sub)
513
514 CALL create_group_dist(gd_b_occ_bse(ispin), para_env_sub%num_pe, homo(ispin))
515 CALL get_group_dist(gd_b_occ_bse(ispin), para_env_sub%mepos, my_b_occ_bse_start(ispin), &
516 my_b_occ_bse_end(ispin), my_b_occ_bse_size(ispin))
517 END DO
518
519 END IF
520 END IF
521
522 ! array that will store the (ia|K) integrals
523 ALLOCATE (bib_c(nspins))
524 DO ispin = 1, nspins
525 ALLOCATE (bib_c(ispin)%array(my_group_l_size, my_b_size(ispin), homo(ispin)))
526 bib_c(ispin)%array = 0.0_dp
527 END DO
528
529 ! in the case of GW, we also need (nm|K)
530 IF (my_do_gw) THEN
531
532 ALLOCATE (bib_c_gw(nspins))
533 DO ispin = 1, nspins
534 ALLOCATE (bib_c_gw(ispin)%array(my_group_l_size, my_b_all_size, gw_corr_lev_total))
535 bib_c_gw(ispin)%array = 0.0_dp
536 END DO
537
538 END IF
539
540 IF (do_bse) THEN
541
542 ALLOCATE (bib_c_bse_ij(nspins), bib_c_bse_ab(nspins))
543 DO ispin = 1, nspins
544 ALLOCATE (bib_c_bse_ij(ispin)%array(my_group_l_size, my_b_occ_bse_size(ispin), homo(ispin)))
545 bib_c_bse_ij(ispin)%array = 0.0_dp
546
547 ALLOCATE (bib_c_bse_ab(ispin)%array(my_group_l_size, my_b_virt_bse_size(ispin), bse_lev_virt(ispin)))
548 bib_c_bse_ab(ispin)%array = 0.0_dp
549 END DO
550
551 END IF
552
553 CALL timeset(routinen//"_loop", handle2)
554
555 IF (eri_method == do_eri_mme .AND. &
556 (ri_metric%potential_type == do_potential_coulomb .OR. ri_metric%potential_type == do_potential_long) .OR. &
557 eri_method == do_eri_os .AND. ri_metric%potential_type == do_potential_coulomb) THEN
558
559 ! Add a warning for automatically generated RI_AUX basis sets
560 ! Tend to be not sufficiently converged
561 IF (qs_env%mp2_env%ri_aux_auto_generated) THEN
562 CALL cp_warn(__location__, &
563 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section. "// &
564 "Automatically RI-basis sets and ERI_METHOD OS tend to be not converged. "// &
565 "Consider specifying BASIS_SET RI_AUX explicitly with a sufficiently large basis.")
566 END IF
567
568 NULLIFY (mat_munu_local_l)
569 ALLOCATE (mat_munu_local_l(my_group_l_size))
570 DO lll = 1, my_group_l_size
571 NULLIFY (mat_munu_local_l(lll)%matrix)
572 ALLOCATE (mat_munu_local_l(lll)%matrix)
573 CALL dbcsr_copy(mat_munu_local_l(lll)%matrix, mat_munu%matrix)
574 CALL dbcsr_set(mat_munu_local_l(lll)%matrix, 0.0_dp)
575 END DO
576 CALL mp2_eri_3c_integrate(eri_param, ri_metric, para_env_sub, qs_env, &
577 first_c=my_group_l_start, last_c=my_group_l_end, &
578 mat_ab=mat_munu_local_l, &
579 basis_type_a="ORB", basis_type_b="ORB", &
580 basis_type_c="RI_AUX", &
581 sab_nl=sab_orb_sub, eri_method=eri_method)
582
583 DO ispin = 1, nspins
584 DO lll = 1, my_group_l_size
585 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat(ispin), &
586 bib_c(ispin)%array(lll, :, :), &
587 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
588 eps_filter, &
589 my_b_virtual_end(ispin), my_b_virtual_start(ispin))
590 END DO
591 CALL contract_b_l(bib_c(ispin)%array, my_lrows, gd_b_virtual(ispin)%sizes, &
592 gd_array%sizes, qs_env%mp2_env%eri_blksize, &
593 ngroup, color_sub, para_env, para_env_sub)
594 END DO
595
596 IF (my_do_gw) THEN
597
598 DO ispin = 1, nspins
599 DO lll = 1, my_group_l_size
600 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_gw(ispin), &
601 bib_c_gw(ispin)%array(lll, :, :), &
602 mo_coeff_gw(ispin)%matrix, mo_coeff_all(ispin)%matrix, eps_filter, &
603 my_b_all_end, my_b_all_start)
604 END DO
605 CALL contract_b_l(bib_c_gw(ispin)%array, my_lrows, gd_b_all%sizes, gd_array%sizes, qs_env%mp2_env%eri_blksize, &
606 ngroup, color_sub, para_env, para_env_sub)
607 END DO
608 END IF
609
610 IF (do_bse) THEN
611
612 DO ispin = 1, nspins
613 ! B^ab_P matrix elements for BSE
614 DO lll = 1, my_group_l_size
615 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_bse_ab(ispin), &
616 bib_c_bse_ab(ispin)%array(lll, :, :), &
617 mo_coeff_v_bse(ispin)%matrix, mo_coeff_v_bse(ispin)%matrix, eps_filter, &
618 my_b_all_end, my_b_all_start)
619 END DO
620 CALL contract_b_l(bib_c_bse_ab(ispin)%array, my_lrows, gd_b_virt_bse(ispin)%sizes, gd_array%sizes, &
621 qs_env%mp2_env%eri_blksize, ngroup, color_sub, para_env, para_env_sub)
622
623 ! B^ij_P matrix elements for BSE
624 DO lll = 1, my_group_l_size
625 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_bse_ij(ispin), &
626 bib_c_bse_ij(ispin)%array(lll, :, :), &
627 mo_coeff_o(ispin)%matrix, mo_coeff_o(ispin)%matrix, eps_filter, &
628 my_b_occ_bse_end(ispin), my_b_occ_bse_start(ispin))
629 END DO
630 CALL contract_b_l(bib_c_bse_ij(ispin)%array, my_lrows, gd_b_occ_bse(ispin)%sizes, gd_array%sizes, &
631 qs_env%mp2_env%eri_blksize, ngroup, color_sub, para_env, para_env_sub)
632 END DO
633
634 END IF
635
636 DO lll = 1, my_group_l_size
637 CALL dbcsr_release_p(mat_munu_local_l(lll)%matrix)
638 END DO
639 DEALLOCATE (mat_munu_local_l)
640
641 ELSE IF (do_gpw) THEN
642
643 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
644 auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
645
646 DO i_counter = 1, my_group_l_size
647
648 CALL mp2_eri_3c_integrate_gpw(psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, dft_control, &
649 particle_set, pw_env_sub, my_lrows(:, i_counter), poisson_env, rho_r, pot_g, &
650 ri_metric, mat_munu, qs_env, task_list_sub)
651
652 DO ispin = 1, nspins
653 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu, intermed_mat(ispin), &
654 bib_c(ispin)%array(i_counter, :, :), &
655 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, eps_filter, &
656 my_b_virtual_end(ispin), my_b_virtual_start(ispin))
657
658 END DO
659
660 IF (my_do_gw) THEN
661 ! transform (K|mu nu) to (K|nm), n corresponds to corrected GW levels, m is in nmo
662 DO ispin = 1, nspins
663 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu, intermed_mat_gw(ispin), &
664 bib_c_gw(ispin)%array(i_counter, :, :), &
665 mo_coeff_gw(ispin)%matrix, mo_coeff_all(ispin)%matrix, eps_filter, &
666 my_b_all_end, my_b_all_start)
667
668 END DO
669 END IF
670
671 END DO
672
673 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
674 task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
675 ELSE
676 cpabort("Integration method not implemented!")
677 END IF
678
679 CALL timestop(handle2)
680
681 DEALLOCATE (my_lrows)
682
683 DO ispin = 1, nspins
684 CALL release_intermediate_matrices(intermed_mat(ispin))
685 END DO
686 DEALLOCATE (intermed_mat)
687
688 IF (my_do_gw) THEN
689 DO ispin = 1, nspins
690 CALL release_intermediate_matrices(intermed_mat_gw(ispin))
691 END DO
692 DEALLOCATE (intermed_mat_gw)
693 END IF
694
695 IF (do_bse) THEN
696 DO ispin = 1, nspins
697 CALL release_intermediate_matrices(intermed_mat_bse_ab(ispin))
698 CALL release_intermediate_matrices(intermed_mat_bse_ij(ispin))
699 END DO
700 DEALLOCATE (intermed_mat_bse_ab, intermed_mat_bse_ij)
701 END IF
702
703 ! imag. time = low-scaling SOS-MP2, RPA, GW
704 ELSE
705
706 memory_info = qs_env%mp2_env%ri_rpa_im_time%memory_info
707
708 ! we need 3 tensors:
709 ! 1) t_3c_overl_int: 3c overlap integrals, optimized for easy access to integral blocks
710 ! (atomic blocks)
711 ! 2) t_3c_O: 3c overlap integrals, optimized for contraction (split blocks)
712 ! 3) t_3c_M: tensor M, optimized for contraction
713
714 CALL get_qs_env(qs_env, natom=natom, nkind=nkind, dft_control=dft_control)
715
716 pdims_t3c = 0
717 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c_overl)
718
719 ! set up basis
720 ALLOCATE (sizes_ri(natom), sizes_ao(natom))
721 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
722 CALL basis_set_list_setup(basis_set_ri_aux, "RI_AUX", qs_kind_set)
723 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
724 CALL basis_set_list_setup(basis_set_ao, "ORB", qs_kind_set)
725 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
726
727 ! make sure we use the QS%EPS_PGF_ORB
728 qs_section => section_vals_get_subs_vals(qs_env%input, "DFT%QS")
729 CALL section_vals_val_get(qs_section, "EPS_PGF_ORB", n_rep_val=n_rep)
730 IF (n_rep /= 0) THEN
731 CALL section_vals_val_get(qs_section, "EPS_PGF_ORB", r_val=eps_pgf_orb)
732 ELSE
733 CALL section_vals_val_get(qs_section, "EPS_DEFAULT", r_val=eps_pgf_orb)
734 eps_pgf_orb = sqrt(eps_pgf_orb)
735 END IF
736 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
737
738 DO ibasis = 1, SIZE(basis_set_ao)
739 orb_basis => basis_set_ao(ibasis)%gto_basis_set
740 CALL init_interaction_radii_orb_basis(orb_basis, eps_pgf_orb)
741 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
742 CALL init_interaction_radii_orb_basis(ri_basis, eps_pgf_orb)
743 END DO
744
745 cut_memory_int = qs_env%mp2_env%ri_rpa_im_time%cut_memory
746 CALL create_tensor_batches(sizes_ri, cut_memory_int, starts_array_mc_int, ends_array_mc_int, &
747 starts_array_mc_block_int, ends_array_mc_block_int)
748
749 DEALLOCATE (starts_array_mc_int, ends_array_mc_int)
750
751 CALL create_3c_tensor(t_3c_overl_int_template, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_overl, &
752 sizes_ri, sizes_ao, sizes_ao, map1=[1, 2], map2=[3], &
753 name="O (RI AO | AO)")
754
755 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
756 CALL dbt_mp_environ_pgrid(pgrid_t3c_overl, pdims, pcoord)
757 CALL mp_comm_t3c_2%create(pgrid_t3c_overl%mp_comm_2d, 3, pdims)
758 CALL distribution_3d_create(dist_3d, dist_ri, dist_ao_1, dist_ao_2, &
759 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
760 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
761
762 CALL build_3c_neighbor_lists(nl_3c, basis_set_ri_aux, basis_set_ao, basis_set_ao, &
763 dist_3d, ri_metric, "RPA_3c_nl", qs_env, &
764 sym_jk=.NOT. do_kpoints_cubic_rpa, own_dist=.true.)
765
766 ! init k points
767 IF (do_kpoints_cubic_rpa) THEN
768 ! set up new kpoint type with periodic images according to eps_grid from MP2 section
769 ! instead of eps_pgf_orb from QS section
770 CALL kpoint_init_cell_index(kpoints, nl_3c%jk_list, para_env, dft_control%nimages)
771 IF (unit_nr > 0) WRITE (unit=unit_nr, fmt="(T3,A,T75,i6)") &
772 "3C_OVERLAP_INTEGRALS_INFO| Number of periodic images considered:", dft_control%nimages
773
774 nimg = dft_control%nimages
775 ELSE
776 nimg = 1
777 END IF
778
779 ALLOCATE (t_3c_overl_int(nimg, nimg))
780
781 DO i = 1, SIZE(t_3c_overl_int, 1)
782 DO j = 1, SIZE(t_3c_overl_int, 2)
783 CALL dbt_create(t_3c_overl_int_template, t_3c_overl_int(i, j))
784 END DO
785 END DO
786
787 CALL dbt_destroy(t_3c_overl_int_template)
788
789 ! split blocks to improve load balancing for tensor contraction
790 min_bsize = qs_env%mp2_env%ri_rpa_im_time%min_bsize
791
792 CALL pgf_block_sizes(atomic_kind_set, basis_set_ao, min_bsize, sizes_ao_split)
793 CALL pgf_block_sizes(atomic_kind_set, basis_set_ri_aux, min_bsize, sizes_ri_split)
794
795 pdims_t3c = 0
796 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c_m)
797
798 associate(cut_memory => qs_env%mp2_env%ri_rpa_im_time%cut_memory)
799 CALL create_tensor_batches(sizes_ao_split, cut_memory, starts_array_mc, ends_array_mc, &
800 starts_array_mc_block, ends_array_mc_block)
801 CALL create_tensor_batches(sizes_ri_split, cut_memory, &
802 qs_env%mp2_env%ri_rpa_im_time%starts_array_mc_RI, &
803 qs_env%mp2_env%ri_rpa_im_time%ends_array_mc_RI, &
804 qs_env%mp2_env%ri_rpa_im_time%starts_array_mc_block_RI, &
805 qs_env%mp2_env%ri_rpa_im_time%ends_array_mc_block_RI)
806
807 END associate
808 cut_memory = qs_env%mp2_env%ri_rpa_im_time%cut_memory
809
810 CALL create_3c_tensor(t_3c_m, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_m, &
811 sizes_ri_split, sizes_ao_split, sizes_ao_split, &
812 map1=[1], map2=[2, 3], &
813 name="M (RI | AO AO)")
814 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
815 CALL dbt_pgrid_destroy(pgrid_t3c_m)
816
817 ALLOCATE (t_3c_o(SIZE(t_3c_overl_int, 1), SIZE(t_3c_overl_int, 2)))
818 ALLOCATE (t_3c_o_compressed(SIZE(t_3c_overl_int, 1), SIZE(t_3c_overl_int, 2), cut_memory))
819 ALLOCATE (t_3c_o_ind(SIZE(t_3c_overl_int, 1), SIZE(t_3c_overl_int, 2), cut_memory))
820 CALL create_3c_tensor(t_3c_o(1, 1), dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_overl, &
821 sizes_ri_split, sizes_ao_split, sizes_ao_split, &
822 map1=[1, 2], map2=[3], &
823 name="O (RI AO | AO)")
824 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
825 CALL dbt_pgrid_destroy(pgrid_t3c_overl)
826
827 DO i = 1, SIZE(t_3c_o, 1)
828 DO j = 1, SIZE(t_3c_o, 2)
829 IF (i > 1 .OR. j > 1) CALL dbt_create(t_3c_o(1, 1), t_3c_o(i, j))
830 END DO
831 END DO
832
833 ! build integrals in batches and copy to optimized format
834 ! note: integrals are stored in terms of atomic blocks. To avoid a memory bottleneck,
835 ! integrals are calculated in batches and copied to optimized format with subatomic blocks
836
837 DO cm = 1, cut_memory_int
838 CALL build_3c_integrals(t_3c_overl_int, &
839 qs_env%mp2_env%ri_rpa_im_time%eps_filter/2, &
840 qs_env, &
841 nl_3c, &
842 int_eps=qs_env%mp2_env%ri_rpa_im_time%eps_filter/2, &
843 basis_i=basis_set_ri_aux, &
844 basis_j=basis_set_ao, basis_k=basis_set_ao, &
845 potential_parameter=ri_metric, &
846 do_kpoints=do_kpoints_cubic_rpa, &
847 bounds_i=[starts_array_mc_block_int(cm), ends_array_mc_block_int(cm)], desymmetrize=.false.)
848 CALL timeset(routinen//"_copy_3c", handle4)
849 ! copy integral tensor t_3c_overl_int to t_3c_O tensor optimized for contraction
850 DO i = 1, SIZE(t_3c_overl_int, 1)
851 DO j = 1, SIZE(t_3c_overl_int, 2)
852
853 CALL dbt_copy(t_3c_overl_int(i, j), t_3c_o(i, j), order=[1, 3, 2], &
854 summation=.true., move_data=.true.)
855 CALL dbt_clear(t_3c_overl_int(i, j))
856 CALL dbt_filter(t_3c_o(i, j), qs_env%mp2_env%ri_rpa_im_time%eps_filter/2)
857 ! rescaling, probably because of neighbor list
858 IF (do_kpoints_cubic_rpa .AND. cm == cut_memory_int) THEN
859 CALL dbt_scale(t_3c_o(i, j), 0.5_dp)
860 END IF
861 END DO
862 END DO
863 CALL timestop(handle4)
864 END DO
865
866 DO i = 1, SIZE(t_3c_overl_int, 1)
867 DO j = 1, SIZE(t_3c_overl_int, 2)
868 CALL dbt_destroy(t_3c_overl_int(i, j))
869 END DO
870 END DO
871 DEALLOCATE (t_3c_overl_int)
872
873 CALL timeset(routinen//"_copy_3c", handle4)
874 ! desymmetrize
875 CALL dbt_create(t_3c_o(1, 1), t_3c_tmp)
876 DO jcell = 1, nimg
877 DO kcell = 1, jcell
878 CALL dbt_copy(t_3c_o(jcell, kcell), t_3c_tmp)
879 CALL dbt_copy(t_3c_tmp, t_3c_o(kcell, jcell), order=[1, 3, 2], summation=.true., move_data=.true.)
880 CALL dbt_filter(t_3c_o(kcell, jcell), qs_env%mp2_env%ri_rpa_im_time%eps_filter)
881 END DO
882 END DO
883 DO jcell = 1, nimg
884 DO kcell = jcell + 1, nimg
885 CALL dbt_copy(t_3c_o(jcell, kcell), t_3c_tmp)
886 CALL dbt_copy(t_3c_tmp, t_3c_o(kcell, jcell), order=[1, 3, 2], summation=.false., move_data=.true.)
887 CALL dbt_filter(t_3c_o(kcell, jcell), qs_env%mp2_env%ri_rpa_im_time%eps_filter)
888 END DO
889 END DO
890
891 CALL dbt_get_info(t_3c_o(1, 1), nfull_total=bounds_3c)
892 CALL get_tensor_occupancy(t_3c_o(1, 1), nze, occ)
893 memory_3c = 0.0_dp
894
895 bounds(:, 1) = [1, bounds_3c(1)]
896 bounds(:, 3) = [1, bounds_3c(3)]
897 DO i = 1, SIZE(t_3c_o, 1)
898 DO j = 1, SIZE(t_3c_o, 2)
899 DO i_mem = 1, cut_memory
900 bounds(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
901 CALL dbt_copy(t_3c_o(i, j), t_3c_tmp, bounds=bounds)
902
903 CALL alloc_containers(t_3c_o_compressed(i, j, i_mem), 1)
904 CALL compress_tensor(t_3c_tmp, t_3c_o_ind(i, j, i_mem)%ind, &
905 t_3c_o_compressed(i, j, i_mem), &
906 qs_env%mp2_env%ri_rpa_im_time%eps_compress, memory_3c)
907 END DO
908 CALL dbt_clear(t_3c_o(i, j))
909 END DO
910 END DO
911
912 CALL para_env%sum(memory_3c)
913
914 compression_factor = real(nze, dp)*1.0e-06*8.0_dp/memory_3c
915
916 IF (unit_nr > 0) THEN
917 WRITE (unit=unit_nr, fmt="((T3,A,T66,F11.2,A4))") &
918 "MEMORY_INFO| Memory for 3-center integrals (compressed):", memory_3c, ' MiB'
919
920 WRITE (unit=unit_nr, fmt="((T3,A,T60,F21.2))") &
921 "MEMORY_INFO| Compression factor: ", compression_factor
922 END IF
923
924 CALL dbt_destroy(t_3c_tmp)
925
926 CALL timestop(handle4)
927
928 DO ibasis = 1, SIZE(basis_set_ao)
929 orb_basis => basis_set_ao(ibasis)%gto_basis_set
930 CALL init_interaction_radii_orb_basis(orb_basis, eps_pgf_orb_old)
931 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
932 CALL init_interaction_radii_orb_basis(ri_basis, eps_pgf_orb_old)
933 END DO
934
935 DEALLOCATE (basis_set_ri_aux, basis_set_ao)
936
937 CALL neighbor_list_3c_destroy(nl_3c)
938
939 END IF
940
941 CALL timestop(handle)
942
943 END SUBROUTINE mp2_ri_gpw_compute_in
944
945! **************************************************************************************************
946!> \brief Contract (P|ai) = (R|P) x (R|ai)
947!> \param BIb_C (R|ai)
948!> \param my_Lrows (R|P)
949!> \param sizes_B number of a (virtual) indices per subgroup process
950!> \param sizes_L number of P / R (auxiliary) indices per subgroup
951!> \param blk_size ...
952!> \param ngroup how many subgroups (NG)
953!> \param igroup subgroup color
954!> \param mp_comm communicator
955!> \param para_env_sub ...
956! **************************************************************************************************
957 SUBROUTINE contract_b_l(BIb_C, my_Lrows, sizes_B, sizes_L, blk_size, ngroup, igroup, mp_comm, para_env_sub)
958 REAL(kind=dp), DIMENSION(:, :, :), INTENT(INOUT) :: bib_c
959 REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: my_lrows
960 INTEGER, DIMENSION(:), INTENT(IN) :: sizes_b, sizes_l
961 INTEGER, DIMENSION(2), INTENT(IN) :: blk_size
962 INTEGER, INTENT(IN) :: ngroup, igroup
963
964 CLASS(mp_comm_type), INTENT(IN) :: mp_comm
965 TYPE(mp_para_env_type), INTENT(IN) :: para_env_sub
966
967 CHARACTER(LEN=*), PARAMETER :: routinen = 'contract_B_L'
968 LOGICAL, PARAMETER :: debug = .false.
969
970 INTEGER :: check_proc, handle, i, iend, ii, ioff, &
971 istart, loc_a, loc_p, nblk_per_thread
972 INTEGER, ALLOCATABLE, DIMENSION(:) :: block_ind_l_p, block_ind_l_r
973 INTEGER, DIMENSION(1) :: dist_b_i, map_b_1, map_l_1, map_l_2, &
974 sizes_i
975 INTEGER, DIMENSION(2) :: map_b_2, pdims_l
976 INTEGER, DIMENSION(3) :: pdims_b
977 LOGICAL :: found
978 INTEGER, DIMENSION(ngroup) :: dist_l_p, dist_l_r
979 INTEGER, DIMENSION(para_env_sub%num_pe) :: dist_b_a
980 TYPE(dbt_distribution_type) :: dist_b, dist_l
981 TYPE(dbt_pgrid_type) :: mp_comm_b, mp_comm_l
982 TYPE(dbt_type) :: tb_in, tb_in_split, tb_out, &
983 tb_out_split, tl, tl_split
984
985 CALL timeset(routinen, handle)
986
987 sizes_i(1) = SIZE(bib_c, 3)
988
989 associate(nproc => para_env_sub%num_pe, iproc => para_env_sub%mepos, iproc_glob => mp_comm%mepos)
990
991 ! local block index for R/P and a
992 loc_p = igroup + 1; loc_a = iproc + 1
993
994 cpassert(SIZE(sizes_l) == ngroup)
995 cpassert(SIZE(sizes_b) == nproc)
996 cpassert(sizes_l(loc_p) == SIZE(bib_c, 1))
997 cpassert(sizes_l(loc_p) == SIZE(my_lrows, 2))
998 cpassert(sizes_b(loc_a) == SIZE(bib_c, 2))
999
1000 ! Tensor distributions as follows:
1001 ! Process grid NG x Nw
1002 ! Each process has coordinates (np, nw)
1003 ! tB_in: (R|ai): R distributed (np), a distributed (nw)
1004 ! tB_out: (P|ai): P distributed (np), a distributed (nw)
1005 ! tL: (R|P): R distributed (nw), P distributed (np)
1006
1007 ! define mappings between tensor index and matrix index:
1008 ! (R|ai) and (P|ai):
1009 map_b_1 = [1] ! index 1 (R or P) maps to 1st matrix index (np distributed)
1010 map_b_2 = [2, 3] ! indices 2, 3 (a, i) map to 2nd matrix index (nw distributed)
1011 ! (R|P):
1012 map_l_1 = [2] ! index 2 (P) maps to 1st matrix index (np distributed)
1013 map_l_2 = [1] ! index 1 (R) maps to 2nd matrix index (nw distributed)
1014
1015 ! derive nd process grid that is compatible with distributions and 2d process grid
1016 ! (R|ai) / (P|ai) on process grid NG x Nw x 1
1017 ! (R|P) on process grid NG x Nw
1018 pdims_b = [ngroup, nproc, 1]
1019 pdims_l = [nproc, ngroup]
1020
1021 CALL dbt_pgrid_create(mp_comm, pdims_b, mp_comm_b)
1022 CALL dbt_pgrid_create(mp_comm, pdims_l, mp_comm_l)
1023
1024 ! setup distribution vectors such that distribution matches parallel data layout of BIb_C and my_Lrows
1025 dist_b_i = [0]
1026 dist_b_a = [(i, i=0, nproc - 1)]
1027 dist_l_r = [(modulo(i, nproc), i=0, ngroup - 1)] ! R index is replicated in my_Lrows, we impose a cyclic distribution
1028 dist_l_p = [(i, i=0, ngroup - 1)]
1029
1030 ! create distributions and tensors
1031 CALL dbt_distribution_new(dist_b, mp_comm_b, dist_l_p, dist_b_a, dist_b_i)
1032 CALL dbt_distribution_new(dist_l, mp_comm_l, dist_l_r, dist_l_p)
1033
1034 CALL dbt_create(tb_in, "(R|ai)", dist_b, map_b_1, map_b_2, sizes_l, sizes_b, sizes_i)
1035 CALL dbt_create(tb_out, "(P|ai)", dist_b, map_b_1, map_b_2, sizes_l, sizes_b, sizes_i)
1036 CALL dbt_create(tl, "(R|P)", dist_l, map_l_1, map_l_2, sizes_l, sizes_l)
1037
1038 IF (debug) THEN
1039 ! check that tensor distribution is correct
1040 CALL dbt_get_stored_coordinates(tb_in, [loc_p, loc_a, 1], check_proc)
1041 cpassert(check_proc == iproc_glob)
1042 END IF
1043
1044 ! reserve (R|ai) block
1045!$OMP PARALLEL DEFAULT(NONE) SHARED(tB_in,loc_P,loc_a)
1046 CALL dbt_reserve_blocks(tb_in, [loc_p], [loc_a], [1])
1047!$OMP END PARALLEL
1048
1049 ! reserve (R|P) blocks
1050 ! in my_Lrows, R index is replicated. For (R|P), we distribute quadratic blocks cyclically over
1051 ! the processes in a subgroup.
1052 ! There are NG blocks, so each process holds at most NG/Nw+1 blocks.
1053 ALLOCATE (block_ind_l_r(ngroup/nproc + 1))
1054 ALLOCATE (block_ind_l_p(ngroup/nproc + 1))
1055 block_ind_l_r(:) = 0; block_ind_l_p(:) = 0
1056 ii = 0
1057 DO i = 1, ngroup
1058 CALL dbt_get_stored_coordinates(tl, [i, loc_p], check_proc)
1059 IF (check_proc == iproc_glob) THEN
1060 ii = ii + 1
1061 block_ind_l_r(ii) = i
1062 block_ind_l_p(ii) = loc_p
1063 END IF
1064 END DO
1065
1066!TODO: Parallelize creation of block list.
1067!$OMP PARALLEL DEFAULT(NONE) SHARED(tL,block_ind_L_R,block_ind_L_P,ii) &
1068!$OMP PRIVATE(nblk_per_thread,istart,iend)
1069 nblk_per_thread = ii/omp_get_num_threads() + 1
1070 istart = omp_get_thread_num()*nblk_per_thread + 1
1071 iend = min(istart + nblk_per_thread, ii)
1072 CALL dbt_reserve_blocks(tl, block_ind_l_r(istart:iend), block_ind_l_p(istart:iend))
1073!$OMP END PARALLEL
1074
1075 ! insert (R|ai) block
1076 CALL dbt_put_block(tb_in, [loc_p, loc_a, 1], shape(bib_c), bib_c)
1077
1078 ! insert (R|P) blocks
1079 ioff = 0
1080 DO i = 1, ngroup
1081 istart = ioff + 1; iend = ioff + sizes_l(i)
1082 ioff = ioff + sizes_l(i)
1083 CALL dbt_get_stored_coordinates(tl, [i, loc_p], check_proc)
1084 IF (check_proc == iproc_glob) THEN
1085 CALL dbt_put_block(tl, [i, loc_p], [sizes_l(i), sizes_l(loc_p)], my_lrows(istart:iend, :))
1086 END IF
1087 END DO
1088 END associate
1089
1090 CALL dbt_split_blocks(tb_in, tb_in_split, [blk_size(2), blk_size(1), blk_size(1)])
1091 CALL dbt_split_blocks(tl, tl_split, [blk_size(2), blk_size(2)])
1092 CALL dbt_split_blocks(tb_out, tb_out_split, [blk_size(2), blk_size(1), blk_size(1)])
1093
1094 ! contract
1095 CALL dbt_contract(alpha=1.0_dp, tensor_1=tb_in_split, tensor_2=tl_split, &
1096 beta=0.0_dp, tensor_3=tb_out_split, &
1097 contract_1=[1], notcontract_1=[2, 3], &
1098 contract_2=[1], notcontract_2=[2], &
1099 map_1=[2, 3], map_2=[1], optimize_dist=.true.)
1100
1101 ! retrieve local block of contraction result (P|ai)
1102 CALL dbt_copy(tb_out_split, tb_out)
1103
1104 CALL dbt_get_block(tb_out, [loc_p, loc_a, 1], shape(bib_c), bib_c, found)
1105 cpassert(found)
1106
1107 ! cleanup
1108 CALL dbt_destroy(tb_in)
1109 CALL dbt_destroy(tb_in_split)
1110 CALL dbt_destroy(tb_out)
1111 CALL dbt_destroy(tb_out_split)
1112 CALL dbt_destroy(tl)
1113 CALL dbt_destroy(tl_split)
1114
1115 CALL dbt_distribution_destroy(dist_b)
1116 CALL dbt_distribution_destroy(dist_l)
1117
1118 CALL dbt_pgrid_destroy(mp_comm_b)
1119 CALL dbt_pgrid_destroy(mp_comm_l)
1120
1121 CALL timestop(handle)
1122
1123 END SUBROUTINE contract_b_l
1124
1125! **************************************************************************************************
1126!> \brief Encapsulate building of intermediate matrices matrix_ia_jnu(_beta
1127!> matrix_ia_jb(_beta),fm_BIb_jb(_beta),matrix_in_jnu(for G0W0) and
1128!> fm_BIb_all(for G0W0)
1129!> \param intermed_mat ...
1130!> \param mo_coeff_templ ...
1131!> \param size_1 ...
1132!> \param size_2 ...
1133!> \param matrix_name_2 ...
1134!> \param blacs_env_sub ...
1135!> \param para_env_sub ...
1136!> \author Jan Wilhelm
1137! **************************************************************************************************
1138 SUBROUTINE create_intermediate_matrices(intermed_mat, mo_coeff_templ, size_1, size_2, &
1139 matrix_name_2, blacs_env_sub, para_env_sub)
1140
1141 TYPE(intermediate_matrix_type), INTENT(OUT) :: intermed_mat
1142 TYPE(dbcsr_type), INTENT(INOUT) :: mo_coeff_templ
1143 INTEGER, INTENT(IN) :: size_1, size_2
1144 CHARACTER(LEN=*), INTENT(IN) :: matrix_name_2
1145 TYPE(cp_blacs_env_type), POINTER :: blacs_env_sub
1146 TYPE(mp_para_env_type), POINTER :: para_env_sub
1147
1148 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_intermediate_matrices'
1149
1150 INTEGER :: handle, ncol_local, nfullcols_total, &
1151 nfullrows_total, nrow_local
1152 INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
1153 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1154
1155 CALL timeset(routinen, handle)
1156
1157 ! initialize and create the matrix (K|jnu)
1158 CALL dbcsr_create(intermed_mat%matrix_ia_jnu, template=mo_coeff_templ)
1159
1160 ! Allocate Sparse matrices: (K|jb)
1161 CALL cp_dbcsr_m_by_n_from_template(intermed_mat%matrix_ia_jb, template=mo_coeff_templ, m=size_2, n=size_1, &
1162 sym=dbcsr_type_no_symmetry)
1163
1164 ! set all to zero in such a way that the memory is actually allocated
1165 CALL dbcsr_set(intermed_mat%matrix_ia_jnu, 0.0_dp)
1166 CALL dbcsr_set(intermed_mat%matrix_ia_jb, 0.0_dp)
1167
1168 ! create the analogous of matrix_ia_jb in fm type
1169 NULLIFY (fm_struct)
1170 CALL dbcsr_get_info(intermed_mat%matrix_ia_jb, nfullrows_total=nfullrows_total, nfullcols_total=nfullcols_total)
1171 CALL cp_fm_struct_create(fm_struct, context=blacs_env_sub, nrow_global=nfullrows_total, &
1172 ncol_global=nfullcols_total, para_env=para_env_sub)
1173 CALL cp_fm_create(intermed_mat%fm_BIb_jb, fm_struct, name="fm_BIb_jb_"//matrix_name_2)
1174
1175 CALL copy_dbcsr_to_fm(intermed_mat%matrix_ia_jb, intermed_mat%fm_BIb_jb)
1176 CALL cp_fm_struct_release(fm_struct)
1177
1178 CALL cp_fm_get_info(matrix=intermed_mat%fm_BIb_jb, &
1179 nrow_local=nrow_local, &
1180 ncol_local=ncol_local, &
1181 row_indices=row_indices, &
1182 col_indices=col_indices)
1183
1184 intermed_mat%max_row_col_local = max(nrow_local, ncol_local)
1185 CALL para_env_sub%max(intermed_mat%max_row_col_local)
1186
1187 ALLOCATE (intermed_mat%local_col_row_info(0:intermed_mat%max_row_col_local, 2))
1188 intermed_mat%local_col_row_info = 0
1189 ! 0,1 nrows
1190 intermed_mat%local_col_row_info(0, 1) = nrow_local
1191 intermed_mat%local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
1192 ! 0,2 ncols
1193 intermed_mat%local_col_row_info(0, 2) = ncol_local
1194 intermed_mat%local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
1195
1196 intermed_mat%descr = matrix_name_2
1197
1198 CALL timestop(handle)
1199
1200 END SUBROUTINE create_intermediate_matrices
1201
1202! **************************************************************************************************
1203!> \brief Encapsulate ERI postprocessing: AO to MO transformation and store in B matrix.
1204!> \param para_env ...
1205!> \param mat_munu ...
1206!> \param intermed_mat ...
1207!> \param BIb_jb ...
1208!> \param mo_coeff_o ...
1209!> \param mo_coeff_v ...
1210!> \param eps_filter ...
1211!> \param my_B_end ...
1212!> \param my_B_start ...
1213! **************************************************************************************************
1214 SUBROUTINE ao_to_mo_and_store_b(para_env, mat_munu, intermed_mat, BIb_jb, &
1215 mo_coeff_o, mo_coeff_v, eps_filter, &
1216 my_B_end, my_B_start)
1217 TYPE(mp_para_env_type), INTENT(IN) :: para_env
1218 TYPE(dbcsr_p_type), INTENT(IN) :: mat_munu
1219 TYPE(intermediate_matrix_type), INTENT(INOUT) :: intermed_mat
1220 REAL(kind=dp), DIMENSION(:, :), INTENT(OUT) :: bib_jb
1221 TYPE(dbcsr_type), POINTER :: mo_coeff_o, mo_coeff_v
1222 REAL(kind=dp), INTENT(IN) :: eps_filter
1223 INTEGER, INTENT(IN) :: my_b_end, my_b_start
1224
1225 CHARACTER(LEN=*), PARAMETER :: routinen = 'ao_to_mo_and_store_B'
1226
1227 INTEGER :: handle
1228
1229 CALL timeset(routinen//"_mult_"//trim(intermed_mat%descr), handle)
1230
1231 CALL dbcsr_multiply("N", "N", 1.0_dp, mat_munu%matrix, mo_coeff_o, &
1232 0.0_dp, intermed_mat%matrix_ia_jnu, filter_eps=eps_filter)
1233 CALL dbcsr_multiply("T", "N", 1.0_dp, intermed_mat%matrix_ia_jnu, mo_coeff_v, &
1234 0.0_dp, intermed_mat%matrix_ia_jb, filter_eps=eps_filter)
1235 CALL timestop(handle)
1236
1237 CALL timeset(routinen//"_E_Ex_"//trim(intermed_mat%descr), handle)
1238 CALL copy_dbcsr_to_fm(intermed_mat%matrix_ia_jb, intermed_mat%fm_BIb_jb)
1239
1240 CALL grep_my_integrals(para_env, intermed_mat%fm_BIb_jb, bib_jb, intermed_mat%max_row_col_local, &
1241 intermed_mat%local_col_row_info, &
1242 my_b_end, my_b_start)
1243
1244 CALL timestop(handle)
1245 END SUBROUTINE ao_to_mo_and_store_b
1246
1247! **************************************************************************************************
1248!> \brief ...
1249!> \param intermed_mat ...
1250! **************************************************************************************************
1251 SUBROUTINE release_intermediate_matrices(intermed_mat)
1252 TYPE(intermediate_matrix_type), INTENT(INOUT) :: intermed_mat
1253
1254 CALL dbcsr_release(intermed_mat%matrix_ia_jnu)
1255 CALL dbcsr_release(intermed_mat%matrix_ia_jb)
1256 CALL cp_fm_release(intermed_mat%fm_BIb_jb)
1257 DEALLOCATE (intermed_mat%local_col_row_info)
1258
1259 END SUBROUTINE release_intermediate_matrices
1260
1261! **************************************************************************************************
1262!> \brief ...
1263!> \param qs_env ...
1264!> \param kpoints ...
1265!> \param unit_nr ...
1266! **************************************************************************************************
1267 SUBROUTINE compute_kpoints(qs_env, kpoints, unit_nr)
1268
1269 TYPE(qs_environment_type), POINTER :: qs_env
1270 TYPE(kpoint_type), POINTER :: kpoints
1271 INTEGER :: unit_nr
1272
1273 CHARACTER(LEN=*), PARAMETER :: routinen = 'compute_kpoints'
1274
1275 INTEGER :: handle, i, i_dim, ix, iy, iz, nkp, &
1276 nkp_extra, nkp_orig
1277 INTEGER, DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
1278 LOGICAL :: do_extrapolate_kpoints
1279 TYPE(cell_type), POINTER :: cell
1280 TYPE(dft_control_type), POINTER :: dft_control
1281 TYPE(mp_para_env_type), POINTER :: para_env
1282 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1283 POINTER :: sab_orb
1284
1285 CALL timeset(routinen, handle)
1286
1287 NULLIFY (cell, dft_control, para_env)
1288 CALL get_qs_env(qs_env=qs_env, cell=cell, para_env=para_env, dft_control=dft_control, sab_orb=sab_orb)
1289 CALL get_cell(cell=cell, periodic=periodic)
1290
1291 ! general because we augment a Monkhorst-Pack mesh by additional points in the BZ
1292 kpoints%kp_scheme = "GENERAL"
1293 kpoints%symmetry = .false.
1294 kpoints%verbose = .false.
1295 kpoints%full_grid = .true.
1296 kpoints%use_real_wfn = .false.
1297 kpoints%eps_geo = 1.e-6_dp
1298 nkp_grid(1:3) = qs_env%mp2_env%ri_rpa_im_time%kp_grid(1:3)
1299 do_extrapolate_kpoints = qs_env%mp2_env%ri_rpa_im_time%do_extrapolate_kpoints
1300
1301 DO i_dim = 1, 3
1302 IF (periodic(i_dim) == 1) THEN
1303 cpassert(modulo(nkp_grid(i_dim), 2) == 0)
1304 END IF
1305 IF (periodic(i_dim) == 0) THEN
1306 cpassert(nkp_grid(i_dim) == 1)
1307 END IF
1308 END DO
1309
1310 nkp_orig = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2
1311
1312 IF (do_extrapolate_kpoints) THEN
1313
1314 cpassert(qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method == kp_weights_w_uniform)
1315
1316 DO i_dim = 1, 3
1317 IF (periodic(i_dim) == 1) nkp_grid_extra(i_dim) = nkp_grid(i_dim) + 2
1318 IF (periodic(i_dim) == 0) nkp_grid_extra(i_dim) = 1
1319 END DO
1320
1321 qs_env%mp2_env%ri_rpa_im_time%kp_grid_extra(1:3) = nkp_grid_extra(1:3)
1322
1323 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
1324
1325 ELSE
1326
1327 nkp_grid_extra(1:3) = 0
1328 nkp_extra = 0
1329
1330 END IF
1331
1332 nkp = nkp_orig + nkp_extra
1333
1334 qs_env%mp2_env%ri_rpa_im_time%nkp_orig = nkp_orig
1335 qs_env%mp2_env%ri_rpa_im_time%nkp_extra = nkp_extra
1336
1337 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
1338
1339 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
1340 kpoints%nkp = nkp
1341
1342 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%wkp_V(nkp))
1343 IF (do_extrapolate_kpoints) THEN
1344 kpoints%wkp(1:nkp_orig) = 1.0_dp/real(nkp_orig, kind=dp) &
1345 /(1.0_dp - sqrt(real(nkp_extra, kind=dp)/real(nkp_orig, kind=dp)))
1346 kpoints%wkp(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=dp) &
1347 /(1.0_dp - sqrt(real(nkp_orig, kind=dp)/real(nkp_extra, kind=dp)))
1348 qs_env%mp2_env%ri_rpa_im_time%wkp_V(1:nkp_orig) = 0.0_dp
1349 qs_env%mp2_env%ri_rpa_im_time%wkp_V(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=dp)
1350 ELSE
1351 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=dp)
1352 qs_env%mp2_env%ri_rpa_im_time%wkp_V(:) = kpoints%wkp(:)
1353 END IF
1354
1355 i = 0
1356 DO ix = 1, nkp_grid(1)
1357 DO iy = 1, nkp_grid(2)
1358 DO iz = 1, nkp_grid(3)
1359
1360 IF (i == nkp_orig) cycle
1361 i = i + 1
1362
1363 kpoints%xkp(1, i) = real(2*ix - nkp_grid(1) - 1, kind=dp)/(2._dp*real(nkp_grid(1), kind=dp))
1364 kpoints%xkp(2, i) = real(2*iy - nkp_grid(2) - 1, kind=dp)/(2._dp*real(nkp_grid(2), kind=dp))
1365 kpoints%xkp(3, i) = real(2*iz - nkp_grid(3) - 1, kind=dp)/(2._dp*real(nkp_grid(3), kind=dp))
1366
1367 END DO
1368 END DO
1369 END DO
1370
1371 DO ix = 1, nkp_grid_extra(1)
1372 DO iy = 1, nkp_grid_extra(2)
1373 DO iz = 1, nkp_grid_extra(3)
1374
1375 i = i + 1
1376 IF (i > nkp) cycle
1377
1378 kpoints%xkp(1, i) = real(2*ix - nkp_grid_extra(1) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(1), kind=dp))
1379 kpoints%xkp(2, i) = real(2*iy - nkp_grid_extra(2) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(2), kind=dp))
1380 kpoints%xkp(3, i) = real(2*iz - nkp_grid_extra(3) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(3), kind=dp))
1381
1382 END DO
1383 END DO
1384 END DO
1385
1386 CALL kpoint_init_cell_index(kpoints, sab_orb, para_env, dft_control%nimages)
1387
1388 CALL set_qs_env(qs_env, kpoints=kpoints)
1389
1390 IF (unit_nr > 0) THEN
1391
1392 IF (do_extrapolate_kpoints) THEN
1393 WRITE (unit=unit_nr, fmt="(T3,A,T69,3I4)") "KPOINT_INFO| K-point mesh for V (leading to Sigma^x):", nkp_grid(1:3)
1394 WRITE (unit=unit_nr, fmt="(T3,A,T69)") "KPOINT_INFO| K-point extrapolation for W^c is used (W^c leads to Sigma^c):"
1395 WRITE (unit=unit_nr, fmt="(T3,A,T69,3I4)") "KPOINT_INFO| K-point mesh 1 for W^c:", nkp_grid(1:3)
1396 WRITE (unit=unit_nr, fmt="(T3,A,T69,3I4)") "KPOINT_INFO| K-point mesh 2 for W^c:", nkp_grid_extra(1:3)
1397 ELSE
1398 WRITE (unit=unit_nr, fmt="(T3,A,T69,3I4)") "KPOINT_INFO| K-point mesh for V and W:", nkp_grid(1:3)
1399 WRITE (unit=unit_nr, fmt="(T3,A,T75,I6)") "KPOINT_INFO| Number of kpoints for V and W:", nkp
1400 END IF
1401
1402 SELECT CASE (qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method)
1403 CASE (kp_weights_w_tailored)
1404 WRITE (unit=unit_nr, fmt="(T3,A,T81)") &
1405 "KPOINT_INFO| K-point weights for W: TAILORED"
1406 CASE (kp_weights_w_auto)
1407 WRITE (unit=unit_nr, fmt="(T3,A,T81)") &
1408 "KPOINT_INFO| K-point weights for W: AUTO"
1409 CASE (kp_weights_w_uniform)
1410 WRITE (unit=unit_nr, fmt="(T3,A,T81)") &
1411 "KPOINT_INFO| K-point weights for W: UNIFORM"
1412 END SELECT
1413
1414 END IF
1415
1416 CALL timestop(handle)
1417
1418 END SUBROUTINE compute_kpoints
1419
1420! **************************************************************************************************
1421!> \brief ...
1422!> \param para_env_sub ...
1423!> \param fm_BIb_jb ...
1424!> \param BIb_jb ...
1425!> \param max_row_col_local ...
1426!> \param local_col_row_info ...
1427!> \param my_B_virtual_end ...
1428!> \param my_B_virtual_start ...
1429! **************************************************************************************************
1430 SUBROUTINE grep_my_integrals(para_env_sub, fm_BIb_jb, BIb_jb, max_row_col_local, &
1431 local_col_row_info, &
1432 my_B_virtual_end, my_B_virtual_start)
1433 TYPE(mp_para_env_type), INTENT(IN) :: para_env_sub
1434 TYPE(cp_fm_type), INTENT(IN) :: fm_bib_jb
1435 REAL(kind=dp), DIMENSION(:, :), INTENT(OUT) :: bib_jb
1436 INTEGER, INTENT(IN) :: max_row_col_local
1437 INTEGER, ALLOCATABLE, DIMENSION(:, :), INTENT(IN) :: local_col_row_info
1438 INTEGER, INTENT(IN) :: my_b_virtual_end, my_b_virtual_start
1439
1440 INTEGER :: i_global, iib, j_global, jjb, ncol_rec, &
1441 nrow_rec, proc_receive, proc_send, &
1442 proc_shift
1443 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: rec_col_row_info
1444 INTEGER, DIMENSION(:), POINTER :: col_indices_rec, row_indices_rec
1445 REAL(kind=dp), DIMENSION(:, :), POINTER :: local_bi, rec_bi
1446
1447 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
1448
1449 rec_col_row_info(:, :) = local_col_row_info
1450
1451 nrow_rec = rec_col_row_info(0, 1)
1452 ncol_rec = rec_col_row_info(0, 2)
1453
1454 ALLOCATE (row_indices_rec(nrow_rec))
1455 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1456
1457 ALLOCATE (col_indices_rec(ncol_rec))
1458 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1459
1460 ! accumulate data on BIb_jb buffer starting from myself
1461 DO jjb = 1, ncol_rec
1462 j_global = col_indices_rec(jjb)
1463 IF (j_global >= my_b_virtual_start .AND. j_global <= my_b_virtual_end) THEN
1464 DO iib = 1, nrow_rec
1465 i_global = row_indices_rec(iib)
1466 bib_jb(j_global - my_b_virtual_start + 1, i_global) = fm_bib_jb%local_data(iib, jjb)
1467 END DO
1468 END IF
1469 END DO
1470
1471 DEALLOCATE (row_indices_rec)
1472 DEALLOCATE (col_indices_rec)
1473
1474 IF (para_env_sub%num_pe > 1) THEN
1475 ALLOCATE (local_bi(nrow_rec, ncol_rec))
1476 local_bi(1:nrow_rec, 1:ncol_rec) = fm_bib_jb%local_data(1:nrow_rec, 1:ncol_rec)
1477
1478 DO proc_shift = 1, para_env_sub%num_pe - 1
1479 proc_send = modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
1480 proc_receive = modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
1481
1482 ! first exchange information on the local data
1483 rec_col_row_info = 0
1484 CALL para_env_sub%sendrecv(local_col_row_info, proc_send, rec_col_row_info, proc_receive)
1485 nrow_rec = rec_col_row_info(0, 1)
1486 ncol_rec = rec_col_row_info(0, 2)
1487
1488 ALLOCATE (row_indices_rec(nrow_rec))
1489 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1490
1491 ALLOCATE (col_indices_rec(ncol_rec))
1492 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1493
1494 ALLOCATE (rec_bi(nrow_rec, ncol_rec))
1495 rec_bi = 0.0_dp
1496
1497 ! then send and receive the real data
1498 CALL para_env_sub%sendrecv(local_bi, proc_send, rec_bi, proc_receive)
1499
1500 ! accumulate the received data on BIb_jb buffer
1501 DO jjb = 1, ncol_rec
1502 j_global = col_indices_rec(jjb)
1503 IF (j_global >= my_b_virtual_start .AND. j_global <= my_b_virtual_end) THEN
1504 DO iib = 1, nrow_rec
1505 i_global = row_indices_rec(iib)
1506 bib_jb(j_global - my_b_virtual_start + 1, i_global) = rec_bi(iib, jjb)
1507 END DO
1508 END IF
1509 END DO
1510
1511 DEALLOCATE (col_indices_rec)
1512 DEALLOCATE (row_indices_rec)
1513 DEALLOCATE (rec_bi)
1514 END DO
1515
1516 DEALLOCATE (local_bi)
1517 END IF
1518
1519 DEALLOCATE (rec_col_row_info)
1520
1521 END SUBROUTINE grep_my_integrals
1522
1523END MODULE mp2_integrals
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.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public delben2013
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
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_release_p(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_m_by_n_from_template(matrix, template, m, n, sym)
Utility function to create an arbitrary shaped dbcsr matrix with the same processor grid as the templ...
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
unit conversion facility
Definition cp_units.F:30
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Definition cp_units.F:1251
This is the start of a dbt_api, all publically needed functions are exported here....
Definition dbt_api.F:17
Types to describe group distributions.
Types and set/get functions for HFX.
Definition hfx_types.F:16
subroutine, public alloc_containers(data, bin_size)
...
Definition hfx_types.F:2989
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_eri_os
integer, parameter, public kp_weights_w_auto
integer, parameter, public kp_weights_w_uniform
integer, parameter, public do_eri_mme
integer, parameter, public do_potential_truncated
integer, parameter, public do_potential_id
integer, parameter, public do_potential_coulomb
integer, parameter, public do_potential_short
integer, parameter, public kp_weights_w_tailored
integer, parameter, public do_potential_long
integer, parameter, public do_eri_gpw
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public int_8
Definition kinds.F:54
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Routines needed for kpoint calculation.
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, nimages)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
Types and basic routines needed for a kpoint calculation.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
pure logical function, public compare_potential_types(potential1, potential2)
Helper function to compare Coulomb operator types.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
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.
Routines to calculate 2c- and 3c-integrals for RI with GPW.
Definition mp2_eri_gpw.F:13
subroutine, public prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
Prepares GPW calculation for RI-MP2/RI-RPA.
subroutine, public mp2_eri_3c_integrate_gpw(psi_l, rho_g, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env_sub, external_vector, poisson_env, rho_r, pot_g, potential_parameter, mat_munu, qs_env, task_list_sub)
...
subroutine, public cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
Cleanup GPW integration for RI-MP2/RI-RPA.
Interface to direct methods for electron repulsion integrals for MP2.
Definition mp2_eri.F:12
subroutine, public mp2_eri_3c_integrate(param, potential_parameter, para_env, qs_env, first_c, last_c, mat_ab, basis_type_a, basis_type_b, basis_type_c, sab_nl, eri_method, pabc, force_a, force_b, force_c, mat_dabc, mat_adbc, mat_abdc)
high-level integration routine for 3c integrals (ab|c) over CP2K basis sets. For each local function ...
Definition mp2_eri.F:702
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
subroutine, public compute_kpoints(qs_env, kpoints, unit_nr)
...
Framework for 2c-integrals for RI.
Definition mp2_ri_2c.F:14
subroutine, public get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, my_lrows, my_vrows, fm_matrix_pq, ngroup, color_sub, dimen_ri, dimen_ri_red, kpoints, my_group_l_size, my_group_l_start, my_group_l_end, gd_array, calc_pq_cond_num, do_svd, eps_svd, potential, ri_metric, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, do_im_time, do_kpoints, mp2_eps_pgf_orb_s, qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
...
Definition mp2_ri_2c.F:167
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.
container for various plainwaves related things
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set 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_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
Define the neighbor list data types and the corresponding functionality.
Utility methods to build 3-center integral tensors of various types.
subroutine, public distribution_3d_create(dist_3d, dist1, dist2, dist3, nkind, particle_set, mp_comm_3d, own_comm)
Create a 3d distribution.
subroutine, public pgf_block_sizes(atomic_kind_set, basis, min_blk_size, pgf_blk_sizes)
...
subroutine, public create_tensor_batches(sizes, nbatches, starts_array, ends_array, starts_array_block, ends_array_block)
...
subroutine, public create_3c_tensor(t3c, dist_1, dist_2, dist_3, pgrid, sizes_1, sizes_2, sizes_3, map1, map2, name)
...
Utility methods to build 3-center integral tensors of various types.
Definition qs_tensors.F:11
subroutine, public build_3c_integrals(t3c, filter_eps, qs_env, nl_3c, basis_i, basis_j, basis_k, potential_parameter, int_eps, op_pos, do_kpoints, do_hfx_kpoints, desymmetrize, cell_sym, bounds_i, bounds_j, bounds_k, ri_range, img_to_ri_cell, cell_to_index_ext)
Build 3-center integral tensor.
subroutine, public compress_tensor(tensor, blk_indices, compressed, eps, memory)
...
subroutine, public neighbor_list_3c_destroy(ijk_list)
Destroy 3c neighborlist.
Definition qs_tensors.F:381
subroutine, public get_tensor_occupancy(tensor, nze, occ)
...
subroutine, public build_3c_neighbor_lists(ijk_list, basis_i, basis_j, basis_k, dist_3d, potential_parameter, name, qs_env, sym_ij, sym_jk, sym_ik, molecular, op_pos, own_dist)
Build a 3-center neighbor list.
Definition qs_tensors.F:280
types for task lists
All kind of helpful little routines.
Definition util.F:14
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
Definition util.F:333
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...
keeps the information about the structure of a full matrix
represent a full matrix
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.