15 USE omp_lib,
ONLY: omp_get_num_threads,&
44 dbt_clear, dbt_contract, dbt_copy, dbt_create, dbt_destroy, dbt_distribution_destroy, &
45 dbt_distribution_new, dbt_distribution_type, dbt_filter, dbt_get_block, dbt_get_info, &
46 dbt_get_stored_coordinates, dbt_mp_environ_pgrid, dbt_pgrid_create, dbt_pgrid_destroy, &
47 dbt_pgrid_type, dbt_put_block, dbt_reserve_blocks, dbt_scale, dbt_split_blocks, dbt_type
105#include "./base/base_uses.f90"
111 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_integrals'
115 TYPE intermediate_matrix_type
116 TYPE(dbcsr_type) :: matrix_ia_jnu, matrix_ia_jb
117 INTEGER :: max_row_col_local = 0
118 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: local_col_row_info
120 CHARACTER(LEN=default_string_length) :: descr =
""
121 END TYPE intermediate_matrix_type
188 dimen_RI, dimen_RI_red, qs_env, para_env, para_env_sub, color_sub, &
189 cell, particle_set, atomic_kind_set, qs_kind_set, &
190 fm_matrix_PQ, cfm_matrix_L_kpoints, cfm_matrix_Minv_L_kpoints, fm_matrix_Minv_L_gamma, &
191 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, &
192 nmo, homo, mat_munu, &
193 sab_orb_sub, mo_coeff_o, mo_coeff_v, mo_coeff_all, &
194 mo_coeff_gw, mo_coeff_o_bse, mo_coeff_v_bse, eps_filter, unit_nr, &
195 mp2_memory, calc_PQ_cond_num, calc_forces, blacs_env_sub, my_do_gw, do_bse, &
196 gd_B_all, starts_array_mc, ends_array_mc, &
197 starts_array_mc_block, ends_array_mc_block, &
198 gw_corr_lev_occ, gw_corr_lev_virt, &
200 do_im_time, do_kpoints_cubic_RPA, kpoints, &
201 t_3c_M, t_3c_O, t_3c_O_compressed, t_3c_O_ind, &
202 ri_metric, gd_B_occ_bse, gd_B_virt_bse)
205 DIMENSION(:),
INTENT(OUT) :: bib_c, bib_c_gw, bib_c_bse_ij, &
209 DIMENSION(:),
INTENT(OUT) :: gd_b_virtual
210 INTEGER,
INTENT(OUT) :: dimen_ri, dimen_ri_red
213 INTEGER,
INTENT(IN) :: color_sub
217 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
219 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: cfm_matrix_l_kpoints, &
220 cfm_matrix_minv_l_kpoints
221 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_minv_l_gamma, fm_matrix_minv, &
222 fm_matrix_minv_vtrunc_minv
223 INTEGER,
INTENT(IN) :: nmo
224 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
227 INTENT(IN),
POINTER :: sab_orb_sub
228 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff_o, mo_coeff_v, mo_coeff_all, &
229 mo_coeff_gw, mo_coeff_o_bse, &
231 REAL(kind=
dp),
INTENT(IN) :: eps_filter
232 INTEGER,
INTENT(IN) :: unit_nr
233 REAL(kind=
dp),
INTENT(IN) :: mp2_memory
234 LOGICAL,
INTENT(IN) :: calc_pq_cond_num, calc_forces
236 LOGICAL,
INTENT(IN) :: my_do_gw, do_bse
238 INTEGER,
ALLOCATABLE,
DIMENSION(:),
INTENT(OUT) :: starts_array_mc, ends_array_mc, &
239 starts_array_mc_block, &
241 INTEGER,
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt
242 INTEGER,
DIMENSION(:),
INTENT(IN) :: bse_lev_virt
243 LOGICAL,
INTENT(IN) :: do_im_time, do_kpoints_cubic_rpa
245 TYPE(dbt_type),
INTENT(OUT) :: t_3c_m
246 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :), &
247 INTENT(OUT) :: t_3c_o
249 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_compressed
251 DIMENSION(:, :, :) :: t_3c_o_ind
252 TYPE(libint_potential_type),
INTENT(IN) :: ri_metric
254 DIMENSION(:),
INTENT(OUT) :: gd_b_occ_bse, gd_b_virt_bse
256 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mp2_ri_gpw_compute_in'
258 INTEGER :: cm, cut_memory, cut_memory_int, eri_method, gw_corr_lev_total, handle, handle2, &
259 handle4, i, i_counter, i_mem, ibasis, ispin, itmp(2), j, jcell, kcell, lll, min_bsize, &
260 my_b_all_end, my_b_all_size, my_b_all_start, my_group_l_end, my_group_l_size, &
261 my_group_l_start, n_rep, natom, ngroup, nimg, nkind, nspins, potential_type, &
263 INTEGER(int_8) :: nze
264 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist_ao_1, dist_ao_2, dist_ri, &
265 ends_array_mc_block_int, ends_array_mc_int, my_b_occ_bse_end, my_b_occ_bse_size, &
266 my_b_occ_bse_start, my_b_size, my_b_virt_bse_end, my_b_virt_bse_size, &
267 my_b_virt_bse_start, my_b_virtual_end, my_b_virtual_start, sizes_ao, sizes_ao_split, &
268 sizes_ri, sizes_ri_split, starts_array_mc_block_int, starts_array_mc_int, virtual
269 INTEGER,
DIMENSION(2, 3) :: bounds
270 INTEGER,
DIMENSION(3) :: bounds_3c, pcoord, pdims, pdims_t3c, &
272 LOGICAL :: do_gpw, do_kpoints_from_gamma, do_svd, &
274 REAL(kind=
dp) :: compression_factor, cutoff_old, eps_pgf_orb, eps_pgf_orb_old, eps_svd, &
275 mem_for_abk, mem_for_iak, mem_for_ijk, memory_3c, occ, omega_pot, rc_ang, &
277 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: e_cutoff_old
278 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: my_lrows, my_vrows
280 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_munu_local_l
281 TYPE(dbt_pgrid_type) :: pgrid_t3c_m, pgrid_t3c_overl
282 TYPE(dbt_type) :: t_3c_overl_int_template, t_3c_tmp
283 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_overl_int
288 TYPE(intermediate_matrix_type),
ALLOCATABLE, &
289 DIMENSION(:) :: intermed_mat, intermed_mat_bse_ab, &
290 intermed_mat_bse_ij, intermed_mat_gw
301 CALL timeset(routinen, handle)
307 ALLOCATE (virtual(nspins))
308 virtual(:) = nmo - homo(:)
309 gw_corr_lev_total = gw_corr_lev_virt + gw_corr_lev_occ
311 eri_method = qs_env%mp2_env%eri_method
312 eri_param => qs_env%mp2_env%eri_mme_param
313 do_svd = qs_env%mp2_env%do_svd
314 eps_svd = qs_env%mp2_env%eps_svd
315 potential_type = qs_env%mp2_env%potential_parameter%potential_type
316 ri_metric_type = ri_metric%potential_type
317 omega_pot = qs_env%mp2_env%potential_parameter%omega
322 .AND. qs_env%mp2_env%eri_method ==
do_eri_os) &
325 IF (do_svd .AND. calc_forces)
THEN
326 cpabort(
"SVD not implemented for forces.!")
329 do_kpoints_from_gamma = qs_env%mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma
330 IF (do_kpoints_cubic_rpa .OR. do_kpoints_from_gamma)
THEN
334 IF (do_kpoints_from_gamma)
THEN
339 IF (.NOT. my_do_gw)
THEN
340 CALL cp_abort(__location__,
"BSE calculations require prior GW calculations.")
343 CALL cp_abort(__location__,
"BSE calculations are not implemented for low-scaling GW.")
347 CALL cp_abort(__location__, &
348 "BSE calculations are not implemented for GPW integrals. "// &
349 "This is probably caused by invoking a periodic calculation. "// &
350 "Use PERIODIC NONE for BSE calculations.")
354 ngroup = para_env%num_pe/para_env_sub%num_pe
357 IF (qs_env%mp2_env%eri_method ==
do_eri_mme)
THEN
359 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)
362 CALL get_cell(cell=cell, periodic=periodic)
365 cpassert(periodic(1) == 1 .AND. periodic(2) == 1 .AND. periodic(3) == 1)
368 IF (do_svd .AND. (do_kpoints_from_gamma .OR. do_kpoints_cubic_rpa))
THEN
369 cpabort(
"SVD with kpoints not implemented yet!")
372 CALL get_2c_integrals(qs_env, eri_method, eri_param, para_env, para_env_sub, mp2_memory, &
373 my_lrows, my_vrows, fm_matrix_pq, ngroup, color_sub, dimen_ri, dimen_ri_red, &
374 kpoints, my_group_l_size, my_group_l_start, my_group_l_end, &
375 gd_array, calc_pq_cond_num .AND. .NOT. do_svd, do_svd, eps_svd, &
376 qs_env%mp2_env%potential_parameter, ri_metric, &
377 cfm_matrix_l_kpoints, cfm_matrix_minv_l_kpoints, fm_matrix_minv_l_gamma, &
378 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, &
379 do_im_time, do_kpoints_from_gamma .OR. do_kpoints_cubic_rpa, qs_env%mp2_env%mp2_gpw%eps_pgf_orb_S, &
380 qs_kind_set, sab_orb_sub, calc_forces, unit_nr)
382 IF (unit_nr > 0)
THEN
383 associate(ri_metric => qs_env%mp2_env%ri_metric)
384 SELECT CASE (ri_metric%potential_type)
386 WRITE (unit_nr, fmt=
"(/T3,A,T74,A)") &
387 "RI_INFO| RI metric: ",
"COULOMB"
389 WRITE (unit_nr, fmt=
"(T3,A,T71,A)") &
390 "RI_INFO| RI metric: ",
"SHORTRANGE"
391 WRITE (unit_nr,
'(T3,A,T61,F20.10)') &
392 "RI_INFO| Omega: ", ri_metric%omega
394 WRITE (unit_nr,
'(T3,A,T61,F20.10)') &
395 "RI_INFO| Cutoff Radius [angstrom]: ", rc_ang
397 WRITE (unit_nr, fmt=
"(T3,A,T72,A)") &
398 "RI_INFO| RI metric: ",
"LONGRANGE"
399 WRITE (unit_nr,
'(T3,A,T61,F20.10)') &
400 "RI_INFO| Omega: ", ri_metric%omega
402 WRITE (unit_nr, fmt=
"(T3,A,T74,A)") &
403 "RI_INFO| RI metric: ",
"OVERLAP"
405 WRITE (unit_nr, fmt=
"(T3,A,T64,A)") &
406 "RI_INFO| RI metric: ",
"TRUNCATED COULOMB"
408 WRITE (unit_nr,
'(T3,A,T61,F20.2)') &
409 "RI_INFO| Cutoff Radius [angstrom]: ", rc_ang
414 IF (calc_forces .AND. .NOT. do_im_time)
THEN
417 itmp =
get_limit(dimen_ri, para_env_sub%num_pe, para_env_sub%mepos)
418 lll = itmp(2) - itmp(1) + 1
419 ALLOCATE (qs_env%mp2_env%ri_grad%PQ_half(lll, my_group_l_size))
420 qs_env%mp2_env%ri_grad%PQ_half(:, :) = my_lrows(itmp(1):itmp(2), 1:my_group_l_size)
422 ALLOCATE (qs_env%mp2_env%ri_grad%operator_half(lll, my_group_l_size))
423 qs_env%mp2_env%ri_grad%operator_half(:, :) = my_vrows(itmp(1):itmp(2), 1:my_group_l_size)
424 DEALLOCATE (my_vrows)
428 IF (unit_nr > 0)
THEN
429 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
430 "RI_INFO| Number of auxiliary basis functions:", dimen_ri, &
431 "GENERAL_INFO| Number of basis functions:", nmo, &
432 "GENERAL_INFO| Number of occupied orbitals:", homo(1), &
433 "GENERAL_INFO| Number of virtual orbitals:", virtual(1)
435 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
436 "RI_INFO| Reduced auxiliary basis set size:", dimen_ri_red
439 mem_for_iak = dimen_ri*real(sum(homo*virtual), kind=
dp)*8.0_dp/(1024_dp**2)
440 mem_for_ijk = dimen_ri*real(sum(homo(1:nspins)**2), kind=
dp)*8.0_dp/(1024_dp**2)
441 mem_for_abk = dimen_ri*real(sum(bse_lev_virt(1:nspins)**2), kind=
dp)*8.0_dp/(1024_dp**2)
443 IF (.NOT. do_im_time)
THEN
444 WRITE (unit_nr,
'(T3,A,T66,F11.2,A4)')
'RI_INFO| Total memory for (ia|K) integrals:', &
446 IF (my_do_gw .AND. .NOT. do_im_time)
THEN
447 mem_for_iak = dimen_ri*real(nmo, kind=
dp)*gw_corr_lev_total*8.0_dp/(1024_dp**2)
449 WRITE (unit_nr,
'(T3,A,T66,F11.2,A4)')
'RI_INFO| Total memory for G0W0-(nm|K) integrals:', &
454 WRITE (unit_nr,
'(T3,A,T66,F11.2,A4)')
'RI_INFO| Total memory for (ij|K) integrals:', &
456 WRITE (unit_nr,
'(T3,A,T66,F11.2,A4)')
'RI_INFO| Total memory for (ab|K) integrals:', &
465 IF (.NOT. do_im_time)
THEN
467 ALLOCATE (gd_b_virtual(nspins), intermed_mat(nspins))
468 ALLOCATE (my_b_virtual_start(nspins), my_b_virtual_end(nspins), my_b_size(nspins))
471 CALL create_intermediate_matrices(intermed_mat(ispin), mo_coeff_o(ispin)%matrix, virtual(ispin), homo(ispin), &
472 trim(adjustl(
cp_to_string(ispin))), blacs_env_sub, para_env_sub)
475 CALL get_group_dist(gd_b_virtual(ispin), para_env_sub%mepos, my_b_virtual_start(ispin), my_b_virtual_end(ispin), &
483 ALLOCATE (intermed_mat_gw(nspins))
485 CALL create_intermediate_matrices(intermed_mat_gw(ispin), mo_coeff_gw(ispin)%matrix, &
486 nmo, gw_corr_lev_total, &
488 blacs_env_sub, para_env_sub)
493 CALL get_group_dist(gd_b_all, para_env_sub%mepos, my_b_all_start, my_b_all_end, my_b_all_size)
498 ALLOCATE (intermed_mat_bse_ab(nspins), intermed_mat_bse_ij(nspins), gd_b_occ_bse(nspins), gd_b_virt_bse(nspins))
499 ALLOCATE (my_b_occ_bse_start(nspins), my_b_occ_bse_end(nspins), my_b_occ_bse_size(nspins))
500 ALLOCATE (my_b_virt_bse_start(nspins), my_b_virt_bse_end(nspins), my_b_virt_bse_size(nspins))
502 CALL create_group_dist(gd_b_virt_bse(ispin), para_env_sub%num_pe, bse_lev_virt(ispin))
503 CALL get_group_dist(gd_b_virt_bse(ispin), para_env_sub%mepos, my_b_virt_bse_start(ispin), &
504 my_b_virt_bse_end(ispin), my_b_virt_bse_size(ispin))
506 CALL create_intermediate_matrices(intermed_mat_bse_ab(ispin), mo_coeff_v_bse(ispin)%matrix, &
507 bse_lev_virt(ispin), bse_lev_virt(ispin), &
508 "bse_ab_"//trim(adjustl(
cp_to_string(ispin))), blacs_env_sub, para_env_sub)
513 CALL create_intermediate_matrices(intermed_mat_bse_ij(ispin), mo_coeff_o_bse(ispin)%matrix, &
514 homo(ispin), homo(ispin), &
515 "bse_ij_"//trim(adjustl(
cp_to_string(ispin))), blacs_env_sub, para_env_sub)
518 CALL get_group_dist(gd_b_occ_bse(ispin), para_env_sub%mepos, my_b_occ_bse_start(ispin), &
519 my_b_occ_bse_end(ispin), my_b_occ_bse_size(ispin))
526 ALLOCATE (bib_c(nspins))
528 ALLOCATE (bib_c(ispin)%array(my_group_l_size, my_b_size(ispin), homo(ispin)))
529 bib_c(ispin)%array = 0.0_dp
535 ALLOCATE (bib_c_gw(nspins))
537 ALLOCATE (bib_c_gw(ispin)%array(my_group_l_size, my_b_all_size, gw_corr_lev_total))
538 bib_c_gw(ispin)%array = 0.0_dp
545 ALLOCATE (bib_c_bse_ij(nspins), bib_c_bse_ab(nspins))
547 ALLOCATE (bib_c_bse_ij(ispin)%array(my_group_l_size, my_b_occ_bse_size(ispin), homo(ispin)))
548 bib_c_bse_ij(ispin)%array = 0.0_dp
550 ALLOCATE (bib_c_bse_ab(ispin)%array(my_group_l_size, my_b_virt_bse_size(ispin), bse_lev_virt(ispin)))
551 bib_c_bse_ab(ispin)%array = 0.0_dp
556 CALL timeset(routinen//
"_loop", handle2)
564 IF (qs_env%mp2_env%ri_aux_auto_generated)
THEN
565 CALL cp_warn(__location__, &
566 "At least one RI_AUX basis set was not explicitly invoked in &KIND-section. "// &
567 "Automatically RI-basis sets and ERI_METHOD OS tend to be not converged. "// &
568 "Consider specifying BASIS_SET RI_AUX explicitly with a sufficiently large basis.")
571 NULLIFY (mat_munu_local_l)
572 ALLOCATE (mat_munu_local_l(my_group_l_size))
573 DO lll = 1, my_group_l_size
574 NULLIFY (mat_munu_local_l(lll)%matrix)
575 ALLOCATE (mat_munu_local_l(lll)%matrix)
576 CALL dbcsr_copy(mat_munu_local_l(lll)%matrix, mat_munu%matrix)
577 CALL dbcsr_set(mat_munu_local_l(lll)%matrix, 0.0_dp)
580 first_c=my_group_l_start, last_c=my_group_l_end, &
581 mat_ab=mat_munu_local_l, &
582 basis_type_a=
"ORB", basis_type_b=
"ORB", &
583 basis_type_c=
"RI_AUX", &
584 sab_nl=sab_orb_sub, eri_method=eri_method)
587 DO lll = 1, my_group_l_size
588 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat(ispin), &
589 bib_c(ispin)%array(lll, :, :), &
590 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, &
592 my_b_virtual_end(ispin), my_b_virtual_start(ispin))
594 CALL contract_b_l(bib_c(ispin)%array, my_lrows, gd_b_virtual(ispin)%sizes, &
595 gd_array%sizes, qs_env%mp2_env%eri_blksize, &
596 ngroup, color_sub, para_env, para_env_sub)
602 DO lll = 1, my_group_l_size
603 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_gw(ispin), &
604 bib_c_gw(ispin)%array(lll, :, :), &
605 mo_coeff_gw(ispin)%matrix, mo_coeff_all(ispin)%matrix, eps_filter, &
606 my_b_all_end, my_b_all_start)
608 CALL contract_b_l(bib_c_gw(ispin)%array, my_lrows, gd_b_all%sizes, gd_array%sizes, qs_env%mp2_env%eri_blksize, &
609 ngroup, color_sub, para_env, para_env_sub)
617 DO lll = 1, my_group_l_size
618 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_bse_ab(ispin), &
619 bib_c_bse_ab(ispin)%array(lll, :, :), &
620 mo_coeff_v_bse(ispin)%matrix, mo_coeff_v_bse(ispin)%matrix, eps_filter, &
621 my_b_all_end, my_b_all_start)
623 CALL contract_b_l(bib_c_bse_ab(ispin)%array, my_lrows, gd_b_virt_bse(ispin)%sizes, gd_array%sizes, &
624 qs_env%mp2_env%eri_blksize, ngroup, color_sub, para_env, para_env_sub)
627 DO lll = 1, my_group_l_size
628 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu_local_l(lll), intermed_mat_bse_ij(ispin), &
629 bib_c_bse_ij(ispin)%array(lll, :, :), &
630 mo_coeff_o(ispin)%matrix, mo_coeff_o(ispin)%matrix, eps_filter, &
631 my_b_occ_bse_end(ispin), my_b_occ_bse_start(ispin))
633 CALL contract_b_l(bib_c_bse_ij(ispin)%array, my_lrows, gd_b_occ_bse(ispin)%sizes, gd_array%sizes, &
634 qs_env%mp2_env%eri_blksize, ngroup, color_sub, para_env, para_env_sub)
639 DO lll = 1, my_group_l_size
642 DEALLOCATE (mat_munu_local_l)
644 ELSE IF (do_gpw)
THEN
646 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
647 auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
649 DO i_counter = 1, my_group_l_size
652 particle_set, pw_env_sub, my_lrows(:, i_counter), poisson_env, rho_r, pot_g, &
653 ri_metric, mat_munu, qs_env, task_list_sub)
656 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu, intermed_mat(ispin), &
657 bib_c(ispin)%array(i_counter, :, :), &
658 mo_coeff_o(ispin)%matrix, mo_coeff_v(ispin)%matrix, eps_filter, &
659 my_b_virtual_end(ispin), my_b_virtual_start(ispin))
666 CALL ao_to_mo_and_store_b(para_env_sub, mat_munu, intermed_mat_gw(ispin), &
667 bib_c_gw(ispin)%array(i_counter, :, :), &
668 mo_coeff_gw(ispin)%matrix, mo_coeff_all(ispin)%matrix, eps_filter, &
669 my_b_all_end, my_b_all_start)
676 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
677 task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
679 cpabort(
"Integration method not implemented!")
682 CALL timestop(handle2)
684 DEALLOCATE (my_lrows)
687 CALL release_intermediate_matrices(intermed_mat(ispin))
689 DEALLOCATE (intermed_mat)
693 CALL release_intermediate_matrices(intermed_mat_gw(ispin))
695 DEALLOCATE (intermed_mat_gw)
700 CALL release_intermediate_matrices(intermed_mat_bse_ab(ispin))
701 CALL release_intermediate_matrices(intermed_mat_bse_ij(ispin))
703 DEALLOCATE (intermed_mat_bse_ab, intermed_mat_bse_ij)
709 memory_info = qs_env%mp2_env%ri_rpa_im_time%memory_info
717 CALL get_qs_env(qs_env, natom=natom, nkind=nkind, dft_control=dft_control)
720 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c_overl)
723 ALLOCATE (sizes_ri(natom), sizes_ao(natom))
724 ALLOCATE (basis_set_ri_aux(nkind), basis_set_ao(nkind))
726 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ri, basis=basis_set_ri_aux)
728 CALL get_particle_set(particle_set, qs_kind_set, nsgf=sizes_ao, basis=basis_set_ao)
737 eps_pgf_orb = sqrt(eps_pgf_orb)
739 eps_pgf_orb_old = dft_control%qs_control%eps_pgf_orb
741 DO ibasis = 1,
SIZE(basis_set_ao)
742 orb_basis => basis_set_ao(ibasis)%gto_basis_set
744 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
748 cut_memory_int = qs_env%mp2_env%ri_rpa_im_time%cut_memory
750 starts_array_mc_block_int, ends_array_mc_block_int)
752 DEALLOCATE (starts_array_mc_int, ends_array_mc_int)
754 CALL create_3c_tensor(t_3c_overl_int_template, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_overl, &
755 sizes_ri, sizes_ao, sizes_ao, map1=[1, 2], map2=[3], &
756 name=
"O (RI AO | AO)")
758 CALL get_qs_env(qs_env, nkind=nkind, particle_set=particle_set)
759 CALL dbt_mp_environ_pgrid(pgrid_t3c_overl, pdims, pcoord)
760 CALL mp_comm_t3c_2%create(pgrid_t3c_overl%mp_comm_2d, 3, pdims)
762 nkind, particle_set, mp_comm_t3c_2, own_comm=.true.)
763 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
766 dist_3d, ri_metric,
"RPA_3c_nl", qs_env, &
767 sym_jk=.NOT. do_kpoints_cubic_rpa, own_dist=.true.)
770 IF (do_kpoints_cubic_rpa)
THEN
774 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
775 "3C_OVERLAP_INTEGRALS_INFO| Number of periodic images considered:", dft_control%nimages
777 nimg = dft_control%nimages
782 ALLOCATE (t_3c_overl_int(nimg, nimg))
784 DO i = 1,
SIZE(t_3c_overl_int, 1)
785 DO j = 1,
SIZE(t_3c_overl_int, 2)
786 CALL dbt_create(t_3c_overl_int_template, t_3c_overl_int(i, j))
790 CALL dbt_destroy(t_3c_overl_int_template)
793 min_bsize = qs_env%mp2_env%ri_rpa_im_time%min_bsize
795 CALL pgf_block_sizes(atomic_kind_set, basis_set_ao, min_bsize, sizes_ao_split)
796 CALL pgf_block_sizes(atomic_kind_set, basis_set_ri_aux, min_bsize, sizes_ri_split)
799 CALL dbt_pgrid_create(para_env, pdims_t3c, pgrid_t3c_m)
801 associate(cut_memory => qs_env%mp2_env%ri_rpa_im_time%cut_memory)
803 starts_array_mc_block, ends_array_mc_block)
805 qs_env%mp2_env%ri_rpa_im_time%starts_array_mc_RI, &
806 qs_env%mp2_env%ri_rpa_im_time%ends_array_mc_RI, &
807 qs_env%mp2_env%ri_rpa_im_time%starts_array_mc_block_RI, &
808 qs_env%mp2_env%ri_rpa_im_time%ends_array_mc_block_RI)
811 cut_memory = qs_env%mp2_env%ri_rpa_im_time%cut_memory
813 CALL create_3c_tensor(t_3c_m, dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_m, &
814 sizes_ri_split, sizes_ao_split, sizes_ao_split, &
815 map1=[1], map2=[2, 3], &
816 name=
"M (RI | AO AO)")
817 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
818 CALL dbt_pgrid_destroy(pgrid_t3c_m)
820 ALLOCATE (t_3c_o(
SIZE(t_3c_overl_int, 1),
SIZE(t_3c_overl_int, 2)))
821 ALLOCATE (t_3c_o_compressed(
SIZE(t_3c_overl_int, 1),
SIZE(t_3c_overl_int, 2), cut_memory))
822 ALLOCATE (t_3c_o_ind(
SIZE(t_3c_overl_int, 1),
SIZE(t_3c_overl_int, 2), cut_memory))
823 CALL create_3c_tensor(t_3c_o(1, 1), dist_ri, dist_ao_1, dist_ao_2, pgrid_t3c_overl, &
824 sizes_ri_split, sizes_ao_split, sizes_ao_split, &
825 map1=[1, 2], map2=[3], &
826 name=
"O (RI AO | AO)")
827 DEALLOCATE (dist_ri, dist_ao_1, dist_ao_2)
828 CALL dbt_pgrid_destroy(pgrid_t3c_overl)
830 DO i = 1,
SIZE(t_3c_o, 1)
831 DO j = 1,
SIZE(t_3c_o, 2)
832 IF (i > 1 .OR. j > 1)
CALL dbt_create(t_3c_o(1, 1), t_3c_o(i, j))
840 DO cm = 1, cut_memory_int
841 CALL build_3c_integrals(t_3c_overl_int, &
842 qs_env%mp2_env%ri_rpa_im_time%eps_filter/2, &
845 int_eps=qs_env%mp2_env%ri_rpa_im_time%eps_filter/2, &
846 basis_i=basis_set_ri_aux, &
847 basis_j=basis_set_ao, basis_k=basis_set_ao, &
848 potential_parameter=ri_metric, &
849 do_kpoints=do_kpoints_cubic_rpa, &
850 bounds_i=[starts_array_mc_block_int(cm), ends_array_mc_block_int(cm)], desymmetrize=.false.)
851 CALL timeset(routinen//
"_copy_3c", handle4)
853 DO i = 1,
SIZE(t_3c_overl_int, 1)
854 DO j = 1,
SIZE(t_3c_overl_int, 2)
856 CALL dbt_copy(t_3c_overl_int(i, j), t_3c_o(i, j), order=[1, 3, 2], &
857 summation=.true., move_data=.true.)
858 CALL dbt_clear(t_3c_overl_int(i, j))
859 CALL dbt_filter(t_3c_o(i, j), qs_env%mp2_env%ri_rpa_im_time%eps_filter/2)
861 IF (do_kpoints_cubic_rpa .AND. cm == cut_memory_int)
THEN
862 CALL dbt_scale(t_3c_o(i, j), 0.5_dp)
866 CALL timestop(handle4)
869 DO i = 1,
SIZE(t_3c_overl_int, 1)
870 DO j = 1,
SIZE(t_3c_overl_int, 2)
871 CALL dbt_destroy(t_3c_overl_int(i, j))
874 DEALLOCATE (t_3c_overl_int)
876 CALL timeset(routinen//
"_copy_3c", handle4)
878 CALL dbt_create(t_3c_o(1, 1), t_3c_tmp)
881 CALL dbt_copy(t_3c_o(jcell, kcell), t_3c_tmp)
882 CALL dbt_copy(t_3c_tmp, t_3c_o(kcell, jcell), order=[1, 3, 2], summation=.true., move_data=.true.)
883 CALL dbt_filter(t_3c_o(kcell, jcell), qs_env%mp2_env%ri_rpa_im_time%eps_filter)
887 DO kcell = jcell + 1, nimg
888 CALL dbt_copy(t_3c_o(jcell, kcell), t_3c_tmp)
889 CALL dbt_copy(t_3c_tmp, t_3c_o(kcell, jcell), order=[1, 3, 2], summation=.false., move_data=.true.)
890 CALL dbt_filter(t_3c_o(kcell, jcell), qs_env%mp2_env%ri_rpa_im_time%eps_filter)
894 CALL dbt_get_info(t_3c_o(1, 1), nfull_total=bounds_3c)
895 CALL get_tensor_occupancy(t_3c_o(1, 1), nze, occ)
898 bounds(:, 1) = [1, bounds_3c(1)]
899 bounds(:, 3) = [1, bounds_3c(3)]
900 DO i = 1,
SIZE(t_3c_o, 1)
901 DO j = 1,
SIZE(t_3c_o, 2)
902 DO i_mem = 1, cut_memory
903 bounds(:, 2) = [starts_array_mc(i_mem), ends_array_mc(i_mem)]
904 CALL dbt_copy(t_3c_o(i, j), t_3c_tmp, bounds=bounds)
906 CALL alloc_containers(t_3c_o_compressed(i, j, i_mem), 1)
907 CALL compress_tensor(t_3c_tmp, t_3c_o_ind(i, j, i_mem)%ind, &
908 t_3c_o_compressed(i, j, i_mem), &
909 qs_env%mp2_env%ri_rpa_im_time%eps_compress, memory_3c)
911 CALL dbt_clear(t_3c_o(i, j))
915 CALL para_env%sum(memory_3c)
917 compression_factor = real(nze, dp)*1.0e-06_dp*8.0_dp/memory_3c
919 IF (unit_nr > 0)
THEN
920 WRITE (unit=unit_nr, fmt=
"((T3,A,T66,F11.2,A4))") &
921 "MEMORY_INFO| Memory for 3-center integrals (compressed):", memory_3c,
' MiB'
923 WRITE (unit=unit_nr, fmt=
"((T3,A,T60,F21.2))") &
924 "MEMORY_INFO| Compression factor: ", compression_factor
927 CALL dbt_destroy(t_3c_tmp)
929 CALL timestop(handle4)
931 DO ibasis = 1,
SIZE(basis_set_ao)
932 orb_basis => basis_set_ao(ibasis)%gto_basis_set
933 CALL init_interaction_radii_orb_basis(orb_basis, eps_pgf_orb_old)
934 ri_basis => basis_set_ri_aux(ibasis)%gto_basis_set
935 CALL init_interaction_radii_orb_basis(ri_basis, eps_pgf_orb_old)
938 DEALLOCATE (basis_set_ri_aux, basis_set_ao)
940 CALL neighbor_list_3c_destroy(nl_3c)
944 CALL timestop(handle)
960 SUBROUTINE contract_b_l(BIb_C, my_Lrows, sizes_B, sizes_L, blk_size, ngroup, igroup, mp_comm, para_env_sub)
961 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: bib_c
962 REAL(kind=dp),
DIMENSION(:, :),
INTENT(IN) :: my_lrows
963 INTEGER,
DIMENSION(:),
INTENT(IN) :: sizes_b, sizes_l
964 INTEGER,
DIMENSION(2),
INTENT(IN) :: blk_size
965 INTEGER,
INTENT(IN) :: ngroup, igroup
967 CLASS(mp_comm_type),
INTENT(IN) :: mp_comm
968 TYPE(mp_para_env_type),
INTENT(IN) :: para_env_sub
970 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_B_L'
971 LOGICAL,
PARAMETER :: debug = .false.
973 INTEGER :: check_proc, handle, i, iend, ii, ioff, &
974 istart, loc_a, loc_p, nblk_per_thread
975 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: block_ind_l_p, block_ind_l_r
976 INTEGER,
DIMENSION(1) :: dist_b_i, map_b_1, map_l_1, map_l_2, &
978 INTEGER,
DIMENSION(2) :: map_b_2, pdims_l
979 INTEGER,
DIMENSION(3) :: pdims_b
981 INTEGER,
DIMENSION(ngroup) :: dist_l_p, dist_l_r
982 INTEGER,
DIMENSION(para_env_sub%num_pe) :: dist_b_a
983 TYPE(dbt_distribution_type) :: dist_b, dist_l
984 TYPE(dbt_pgrid_type) :: mp_comm_b, mp_comm_l
985 TYPE(dbt_type) :: tb_in, tb_in_split, tb_out, &
986 tb_out_split, tl, tl_split
988 CALL timeset(routinen, handle)
990 sizes_i(1) =
SIZE(bib_c, 3)
992 associate(nproc => para_env_sub%num_pe, iproc => para_env_sub%mepos, iproc_glob => mp_comm%mepos)
995 loc_p = igroup + 1; loc_a = iproc + 1
997 cpassert(
SIZE(sizes_l) == ngroup)
998 cpassert(
SIZE(sizes_b) == nproc)
999 cpassert(sizes_l(loc_p) ==
SIZE(bib_c, 1))
1000 cpassert(sizes_l(loc_p) ==
SIZE(my_lrows, 2))
1001 cpassert(sizes_b(loc_a) ==
SIZE(bib_c, 2))
1021 pdims_b = [ngroup, nproc, 1]
1022 pdims_l = [nproc, ngroup]
1024 CALL dbt_pgrid_create(mp_comm, pdims_b, mp_comm_b)
1025 CALL dbt_pgrid_create(mp_comm, pdims_l, mp_comm_l)
1029 dist_b_a = [(i, i=0, nproc - 1)]
1030 dist_l_r = [(
modulo(i, nproc), i=0, ngroup - 1)]
1031 dist_l_p = [(i, i=0, ngroup - 1)]
1034 CALL dbt_distribution_new(dist_b, mp_comm_b, dist_l_p, dist_b_a, dist_b_i)
1035 CALL dbt_distribution_new(dist_l, mp_comm_l, dist_l_r, dist_l_p)
1037 CALL dbt_create(tb_in,
"(R|ai)", dist_b, map_b_1, map_b_2, sizes_l, sizes_b, sizes_i)
1038 CALL dbt_create(tb_out,
"(P|ai)", dist_b, map_b_1, map_b_2, sizes_l, sizes_b, sizes_i)
1039 CALL dbt_create(tl,
"(R|P)", dist_l, map_l_1, map_l_2, sizes_l, sizes_l)
1043 CALL dbt_get_stored_coordinates(tb_in, [loc_p, loc_a, 1], check_proc)
1044 cpassert(check_proc == iproc_glob)
1049 CALL dbt_reserve_blocks(tb_in, [loc_p], [loc_a], [1])
1056 ALLOCATE (block_ind_l_r(ngroup/nproc + 1))
1057 ALLOCATE (block_ind_l_p(ngroup/nproc + 1))
1058 block_ind_l_r(:) = 0; block_ind_l_p(:) = 0
1061 CALL dbt_get_stored_coordinates(tl, [i, loc_p], check_proc)
1062 IF (check_proc == iproc_glob)
THEN
1064 block_ind_l_r(ii) = i
1065 block_ind_l_p(ii) = loc_p
1072 nblk_per_thread = ii/omp_get_num_threads() + 1
1073 istart = omp_get_thread_num()*nblk_per_thread + 1
1074 iend = min(istart + nblk_per_thread, ii)
1075 CALL dbt_reserve_blocks(tl, block_ind_l_r(istart:iend), block_ind_l_p(istart:iend))
1079 CALL dbt_put_block(tb_in, [loc_p, loc_a, 1], shape(bib_c), bib_c)
1084 istart = ioff + 1; iend = ioff + sizes_l(i)
1085 ioff = ioff + sizes_l(i)
1086 CALL dbt_get_stored_coordinates(tl, [i, loc_p], check_proc)
1087 IF (check_proc == iproc_glob)
THEN
1088 CALL dbt_put_block(tl, [i, loc_p], [sizes_l(i), sizes_l(loc_p)], my_lrows(istart:iend, :))
1093 CALL dbt_split_blocks(tb_in, tb_in_split, [blk_size(2), blk_size(1), blk_size(1)])
1094 CALL dbt_split_blocks(tl, tl_split, [blk_size(2), blk_size(2)])
1095 CALL dbt_split_blocks(tb_out, tb_out_split, [blk_size(2), blk_size(1), blk_size(1)])
1098 CALL dbt_contract(alpha=1.0_dp, tensor_1=tb_in_split, tensor_2=tl_split, &
1099 beta=0.0_dp, tensor_3=tb_out_split, &
1100 contract_1=[1], notcontract_1=[2, 3], &
1101 contract_2=[1], notcontract_2=[2], &
1102 map_1=[2, 3], map_2=[1], optimize_dist=.true.)
1105 CALL dbt_copy(tb_out_split, tb_out)
1107 CALL dbt_get_block(tb_out, [loc_p, loc_a, 1], shape(bib_c), bib_c, found)
1111 CALL dbt_destroy(tb_in)
1112 CALL dbt_destroy(tb_in_split)
1113 CALL dbt_destroy(tb_out)
1114 CALL dbt_destroy(tb_out_split)
1115 CALL dbt_destroy(tl)
1116 CALL dbt_destroy(tl_split)
1118 CALL dbt_distribution_destroy(dist_b)
1119 CALL dbt_distribution_destroy(dist_l)
1121 CALL dbt_pgrid_destroy(mp_comm_b)
1122 CALL dbt_pgrid_destroy(mp_comm_l)
1124 CALL timestop(handle)
1126 END SUBROUTINE contract_b_l
1141 SUBROUTINE create_intermediate_matrices(intermed_mat, mo_coeff_templ, size_1, size_2, &
1142 matrix_name_2, blacs_env_sub, para_env_sub)
1144 TYPE(intermediate_matrix_type),
INTENT(OUT) :: intermed_mat
1145 TYPE(dbcsr_type),
INTENT(INOUT) :: mo_coeff_templ
1146 INTEGER,
INTENT(IN) :: size_1, size_2
1147 CHARACTER(LEN=*),
INTENT(IN) :: matrix_name_2
1148 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_sub
1149 TYPE(mp_para_env_type),
POINTER :: para_env_sub
1151 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_intermediate_matrices'
1153 INTEGER :: handle, ncol_local, nfullcols_total, &
1154 nfullrows_total, nrow_local
1155 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1156 TYPE(cp_fm_struct_type),
POINTER :: fm_struct
1158 CALL timeset(routinen, handle)
1161 CALL dbcsr_create(intermed_mat%matrix_ia_jnu, template=mo_coeff_templ)
1164 CALL cp_dbcsr_m_by_n_from_template(intermed_mat%matrix_ia_jb, template=mo_coeff_templ, m=size_2, n=size_1, &
1165 sym=dbcsr_type_no_symmetry)
1168 CALL dbcsr_set(intermed_mat%matrix_ia_jnu, 0.0_dp)
1169 CALL dbcsr_set(intermed_mat%matrix_ia_jb, 0.0_dp)
1173 CALL dbcsr_get_info(intermed_mat%matrix_ia_jb, nfullrows_total=nfullrows_total, nfullcols_total=nfullcols_total)
1174 CALL cp_fm_struct_create(fm_struct, context=blacs_env_sub, nrow_global=nfullrows_total, &
1175 ncol_global=nfullcols_total, para_env=para_env_sub)
1176 CALL cp_fm_create(intermed_mat%fm_BIb_jb, fm_struct, name=
"fm_BIb_jb_"//matrix_name_2)
1178 CALL copy_dbcsr_to_fm(intermed_mat%matrix_ia_jb, intermed_mat%fm_BIb_jb)
1179 CALL cp_fm_struct_release(fm_struct)
1181 CALL cp_fm_get_info(matrix=intermed_mat%fm_BIb_jb, &
1182 nrow_local=nrow_local, &
1183 ncol_local=ncol_local, &
1184 row_indices=row_indices, &
1185 col_indices=col_indices)
1187 intermed_mat%max_row_col_local = max(nrow_local, ncol_local)
1188 CALL para_env_sub%max(intermed_mat%max_row_col_local)
1190 ALLOCATE (intermed_mat%local_col_row_info(0:intermed_mat%max_row_col_local, 2))
1191 intermed_mat%local_col_row_info = 0
1193 intermed_mat%local_col_row_info(0, 1) = nrow_local
1194 intermed_mat%local_col_row_info(1:nrow_local, 1) = row_indices(1:nrow_local)
1196 intermed_mat%local_col_row_info(0, 2) = ncol_local
1197 intermed_mat%local_col_row_info(1:ncol_local, 2) = col_indices(1:ncol_local)
1199 intermed_mat%descr = matrix_name_2
1201 CALL timestop(handle)
1203 END SUBROUTINE create_intermediate_matrices
1217 SUBROUTINE ao_to_mo_and_store_b(para_env, mat_munu, intermed_mat, BIb_jb, &
1218 mo_coeff_o, mo_coeff_v, eps_filter, &
1219 my_B_end, my_B_start)
1220 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1221 TYPE(dbcsr_p_type),
INTENT(IN) :: mat_munu
1222 TYPE(intermediate_matrix_type),
INTENT(INOUT) :: intermed_mat
1223 REAL(kind=dp),
DIMENSION(:, :),
INTENT(OUT) :: bib_jb
1224 TYPE(dbcsr_type),
POINTER :: mo_coeff_o, mo_coeff_v
1225 REAL(kind=dp),
INTENT(IN) :: eps_filter
1226 INTEGER,
INTENT(IN) :: my_b_end, my_b_start
1228 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ao_to_mo_and_store_B'
1232 CALL timeset(routinen//
"_mult_"//trim(intermed_mat%descr), handle)
1234 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mat_munu%matrix, mo_coeff_o, &
1235 0.0_dp, intermed_mat%matrix_ia_jnu, filter_eps=eps_filter)
1236 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, intermed_mat%matrix_ia_jnu, mo_coeff_v, &
1237 0.0_dp, intermed_mat%matrix_ia_jb, filter_eps=eps_filter)
1238 CALL timestop(handle)
1240 CALL timeset(routinen//
"_E_Ex_"//trim(intermed_mat%descr), handle)
1241 CALL copy_dbcsr_to_fm(intermed_mat%matrix_ia_jb, intermed_mat%fm_BIb_jb)
1243 CALL grep_my_integrals(para_env, intermed_mat%fm_BIb_jb, bib_jb, intermed_mat%max_row_col_local, &
1244 intermed_mat%local_col_row_info, &
1245 my_b_end, my_b_start)
1247 CALL timestop(handle)
1248 END SUBROUTINE ao_to_mo_and_store_b
1254 SUBROUTINE release_intermediate_matrices(intermed_mat)
1255 TYPE(intermediate_matrix_type),
INTENT(INOUT) :: intermed_mat
1257 CALL dbcsr_release(intermed_mat%matrix_ia_jnu)
1258 CALL dbcsr_release(intermed_mat%matrix_ia_jb)
1259 CALL cp_fm_release(intermed_mat%fm_BIb_jb)
1260 DEALLOCATE (intermed_mat%local_col_row_info)
1262 END SUBROUTINE release_intermediate_matrices
1272 TYPE(qs_environment_type),
POINTER :: qs_env
1273 TYPE(kpoint_type),
POINTER :: kpoints
1276 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_kpoints'
1278 INTEGER :: handle, i, i_dim, ix, iy, iz, nkp, &
1280 INTEGER,
DIMENSION(3) :: nkp_grid, nkp_grid_extra, periodic
1281 LOGICAL :: do_extrapolate_kpoints
1282 TYPE(cell_type),
POINTER :: cell
1283 TYPE(dft_control_type),
POINTER :: dft_control
1284 TYPE(mp_para_env_type),
POINTER :: para_env
1285 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1288 CALL timeset(routinen, handle)
1290 NULLIFY (cell, dft_control, para_env)
1291 CALL get_qs_env(qs_env=qs_env, cell=cell, para_env=para_env, dft_control=dft_control, sab_orb=sab_orb)
1292 CALL get_cell(cell=cell, periodic=periodic)
1295 kpoints%kp_scheme =
"GENERAL"
1296 kpoints%symmetry = .false.
1297 kpoints%verbose = .false.
1298 kpoints%full_grid = .true.
1299 kpoints%use_real_wfn = .false.
1300 kpoints%eps_geo = 1.e-6_dp
1301 nkp_grid(1:3) = qs_env%mp2_env%ri_rpa_im_time%kp_grid(1:3)
1302 do_extrapolate_kpoints = qs_env%mp2_env%ri_rpa_im_time%do_extrapolate_kpoints
1305 IF (periodic(i_dim) == 1)
THEN
1306 cpassert(
modulo(nkp_grid(i_dim), 2) == 0)
1308 IF (periodic(i_dim) == 0)
THEN
1309 cpassert(nkp_grid(i_dim) == 1)
1313 nkp_orig = nkp_grid(1)*nkp_grid(2)*nkp_grid(3)/2
1315 IF (do_extrapolate_kpoints)
THEN
1317 cpassert(qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method == kp_weights_w_uniform)
1320 IF (periodic(i_dim) == 1) nkp_grid_extra(i_dim) = nkp_grid(i_dim) + 2
1321 IF (periodic(i_dim) == 0) nkp_grid_extra(i_dim) = 1
1324 qs_env%mp2_env%ri_rpa_im_time%kp_grid_extra(1:3) = nkp_grid_extra(1:3)
1326 nkp_extra = nkp_grid_extra(1)*nkp_grid_extra(2)*nkp_grid_extra(3)/2
1330 nkp_grid_extra(1:3) = 0
1335 nkp = nkp_orig + nkp_extra
1337 qs_env%mp2_env%ri_rpa_im_time%nkp_orig = nkp_orig
1338 qs_env%mp2_env%ri_rpa_im_time%nkp_extra = nkp_extra
1340 ALLOCATE (kpoints%xkp(3, nkp), kpoints%wkp(nkp))
1342 kpoints%nkp_grid(1:3) = nkp_grid(1:3)
1345 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%wkp_V(nkp))
1346 IF (do_extrapolate_kpoints)
THEN
1347 kpoints%wkp(1:nkp_orig) = 1.0_dp/real(nkp_orig, kind=dp) &
1348 /(1.0_dp - sqrt(real(nkp_extra, kind=dp)/real(nkp_orig, kind=dp)))
1349 kpoints%wkp(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=dp) &
1350 /(1.0_dp - sqrt(real(nkp_orig, kind=dp)/real(nkp_extra, kind=dp)))
1351 qs_env%mp2_env%ri_rpa_im_time%wkp_V(1:nkp_orig) = 0.0_dp
1352 qs_env%mp2_env%ri_rpa_im_time%wkp_V(nkp_orig + 1:nkp) = 1.0_dp/real(nkp_extra, kind=dp)
1354 kpoints%wkp(:) = 1.0_dp/real(nkp, kind=dp)
1355 qs_env%mp2_env%ri_rpa_im_time%wkp_V(:) = kpoints%wkp(:)
1359 DO ix = 1, nkp_grid(1)
1360 DO iy = 1, nkp_grid(2)
1361 DO iz = 1, nkp_grid(3)
1363 IF (i == nkp_orig) cycle
1366 kpoints%xkp(1, i) = real(2*ix - nkp_grid(1) - 1, kind=dp)/(2._dp*real(nkp_grid(1), kind=dp))
1367 kpoints%xkp(2, i) = real(2*iy - nkp_grid(2) - 1, kind=dp)/(2._dp*real(nkp_grid(2), kind=dp))
1368 kpoints%xkp(3, i) = real(2*iz - nkp_grid(3) - 1, kind=dp)/(2._dp*real(nkp_grid(3), kind=dp))
1374 DO ix = 1, nkp_grid_extra(1)
1375 DO iy = 1, nkp_grid_extra(2)
1376 DO iz = 1, nkp_grid_extra(3)
1381 kpoints%xkp(1, i) = real(2*ix - nkp_grid_extra(1) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(1), kind=dp))
1382 kpoints%xkp(2, i) = real(2*iy - nkp_grid_extra(2) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(2), kind=dp))
1383 kpoints%xkp(3, i) = real(2*iz - nkp_grid_extra(3) - 1, kind=dp)/(2._dp*real(nkp_grid_extra(3), kind=dp))
1389 CALL kpoint_init_cell_index(kpoints, sab_orb, para_env, dft_control%nimages)
1391 CALL set_qs_env(qs_env, kpoints=kpoints)
1393 IF (unit_nr > 0)
THEN
1395 IF (do_extrapolate_kpoints)
THEN
1396 WRITE (unit=unit_nr, fmt=
"(T3,A,T69,3I4)")
"KPOINT_INFO| K-point mesh for V (leading to Sigma^x):", nkp_grid(1:3)
1397 WRITE (unit=unit_nr, fmt=
"(T3,A,T69)")
"KPOINT_INFO| K-point extrapolation for W^c is used (W^c leads to Sigma^c):"
1398 WRITE (unit=unit_nr, fmt=
"(T3,A,T69,3I4)")
"KPOINT_INFO| K-point mesh 1 for W^c:", nkp_grid(1:3)
1399 WRITE (unit=unit_nr, fmt=
"(T3,A,T69,3I4)")
"KPOINT_INFO| K-point mesh 2 for W^c:", nkp_grid_extra(1:3)
1401 WRITE (unit=unit_nr, fmt=
"(T3,A,T69,3I4)")
"KPOINT_INFO| K-point mesh for V and W:", nkp_grid(1:3)
1402 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,I6)")
"KPOINT_INFO| Number of kpoints for V and W:", nkp
1405 SELECT CASE (qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method)
1406 CASE (kp_weights_w_tailored)
1407 WRITE (unit=unit_nr, fmt=
"(T3,A,T81)") &
1408 "KPOINT_INFO| K-point weights for W: TAILORED"
1409 CASE (kp_weights_w_auto)
1410 WRITE (unit=unit_nr, fmt=
"(T3,A,T81)") &
1411 "KPOINT_INFO| K-point weights for W: AUTO"
1412 CASE (kp_weights_w_uniform)
1413 WRITE (unit=unit_nr, fmt=
"(T3,A,T81)") &
1414 "KPOINT_INFO| K-point weights for W: UNIFORM"
1419 CALL timestop(handle)
1433 SUBROUTINE grep_my_integrals(para_env_sub, fm_BIb_jb, BIb_jb, max_row_col_local, &
1434 local_col_row_info, &
1435 my_B_virtual_end, my_B_virtual_start)
1436 TYPE(mp_para_env_type),
INTENT(IN) :: para_env_sub
1437 TYPE(cp_fm_type),
INTENT(IN) :: fm_bib_jb
1438 REAL(kind=dp),
DIMENSION(:, :),
INTENT(OUT) :: bib_jb
1439 INTEGER,
INTENT(IN) :: max_row_col_local
1440 INTEGER,
ALLOCATABLE,
DIMENSION(:, :),
INTENT(IN) :: local_col_row_info
1441 INTEGER,
INTENT(IN) :: my_b_virtual_end, my_b_virtual_start
1443 INTEGER :: i_global, iib, j_global, jjb, ncol_rec, &
1444 nrow_rec, proc_receive, proc_send, &
1446 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: rec_col_row_info
1447 INTEGER,
DIMENSION(:),
POINTER :: col_indices_rec, row_indices_rec
1448 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: local_bi, rec_bi
1450 ALLOCATE (rec_col_row_info(0:max_row_col_local, 2))
1452 rec_col_row_info(:, :) = local_col_row_info
1454 nrow_rec = rec_col_row_info(0, 1)
1455 ncol_rec = rec_col_row_info(0, 2)
1457 ALLOCATE (row_indices_rec(nrow_rec))
1458 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1460 ALLOCATE (col_indices_rec(ncol_rec))
1461 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1464 DO jjb = 1, ncol_rec
1465 j_global = col_indices_rec(jjb)
1466 IF (j_global >= my_b_virtual_start .AND. j_global <= my_b_virtual_end)
THEN
1467 DO iib = 1, nrow_rec
1468 i_global = row_indices_rec(iib)
1469 bib_jb(j_global - my_b_virtual_start + 1, i_global) = fm_bib_jb%local_data(iib, jjb)
1474 DEALLOCATE (row_indices_rec)
1475 DEALLOCATE (col_indices_rec)
1477 IF (para_env_sub%num_pe > 1)
THEN
1478 ALLOCATE (local_bi(nrow_rec, ncol_rec))
1479 local_bi(1:nrow_rec, 1:ncol_rec) = fm_bib_jb%local_data(1:nrow_rec, 1:ncol_rec)
1481 DO proc_shift = 1, para_env_sub%num_pe - 1
1482 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
1483 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
1486 rec_col_row_info = 0
1487 CALL para_env_sub%sendrecv(local_col_row_info, proc_send, rec_col_row_info, proc_receive)
1488 nrow_rec = rec_col_row_info(0, 1)
1489 ncol_rec = rec_col_row_info(0, 2)
1491 ALLOCATE (row_indices_rec(nrow_rec))
1492 row_indices_rec = rec_col_row_info(1:nrow_rec, 1)
1494 ALLOCATE (col_indices_rec(ncol_rec))
1495 col_indices_rec = rec_col_row_info(1:ncol_rec, 2)
1497 ALLOCATE (rec_bi(nrow_rec, ncol_rec))
1501 CALL para_env_sub%sendrecv(local_bi, proc_send, rec_bi, proc_receive)
1504 DO jjb = 1, ncol_rec
1505 j_global = col_indices_rec(jjb)
1506 IF (j_global >= my_b_virtual_start .AND. j_global <= my_b_virtual_end)
THEN
1507 DO iib = 1, nrow_rec
1508 i_global = row_indices_rec(iib)
1509 bib_jb(j_global - my_b_virtual_start + 1, i_global) = rec_bi(iib, jjb)
1514 DEALLOCATE (col_indices_rec)
1515 DEALLOCATE (row_indices_rec)
1519 DEALLOCATE (local_bi)
1522 DEALLOCATE (rec_col_row_info)
1524 END SUBROUTINE grep_my_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.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
methods related to the blacs parallel environment
Represents a complex full matrix distributed on many processors.
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, plan, check_plan)
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
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 ...
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
This is the start of a dbt_api, all publically needed functions are exported here....
Types to describe group distributions.
Types and set/get functions for HFX.
subroutine, public alloc_containers(data, bin_size)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
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.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Interface to the message passing library MPI.
Routines to calculate 2c- and 3c-integrals for RI with GPW.
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.
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 ...
Routines to calculate and distribute 2c- and 3c- integrals for RI.
subroutine, public compute_kpoints(qs_env, kpoints, unit_nr)
...
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, cfm_matrix_l_kpoints, cfm_matrix_minv_l_kpoints, fm_matrix_minv_l_gamma, 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
Framework for 2c-integrals for RI.
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, cfm_matrix_l_kpoints, cfm_matrix_minv_l_kpoints, fm_matrix_minv_l_gamma, 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)
...
Types needed for MP2 calculations.
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.
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.
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.
All kind of helpful little routines.
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
keeps the information about the structure of 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.