77#include "./base/base_uses.f90"
83 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_ri_grad'
112 atomic_kind_set, qs_kind_set, mo_coeff, dimen_RI, Eigenval, &
113 my_group_L_start, my_group_L_end, my_group_L_size, sab_orb_sub, mat_munu, &
121 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
122 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
123 INTEGER,
INTENT(IN) :: dimen_ri
124 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
125 INTEGER,
INTENT(IN) :: my_group_l_start, my_group_l_end, &
128 POINTER :: sab_orb_sub
132 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_ri_mp2_nonsep'
134 INTEGER :: eri_method, handle, handle2, i, ikind, &
135 ispin, itmp(2), l_counter, lll, &
136 my_p_end, my_p_size, my_p_start, nao, &
138 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, homo, kind_of, &
139 natom_of_kind, virtual
140 LOGICAL :: alpha_beta, use_virial
141 REAL(kind=
dp) :: cutoff_old, eps_filter, factor, &
142 factor_2c, relative_cutoff_old
143 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: e_cutoff_old
144 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: g_pq_local, g_pq_local_2
145 REAL(kind=
dp),
DIMENSION(3, 3) :: h_stress, pv_virial
146 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: i_tmp2
149 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: l1_mu_i, l2_nu_a
151 TYPE(
dbcsr_p_type),
ALLOCATABLE,
DIMENSION(:) :: mo_coeff_o, mo_coeff_v
152 TYPE(
dbcsr_p_type),
ALLOCATABLE,
DIMENSION(:, :) :: g_p_ia
153 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_munu_local, matrix_p_munu_local
155 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: lag_mu_i_1, lag_nu_a_2, matrix_p_inu
157 TYPE(
mp2_eri_force),
ALLOCATABLE,
DIMENSION(:) :: force_2c, force_2c_ri, force_3c_aux, &
158 force_3c_orb_mu, force_3c_orb_nu
164 TYPE(
qs_force_type),
DIMENSION(:),
POINTER :: force, mp2_force
169 CALL timeset(routinen, handle)
171 eri_method = mp2_env%eri_method
172 eri_param => mp2_env%eri_mme_param
175 nspins =
SIZE(eigenval, 2)
176 alpha_beta = (nspins == 2)
178 ALLOCATE (virtual(nspins), homo(nspins))
179 eps_filter = mp2_env%mp2_gpw%eps_filter
180 ALLOCATE (mo_coeff_o(nspins), mo_coeff_v(nspins), g_p_ia(nspins, my_group_l_size))
182 mo_coeff_o(ispin)%matrix => mp2_env%ri_grad%mo_coeff_o(ispin)%matrix
183 mo_coeff_v(ispin)%matrix => mp2_env%ri_grad%mo_coeff_v(ispin)%matrix
185 nfullrows_total=nao, &
186 nfullcols_total=homo(ispin))
188 nfullrows_total=nao, &
189 nfullcols_total=virtual(ispin))
190 DO lll = 1, my_group_l_size
191 g_p_ia(ispin, lll)%matrix => mp2_env%ri_grad%G_P_ia(lll, ispin)%matrix
194 DEALLOCATE (mp2_env%ri_grad%G_P_ia)
196 itmp =
get_limit(dimen_ri, para_env_sub%num_pe, para_env_sub%mepos)
199 my_p_size = itmp(2) - itmp(1) + 1
201 ALLOCATE (g_pq_local(dimen_ri, my_group_l_size))
203 g_pq_local(my_p_start:my_p_end, :) = mp2_env%ri_grad%Gamma_PQ
204 DEALLOCATE (mp2_env%ri_grad%Gamma_PQ)
205 g_pq_local(my_p_start:my_p_end, :) = g_pq_local(my_p_start:my_p_end, :)/real(nspins,
dp)
206 CALL para_env_sub%sum(g_pq_local)
208 ALLOCATE (g_pq_local_2(dimen_ri, my_group_l_size))
209 g_pq_local_2 = 0.0_dp
210 g_pq_local_2(my_p_start:my_p_end, :) = mp2_env%ri_grad%Gamma_PQ_2
211 DEALLOCATE (mp2_env%ri_grad%Gamma_PQ_2)
212 g_pq_local_2(my_p_start:my_p_end, :) = g_pq_local_2(my_p_start:my_p_end, :)/real(nspins,
dp)
213 CALL para_env_sub%sum(g_pq_local_2)
217 ALLOCATE (matrix_p_inu(nspins))
219 CALL dbcsr_create(matrix_p_inu(ispin), template=mo_coeff_o(ispin)%matrix)
223 CALL dbcsr_create(matrix_p_munu_nosym, template=mat_munu%matrix, &
224 matrix_type=dbcsr_type_no_symmetry)
227 ALLOCATE (lag_mu_i_1(nspins))
229 CALL dbcsr_create(lag_mu_i_1(ispin), template=mo_coeff_o(ispin)%matrix)
230 CALL dbcsr_set(lag_mu_i_1(ispin), 0.0_dp)
233 ALLOCATE (lag_nu_a_2(nspins))
235 CALL dbcsr_create(lag_nu_a_2(ispin), template=mo_coeff_v(ispin)%matrix)
236 CALL dbcsr_set(lag_nu_a_2(ispin), 0.0_dp)
240 NULLIFY (force, virial)
241 CALL get_qs_env(qs_env=qs_env, force=force, virial=virial)
244 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
249 DEALLOCATE (natom_of_kind)
251 mp2_env%ri_grad%mp2_force => mp2_force
256 IF (alpha_beta) factor_2c = -2.0_dp
261 ALLOCATE (matrix_p_munu_local(my_group_l_size))
262 ALLOCATE (mat_munu_local(my_group_l_size))
264 DO lll = my_group_l_start, my_group_l_end
265 l_counter = l_counter + 1
266 ALLOCATE (mat_munu_local(l_counter)%matrix)
267 CALL dbcsr_create(mat_munu_local(l_counter)%matrix, template=mat_munu%matrix, &
268 matrix_type=dbcsr_type_symmetric)
269 CALL dbcsr_copy(mat_munu_local(l_counter)%matrix, mat_munu%matrix)
270 CALL dbcsr_set(mat_munu_local(l_counter)%matrix, 0.0_dp)
272 CALL g_p_transform_mo_to_ao(matrix_p_munu_local(l_counter)%matrix, matrix_p_munu_nosym, mat_munu%matrix, &
273 g_p_ia(:, l_counter), matrix_p_inu, &
274 mo_coeff_v, mo_coeff_o, eps_filter)
277 ALLOCATE (i_tmp2(dimen_ri, my_group_l_size))
278 i_tmp2(:, :) = 0.0_dp
280 basis_type_a=
"RI_AUX", basis_type_b=
"RI_AUX", &
281 hab=i_tmp2, first_b=my_group_l_start, last_b=my_group_l_end, &
282 eri_method=eri_method, pab=g_pq_local, force_a=force_2c)
284 i_tmp2(:, :) = 0.0_dp
286 basis_type_a=
"RI_AUX", basis_type_b=
"RI_AUX", &
287 hab=i_tmp2, first_b=my_group_l_start, last_b=my_group_l_end, &
288 eri_method=eri_method, pab=g_pq_local_2, force_a=force_2c_ri)
293 first_c=my_group_l_start, last_c=my_group_l_end, mat_ab=mat_munu_local, &
294 basis_type_a=
"ORB", basis_type_b=
"ORB", basis_type_c=
"RI_AUX", &
295 sab_nl=sab_orb_sub, eri_method=eri_method, &
296 pabc=matrix_p_munu_local, &
297 force_a=force_3c_orb_mu, force_b=force_3c_orb_nu, force_c=force_3c_aux)
300 DO lll = my_group_l_start, my_group_l_end
301 l_counter = l_counter + 1
303 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, mo_coeff_v(ispin)%matrix, g_p_ia(ispin, l_counter)%matrix, &
304 0.0_dp, matrix_p_inu(ispin), filter_eps=eps_filter)
308 CALL update_lagrangian(mat_munu_local(l_counter)%matrix, matrix_p_inu, lag_mu_i_1, &
309 g_p_ia(:, l_counter), mo_coeff_o, lag_nu_a_2, &
313 DO ikind = 1,
SIZE(force)
314 mp2_force(ikind)%mp2_non_sep(:, :) = factor_2c*force_2c(ikind)%forces(:, :) + &
315 force_3c_orb_mu(ikind)%forces(:, :) + &
316 force_3c_orb_nu(ikind)%forces(:, :) + &
317 force_3c_aux(ikind)%forces(:, :)
320 mp2_force(ikind)%mp2_non_sep(:, :) = mp2_force(ikind)%mp2_non_sep(:, :) + factor_2c*force_2c_ri(ikind)%forces
340 CALL prepare_gpw(qs_env, dft_control, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
341 auxbas_pw_pool, poisson_env, task_list_sub, rho_r, rho_g, pot_g, psi_l, sab_orb_sub)
347 CALL auxbas_pw_pool%create_pw(rho_g_copy)
349 CALL auxbas_pw_pool%create_pw(dvg(i))
354 CALL timeset(routinen//
"_loop", handle2)
356 IF (use_virial) h_stress = 0.0_dp
359 DO lll = my_group_l_start, my_group_l_end
360 l_counter = l_counter + 1
362 CALL g_p_transform_mo_to_ao(matrix_p_munu%matrix, matrix_p_munu_nosym, mat_munu%matrix, &
363 g_p_ia(:, l_counter), matrix_p_inu, &
364 mo_coeff_v, mo_coeff_o, eps_filter)
367 qs_kind_set, particle_set, cell, pw_env_sub, poisson_env, &
368 pot_g, mp2_env%potential_parameter, use_virial, &
369 rho_g_copy, dvg, kind_of, atom_of_kind, g_pq_local(:, l_counter), &
370 mp2_force, h_stress, para_env_sub, dft_control, psi_l, factor_2c)
375 qs_kind_set, particle_set, cell, pw_env_sub, poisson_env, &
376 pot_g, mp2_env%ri_metric, use_virial, &
377 rho_g_copy, dvg, kind_of, atom_of_kind, g_pq_local_2(:, l_counter), &
378 mp2_force, h_stress, para_env_sub, dft_control, psi_l, factor_2c)
381 IF (use_virial) pv_virial = virial%pv_virial
385 h_stress = h_stress + (virial%pv_virial - pv_virial)
386 virial%pv_virial = pv_virial
390 CALL update_lagrangian(mat_munu%matrix, matrix_p_inu, lag_mu_i_1, &
391 g_p_ia(:, l_counter), mo_coeff_o, lag_nu_a_2, &
396 ks_env, poisson_env, pot_g, use_virial, rho_g_copy, dvg, &
397 h_stress, para_env_sub, kind_of, atom_of_kind, &
398 qs_kind_set, particle_set, cell, lll, mp2_force, dft_control)
401 CALL timestop(handle2)
404 DEALLOCATE (atom_of_kind)
407 CALL auxbas_pw_pool%give_back_pw(rho_g_copy)
409 CALL auxbas_pw_pool%give_back_pw(dvg(i))
413 CALL cleanup_gpw(qs_env, e_cutoff_old, cutoff_old, relative_cutoff_old, para_env_sub, pw_env_sub, &
414 task_list_sub, auxbas_pw_pool, rho_r, rho_g, pot_g, psi_l)
417 DEALLOCATE (matrix_p_munu%matrix)
421 IF (use_virial) mp2_env%ri_grad%mp2_virial = h_stress
423 DEALLOCATE (g_pq_local)
431 DEALLOCATE (matrix_p_inu, g_p_ia)
435 DO ikind = 1,
SIZE(mp2_force)
436 mp2_force(ikind)%mp2_non_sep(:, :) = force(ikind)%rho_elec(:, :)
437 force(ikind)%rho_elec(:, :) = 0.0_dp
445 ALLOCATE (l1_mu_i(nspins), l2_nu_a(nspins))
450 NULLIFY (fm_struct_tmp)
452 nrow_global=nao, ncol_global=homo(ispin))
453 CALL cp_fm_create(l1_mu_i(ispin), fm_struct_tmp, name=
"Lag_mu_i")
461 NULLIFY (fm_struct_tmp)
463 nrow_global=nao, ncol_global=virtual(ispin))
464 CALL cp_fm_create(l2_nu_a(ispin), fm_struct_tmp, name=
"Lag_nu_a")
472 DEALLOCATE (lag_mu_i_1, lag_nu_a_2)
476 IF (alpha_beta) factor = 0.50_dp
479 CALL create_w_p(qs_env, mp2_env, mo_coeff(ispin), homo(ispin), virtual(ispin), para_env, &
480 para_env_sub, eigenval(:, ispin), l1_mu_i(ispin), l2_nu_a(ispin), &
483 DEALLOCATE (l1_mu_i, l2_nu_a)
485 CALL timestop(handle)
500 SUBROUTINE g_p_transform_mo_to_ao(G_P_munu, G_P_munu_nosym, mat_munu, G_P_ia, G_P_inu, &
501 mo_coeff_v, mo_coeff_o, eps_filter)
503 TYPE(
dbcsr_type),
INTENT(INOUT) :: g_p_munu_nosym, mat_munu
505 TYPE(
dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: g_p_inu
506 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff_v, mo_coeff_o
507 REAL(kind=
dp),
INTENT(IN) :: eps_filter
509 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_P_transform_MO_to_AO'
513 IF (.NOT.
ASSOCIATED(g_p_munu))
THEN
516 matrix_type=dbcsr_type_symmetric)
519 CALL g_p_transform_alpha_beta(g_p_ia, g_p_inu, g_p_munu_nosym, mo_coeff_v, mo_coeff_o, eps_filter)
522 CALL timeset(routinen//
"_symmetrize", handle)
525 CALL dbcsr_add(g_p_munu, g_p_munu_nosym, &
526 alpha_scalar=2.0_dp, beta_scalar=2.0_dp)
528 CALL dbcsr_copy(mat_munu, g_p_munu, keep_sparsity=.true.)
531 CALL timestop(handle)
533 END SUBROUTINE g_p_transform_mo_to_ao
544 SUBROUTINE g_p_transform_alpha_beta(G_P_ia, G_P_inu, G_P_munu, mo_coeff_v, mo_coeff_o, eps_filter)
546 TYPE(
dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: g_p_inu
548 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff_v, mo_coeff_o
549 REAL(kind=
dp),
INTENT(IN) :: eps_filter
551 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_P_transform_alpha_beta'
553 INTEGER :: handle, ispin
554 REAL(kind=
dp) :: factor
556 CALL timeset(routinen, handle)
558 factor = 1.0_dp/real(
SIZE(g_p_ia),
dp)
562 DO ispin = 1,
SIZE(g_p_ia)
564 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, mo_coeff_v(ispin)%matrix, g_p_ia(ispin)%matrix, &
565 0.0_dp, g_p_inu(ispin), filter_eps=eps_filter)
568 CALL dbcsr_multiply(
"N",
"T", factor, g_p_inu(ispin), mo_coeff_o(ispin)%matrix, &
569 1.0_dp, g_p_munu, filter_eps=eps_filter)
572 CALL timestop(handle)
574 END SUBROUTINE g_p_transform_alpha_beta
586 SUBROUTINE update_lagrangian(mat_munu, matrix_P_inu, Lag_mu_i_1, &
587 G_P_ia, mo_coeff_o, Lag_nu_a_2, &
590 TYPE(
dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: matrix_p_inu, lag_mu_i_1
591 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: g_p_ia
592 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff_o
593 TYPE(
dbcsr_type),
DIMENSION(:),
INTENT(INOUT) :: lag_nu_a_2
594 REAL(kind=
dp),
INTENT(IN) :: eps_filter
596 CHARACTER(LEN=*),
PARAMETER :: routinen =
'update_lagrangian'
598 INTEGER :: handle, ispin
601 CALL timeset(routinen, handle)
603 DO ispin = 1,
SIZE(g_p_ia)
606 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mat_munu, matrix_p_inu(ispin), &
607 1.0_dp, lag_mu_i_1(ispin), filter_eps=eps_filter)
610 CALL dbcsr_set(matrix_p_inu(ispin), 0.0_dp)
611 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mat_munu, mo_coeff_o(ispin)%matrix, &
612 0.0_dp, matrix_p_inu(ispin), filter_eps=eps_filter)
616 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, matrix_p_inu(ispin), g_p_ia(ispin)%matrix, &
617 1.0_dp, lag_nu_a_2(ispin), filter_eps=eps_filter)
621 DEALLOCATE (g_p_ia(ispin)%matrix)
624 CALL timestop(handle)
626 END SUBROUTINE update_lagrangian
643 SUBROUTINE create_w_p(qs_env, mp2_env, mo_coeff, homo, virtual, para_env, para_env_sub, &
644 Eigenval, L1_mu_i, L2_nu_a, factor, kspin)
648 INTEGER,
INTENT(IN) :: homo, virtual
650 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eigenval
651 TYPE(
cp_fm_type),
INTENT(INOUT) :: l1_mu_i, l2_nu_a
652 REAL(kind=
dp),
INTENT(IN) :: factor
653 INTEGER,
INTENT(IN) :: kspin
655 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_W_P'
657 INTEGER :: color_exchange, dummy_proc, handle, handle2, handle3, i_global, i_local, iib, &
658 iii, iproc, itmp(2), j_global, j_local, jjb, max_col_size, max_row_size, &
659 my_b_virtual_end, my_b_virtual_start, mypcol, myprow, nao, ncol_local, ncol_local_1i, &
660 ncol_local_2a, nmo, npcol, nprow, nrow_local, nrow_local_1i, nrow_local_2a, &
661 number_of_rec, number_of_send, proc_receive, proc_receive_static, proc_send, &
662 proc_send_ex, proc_send_static, proc_send_sub, proc_shift, rec_col_size, rec_counter, &
663 rec_row_size, send_col_size, send_counter, send_pcol, send_prow, send_row_size, &
665 INTEGER :: size_send_buffer
666 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iii_vet, map_rec_size, map_send_size, &
667 pos_info, pos_info_ex, proc_2_send_pos
668 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: grid_2_mepos, mepos_2_grid, my_col_indeces_info_1i, &
669 my_col_indeces_info_2a, my_row_indeces_info_1i, my_row_indeces_info_2a, sizes, sizes_1i, &
671 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: col_indeces_info_1i, &
672 col_indeces_info_2a, &
673 row_indeces_info_1i, &
675 INTEGER,
DIMENSION(:),
POINTER :: col_indices, col_indices_1i, &
676 col_indices_2a, row_indices, &
677 row_indices_1i, row_indices_2a
678 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ab_rec, ab_send, mat_rec, mat_send
683 DIMENSION(:) :: buffer_rec, buffer_send
685 DIMENSION(:) :: buffer_cyclic
689 CALL timeset(routinen, handle)
697 NULLIFY (fm_struct_tmp)
699 nrow_global=nao, ncol_global=nmo)
700 CALL cp_fm_create(l_mu_q, fm_struct_tmp, name=
"Lag_mu_q")
705 ALLOCATE (pos_info(0:para_env%num_pe - 1))
706 CALL para_env%allgather(para_env_sub%mepos, pos_info)
710 nrow_local=nrow_local, &
711 ncol_local=ncol_local, &
712 row_indices=row_indices, &
713 col_indices=col_indices)
714 myprow = l_mu_q%matrix_struct%context%mepos(1)
715 mypcol = l_mu_q%matrix_struct%context%mepos(2)
716 nprow = l_mu_q%matrix_struct%context%num_pe(1)
717 npcol = l_mu_q%matrix_struct%context%num_pe(2)
719 ALLOCATE (grid_2_mepos(0:nprow - 1, 0:npcol - 1))
721 grid_2_mepos(myprow, mypcol) = para_env%mepos
722 CALL para_env%sum(grid_2_mepos)
726 nrow_local=nrow_local_1i, &
727 ncol_local=ncol_local_1i, &
728 row_indices=row_indices_1i, &
729 col_indices=col_indices_1i)
731 ALLOCATE (sizes_1i(2, 0:para_env_sub%num_pe - 1))
732 CALL para_env_sub%allgather([nrow_local_1i, ncol_local_1i], sizes_1i)
736 nrow_local=nrow_local_2a, &
737 ncol_local=ncol_local_2a, &
738 row_indices=row_indices_2a, &
739 col_indices=col_indices_2a)
741 ALLOCATE (sizes_2a(2, 0:para_env_sub%num_pe - 1))
742 CALL para_env_sub%allgather([nrow_local_2a, ncol_local_2a], sizes_2a)
753 color_exchange = para_env_sub%mepos
754 ALLOCATE (para_env_exchange)
755 CALL para_env_exchange%from_split(para_env, color_exchange)
756 ALLOCATE (pos_info_ex(0:para_env%num_pe - 1))
757 CALL para_env%allgather(para_env_exchange%mepos, pos_info_ex)
758 ALLOCATE (sizes(2, 0:para_env_exchange%num_pe - 1))
759 CALL para_env_exchange%allgather([nrow_local, ncol_local], sizes)
762 CALL timeset(routinen//
"_inx", handle2)
764 max_row_size = maxval(sizes_1i(1, :))
765 max_col_size = maxval(sizes_1i(2, :))
766 ALLOCATE (row_indeces_info_1i(2, max_row_size, 0:para_env_sub%num_pe - 1))
767 ALLOCATE (col_indeces_info_1i(2, max_col_size, 0:para_env_sub%num_pe - 1))
768 ALLOCATE (my_row_indeces_info_1i(2, max_row_size))
769 ALLOCATE (my_col_indeces_info_1i(2, max_col_size))
770 row_indeces_info_1i = 0
771 col_indeces_info_1i = 0
774 DO iib = 1, nrow_local_1i
775 i_global = row_indices_1i(iib)
776 send_prow = l_mu_q%matrix_struct%g2p_row(i_global)
777 i_local = l_mu_q%matrix_struct%g2l_row(i_global)
778 my_row_indeces_info_1i(1, iib) = send_prow
779 my_row_indeces_info_1i(2, iib) = i_local
782 DO jjb = 1, ncol_local_1i
783 j_global = col_indices_1i(jjb)
784 send_pcol = l_mu_q%matrix_struct%g2p_col(j_global)
785 j_local = l_mu_q%matrix_struct%g2l_col(j_global)
786 my_col_indeces_info_1i(1, jjb) = send_pcol
787 my_col_indeces_info_1i(2, jjb) = j_local
789 CALL para_env_sub%allgather(my_row_indeces_info_1i, row_indeces_info_1i)
790 CALL para_env_sub%allgather(my_col_indeces_info_1i, col_indeces_info_1i)
791 DEALLOCATE (my_row_indeces_info_1i, my_col_indeces_info_1i)
794 max_row_size = maxval(sizes_2a(1, :))
795 max_col_size = maxval(sizes_2a(2, :))
796 ALLOCATE (row_indeces_info_2a(2, max_row_size, 0:para_env_sub%num_pe - 1))
797 ALLOCATE (col_indeces_info_2a(2, max_col_size, 0:para_env_sub%num_pe - 1))
798 ALLOCATE (my_row_indeces_info_2a(2, max_row_size))
799 ALLOCATE (my_col_indeces_info_2a(2, max_col_size))
800 row_indeces_info_2a = 0
801 col_indeces_info_2a = 0
803 DO iib = 1, nrow_local_2a
804 i_global = row_indices_2a(iib)
805 send_prow = l_mu_q%matrix_struct%g2p_row(i_global)
806 i_local = l_mu_q%matrix_struct%g2l_row(i_global)
807 my_row_indeces_info_2a(1, iib) = send_prow
808 my_row_indeces_info_2a(2, iib) = i_local
811 DO jjb = 1, ncol_local_2a
812 j_global = col_indices_2a(jjb) + homo
813 send_pcol = l_mu_q%matrix_struct%g2p_col(j_global)
814 j_local = l_mu_q%matrix_struct%g2l_col(j_global)
815 my_col_indeces_info_2a(1, jjb) = send_pcol
816 my_col_indeces_info_2a(2, jjb) = j_local
818 CALL para_env_sub%allgather(my_row_indeces_info_2a, row_indeces_info_2a)
819 CALL para_env_sub%allgather(my_col_indeces_info_2a, col_indeces_info_2a)
820 DEALLOCATE (my_row_indeces_info_2a, my_col_indeces_info_2a)
821 CALL timestop(handle2)
824 CALL timeset(routinen//
"_subinfo", handle2)
825 ALLOCATE (map_send_size(0:para_env_sub%num_pe - 1))
827 DO jjb = 1, ncol_local_1i
828 send_pcol = col_indeces_info_1i(1, jjb, para_env_sub%mepos)
829 DO iib = 1, nrow_local_1i
830 send_prow = row_indeces_info_1i(1, iib, para_env_sub%mepos)
831 proc_send = grid_2_mepos(send_prow, send_pcol)
832 proc_send_sub = pos_info(proc_send)
833 map_send_size(proc_send_sub) = map_send_size(proc_send_sub) + 1
837 DO jjb = 1, ncol_local_2a
838 send_pcol = col_indeces_info_2a(1, jjb, para_env_sub%mepos)
839 DO iib = 1, nrow_local_2a
840 send_prow = row_indeces_info_2a(1, iib, para_env_sub%mepos)
841 proc_send = grid_2_mepos(send_prow, send_pcol)
842 proc_send_sub = pos_info(proc_send)
843 map_send_size(proc_send_sub) = map_send_size(proc_send_sub) + 1
847 ALLOCATE (map_rec_size(0:para_env_sub%num_pe - 1))
849 CALL para_env_sub%alltoall(map_send_size, map_rec_size, 1)
850 CALL timestop(handle2)
853 CALL timeset(routinen//
"_sub_Bsend", handle2)
856 DO proc_shift = 0, para_env_sub%num_pe - 1
857 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
858 IF (map_send_size(proc_send) > 0)
THEN
859 number_of_send = number_of_send + 1
863 ALLOCATE (buffer_send(number_of_send))
865 ALLOCATE (proc_2_send_pos(0:para_env_sub%num_pe - 1))
867 DO proc_shift = 0, para_env_sub%num_pe - 1
868 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
869 size_send_buffer = map_send_size(proc_send)
870 IF (map_send_size(proc_send) > 0)
THEN
871 send_counter = send_counter + 1
873 ALLOCATE (buffer_send(send_counter)%msg(size_send_buffer))
874 buffer_send(send_counter)%msg = 0.0_dp
875 buffer_send(send_counter)%proc = proc_send
876 proc_2_send_pos(proc_send) = send_counter
882 ALLOCATE (iii_vet(number_of_send))
884 DO jjb = 1, ncol_local_1i
885 send_pcol = col_indeces_info_1i(1, jjb, para_env_sub%mepos)
886 DO iib = 1, nrow_local_1i
887 send_prow = row_indeces_info_1i(1, iib, para_env_sub%mepos)
888 proc_send = grid_2_mepos(send_prow, send_pcol)
889 proc_send_sub = pos_info(proc_send)
890 send_counter = proc_2_send_pos(proc_send_sub)
891 iii_vet(send_counter) = iii_vet(send_counter) + 1
892 iii = iii_vet(send_counter)
893 buffer_send(send_counter)%msg(iii) = l1_mu_i%local_data(iib, jjb)
897 DEALLOCATE (l1_mu_i%local_data)
899 DO jjb = 1, ncol_local_2a
900 send_pcol = col_indeces_info_2a(1, jjb, para_env_sub%mepos)
901 DO iib = 1, nrow_local_2a
902 send_prow = row_indeces_info_2a(1, iib, para_env_sub%mepos)
903 proc_send = grid_2_mepos(send_prow, send_pcol)
904 proc_send_sub = pos_info(proc_send)
905 send_counter = proc_2_send_pos(proc_send_sub)
906 iii_vet(send_counter) = iii_vet(send_counter) + 1
907 iii = iii_vet(send_counter)
908 buffer_send(send_counter)%msg(iii) = l2_nu_a%local_data(iib, jjb)
911 DEALLOCATE (l2_nu_a%local_data)
912 DEALLOCATE (proc_2_send_pos)
914 CALL timestop(handle2)
918 CALL timeset(routinen//
"_sub_isendrecv", handle2)
921 DO proc_shift = 0, para_env_sub%num_pe - 1
922 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
923 IF (map_rec_size(proc_receive) > 0)
THEN
924 number_of_rec = number_of_rec + 1
927 ALLOCATE (buffer_rec(number_of_rec))
929 DO proc_shift = 0, para_env_sub%num_pe - 1
930 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
931 size_rec_buffer = map_rec_size(proc_receive)
932 IF (map_rec_size(proc_receive) > 0)
THEN
933 rec_counter = rec_counter + 1
935 ALLOCATE (buffer_rec(rec_counter)%msg(size_rec_buffer))
936 buffer_rec(rec_counter)%msg = 0.0_dp
937 buffer_rec(rec_counter)%proc = proc_receive
939 IF (proc_receive /= para_env_sub%mepos)
THEN
940 CALL para_env_sub%irecv(buffer_rec(rec_counter)%msg, proc_receive, &
941 buffer_rec(rec_counter)%msg_req)
946 ALLOCATE (req_send(number_of_send))
949 DO proc_shift = 0, para_env_sub%num_pe - 1
950 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
951 IF (map_send_size(proc_send) > 0)
THEN
952 send_counter = send_counter + 1
953 IF (proc_send == para_env_sub%mepos)
THEN
954 buffer_rec(send_counter)%msg(:) = buffer_send(send_counter)%msg
956 CALL para_env_sub%isend(buffer_send(send_counter)%msg, proc_send, &
957 buffer_send(send_counter)%msg_req)
958 req_send(send_counter) = buffer_send(send_counter)%msg_req
962 DEALLOCATE (map_send_size)
963 CALL timestop(handle2)
969 CALL timeset(routinen//
"_Bcyclic", handle2)
971 ALLOCATE (buffer_cyclic(0:para_env_exchange%num_pe - 1))
972 DO iproc = 0, para_env_exchange%num_pe - 1
973 rec_row_size = sizes(1, iproc)
974 rec_col_size = sizes(2, iproc)
975 ALLOCATE (buffer_cyclic(iproc)%msg(rec_row_size, rec_col_size))
976 buffer_cyclic(iproc)%msg = 0.0_dp
981 DO proc_shift = 0, para_env_sub%num_pe - 1
982 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
983 size_rec_buffer = map_rec_size(proc_receive)
984 IF (map_rec_size(proc_receive) > 0)
THEN
985 rec_counter = rec_counter + 1
988 IF (proc_receive /= para_env_sub%mepos)
CALL buffer_rec(rec_counter)%msg_req%wait()
990 CALL timeset(routinen//
"_fill", handle3)
992 DO jjb = 1, sizes_1i(2, proc_receive)
993 send_pcol = col_indeces_info_1i(1, jjb, proc_receive)
994 j_local = col_indeces_info_1i(2, jjb, proc_receive)
995 DO iib = 1, sizes_1i(1, proc_receive)
996 send_prow = row_indeces_info_1i(1, iib, proc_receive)
997 proc_send = grid_2_mepos(send_prow, send_pcol)
998 proc_send_sub = pos_info(proc_send)
999 IF (proc_send_sub /= para_env_sub%mepos) cycle
1001 i_local = row_indeces_info_1i(2, iib, proc_receive)
1002 proc_send_ex = pos_info_ex(proc_send)
1003 buffer_cyclic(proc_send_ex)%msg(i_local, j_local) = buffer_rec(rec_counter)%msg(iii)
1007 DO jjb = 1, sizes_2a(2, proc_receive)
1008 send_pcol = col_indeces_info_2a(1, jjb, proc_receive)
1009 j_local = col_indeces_info_2a(2, jjb, proc_receive)
1010 DO iib = 1, sizes_2a(1, proc_receive)
1011 send_prow = row_indeces_info_2a(1, iib, proc_receive)
1012 proc_send = grid_2_mepos(send_prow, send_pcol)
1013 proc_send_sub = pos_info(proc_send)
1014 IF (proc_send_sub /= para_env_sub%mepos) cycle
1016 i_local = row_indeces_info_2a(2, iib, proc_receive)
1017 proc_send_ex = pos_info_ex(proc_send)
1018 buffer_cyclic(proc_send_ex)%msg(i_local, j_local) = buffer_rec(rec_counter)%msg(iii)
1021 CALL timestop(handle3)
1024 DEALLOCATE (buffer_rec(rec_counter)%msg)
1027 DEALLOCATE (row_indeces_info_1i)
1028 DEALLOCATE (col_indeces_info_1i)
1029 DEALLOCATE (row_indeces_info_2a)
1030 DEALLOCATE (col_indeces_info_2a)
1031 DEALLOCATE (buffer_rec)
1032 DEALLOCATE (map_rec_size)
1033 CALL timestop(handle2)
1036 CALL timeset(routinen//
"_sub_waitall", handle2)
1038 DO send_counter = 1, number_of_send
1039 DEALLOCATE (buffer_send(send_counter)%msg)
1041 DEALLOCATE (buffer_send)
1042 DEALLOCATE (req_send)
1043 CALL timestop(handle2)
1046 CALL timeset(routinen//
"_ring", handle2)
1047 proc_send_static =
modulo(para_env_exchange%mepos + 1, para_env_exchange%num_pe)
1048 proc_receive_static =
modulo(para_env_exchange%mepos - 1, para_env_exchange%num_pe)
1049 max_row_size = maxval(sizes(1, :))
1050 max_col_size = maxval(sizes(2, :))
1051 ALLOCATE (mat_send(max_row_size, max_col_size))
1052 ALLOCATE (mat_rec(max_row_size, max_col_size))
1054 mat_send(1:nrow_local, 1:ncol_local) = buffer_cyclic(para_env_exchange%mepos)%msg(:, :)
1055 DEALLOCATE (buffer_cyclic(para_env_exchange%mepos)%msg)
1056 DO proc_shift = 1, para_env_exchange%num_pe - 1
1057 proc_receive =
modulo(para_env_exchange%mepos - proc_shift, para_env_exchange%num_pe)
1059 rec_row_size = sizes(1, proc_receive)
1060 rec_col_size = sizes(2, proc_receive)
1063 CALL para_env_exchange%sendrecv(mat_send, proc_send_static, &
1064 mat_rec, proc_receive_static)
1067 mat_send(1:rec_row_size, 1:rec_col_size) = mat_rec(1:rec_row_size, 1:rec_col_size) + &
1068 buffer_cyclic(proc_receive)%msg(:, :)
1070 DEALLOCATE (buffer_cyclic(proc_receive)%msg)
1073 CALL para_env_exchange%sendrecv(mat_send, proc_send_static, &
1074 mat_rec, proc_receive_static)
1075 l_mu_q%local_data(1:nrow_local, 1:ncol_local) = mat_rec(1:nrow_local, 1:ncol_local)
1076 DEALLOCATE (buffer_cyclic)
1077 DEALLOCATE (mat_send)
1078 DEALLOCATE (mat_rec)
1079 CALL timestop(handle2)
1086 DEALLOCATE (pos_info_ex)
1087 DEALLOCATE (grid_2_mepos)
1089 DEALLOCATE (sizes_1i)
1090 DEALLOCATE (sizes_2a)
1094 CALL timeset(routinen//
"_Pij", handle2)
1095 NULLIFY (fm_struct_tmp)
1097 nrow_global=homo, ncol_global=homo)
1098 CALL cp_fm_create(fm_p_ij, fm_struct_tmp, name=
"fm_P_ij")
1104 nrow_local=nrow_local, &
1105 ncol_local=ncol_local, &
1106 row_indices=row_indices, &
1107 col_indices=col_indices)
1111 mo_coeff, l_mu_q, 0.0_dp, fm_p_ij, &
1119 l_mu_q, mo_coeff, 2.0_dp, fm_p_ij, &
1127 DO jjb = 1, ncol_local
1128 j_global = col_indices(jjb)
1129 DO iib = 1, nrow_local
1130 i_global = row_indices(iib)
1132 IF (abs(eigenval(j_global) - eigenval(i_global)) < mp2_env%ri_grad%eps_canonical)
THEN
1133 fm_p_ij%local_data(iib, jjb) = mp2_env%ri_grad%P_ij(kspin)%array(i_global, j_global)
1135 fm_p_ij%local_data(iib, jjb) = &
1136 factor*fm_p_ij%local_data(iib, jjb)/(eigenval(j_global) - eigenval(i_global))
1141 DO jjb = 1, ncol_local
1142 j_global = col_indices(jjb)
1143 DO iib = 1, nrow_local
1144 i_global = row_indices(iib)
1145 fm_p_ij%local_data(iib, jjb) = mp2_env%ri_grad%P_ij(kspin)%array(i_global, j_global)
1150 DEALLOCATE (mp2_env%ri_grad%P_ij(kspin)%array)
1151 CALL timestop(handle2)
1155 IF (.NOT.
ALLOCATED(mp2_env%ri_grad%P_mo))
THEN
1156 ALLOCATE (mp2_env%ri_grad%P_mo(
SIZE(mp2_env%ri_grad%mo_coeff_o)))
1159 CALL timeset(routinen//
"_PMO", handle2)
1160 NULLIFY (fm_struct_tmp)
1162 nrow_global=nmo, ncol_global=nmo)
1163 CALL cp_fm_create(mp2_env%ri_grad%P_mo(kspin), fm_struct_tmp, name=
"P_MP2_MO")
1167 itmp =
get_limit(virtual, para_env_sub%num_pe, para_env_sub%mepos)
1168 my_b_virtual_start = itmp(1)
1169 my_b_virtual_end = itmp(2)
1172 CALL cp_fm_to_fm_submat(fm_p_ij, mp2_env%ri_grad%P_mo(kspin), homo, homo, 1, 1, 1, 1)
1176 nrow_local=nrow_local, &
1177 ncol_local=ncol_local, &
1178 row_indices=row_indices, &
1179 col_indices=col_indices)
1182 CALL parallel_gemm(
'T',
'N', virtual, virtual, nao, 1.0_dp, &
1183 mo_coeff, l_mu_q, 0.0_dp, mp2_env%ri_grad%P_mo(kspin), &
1184 a_first_col=homo + 1, &
1186 b_first_col=homo + 1, &
1188 c_first_col=homo + 1, &
1189 c_first_row=homo + 1)
1190 CALL parallel_gemm(
'T',
'N', virtual, virtual, nao, -2.0_dp, &
1191 l_mu_q, mo_coeff, 2.0_dp, mp2_env%ri_grad%P_mo(kspin), &
1192 a_first_col=homo + 1, &
1194 b_first_col=homo + 1, &
1196 c_first_col=homo + 1, &
1197 c_first_row=homo + 1)
1202 DO jjb = 1, ncol_local
1203 j_global = col_indices(jjb)
1204 IF (j_global <= homo) cycle
1205 DO iib = 1, nrow_local
1206 i_global = row_indices(iib)
1207 IF (my_b_virtual_start <= i_global - homo .AND. i_global - homo <= my_b_virtual_end)
THEN
1208 mp2_env%ri_grad%P_mo(kspin)%local_data(iib, jjb) = &
1209 mp2_env%ri_grad%P_ab(kspin)%array(i_global - homo - my_b_virtual_start + 1, j_global - homo)
1215 DO jjb = 1, ncol_local
1216 j_global = col_indices(jjb)
1217 IF (j_global <= homo) cycle
1218 DO iib = 1, nrow_local
1219 i_global = row_indices(iib)
1220 IF (abs(eigenval(i_global) - eigenval(j_global)) < mp2_env%ri_grad%eps_canonical)
THEN
1221 IF (my_b_virtual_start <= i_global - homo .AND. i_global - homo <= my_b_virtual_end)
THEN
1222 mp2_env%ri_grad%P_mo(kspin)%local_data(iib, jjb) = &
1223 mp2_env%ri_grad%P_ab(kspin)%array(i_global - homo - my_b_virtual_start + 1, j_global - homo)
1225 mp2_env%ri_grad%P_mo(kspin)%local_data(iib, jjb) = 0.0_dp
1228 mp2_env%ri_grad%P_mo(kspin)%local_data(iib, jjb) = &
1229 factor*mp2_env%ri_grad%P_mo(kspin)%local_data(iib, jjb)/ &
1230 (eigenval(i_global) - eigenval(j_global))
1235 cpabort(
"Calculation of virt-virt block of density matrix is dealt with elsewhere!")
1240 ALLOCATE (mepos_2_grid(2, 0:para_env_sub%num_pe - 1))
1241 CALL para_env_sub%allgather([myprow, mypcol], mepos_2_grid)
1243 ALLOCATE (sizes(2, 0:para_env_sub%num_pe - 1))
1244 CALL para_env_sub%allgather([nrow_local, ncol_local], sizes)
1246 ALLOCATE (ab_rec(nrow_local, ncol_local))
1247 DO proc_shift = 1, para_env_sub%num_pe - 1
1248 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
1249 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
1251 send_prow = mepos_2_grid(1, proc_send)
1252 send_pcol = mepos_2_grid(2, proc_send)
1254 send_row_size = sizes(1, proc_send)
1255 send_col_size = sizes(2, proc_send)
1257 ALLOCATE (ab_send(send_row_size, send_col_size))
1261 DO iib = 1, send_row_size
1262 i_global = mp2_env%ri_grad%P_mo(kspin)%matrix_struct%l2g_row(iib, send_prow)
1263 IF (i_global <= homo) cycle
1264 i_global = i_global - homo
1265 IF (.NOT. (my_b_virtual_start <= i_global .AND. i_global <= my_b_virtual_end)) cycle
1266 DO jjb = 1, send_col_size
1267 j_global = mp2_env%ri_grad%P_mo(kspin)%matrix_struct%l2g_col(jjb, send_pcol)
1268 IF (j_global <= homo) cycle
1269 j_global = j_global - homo
1270 ab_send(iib, jjb) = mp2_env%ri_grad%P_ab(kspin)%array(i_global - my_b_virtual_start + 1, j_global)
1275 CALL para_env_sub%sendrecv(ab_send, proc_send, &
1276 ab_rec, proc_receive)
1277 mp2_env%ri_grad%P_mo(kspin)%local_data(1:nrow_local, 1:ncol_local) = &
1278 mp2_env%ri_grad%P_mo(kspin)%local_data(1:nrow_local, 1:ncol_local) + &
1279 ab_rec(1:nrow_local, 1:ncol_local)
1281 DEALLOCATE (ab_send)
1284 DEALLOCATE (mepos_2_grid)
1288 DEALLOCATE (mp2_env%ri_grad%P_ab(kspin)%array)
1289 CALL timestop(handle2)
1292 CALL timeset(routinen//
"_WMO", handle2)
1293 IF (.NOT.
ALLOCATED(mp2_env%ri_grad%W_mo))
THEN
1294 ALLOCATE (mp2_env%ri_grad%W_mo(
SIZE(mp2_env%ri_grad%mo_coeff_o)))
1297 CALL cp_fm_create(mp2_env%ri_grad%W_mo(kspin), fm_struct_tmp, name=
"W_MP2_MO")
1301 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, 2.0_dp*factor, &
1302 l_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
1311 CALL parallel_gemm(
'T',
'N', homo, homo, nao, -2.0_dp*factor, &
1312 l_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
1321 CALL parallel_gemm(
'T',
'N', homo, virtual, nao, 2.0_dp*factor, &
1322 mo_coeff, l_mu_q, 0.0_dp, mp2_env%ri_grad%W_mo(kspin), &
1325 b_first_col=homo + 1, &
1327 c_first_col=homo + 1, &
1329 CALL timestop(handle2)
1332 CALL timeset(routinen//
"_Ljb", handle2)
1333 IF (.NOT.
ALLOCATED(mp2_env%ri_grad%L_jb))
THEN
1334 ALLOCATE (mp2_env%ri_grad%L_jb(
SIZE(mp2_env%ri_grad%mo_coeff_o)))
1338 nrow_global=homo, ncol_global=virtual)
1339 CALL cp_fm_create(mp2_env%ri_grad%L_jb(kspin), fm_struct_tmp, name=
"fm_L_jb")
1343 CALL parallel_gemm(
'T',
'N', homo, virtual, nao, 2.0_dp*factor, &
1344 l_mu_q, mo_coeff, 0.0_dp, mp2_env%ri_grad%L_jb(kspin), &
1347 b_first_col=homo + 1, &
1352 CALL parallel_gemm(
'T',
'N', homo, virtual, nao, 2.0_dp*factor, &
1353 mo_coeff, l_mu_q, 1.0_dp, mp2_env%ri_grad%L_jb(kspin), &
1356 b_first_col=homo + 1, &
1363 CALL timestop(handle2)
1367 DEALLOCATE (pos_info)
1369 CALL timestop(handle)
1371 END SUBROUTINE create_w_p
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Handles all functions related to the CELL.
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_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
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)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
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_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
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 libint_potential_types.
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
type(mp_request_type), parameter, public mp_request_null
Routines to calculate 2c- and 3c-integrals for RI with GPW.
subroutine, public integrate_potential_forces_3c_2c(matrix_p_munu, rho_r, rho_g, task_list_sub, pw_env_sub, potential_parameter, ks_env, poisson_env, pot_g, use_virial, rho_g_copy, dvg, h_stress, para_env_sub, kind_of, atom_of_kind, qs_kind_set, particle_set, cell, lll, force, dft_control)
Integrates potential of two Gaussians to a potential.
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 integrate_potential_forces_2c(rho_r, lll, rho_g, atomic_kind_set, qs_kind_set, particle_set, cell, pw_env_sub, poisson_env, pot_g, potential_parameter, use_virial, rho_g_copy, dvg, kind_of, atom_of_kind, g_pq_local, force, h_stress, para_env_sub, dft_control, psi_l, factor)
Integrates the potential of a RI function obtaining the forces and stress tensor.
subroutine, public integrate_potential_forces_3c_1c(mat_munu, rho_r, matrix_p_munu, qs_env, pw_env_sub, task_list_sub)
Takes the precomputed potential of an RI wave-function and determines matrix element and gradients wi...
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_2c_integrate(param, potential_parameter, para_env, qs_env, basis_type_a, basis_type_b, hab, first_b, last_b, eri_method, pab, force_a, force_b, hdab, hadb, reflection_z_a, reflection_z_b, do_reflection_a, do_reflection_b)
high-level integration routine for 2c integrals over CP2K basis sets. Contiguous column-wise distribu...
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 ...
pure subroutine, public mp2_eri_deallocate_forces(force)
...
Routines to calculate gradients of RI-GPW-MP2 energy using pw.
subroutine, public calc_ri_mp2_nonsep(qs_env, mp2_env, para_env, para_env_sub, cell, particle_set, atomic_kind_set, qs_kind_set, mo_coeff, dimen_ri, eigenval, my_group_l_start, my_group_l_end, my_group_l_size, sab_orb_sub, mat_munu, blacs_env_sub)
Calculate the non-separable part of the gradients and update the Lagrangian.
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
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, 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, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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 zero_qs_force(qs_force)
Initialize a Quickstep force data structure.
subroutine, public allocate_qs_force(qs_force, natom_of_kind)
Allocate a Quickstep force data structure.
Define the quickstep kind type and their sub types.
Define the neighbor list data types and the corresponding functionality.
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...
keeps the information about the structure of a full matrix
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.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...