126#include "./base/base_uses.f90"
132 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_main'
188 SUBROUTINE rpa_ri_compute_en(qs_env, Erpa, mp2_env, BIb_C, BIb_C_gw, BIb_C_bse_ij, BIb_C_bse_ab, &
189 para_env, para_env_sub, color_sub, &
190 gd_array, gd_B_virtual, gd_B_all, gd_B_occ_bse, gd_B_virt_bse, &
191 mo_coeff, fm_matrix_PQ, fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, &
192 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, kpoints, &
193 Eigenval, nmo, homo, dimen_RI, dimen_RI_red, gw_corr_lev_occ, gw_corr_lev_virt, &
195 unit_nr, do_ri_sos_laplace_mp2, my_do_gw, do_im_time, do_bse, matrix_s, &
196 mat_munu, mat_P_global, t_3c_M, t_3c_O, t_3c_O_compressed, t_3c_O_ind, &
197 starts_array_mc, ends_array_mc, &
198 starts_array_mc_block, ends_array_mc_block, calc_forces)
201 REAL(kind=
dp),
INTENT(OUT) :: erpa
202 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
204 INTENT(INOUT) :: bib_c, bib_c_gw, bib_c_bse_ij, &
207 INTEGER,
INTENT(INOUT) :: color_sub
210 INTENT(INOUT) :: gd_b_virtual
213 INTENT(INOUT) :: gd_b_occ_bse, gd_b_virt_bse
214 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
216 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
217 fm_matrix_minv_l_kpoints, &
219 fm_matrix_minv_vtrunc_minv
221 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
222 INTENT(INOUT) :: eigenval
223 INTEGER,
INTENT(IN) :: nmo
224 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
225 INTEGER,
INTENT(IN) :: dimen_ri, dimen_ri_red
226 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, &
228 INTEGER,
INTENT(IN) :: unit_nr
229 LOGICAL,
INTENT(IN) :: do_ri_sos_laplace_mp2, my_do_gw, &
234 TYPE(dbt_type) :: t_3c_m
235 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_o
237 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_compressed
239 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_ind
240 INTEGER,
ALLOCATABLE,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
241 starts_array_mc_block, &
243 LOGICAL,
INTENT(IN) :: calc_forces
245 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rpa_ri_compute_en'
247 INTEGER :: best_integ_group_size, best_num_integ_point, color_rpa_group, dimen_nm_gw, &
248 dimen_virt_square, handle, handle2, handle3, ierr, iib, input_num_integ_groups, &
249 integ_group_size, ispin, jjb, min_integ_group_size, my_group_l_end, my_group_l_size, &
250 my_group_l_start, my_nm_gw_end, my_nm_gw_size, my_nm_gw_start, ncol_block_mat, ngroup, &
251 nrow_block_mat, nspins, num_integ_group, num_integ_points, pos_integ_group
252 INTEGER(KIND=int_8) :: mem
253 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dimen_homo_square, dimen_ia, my_ab_comb_bse_end, &
254 my_ab_comb_bse_size, my_ab_comb_bse_start, my_ia_end, my_ia_size, my_ia_start, &
255 my_ij_comb_bse_end, my_ij_comb_bse_size, my_ij_comb_bse_start, virtual
256 LOGICAL :: do_kpoints_from_gamma, do_minimax_quad, &
257 my_open_shell, skip_integ_group_opt
258 REAL(kind=
dp) :: allowed_memory, avail_mem, e_range, emax, emin, mem_for_iak, mem_for_qk, &
259 mem_min, mem_per_group, mem_per_rank, mem_per_repl, mem_real
260 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_kp
261 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_mat_q, fm_mat_q_gemm, fm_mat_s, &
262 fm_mat_s_ab_bse, fm_mat_s_gw, &
267 DIMENSION(:) :: bib_c_2d, bib_c_2d_bse_ab, &
268 bib_c_2d_bse_ij, bib_c_2d_gw
270 CALL timeset(routinen, handle)
281 IF (mp2_env%ri_rpa%do_rse)
THEN
297 my_open_shell = (nspins == 2)
298 ALLOCATE (virtual(nspins), dimen_ia(nspins), my_ia_end(nspins), my_ia_start(nspins), my_ia_size(nspins))
299 virtual(:) = nmo - homo(:)
300 dimen_ia(:) = virtual(:)*homo(:)
302 ALLOCATE (eigenval_kp(nmo, 1, nspins))
303 eigenval_kp(:, 1, :) = eigenval(:, :)
305 IF (do_im_time) mp2_env%ri_rpa%minimax_quad = .true.
306 do_minimax_quad = mp2_env%ri_rpa%minimax_quad
308 IF (do_ri_sos_laplace_mp2)
THEN
309 num_integ_points = mp2_env%ri_laplace%n_quadrature
310 input_num_integ_groups = mp2_env%ri_laplace%num_integ_groups
313 e_range = mp2_env%e_range
314 IF (mp2_env%e_range <= 1.0_dp .OR. mp2_env%e_gap <= 0.0_dp)
THEN
318 IF (homo(ispin) > 0)
THEN
319 emin = min(emin, 2.0_dp*(eigenval(homo(ispin) + 1, ispin) - eigenval(homo(ispin), ispin)))
320 emax = max(emax, 2.0_dp*(maxval(eigenval(:, ispin)) - minval(eigenval(:, ispin))))
325 IF (e_range < 2.0_dp) e_range = 2.0_dp
329 jjb = num_integ_points - 1
331 num_integ_points = num_integ_points - 1
337 cpassert(num_integ_points >= 1)
339 num_integ_points = mp2_env%ri_rpa%rpa_num_quad_points
340 input_num_integ_groups = mp2_env%ri_rpa%rpa_num_integ_groups
341 IF (my_do_gw .AND. do_minimax_quad)
THEN
342 IF (num_integ_points > 34)
THEN
343 IF (unit_nr > 0)
THEN
344 CALL cp_warn(__location__, &
345 "The required number of quadrature point exceeds the maximum possible in the "// &
346 "Minimax quadrature scheme. The number of quadrature point has been reset to 30.")
348 num_integ_points = 30
351 IF (do_minimax_quad .AND. num_integ_points > 20)
THEN
352 IF (unit_nr > 0)
THEN
353 CALL cp_warn(__location__, &
354 "The required number of quadrature point exceeds the maximum possible in the "// &
355 "Minimax quadrature scheme. The number of quadrature point has been reset to 20.")
357 num_integ_points = 20
361 allowed_memory = mp2_env%mp2_memory
363 CALL get_group_dist(gd_array, color_sub, my_group_l_start, my_group_l_end, my_group_l_size)
365 ngroup = para_env%num_pe/para_env_sub%num_pe
368 IF (do_im_time .OR. mp2_env%ri_g0w0%do_periodic .OR. do_bse)
THEN
370 integ_group_size = ngroup
371 best_num_integ_point = num_integ_points
377 mem_for_iak = real(sum(dimen_ia), kind=
dp)*dimen_ri_red*8.0_dp/(1024_dp**2)
378 mem_for_qk = real(dimen_ri_red, kind=
dp)*nspins*dimen_ri_red*8.0_dp/(1024_dp**2)
381 mem_real = (mem + 1024*1024 - 1)/(1024*1024)
382 CALL para_env%min(mem_real)
384 mem_per_rank = 0.0_dp
387 mem_per_repl = mem_for_iak
389 mem_per_repl = mem_per_repl + 2.0_dp*mem_for_qk
391 IF (calc_forces)
CALL rpa_grad_needed_mem(homo, virtual, dimen_ri_red, mem_per_rank, mem_per_repl, do_ri_sos_laplace_mp2)
394 mem_min = mem_per_repl/para_env%num_pe + mem_per_rank
396 IF (unit_nr > 0)
THEN
397 WRITE (unit_nr,
'(T3,A,T68,F9.2,A4)')
'RI_INFO| Minimum required memory per MPI process:', mem_min,
' MiB'
398 WRITE (unit_nr,
'(T3,A,T68,F9.2,A4)')
'RI_INFO| Available memory per MPI process:', mem_real,
' MiB'
402 mem_real = min(mem_real, allowed_memory)
404 mem_real = mem_real - mem_per_rank
406 mem_per_group = mem_real*para_env_sub%num_pe
409 skip_integ_group_opt = .false.
412 IF (input_num_integ_groups > 0)
THEN
413 IF (num_integ_points < input_num_integ_groups)
THEN
414 IF (mod(ngroup, input_num_integ_groups) == 0)
THEN
415 best_integ_group_size = ngroup/input_num_integ_groups
416 best_num_integ_point = (num_integ_points + input_num_integ_groups - 1)/input_num_integ_groups
417 skip_integ_group_opt = .true.
419 IF (unit_nr > 0)
WRITE (unit_nr,
'(T3,A)')
'Total number of groups not multiple of NUM_INTEG_GROUPS'
422 IF (unit_nr > 0)
WRITE (unit_nr,
'(T3,A)')
'Too many integration groups for the given number of quadrature points'
426 IF (.NOT. skip_integ_group_opt)
THEN
427 best_integ_group_size = ngroup
428 best_num_integ_point = num_integ_points
430 min_integ_group_size = max(1, ngroup/num_integ_points)
432 integ_group_size = min_integ_group_size - 1
433 DO iib = min_integ_group_size + 1, ngroup
434 integ_group_size = integ_group_size + 1
437 IF (mod(ngroup, integ_group_size) /= 0) cycle
440 avail_mem = integ_group_size*mem_per_group
441 IF (avail_mem < mem_per_repl) cycle
444 num_integ_group = ngroup/integ_group_size
446 best_num_integ_point = (num_integ_points + num_integ_group - 1)/num_integ_group
447 best_integ_group_size = integ_group_size
454 integ_group_size = best_integ_group_size
458 IF (unit_nr > 0 .AND. .NOT. do_im_time)
THEN
459 IF (do_ri_sos_laplace_mp2)
THEN
460 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
461 "RI_INFO| Group size for laplace numerical integration:", integ_group_size*para_env_sub%num_pe
462 WRITE (unit=unit_nr, fmt=
"(T3,A)") &
463 "INTEG_INFO| MINIMAX approximation"
464 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
465 "INTEG_INFO| Number of integration points:", num_integ_points
466 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
467 "INTEG_INFO| Max. number of integration points per Laplace group:", best_num_integ_point
469 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
470 "RI_INFO| Group size for frequency integration:", integ_group_size*para_env_sub%num_pe
471 IF (do_minimax_quad)
THEN
472 WRITE (unit=unit_nr, fmt=
"(T3,A)") &
473 "INTEG_INFO| MINIMAX quadrature"
475 WRITE (unit=unit_nr, fmt=
"(T3,A)") &
476 "INTEG_INFO| Clenshaw-Curtius quadrature"
478 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
479 "INTEG_INFO| Number of integration points:", num_integ_points
480 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
481 "INTEG_INFO| Max. number of integration points per RPA group:", best_num_integ_point
486 num_integ_group = ngroup/integ_group_size
488 pos_integ_group = mod(color_sub, integ_group_size)
489 color_rpa_group = color_sub/integ_group_size
491 CALL timeset(routinen//
"_reorder", handle2)
495 ALLOCATE (bib_c_2d(nspins))
497 IF (.NOT. do_im_time)
THEN
502 CALL calculate_bib_c_2d(bib_c_2d(ispin)%array, bib_c(ispin)%array, para_env_sub, dimen_ia(ispin), &
503 homo(ispin), virtual(ispin), gd_b_virtual(ispin), &
504 my_ia_size(ispin), my_ia_start(ispin), my_ia_end(ispin), my_group_l_size)
506 DEALLOCATE (bib_c(ispin)%array)
513 ALLOCATE (bib_c_2d_gw(nspins))
515 CALL timeset(routinen//
"_reorder_gw", handle3)
517 dimen_nm_gw = nmo*(gw_corr_lev_occ(1) + gw_corr_lev_virt(1))
521 CALL calculate_bib_c_2d(bib_c_2d_gw(ispin)%array, bib_c_gw(ispin)%array, para_env_sub, dimen_nm_gw, &
522 gw_corr_lev_occ(ispin) + gw_corr_lev_virt(ispin), nmo, gd_b_all, &
523 my_nm_gw_size, my_nm_gw_start, my_nm_gw_end, my_group_l_size)
524 DEALLOCATE (bib_c_gw(ispin)%array)
529 CALL timestop(handle3)
536 CALL timeset(routinen//
"_reorder_bse1", handle3)
538 ALLOCATE (bib_c_2d_bse_ij(nspins), bib_c_2d_bse_ab(nspins))
539 ALLOCATE (dimen_homo_square(nspins))
540 ALLOCATE (my_ij_comb_bse_size(nspins), my_ij_comb_bse_start(nspins), my_ij_comb_bse_end(nspins))
541 ALLOCATE (my_ab_comb_bse_size(nspins), my_ab_comb_bse_start(nspins), my_ab_comb_bse_end(nspins))
546 dimen_homo_square(ispin) = homo(ispin)**2
547 CALL calculate_bib_c_2d(bib_c_2d_bse_ij(ispin)%array, bib_c_bse_ij(ispin)%array, para_env_sub, &
548 dimen_homo_square(ispin), homo(ispin), homo(ispin), gd_b_occ_bse(ispin), &
549 my_ij_comb_bse_size(ispin), my_ij_comb_bse_start(ispin), &
550 my_ij_comb_bse_end(ispin), my_group_l_size)
551 DEALLOCATE (bib_c_bse_ij(ispin)%array)
555 CALL timestop(handle3)
557 CALL timeset(routinen//
"_reorder_bse2", handle3)
561 dimen_virt_square = bse_lev_virt(ispin)**2
562 CALL calculate_bib_c_2d(bib_c_2d_bse_ab(ispin)%array, bib_c_bse_ab(ispin)%array, para_env_sub, &
563 dimen_virt_square, bse_lev_virt(ispin), bse_lev_virt(ispin), gd_b_virt_bse(ispin), &
564 my_ab_comb_bse_size(ispin), my_ab_comb_bse_start(ispin), &
565 my_ab_comb_bse_end(ispin), my_group_l_size)
566 DEALLOCATE (bib_c_bse_ab(ispin)%array)
570 CALL timestop(handle3)
574 CALL timestop(handle2)
576 IF (num_integ_group > 1)
THEN
577 ALLOCATE (para_env_rpa)
578 CALL para_env_rpa%from_split(para_env, color_rpa_group)
580 para_env_rpa => para_env
587 ALLOCATE (fm_mat_q(nspins), fm_mat_q_gemm(1), fm_mat_s(1))
589 ALLOCATE (fm_mat_q(nspins), fm_mat_q_gemm(nspins), fm_mat_s(nspins))
592 CALL create_integ_mat(bib_c_2d, para_env, para_env_sub, color_sub, ngroup, integ_group_size, &
593 dimen_ri_red, dimen_ia, color_rpa_group, &
594 mp2_env%block_size_row, mp2_env%block_size_col, unit_nr, &
595 my_ia_size, my_ia_start, my_ia_end, &
596 my_group_l_size, my_group_l_start, my_group_l_end, &
597 para_env_rpa, fm_mat_s, nrow_block_mat, ncol_block_mat, &
598 dimen_ia_for_block_size=dimen_ia(1), &
599 do_im_time=do_im_time, fm_mat_q_gemm=fm_mat_q_gemm, fm_mat_q=fm_mat_q, qs_env=qs_env)
601 DEALLOCATE (bib_c_2d, my_ia_end, my_ia_size, my_ia_start)
604 ALLOCATE (fm_mat_s_gw(nspins))
605 IF (my_do_gw .AND. .NOT. do_im_time)
THEN
607 CALL create_integ_mat(bib_c_2d_gw, para_env, para_env_sub, color_sub, ngroup, integ_group_size, &
608 dimen_ri_red, [dimen_nm_gw, dimen_nm_gw], color_rpa_group, &
609 mp2_env%block_size_row, mp2_env%block_size_col, unit_nr, &
610 [my_nm_gw_size, my_nm_gw_size], [my_nm_gw_start, my_nm_gw_start], [my_nm_gw_end, my_nm_gw_end], &
611 my_group_l_size, my_group_l_start, my_group_l_end, &
612 para_env_rpa, fm_mat_s_gw, nrow_block_mat, ncol_block_mat, &
613 fm_mat_q(1)%matrix_struct%context, fm_mat_q(1)%matrix_struct%context, &
614 fm_mat_q=fm_mat_r_gw)
615 DEALLOCATE (bib_c_2d_gw)
621 ALLOCATE (fm_mat_s_ij_bse(nspins), fm_mat_s_ab_bse(nspins))
622 CALL create_integ_mat(bib_c_2d_bse_ij, para_env, para_env_sub, color_sub, ngroup, integ_group_size, &
623 dimen_ri_red, dimen_homo_square, color_rpa_group, &
624 mp2_env%block_size_row, mp2_env%block_size_col, unit_nr, &
625 my_ij_comb_bse_size, my_ij_comb_bse_start, my_ij_comb_bse_end, &
626 my_group_l_size, my_group_l_start, my_group_l_end, &
627 para_env_rpa, fm_mat_s_ij_bse, nrow_block_mat, ncol_block_mat, &
628 fm_mat_q(1)%matrix_struct%context, fm_mat_q(1)%matrix_struct%context)
630 CALL create_integ_mat(bib_c_2d_bse_ab, para_env, para_env_sub, color_sub, ngroup, integ_group_size, &
631 dimen_ri_red, [(bse_lev_virt(ispin)**2, ispin=1, nspins)], color_rpa_group, &
632 mp2_env%block_size_row, mp2_env%block_size_col, unit_nr, &
633 my_ab_comb_bse_size, my_ab_comb_bse_start, my_ab_comb_bse_end, &
634 my_group_l_size, my_group_l_start, my_group_l_end, &
635 para_env_rpa, fm_mat_s_ab_bse, nrow_block_mat, ncol_block_mat, &
636 fm_mat_q(1)%matrix_struct%context, fm_mat_q(1)%matrix_struct%context)
640 do_kpoints_from_gamma = qs_env%mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma
641 IF (do_kpoints_from_gamma)
THEN
647 CALL rpa_num_int(qs_env, erpa, mp2_env, para_env, para_env_rpa, para_env_sub, unit_nr, &
648 homo, virtual, dimen_ri, dimen_ri_red, dimen_ia, dimen_nm_gw, &
649 eigenval_kp, num_integ_points, num_integ_group, color_rpa_group, &
650 fm_matrix_pq, fm_mat_s, fm_mat_q_gemm, fm_mat_q, fm_mat_s_gw, fm_mat_r_gw(1), &
651 fm_mat_s_ij_bse, fm_mat_s_ab_bse, &
652 my_do_gw, do_bse, gw_corr_lev_occ, gw_corr_lev_virt, &
655 do_im_time, mo_coeff, &
656 fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, &
657 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, mat_munu, mat_p_global, &
658 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
659 starts_array_mc, ends_array_mc, &
660 starts_array_mc_block, ends_array_mc_block, &
661 matrix_s, do_kpoints_from_gamma, kpoints, gd_array, color_sub, &
662 do_ri_sos_laplace_mp2=do_ri_sos_laplace_mp2, calc_forces=calc_forces)
668 IF (.NOT. do_im_time)
THEN
674 IF (my_do_gw .AND. .NOT. do_im_time)
THEN
684 DEALLOCATE (fm_mat_s_ij_bse, fm_mat_s_ab_bse)
687 CALL timestop(handle)
708 SUBROUTINE calculate_bib_c_2d(BIb_C_2D, BIb_C, para_env_sub, dimen_ia, homo, virtual, &
710 my_ia_size, my_ia_start, my_ia_end, my_group_L_size)
712 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
713 INTENT(OUT) :: bib_c_2d
714 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
717 INTEGER,
INTENT(IN) :: dimen_ia, homo, virtual
719 INTEGER :: my_ia_size, my_ia_start, my_ia_end, &
722 INTEGER,
PARAMETER :: occ_chunk = 128
724 INTEGER :: ia_global, iib, itmp(2), jjb, my_b_size, my_b_virtual_start, occ_high, occ_low, &
725 proc_receive, proc_send, proc_shift, rec_b_size, rec_b_virtual_end, rec_b_virtual_start
726 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:),
TARGET :: bib_c_rec_1d
727 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: bib_c_rec
729 itmp =
get_limit(dimen_ia, para_env_sub%num_pe, para_env_sub%mepos)
730 my_ia_start = itmp(1)
732 my_ia_size = my_ia_end - my_ia_start + 1
734 CALL get_group_dist(gd_b_virtual, para_env_sub%mepos, sizes=my_b_size, starts=my_b_virtual_start)
737 ALLOCATE (bib_c_2d(my_group_l_size, my_ia_size))
743 DO jjb = 1, my_b_size
744 ia_global = (iib - 1)*virtual + my_b_virtual_start + jjb - 1
745 IF (ia_global >= my_ia_start .AND. ia_global <= my_ia_end)
THEN
746 bib_c_2d(1:my_group_l_size, ia_global - my_ia_start + 1) = bib_c(1:my_group_l_size, jjb, iib)
751 IF (para_env_sub%num_pe > 1)
THEN
752 ALLOCATE (bib_c_rec_1d(int(my_group_l_size,
int_8)*
maxsize(gd_b_virtual)*min(homo, occ_chunk)))
753 DO proc_shift = 1, para_env_sub%num_pe - 1
754 proc_send =
modulo(para_env_sub%mepos + proc_shift, para_env_sub%num_pe)
755 proc_receive =
modulo(para_env_sub%mepos - proc_shift, para_env_sub%num_pe)
757 CALL get_group_dist(gd_b_virtual, proc_receive, rec_b_virtual_start, rec_b_virtual_end, rec_b_size)
760 DO occ_low = 1, homo, occ_chunk
761 occ_high = min(homo, occ_low + occ_chunk - 1)
762 bib_c_rec(1:my_group_l_size, 1:rec_b_size, 1:occ_high - occ_low + 1) => &
763 bib_c_rec_1d(1:int(my_group_l_size,
int_8)*rec_b_size*(occ_high - occ_low + 1))
764 CALL para_env_sub%sendrecv(bib_c(:, :, occ_low:occ_high), proc_send, &
765 bib_c_rec(:, :, 1:occ_high - occ_low + 1), proc_receive)
769 DO iib = occ_low, occ_high
770 DO jjb = 1, rec_b_size
771 ia_global = (iib - 1)*virtual + rec_b_virtual_start + jjb - 1
772 IF (ia_global >= my_ia_start .AND. ia_global <= my_ia_end)
THEN
773 bib_c_2d(1:my_group_l_size, ia_global - my_ia_start + 1) = bib_c_rec(1:my_group_l_size, jjb, iib - occ_low + 1)
780 DEALLOCATE (bib_c_rec_1d)
783 END SUBROUTINE calculate_bib_c_2d
817 SUBROUTINE create_integ_mat(BIb_C_2D, para_env, para_env_sub, color_sub, ngroup, integ_group_size, &
818 dimen_RI, dimen_ia, color_rpa_group, &
819 ext_row_block_size, ext_col_block_size, unit_nr, &
820 my_ia_size, my_ia_start, my_ia_end, &
821 my_group_L_size, my_group_L_start, my_group_L_end, &
822 para_env_RPA, fm_mat_S, nrow_block_mat, ncol_block_mat, &
823 blacs_env_ext, blacs_env_ext_S, dimen_ia_for_block_size, &
824 do_im_time, fm_mat_Q_gemm, fm_mat_Q, qs_env)
827 INTENT(INOUT) :: bib_c_2d
829 INTEGER,
INTENT(IN) :: color_sub, ngroup, integ_group_size, &
831 INTEGER,
DIMENSION(:),
INTENT(IN) :: dimen_ia
832 INTEGER,
INTENT(IN) :: color_rpa_group, ext_row_block_size, &
833 ext_col_block_size, unit_nr
834 INTEGER,
DIMENSION(:),
INTENT(IN) :: my_ia_size, my_ia_start, my_ia_end
835 INTEGER,
INTENT(IN) :: my_group_l_size, my_group_l_start, &
838 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: fm_mat_s
839 INTEGER,
INTENT(INOUT) :: nrow_block_mat, ncol_block_mat
841 INTEGER,
INTENT(IN),
OPTIONAL :: dimen_ia_for_block_size
842 LOGICAL,
INTENT(IN),
OPTIONAL :: do_im_time
843 TYPE(
cp_fm_type),
DIMENSION(:),
OPTIONAL :: fm_mat_q_gemm, fm_mat_q
847 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_integ_mat'
849 INTEGER :: col_row_proc_ratio, grid_2d(2), handle, &
850 iproc, iproc_col, iproc_row, ispin, &
852 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: group_grid_2_mepos
853 LOGICAL :: my_blacs_ext, my_blacs_s_ext, &
859 CALL timeset(routinen, handle)
861 cpassert(
PRESENT(blacs_env_ext) .OR.
PRESENT(dimen_ia_for_block_size))
863 my_blacs_ext = .false.
864 IF (
PRESENT(blacs_env_ext)) my_blacs_ext = .true.
866 my_blacs_s_ext = .false.
867 IF (
PRESENT(blacs_env_ext_s)) my_blacs_s_ext = .true.
869 my_do_im_time = .false.
870 IF (
PRESENT(do_im_time)) my_do_im_time = do_im_time
874 IF (my_blacs_s_ext)
THEN
875 blacs_env => blacs_env_ext_s
877 IF (para_env_rpa%num_pe > 1)
THEN
878 col_row_proc_ratio = max(1, dimen_ia_for_block_size/dimen_ri)
880 iproc_col = min(max(int(sqrt(real(para_env_rpa%num_pe*col_row_proc_ratio, kind=
dp))), 1), para_env_rpa%num_pe) + 1
881 DO iproc = 1, para_env_rpa%num_pe
882 iproc_col = iproc_col - 1
883 IF (mod(para_env_rpa%num_pe, iproc_col) == 0)
EXIT
886 iproc_row = para_env_rpa%num_pe/iproc_col
887 grid_2d(1) = iproc_row
888 grid_2d(2) = iproc_col
894 IF (unit_nr > 0 .AND. .NOT. my_do_im_time)
THEN
895 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
896 "MATRIX_INFO| Number row processes:", grid_2d(1)
897 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
898 "MATRIX_INFO| Number column processes:", grid_2d(2)
902 IF (ext_row_block_size > 0)
THEN
903 nrow_block_mat = ext_row_block_size
905 nrow_block_mat = max(1, dimen_ri/grid_2d(1)/2)
909 IF (ext_col_block_size > 0)
THEN
910 ncol_block_mat = ext_col_block_size
912 ncol_block_mat = max(1, dimen_ia_for_block_size/grid_2d(2)/2)
915 IF (unit_nr > 0 .AND. .NOT. my_do_im_time)
THEN
916 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
917 "MATRIX_INFO| Row block size:", nrow_block_mat
918 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
919 "MATRIX_INFO| Column block size:", ncol_block_mat
923 IF (.NOT. my_do_im_time)
THEN
924 DO ispin = 1,
SIZE(bib_c_2d)
926 IF (my_blacs_ext)
THEN
928 ncol_global=dimen_ia(ispin), para_env=para_env_rpa)
931 ncol_global=dimen_ia(ispin), para_env=para_env_rpa, &
932 nrow_block=nrow_block_mat, ncol_block=ncol_block_mat, force_block=.true.)
936 CALL create_group_dist(gd_ia, my_ia_start(ispin), my_ia_end(ispin), my_ia_size(ispin), para_env_rpa)
937 CALL create_group_dist(gd_l, my_group_l_start, my_group_l_end, my_group_l_size, para_env_rpa)
941 mepos_in_rpa_group = mod(color_sub, integ_group_size)
942 ALLOCATE (group_grid_2_mepos(0:integ_group_size - 1, 0:para_env_sub%num_pe - 1))
943 group_grid_2_mepos = 0
944 group_grid_2_mepos(mepos_in_rpa_group, para_env_sub%mepos) = para_env_rpa%mepos
945 CALL para_env_rpa%sum(group_grid_2_mepos)
947 CALL array2fm(bib_c_2d(ispin)%array, fm_struct, my_group_l_start, my_group_l_end, &
948 my_ia_start(ispin), my_ia_end(ispin), gd_l, gd_ia, &
949 group_grid_2_mepos, ngroup, para_env_sub%num_pe, fm_mat_s(ispin), &
950 integ_group_size, color_rpa_group)
952 DEALLOCATE (group_grid_2_mepos)
960 IF (para_env_rpa%num_pe /= para_env%num_pe)
THEN
963 comm_exchange = fm_mat_s(ispin)%matrix_struct%context%interconnect(para_env)
964 CALL comm_exchange%sum(fm_mat_s(ispin)%local_data)
965 CALL comm_exchange%free()
971 IF (
PRESENT(fm_mat_q_gemm) .AND. .NOT. my_do_im_time)
THEN
975 ncol_global=dimen_ri, para_env=para_env_rpa, &
976 nrow_block=nrow_block_mat, ncol_block=ncol_block_mat, force_block=.true.)
977 DO ispin = 1,
SIZE(fm_mat_q_gemm)
978 CALL cp_fm_create(fm_mat_q_gemm(ispin), fm_struct, name=
"fm_mat_Q_gemm")
983 IF (
PRESENT(fm_mat_q))
THEN
984 NULLIFY (blacs_env_q)
985 IF (my_blacs_ext)
THEN
986 blacs_env_q => blacs_env_ext
987 ELSE IF (para_env_rpa%num_pe == para_env%num_pe .AND.
PRESENT(qs_env))
THEN
988 CALL get_qs_env(qs_env, blacs_env=blacs_env_q)
994 ncol_global=dimen_ri, para_env=para_env_rpa)
995 DO ispin = 1,
SIZE(fm_mat_q)
996 CALL cp_fm_create(fm_mat_q(ispin), fm_struct, name=
"fm_mat_Q", set_zero=.true.)
1001 IF (.NOT. (my_blacs_ext .OR. (para_env_rpa%num_pe == para_env%num_pe .AND.
PRESENT(qs_env))))
THEN
1007 IF (.NOT. my_blacs_s_ext)
THEN
1013 CALL timestop(handle)
1015 END SUBROUTINE create_integ_mat
1074 SUBROUTINE rpa_num_int(qs_env, Erpa, mp2_env, para_env, para_env_RPA, para_env_sub, unit_nr, &
1075 homo, virtual, dimen_RI, dimen_RI_red, dimen_ia, dimen_nm_gw, &
1076 Eigenval, num_integ_points, num_integ_group, color_rpa_group, &
1077 fm_matrix_PQ, fm_mat_S, fm_mat_Q_gemm, fm_mat_Q, fm_mat_S_gw, fm_mat_R_gw, &
1078 fm_mat_S_ij_bse, fm_mat_S_ab_bse, &
1079 my_do_gw, do_bse, gw_corr_lev_occ, gw_corr_lev_virt, &
1081 do_minimax_quad, do_im_time, mo_coeff, &
1082 fm_matrix_L_kpoints, fm_matrix_Minv_L_kpoints, &
1083 fm_matrix_Minv, fm_matrix_Minv_Vtrunc_Minv, mat_munu, mat_P_global, &
1084 t_3c_M, t_3c_O, t_3c_O_compressed, t_3c_O_ind, &
1085 starts_array_mc, ends_array_mc, &
1086 starts_array_mc_block, ends_array_mc_block, &
1087 matrix_s, do_kpoints_from_Gamma, kpoints, gd_array, color_sub, &
1088 do_ri_sos_laplace_mp2, calc_forces)
1090 TYPE(qs_environment_type),
POINTER :: qs_env
1091 REAL(kind=dp),
INTENT(OUT) :: erpa
1092 TYPE(mp2_type) :: mp2_env
1093 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_rpa, para_env_sub
1094 INTEGER,
INTENT(IN) :: unit_nr
1095 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, virtual
1096 INTEGER,
INTENT(IN) :: dimen_ri, dimen_ri_red
1097 INTEGER,
DIMENSION(:),
INTENT(IN) :: dimen_ia
1098 INTEGER,
INTENT(IN) :: dimen_nm_gw
1099 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
1100 INTENT(INOUT) :: eigenval
1101 INTEGER,
INTENT(IN) :: num_integ_points, num_integ_group, &
1103 TYPE(cp_fm_type),
INTENT(IN) :: fm_matrix_pq
1104 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: fm_mat_s
1105 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_q_gemm, fm_mat_q, fm_mat_s_gw
1106 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_r_gw
1107 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s_ij_bse, fm_mat_s_ab_bse
1108 LOGICAL,
INTENT(IN) :: my_do_gw, do_bse
1109 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, &
1111 LOGICAL,
INTENT(IN) :: do_minimax_quad, do_im_time
1112 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
1113 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
1114 fm_matrix_minv_l_kpoints, &
1116 fm_matrix_minv_vtrunc_minv
1117 TYPE(dbcsr_p_type),
INTENT(IN) :: mat_munu
1118 TYPE(dbcsr_p_type),
INTENT(INOUT) :: mat_p_global
1119 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_m
1120 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :), &
1121 INTENT(INOUT) :: t_3c_o
1122 TYPE(hfx_compression_type),
ALLOCATABLE, &
1123 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_compressed
1124 TYPE(block_ind_type),
ALLOCATABLE, &
1125 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_ind
1126 INTEGER,
ALLOCATABLE,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc, &
1127 starts_array_mc_block, &
1129 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
1130 LOGICAL :: do_kpoints_from_gamma
1131 TYPE(kpoint_type),
POINTER :: kpoints
1132 TYPE(group_dist_d1_type),
INTENT(IN) :: gd_array
1133 INTEGER,
INTENT(IN) :: color_sub
1134 LOGICAL,
INTENT(IN) :: do_ri_sos_laplace_mp2, calc_forces
1136 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rpa_num_int'
1138 COMPLEX(KIND=dp),
ALLOCATABLE, &
1139 DIMENSION(:, :, :, :) :: vec_sigma_c_gw
1140 INTEGER :: count_ev_sc_gw, cut_memory, group_size_p, gw_corr_lev_tot, handle, handle3, i, &
1141 ikp_local, ispin, iter_evgw, iter_sc_gw0, j, jquad, min_bsize, mm_style, nkp, &
1142 nkp_self_energy, nmo, nspins, num_3c_repl, num_cells_dm, num_fit_points, pspin, qspin, &
1144 INTEGER(int_8) :: dbcsr_nflop
1145 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: index_to_cell_3c
1146 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :) :: cell_to_index_3c
1147 INTEGER,
DIMENSION(:),
POINTER :: col_blk_size, prim_blk_sizes, &
1149 LOGICAL :: do_apply_ic_corr_to_gw, do_gw_im_time, do_ic_model, do_kpoints_cubic_rpa, &
1150 do_periodic, do_print, do_ri_sigma_x, exit_ev_gw, first_cycle, &
1151 first_cycle_periodic_correction, my_open_shell, print_ic_values
1152 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :, :, :) :: has_mat_p_blocks
1153 REAL(kind=dp) :: alpha, dbcsr_time, e_exchange, e_exchange_corr, eps_filter, &
1154 eps_filter_im_time, ext_scaling, fermi_level_offset, fermi_level_offset_input, &
1155 my_flop_rate, omega, omega_max_fit, omega_old, tau, tau_old
1156 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: delta_corr, e_fermi, trace_qomega, &
1157 vec_omega_fit_gw, wkp_w
1158 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: vec_w_gw
1159 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_last, eigenval_scf, &
1161 TYPE(cp_cfm_type) :: cfm_mat_q
1162 TYPE(cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: cfm_mo_coeff
1163 TYPE(cp_fm_type) :: fm_mat_q_static_bse_gemm, &
1164 fm_mat_ri_global_work, fm_mat_work
1165 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_mat_s_gw_work, fm_mat_s_ia_bse, &
1167 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_mat_l_kpoints, fm_mat_minv_l_kpoints
1168 TYPE(dbcsr_p_type) :: mat_dm, mat_l, mat_m_p_munu_occ, &
1169 mat_m_p_munu_virt, mat_minvvminv
1170 TYPE(dbcsr_p_type),
ALLOCATABLE, &
1171 DIMENSION(:, :, :) :: mat_p_omega
1172 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_im_mo_mo, &
1173 matrix_berry_re_mo_mo
1174 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_p_omega_kp
1175 TYPE(dbcsr_type),
POINTER :: mat_w, mat_work
1176 TYPE(dbt_type) :: t_3c_overl_int_ao_mo
1177 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_3c_overl_int_gw_ao, &
1178 t_3c_overl_int_gw_ri, &
1179 t_3c_overl_nnp_ic, &
1180 t_3c_overl_nnp_ic_reflected
1181 TYPE(dgemm_counter_type) :: dgemm_counter
1182 TYPE(hfx_compression_type),
ALLOCATABLE, &
1183 DIMENSION(:) :: t_3c_o_mo_compressed
1184 TYPE(im_time_force_type) :: force_data
1185 TYPE(rpa_exchange_work_type) :: exchange_work
1187 TYPE(rpa_sigma_type) :: rpa_sigma
1188 TYPE(time_frequency_grid_type) :: time_frequency_grid
1189 TYPE(two_dim_int_array),
ALLOCATABLE,
DIMENSION(:) :: t_3c_o_mo_ind
1191 CALL timeset(routinen, handle)
1194 nmo = homo(1) + virtual(1)
1196 my_open_shell = (nspins == 2)
1198 do_gw_im_time = my_do_gw .AND. do_im_time
1199 do_ri_sigma_x = mp2_env%ri_g0w0%do_ri_Sigma_x
1200 do_ic_model = mp2_env%ri_g0w0%do_ic_model
1201 print_ic_values = mp2_env%ri_g0w0%print_ic_values
1202 do_periodic = mp2_env%ri_g0w0%do_periodic
1203 do_kpoints_cubic_rpa = mp2_env%ri_rpa_im_time%do_im_time_kpoints
1206 mm_style = wfc_mm_style_gemm
1207 IF (.NOT. do_ri_sos_laplace_mp2) mm_style = mp2_env%ri_rpa%mm_style
1210 ext_scaling = 0.2_dp
1211 omega_max_fit = mp2_env%ri_g0w0%omega_max_fit
1212 fermi_level_offset_input = mp2_env%ri_g0w0%fermi_level_offset
1213 iter_evgw = mp2_env%ri_g0w0%iter_evGW
1214 iter_sc_gw0 = mp2_env%ri_g0w0%iter_sc_GW0
1215 IF ((.NOT. do_im_time))
THEN
1216 IF (iter_sc_gw0 /= 1 .AND. iter_evgw /= 1) cpabort(
"Mixed scGW0/evGW not implemented.")
1218 IF (iter_sc_gw0 /= 1) iter_evgw = iter_sc_gw0
1221 ext_scaling = 0.0_dp
1226 IF (do_kpoints_cubic_rpa .AND. do_ri_sos_laplace_mp2)
THEN
1227 cpabort(
"RI-SOS-Laplace-MP2 with k-point-sampling is not implemented.")
1230 do_apply_ic_corr_to_gw = .false.
1231 IF (mp2_env%ri_g0w0%ic_corr_list(1)%array(1) > 0.0_dp) do_apply_ic_corr_to_gw = .true.
1233 IF (do_im_time)
THEN
1234 cpassert(do_minimax_quad .OR. do_ri_sos_laplace_mp2)
1236 group_size_p = mp2_env%ri_rpa_im_time%group_size_P
1237 cut_memory = mp2_env%ri_rpa_im_time%cut_memory
1238 eps_filter = mp2_env%ri_rpa_im_time%eps_filter
1239 eps_filter_im_time = mp2_env%ri_rpa_im_time%eps_filter* &
1240 mp2_env%ri_rpa_im_time%eps_filter_factor
1242 min_bsize = mp2_env%ri_rpa_im_time%min_bsize
1244 CALL alloc_im_time(qs_env, para_env, dimen_ri, dimen_ri_red, &
1245 num_integ_points, nspins, fm_mat_q(1), cfm_mo_coeff, &
1246 fm_matrix_minv_l_kpoints, fm_matrix_l_kpoints, mat_p_global, &
1247 t_3c_o, matrix_s, kpoints, eps_filter_im_time, &
1248 cut_memory, nkp, num_cells_dm, num_3c_repl, &
1249 size_p, ikp_local, &
1253 do_ic_model, do_kpoints_cubic_rpa, &
1254 do_kpoints_from_gamma, do_ri_sigma_x, my_open_shell, &
1255 has_mat_p_blocks, wkp_w, &
1256 cfm_mat_q, fm_mat_minv_l_kpoints, fm_mat_l_kpoints, &
1257 fm_mat_ri_global_work, fm_mat_work, mat_dm, mat_l, mat_m_p_munu_occ, mat_m_p_munu_virt, &
1258 mat_minvvminv, mat_p_omega, mat_p_omega_kp, mat_work, mo_coeff)
1260 IF (calc_forces)
CALL init_im_time_forces(force_data, fm_matrix_pq, t_3c_m, unit_nr, mp2_env, qs_env)
1264 CALL dbcsr_get_info(mat_p_global%matrix, &
1265 row_blk_size=ri_blk_sizes)
1267 CALL dbcsr_get_info(matrix_s(1)%matrix, &
1268 row_blk_size=prim_blk_sizes)
1270 gw_corr_lev_tot = gw_corr_lev_occ(1) + gw_corr_lev_virt(1)
1272 IF (.NOT. do_kpoints_cubic_rpa)
THEN
1273 CALL allocate_matrices_gw_im_time(gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, &
1274 num_integ_points, unit_nr, &
1275 ri_blk_sizes, do_ic_model, &
1276 para_env, fm_mat_w, fm_mat_q(1), &
1278 t_3c_overl_int_ao_mo, t_3c_o_mo_compressed, t_3c_o_mo_ind, &
1279 t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, &
1280 starts_array_mc, ends_array_mc, &
1281 t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected, &
1282 matrix_s, mat_w, t_3c_o, &
1283 t_3c_o_compressed, t_3c_o_ind, &
1290 IF (do_ic_model)
THEN
1292 cpassert(do_gw_im_time)
1293 cpassert(.NOT. do_periodic)
1294 IF (cut_memory /= 1) cpabort(
"For IC, use MEMORY_CUT 1 in the LOW_SCALING section.")
1297 ALLOCATE (e_fermi(nspins))
1298 IF (do_minimax_quad .OR. do_ri_sos_laplace_mp2)
THEN
1299 do_print = .NOT. do_ic_model
1300 CALL get_minimax_grid(para_env, unit_nr, homo, eigenval, num_integ_points, do_im_time, &
1301 do_ri_sos_laplace_mp2, do_print, &
1302 qs_env, do_gw_im_time, do_kpoints_cubic_rpa, e_fermi(1), time_frequency_grid)
1305 IF (qs_env%mp2_env%ri_rpa_im_time%keep_quad)
THEN
1306 CALL keep_initial_quad(time_frequency_grid, do_ri_sos_laplace_mp2, do_im_time, unit_nr, qs_env)
1309 IF (calc_forces) cpabort(
"Forces with Clenshaw-Curtis grid not implemented.")
1310 CALL get_clenshaw_grid(para_env, para_env_rpa, unit_nr, homo, virtual, eigenval, num_integ_points, &
1311 num_integ_group, color_rpa_group, fm_mat_s, my_do_gw, &
1312 ext_scaling, time_frequency_grid)
1316 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1317 ALLOCATE (trace_qomega(dimen_ri_red))
1320 IF (do_ri_sos_laplace_mp2 .AND. .NOT. do_im_time)
THEN
1322 ELSE IF (my_open_shell .OR. do_ri_sos_laplace_mp2)
THEN
1328 CALL allocate_matrices_gw(vec_sigma_c_gw, color_rpa_group, dimen_nm_gw, &
1329 gw_corr_lev_occ, gw_corr_lev_virt, homo, &
1330 nmo, num_integ_group, unit_nr, &
1331 gw_corr_lev_tot, num_fit_points, omega_max_fit, &
1332 do_minimax_quad, do_periodic, do_ri_sigma_x,.NOT. do_im_time, &
1333 first_cycle_periodic_correction, &
1334 time_frequency_grid, eigenval, vec_omega_fit_gw, vec_sigma_x_gw, &
1335 delta_corr, eigenval_last, eigenval_scf, vec_w_gw, &
1336 fm_mat_s_gw, fm_mat_s_gw_work, &
1337 para_env, mp2_env, kpoints, nkp, nkp_self_energy, &
1338 do_kpoints_cubic_rpa, do_kpoints_from_gamma)
1342 CALL cp_fm_create(fm_mat_q_static_bse_gemm, fm_mat_q_gemm(1)%matrix_struct, set_zero=.true.)
1348 IF (calc_forces .AND. .NOT. do_im_time)
CALL rpa_grad_create(
rpa_grad, fm_mat_q(1), &
1349 fm_mat_s, homo, virtual, mp2_env, eigenval(:, 1, :), &
1350 unit_nr, do_ri_sos_laplace_mp2)
1351 IF (.NOT. do_im_time .AND. .NOT. do_ri_sos_laplace_mp2)
THEN
1352 CALL exchange_work%create(qs_env, para_env_sub, mat_munu, dimen_ri_red, &
1353 fm_mat_s, fm_mat_q(1), fm_mat_q_gemm(1), homo, virtual)
1356 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none) e_exchange = 0.0_dp
1357 first_cycle = .true.
1359 CALL dgemm_counter_init(dgemm_counter, unit_nr, mp2_env%ri_rpa%print_dgemm_info)
1361 DO count_ev_sc_gw = 1, iter_evgw
1365 IF (do_ic_model) cycle
1370 vec_sigma_c_gw = z_zero
1371 first_cycle = .true.
1375 IF (do_im_time)
THEN
1377 IF (.NOT. do_kpoints_cubic_rpa)
THEN
1378 DO ispin = 1, nspins
1379 e_fermi(ispin) = (eigenval(homo(ispin), 1, ispin) + eigenval(homo(ispin) + 1, 1, ispin))*0.5_dp
1386 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(/T3,A,T66,i15)") &
1387 "MEMORY_INFO| Memory cut:", cut_memory
1388 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T66,ES15.2)") &
1389 "SPARSITY_INFO| Eps filter for M virt/occ tensors:", eps_filter
1390 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T66,ES15.2)") &
1391 "SPARSITY_INFO| Eps filter for P matrix:", eps_filter_im_time
1392 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T66,i15)") &
1393 "SPARSITY_INFO| Minimum tensor block size:", min_bsize
1396 CALL zero_mat_p_omega(mat_p_omega(:, :, 1))
1399 CALL compute_mat_p_omega(mat_p_omega(:, :, 1), cfm_mo_coeff(1), homo(1), &
1400 mat_p_global, matrix_s, 1, &
1401 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
1402 starts_array_mc, ends_array_mc, &
1403 starts_array_mc_block, ends_array_mc_block, &
1404 time_frequency_grid, e_fermi(1), eps_filter, alpha, &
1405 eps_filter_im_time, eigenval(:, 1, 1), nmo, &
1407 unit_nr, mp2_env, para_env, &
1408 qs_env, do_kpoints_from_gamma, &
1409 index_to_cell_3c, cell_to_index_3c, &
1410 has_mat_p_blocks, do_ri_sos_laplace_mp2, &
1411 dbcsr_time, dbcsr_nflop)
1414 IF (my_open_shell)
THEN
1415 CALL zero_mat_p_omega(mat_p_omega(:, :, 2))
1416 CALL compute_mat_p_omega(mat_p_omega(:, :, 2), cfm_mo_coeff(2), homo(2), &
1417 mat_p_global, matrix_s, 2, &
1418 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, &
1419 starts_array_mc, ends_array_mc, &
1420 starts_array_mc_block, ends_array_mc_block, &
1421 time_frequency_grid, e_fermi(2), eps_filter, alpha, &
1422 eps_filter_im_time, eigenval(:, 1, 2), nmo, &
1424 unit_nr, mp2_env, para_env, &
1425 qs_env, do_kpoints_from_gamma, &
1426 index_to_cell_3c, cell_to_index_3c, &
1427 has_mat_p_blocks, do_ri_sos_laplace_mp2, &
1428 dbcsr_time, dbcsr_nflop)
1431 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1432 DO j = 1,
SIZE(mat_p_omega, 2)
1433 DO i = 1,
SIZE(mat_p_omega, 1)
1434 CALL dbcsr_add(mat_p_omega(i, j, 1)%matrix, mat_p_omega(i, j, 2)%matrix, 1.0_dp, 1.0_dp)
1435 IF (.NOT. calc_forces)
CALL dbcsr_clear(mat_p_omega(i, j, 2)%matrix)
1443 IF (mp2_env%ri_rpa%sigma_param /= sigma_none)
THEN
1444 CALL rpa_sigma_create(rpa_sigma, mp2_env%ri_rpa%sigma_param, fm_mat_q(1), unit_nr, para_env)
1447 DO jquad = 1, num_integ_points
1448 IF (
modulo(jquad, num_integ_group) /= color_rpa_group) cycle
1450 CALL timeset(routinen//
"_RPA_matrix_operations", handle3)
1452 IF (do_ri_sos_laplace_mp2)
THEN
1453 omega = time_frequency_grid%imaginary_time(jquad)
1455 omega = time_frequency_grid%frequency(jquad)
1458 IF (do_im_time)
THEN
1461 IF (.NOT. (do_kpoints_cubic_rpa .OR. do_kpoints_from_gamma))
THEN
1463 DO ispin = 1,
SIZE(mat_p_omega, 3)
1464 CALL contract_p_omega_with_mat_l(mat_p_omega(jquad, 1, ispin)%matrix, mat_l%matrix, mat_work, &
1465 eps_filter_im_time, fm_mat_work, dimen_ri, dimen_ri_red, &
1466 fm_mat_minv_l_kpoints(1, 1), fm_mat_q(ispin))
1471 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3, A, 1X, I3, 1X, A, 1X, I3)") &
1472 "INTEG_INFO| Started with Integration point", jquad,
"of", num_integ_points
1474 IF (first_cycle .AND. count_ev_sc_gw > 1)
THEN
1475 IF (iter_sc_gw0 == 1)
THEN
1476 DO ispin = 1, nspins
1477 CALL remove_scaling_factor_rpa(fm_mat_s(ispin), virtual(ispin), &
1478 eigenval_last(:, 1, ispin), homo(ispin), omega_old)
1481 DO ispin = 1, nspins
1482 CALL remove_scaling_factor_rpa(fm_mat_s(ispin), virtual(ispin), &
1483 eigenval_scf(:, 1, ispin), homo(ispin), omega_old)
1488 IF (iter_sc_gw0 > 1)
THEN
1489 DO ispin = 1, nspins
1490 CALL calc_mat_q(fm_mat_s(ispin), do_ri_sos_laplace_mp2, first_cycle, virtual(ispin), &
1491 eigenval_scf(:, 1, ispin), homo(ispin), omega, omega_old, jquad, mm_style, &
1492 dimen_ri_red, dimen_ia(ispin), alpha, fm_mat_q(ispin), &
1493 fm_mat_q_gemm(ispin), do_bse, fm_mat_q_static_bse_gemm, dgemm_counter, &
1494 num_integ_points, count_ev_sc_gw)
1498 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1499 DO ispin = 2, nspins
1500 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_q(1), beta=1.0_dp, matrix_b=fm_mat_q(ispin))
1504 DO ispin = 1, nspins
1505 CALL calc_mat_q(fm_mat_s(ispin), do_ri_sos_laplace_mp2, first_cycle, virtual(ispin), &
1506 eigenval(:, 1, ispin), homo(ispin), omega, omega_old, jquad, mm_style, &
1507 dimen_ri_red, dimen_ia(ispin), alpha, fm_mat_q(ispin), &
1508 fm_mat_q_gemm(ispin), do_bse, fm_mat_q_static_bse_gemm, dgemm_counter, &
1509 num_integ_points, count_ev_sc_gw)
1514 IF (do_bse .AND. nspins > 1 .AND. jquad == num_integ_points .AND. &
1515 count_ev_sc_gw == 1)
THEN
1516 CALL cp_fm_set_all(fm_mat_q_static_bse_gemm, 0.0_dp)
1517 DO ispin = 1, nspins
1518 CALL cp_fm_scale_and_add(1.0_dp, fm_mat_q_static_bse_gemm, &
1519 1.0_dp, fm_mat_q_gemm(ispin))
1524 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1525 DO ispin = 2, nspins
1526 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_q(1), beta=1.0_dp, matrix_b=fm_mat_q(ispin))
1535 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none)
THEN
1536 e_exchange_corr = 0.0_dp
1537 CALL exchange_work%compute(fm_mat_q(1), eigenval(:, 1, :), fm_mat_s, omega, e_exchange_corr, mp2_env)
1540 e_exchange = e_exchange + e_exchange_corr*time_frequency_grid%frequency_weights(jquad)
1544 IF (mp2_env%ri_rpa%sigma_param /= sigma_none)
THEN
1545 CALL rpa_sigma_matrix_spectral(rpa_sigma, fm_mat_q(1), time_frequency_grid%frequency_weights(jquad), para_env_rpa)
1548 IF (do_ri_sos_laplace_mp2)
THEN
1550 CALL sos_mp2_postprocessing(fm_mat_q, erpa, time_frequency_grid%time_weights_at_zero_frequency(jquad))
1552 IF (calc_forces .AND. .NOT. do_im_time)
THEN
1553 CALL rpa_grad_matrix_operations(mp2_env,
rpa_grad, do_ri_sos_laplace_mp2, &
1554 fm_mat_q, fm_mat_q_gemm, dgemm_counter, fm_mat_s, omega, homo, virtual, &
1555 eigenval(:, 1, :), time_frequency_grid%time_weights_at_zero_frequency(jquad), &
1559 IF (calc_forces .AND. .NOT. do_im_time)
CALL rpa_grad_copy_q(fm_mat_q(1),
rpa_grad)
1561 CALL q_trace_and_add_unit_matrix(dimen_ri_red, trace_qomega, fm_mat_q(1))
1563 IF (do_kpoints_cubic_rpa .OR. do_kpoints_from_gamma)
THEN
1564 CALL invert_eps_compute_w_and_erpa_kp(dimen_ri, jquad, nkp, count_ev_sc_gw, para_env, &
1565 erpa, time_frequency_grid, &
1566 wkp_w, do_gw_im_time, do_ri_sigma_x, do_kpoints_from_gamma, &
1567 cfm_mat_q, ikp_local, &
1568 mat_p_omega(:, :, 1), mat_p_omega_kp, qs_env, eps_filter_im_time, unit_nr, &
1569 kpoints, fm_mat_minv_l_kpoints, fm_mat_l_kpoints, &
1570 fm_mat_w, fm_mat_ri_global_work, mat_minvvminv, &
1571 fm_matrix_minv, fm_matrix_minv_vtrunc_minv)
1573 CALL compute_erpa_by_freq_int(dimen_ri_red, trace_qomega, fm_mat_q(1), para_env_rpa, erpa, &
1574 time_frequency_grid%frequency_weights(jquad))
1577 IF (calc_forces .AND. .NOT. do_im_time)
THEN
1578 CALL rpa_grad_matrix_operations(mp2_env,
rpa_grad, do_ri_sos_laplace_mp2, &
1579 fm_mat_q, fm_mat_q_gemm, dgemm_counter, fm_mat_s, omega, homo, virtual, &
1580 eigenval(:, 1, :), time_frequency_grid%frequency_weights(jquad), unit_nr)
1585 first_cycle = .false.
1588 CALL timestop(handle3)
1592 CALL get_fermi_level_offset(fermi_level_offset, fermi_level_offset_input, eigenval(:, 1, :), homo)
1595 IF (do_im_time)
THEN
1597 IF (.NOT. (do_kpoints_cubic_rpa .OR. do_kpoints_from_gamma))
THEN
1598 CALL compute_w_cubic_gw(fm_mat_w, fm_mat_q(1), fm_mat_work, dimen_ri, fm_mat_minv_l_kpoints, &
1599 time_frequency_grid, jquad, omega)
1602 CALL compute_gw_self_energy(vec_sigma_c_gw, dimen_nm_gw, dimen_ri_red, gw_corr_lev_occ, &
1603 gw_corr_lev_virt, homo, jquad, nmo, num_fit_points, &
1604 do_im_time, do_periodic, first_cycle_periodic_correction, &
1605 fermi_level_offset, &
1606 omega, eigenval(:, 1, :), delta_corr, vec_omega_fit_gw, vec_w_gw, &
1607 time_frequency_grid, &
1608 fm_mat_q(1), fm_mat_r_gw, fm_mat_s_gw, &
1609 fm_mat_s_gw_work, mo_coeff(1), para_env, &
1610 para_env_rpa, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, &
1611 kpoints, qs_env, mp2_env)
1615 IF (unit_nr > 0)
CALL m_flush(unit_nr)
1616 CALL para_env_rpa%sync()
1620 IF (mp2_env%ri_rpa%sigma_param /= sigma_none)
THEN
1621 CALL finalize_rpa_sigma(rpa_sigma, unit_nr, mp2_env%ri_rpa%e_sigma_corr, para_env, do_minimax_quad)
1622 IF (do_minimax_quad) mp2_env%ri_rpa%e_sigma_corr = mp2_env%ri_rpa%e_sigma_corr/2.0_dp
1623 CALL para_env%sum(mp2_env%ri_rpa%e_sigma_corr)
1626 CALL para_env%sum(erpa)
1628 IF (.NOT. (do_ri_sos_laplace_mp2))
THEN
1629 erpa = erpa/(pi*2.0_dp)
1630 IF (do_minimax_quad) erpa = erpa/2.0_dp
1633 IF (mp2_env%ri_rpa%exchange_correction /= rpa_exchange_none)
THEN
1634 CALL para_env%sum(e_exchange)
1635 e_exchange = e_exchange/(pi*2.0_dp)
1636 IF (do_minimax_quad) e_exchange = e_exchange/2.0_dp
1637 mp2_env%ri_rpa%ener_exchange = e_exchange
1640 IF (calc_forces .AND. do_ri_sos_laplace_mp2 .AND. do_im_time)
THEN
1641 IF (my_open_shell)
THEN
1644 CALL calc_laplace_loop_forces(force_data, mat_p_omega(:, 1, :), t_3c_m, t_3c_o(1, 1), &
1645 t_3c_o_compressed(1, 1, :), t_3c_o_ind(1, 1, :), cfm_mo_coeff, homo, &
1646 starts_array_mc, ends_array_mc, starts_array_mc_block, &
1647 ends_array_mc_block, nmo, eigenval(:, 1, :), &
1648 time_frequency_grid, &
1649 cut_memory, pspin, qspin, my_open_shell, &
1650 unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
1653 CALL calc_laplace_loop_forces(force_data, mat_p_omega(:, 1, :), t_3c_m, t_3c_o(1, 1), &
1654 t_3c_o_compressed(1, 1, :), t_3c_o_ind(1, 1, :), cfm_mo_coeff, homo, &
1655 starts_array_mc, ends_array_mc, starts_array_mc_block, &
1656 ends_array_mc_block, nmo, eigenval(:, 1, :), &
1657 time_frequency_grid, &
1658 cut_memory, pspin, qspin, my_open_shell, &
1659 unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
1664 CALL calc_laplace_loop_forces(force_data, mat_p_omega(:, 1, :), t_3c_m, t_3c_o(1, 1), &
1665 t_3c_o_compressed(1, 1, :), t_3c_o_ind(1, 1, :), cfm_mo_coeff, homo, &
1666 starts_array_mc, ends_array_mc, starts_array_mc_block, &
1667 ends_array_mc_block, nmo, eigenval(:, 1, :), &
1668 time_frequency_grid, &
1669 cut_memory, pspin, qspin, my_open_shell, &
1670 unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
1672 CALL calc_post_loop_forces(force_data, unit_nr, qs_env)
1675 IF (calc_forces .AND. do_im_time .AND. .NOT. do_ri_sos_laplace_mp2)
THEN
1676 DO ispin = 1, nspins
1677 CALL calc_rpa_loop_forces(force_data, mat_p_omega(:, 1, :), t_3c_m, t_3c_o(1, 1), &
1678 t_3c_o_compressed(1, 1, :), t_3c_o_ind(1, 1, :), cfm_mo_coeff, homo, &
1679 starts_array_mc, ends_array_mc, starts_array_mc_block, &
1680 ends_array_mc_block, nmo, eigenval(:, 1, :), &
1681 e_fermi(ispin), time_frequency_grid, cut_memory, ispin, my_open_shell, &
1682 unit_nr, dbcsr_time, &
1683 dbcsr_nflop, mp2_env, qs_env)
1685 CALL calc_post_loop_forces(force_data, unit_nr, qs_env)
1688 IF (do_im_time)
THEN
1690 my_flop_rate = real(dbcsr_nflop, dp)/(1.0e09_dp*dbcsr_time)
1691 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(/T3,A,T73,ES8.2)") &
1692 "PERFORMANCE| DBCSR total number of flops:", real(dbcsr_nflop*para_env%num_pe, dp)
1693 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.2)") &
1694 "PERFORMANCE| DBCSR total execution time:", dbcsr_time
1695 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.2)") &
1696 "PERFORMANCE| DBCSR flop rate (Gflops / MPI rank):", my_flop_rate
1700 CALL dgemm_counter_write(dgemm_counter, para_env)
1709 CALL compute_qp_energies(vec_sigma_c_gw, count_ev_sc_gw, gw_corr_lev_occ, &
1710 gw_corr_lev_tot, gw_corr_lev_virt, homo, &
1711 nmo, num_fit_points, &
1712 unit_nr, do_apply_ic_corr_to_gw, do_im_time, &
1713 do_periodic, do_ri_sigma_x, first_cycle_periodic_correction, &
1714 e_fermi, eps_filter, fermi_level_offset, &
1715 delta_corr, eigenval, &
1716 eigenval_last, eigenval_scf, iter_sc_gw0, exit_ev_gw, &
1717 time_frequency_grid, vec_omega_fit_gw, vec_sigma_x_gw, &
1718 mp2_env%ri_g0w0%ic_corr_list, &
1719 cfm_mo_coeff, mo_coeff(1), fm_mat_w, para_env, &
1720 para_env_rpa, mat_dm, mat_minvvminv, &
1721 t_3c_o, t_3c_m, t_3c_overl_int_ao_mo, t_3c_o_compressed, t_3c_o_mo_compressed, &
1722 t_3c_o_ind, t_3c_o_mo_ind, &
1723 t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, &
1724 matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, mat_w, matrix_s, &
1725 kpoints, mp2_env, qs_env, nkp_self_energy, do_kpoints_cubic_rpa, &
1726 starts_array_mc, ends_array_mc)
1729 IF (exit_ev_gw)
EXIT
1735 IF (do_ic_model)
THEN
1737 IF (my_open_shell)
THEN
1739 CALL calculate_ic_correction(eigenval(:, 1, 1), mat_minvvminv%matrix, &
1740 t_3c_overl_nnp_ic(1), t_3c_overl_nnp_ic_reflected(1), &
1742 gw_corr_lev_occ(1), gw_corr_lev_virt(1), homo(1), unit_nr, &
1743 print_ic_values, para_env, do_alpha=.true.)
1745 CALL calculate_ic_correction(eigenval(:, 1, 2), mat_minvvminv%matrix, &
1746 t_3c_overl_nnp_ic(2), t_3c_overl_nnp_ic_reflected(2), &
1748 gw_corr_lev_occ(2), gw_corr_lev_virt(2), homo(2), unit_nr, &
1749 print_ic_values, para_env, do_beta=.true.)
1753 CALL calculate_ic_correction(eigenval(:, 1, 1), mat_minvvminv%matrix, &
1754 t_3c_overl_nnp_ic(1), t_3c_overl_nnp_ic_reflected(1), &
1756 gw_corr_lev_occ(1), gw_corr_lev_virt(1), homo(1), unit_nr, &
1757 print_ic_values, para_env)
1767 IF (mp2_env%ri_g0w0%iter_evGW > 1)
THEN
1768 IF (unit_nr > 0)
THEN
1769 CALL cp_warn(__location__, &
1770 "BSE@evGW applies W0, i.e. screening with DFT energies to the BSE!")
1774 ALLOCATE (fm_mat_s_ia_bse(nspins))
1775 DO ispin = 1, nspins
1776 CALL cp_fm_create(fm_mat_s_ia_bse(ispin), fm_mat_s(ispin)%matrix_struct)
1777 CALL cp_fm_to_fm(fm_mat_s(ispin), fm_mat_s_ia_bse(ispin))
1779 IF (iter_sc_gw0 == 1)
THEN
1780 CALL remove_scaling_factor_rpa(fm_mat_s_ia_bse(ispin), virtual(ispin), &
1781 eigenval_last(:, 1, ispin), homo(ispin), omega)
1783 CALL remove_scaling_factor_rpa(fm_mat_s_ia_bse(ispin), virtual(ispin), &
1784 eigenval_scf(:, 1, ispin), homo(ispin), omega)
1788 CALL start_bse_calculation(fm_mat_s_ia_bse, fm_mat_s_ij_bse, fm_mat_s_ab_bse, &
1789 fm_mat_q_static_bse_gemm, &
1790 eigenval, eigenval_scf, &
1791 homo, virtual, dimen_ri, dimen_ri_red, bse_lev_virt, &
1792 gd_array, color_sub, mp2_env, qs_env, mo_coeff, unit_nr)
1794 DO ispin = 1, nspins
1795 CALL cp_fm_release(fm_mat_s_ia_bse(ispin))
1797 DEALLOCATE (fm_mat_s_ia_bse)
1801 CALL deallocate_matrices_gw(fm_mat_s_gw_work, vec_w_gw, vec_sigma_c_gw, vec_omega_fit_gw, &
1802 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw, &
1803 eigenval_last, eigenval_scf, do_periodic, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
1804 kpoints, vec_sigma_x_gw,.NOT. do_im_time)
1807 IF (do_im_time)
THEN
1809 CALL dealloc_im_time(cfm_mo_coeff, index_to_cell_3c, &
1810 cell_to_index_3c, do_ic_model, &
1811 do_kpoints_cubic_rpa, do_kpoints_from_gamma, do_ri_sigma_x, &
1813 wkp_w, cfm_mat_q, fm_mat_minv_l_kpoints, fm_mat_l_kpoints, &
1814 fm_matrix_minv, fm_matrix_minv_vtrunc_minv, fm_mat_ri_global_work, fm_mat_work, &
1816 mat_minvvminv, mat_p_omega, mat_p_omega_kp, &
1817 t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, mat_work, qs_env)
1820 CALL deallocate_matrices_gw_im_time(do_ic_model, do_kpoints_cubic_rpa, fm_mat_w, &
1821 t_3c_overl_int_ao_mo, t_3c_o_mo_compressed, t_3c_o_mo_ind, &
1822 t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, &
1823 t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected, &
1829 IF (.NOT. do_im_time .AND. .NOT. do_ri_sos_laplace_mp2)
CALL exchange_work%release()
1831 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1832 DEALLOCATE (trace_qomega)
1835 CALL time_frequency_grid_release(time_frequency_grid)
1837 IF (do_im_time .AND. calc_forces)
THEN
1838 CALL im_time_force_release(force_data)
1841 IF (calc_forces .AND. .NOT. do_im_time)
CALL rpa_grad_finalize(
rpa_grad, mp2_env, para_env_sub, para_env, &
1842 qs_env, gd_array, color_sub, do_ri_sos_laplace_mp2, &
1845 CALL timestop(handle)
1847 END SUBROUTINE rpa_num_int
1865 SUBROUTINE get_minimax_grid(para_env, unit_nr, homo, Eigenval, num_integ_points, &
1866 do_im_time, do_ri_sos_laplace_mp2, do_print, qs_env, do_gw_im_time, &
1867 do_kpoints_cubic_RPA, e_fermi, grid)
1869 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
1870 INTEGER,
INTENT(IN) :: unit_nr
1871 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
1872 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
1873 INTEGER,
INTENT(IN) :: num_integ_points
1874 LOGICAL,
INTENT(IN) :: do_im_time, do_ri_sos_laplace_mp2, &
1876 TYPE(qs_environment_type),
POINTER :: qs_env
1877 LOGICAL,
INTENT(IN) :: do_gw_im_time, do_kpoints_cubic_rpa
1878 REAL(kind=dp),
INTENT(OUT) :: e_fermi
1879 TYPE(time_frequency_grid_type),
INTENT(OUT) :: grid
1881 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_minimax_grid'
1882 INTEGER,
PARAMETER :: num_points_per_magnitude = 200
1884 INTEGER :: handle, jquad
1885 LOGICAL :: used_external_backend
1886 REAL(kind=dp) :: e_range, emax, emin, max_error_min
1888 CALL timeset(routinen, handle)
1890 CALL determine_energy_range(qs_env, para_env, homo, eigenval, do_ri_sos_laplace_mp2, &
1891 do_kpoints_cubic_rpa, emin, emax, e_range, e_fermi)
1895 IF (
SIZE(homo) > 1)
THEN
1896 CALL cp_hint(__location__, &
1897 "Open-shell RPA/GW uses one minimax grid spanning [min gap, max span] across "// &
1898 "both spin channels; raise QUADRATURE_POINTS if QP convergence is marginal for "// &
1899 "strongly spin-asymmetric systems.")
1902 CALL build_minimax_time_frequency_grid(num_integ_points, emin, emax, &
1903 qs_env%mp2_env%ri_g0w0%regularization_minimax, &
1904 num_points_per_magnitude, grid, &
1905 build_frequency=.NOT. do_ri_sos_laplace_mp2, &
1906 build_time=do_im_time .OR. do_ri_sos_laplace_mp2, &
1907 build_transforms=do_im_time .AND. .NOT. do_ri_sos_laplace_mp2, &
1908 build_sine=do_im_time .AND. (.NOT. do_ri_sos_laplace_mp2) .AND. do_gw_im_time, &
1909 time_scaling=merge(1.0_dp, 2.0_dp, do_ri_sos_laplace_mp2), &
1910 time_weight_scaling=merge(1.0_dp, 2.0_dp, do_ri_sos_laplace_mp2), &
1911 max_fit_error=max_error_min, print_warning=.true., unit_nr=unit_nr, &
1912 prefer_external_backend=.true., used_external_backend=used_external_backend)
1916 IF (used_external_backend)
THEN
1917 CALL timestop(handle)
1921 IF (num_integ_points > 20 .AND. e_range < 100.0_dp)
THEN
1922 IF (unit_nr > 0)
THEN
1923 CALL cp_warn(__location__, &
1924 "You requested a large minimax grid (> 20 points) for a small minimax range R (R < 100). "// &
1925 "That may lead to numerical "// &
1926 "instabilities when computing minimax grid weights. You can prevent small ranges by choosing "// &
1927 "a larger basis set with higher angular momenta or alternatively using all-electron calculations.")
1931 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
1932 IF (unit_nr > 0 .AND. do_print)
THEN
1933 WRITE (unit=unit_nr, fmt=
"(T3,A,T75,i6)") &
1934 "MINIMAX_INFO| Number of integration points:", num_integ_points
1935 WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.4)") &
1936 "MINIMAX_INFO| Gap for the minimax approximation:", emin
1937 WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.4)") &
1938 "MINIMAX_INFO| Range for the minimax approximation:", e_range
1939 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)")
"MINIMAX_INFO| Minimax parameters:",
"Weights",
"Abscissas"
1940 DO jquad = 1, num_integ_points
1941 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") &
1942 grid%frequency_weights(jquad)/emin, grid%frequency(jquad)/emin
1944 CALL m_flush(unit_nr)
1948 IF (do_im_time .OR. do_ri_sos_laplace_mp2)
THEN
1949 IF (unit_nr > 0 .AND. do_print)
THEN
1950 WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.4)") &
1951 "MINIMAX_INFO| Range for the minimax approximation:", e_range
1952 WRITE (unit=unit_nr, fmt=
"(T3,A,T66,F15.4)") &
1953 "MINIMAX_INFO| Gap:", emin
1954 WRITE (unit=unit_nr, fmt=
"(T3,A,T54,A,T72,A)") &
1955 "MINIMAX_INFO| Minimax parameters of the time grid:",
"Weights",
"Abscissas"
1956 DO jquad = 1, num_integ_points
1957 WRITE (unit=unit_nr, fmt=
"(T41,F20.10,F20.10)") &
1958 grid%time_weights_at_zero_frequency(jquad)*emin, grid%imaginary_time(jquad)*emin
1960 CALL m_flush(unit_nr)
1963 IF (unit_nr > 0 .AND. do_im_time .AND. do_gw_im_time .AND. .NOT. do_ri_sos_laplace_mp2)
THEN
1964 WRITE (unit=unit_nr, fmt=
"(T3,A,T66,ES15.2)") &
1965 "MINIMAX_INFO| Maximum deviation among requested minimax transform fits:", max_error_min
1969 CALL timestop(handle)
1971 END SUBROUTINE get_minimax_grid
1989 SUBROUTINE get_clenshaw_grid(para_env, para_env_RPA, unit_nr, homo, virtual, Eigenval, num_integ_points, &
1990 num_integ_group, color_rpa_group, fm_mat_S, my_do_gw, &
1993 TYPE(mp_para_env_type),
INTENT(IN) :: para_env, para_env_rpa
1994 INTEGER,
INTENT(IN) :: unit_nr
1995 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, virtual
1996 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
1997 INTEGER,
INTENT(IN) :: num_integ_points, num_integ_group, &
1999 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s
2000 LOGICAL,
INTENT(IN) :: my_do_gw
2001 REAL(kind=dp),
INTENT(IN) :: ext_scaling
2002 TYPE(time_frequency_grid_type),
INTENT(OUT) :: grid
2004 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_clenshaw_grid'
2007 REAL(kind=dp) :: a_scaling
2009 CALL timeset(routinen, handle)
2011 CALL build_clenshaw_grid(num_integ_points, grid)
2013 IF (my_do_gw .AND. ext_scaling > 0.0_dp)
THEN
2014 a_scaling = ext_scaling
2016 CALL calc_scaling_factor(a_scaling, para_env, para_env_rpa, homo, virtual, eigenval, &
2017 num_integ_points, num_integ_group, color_rpa_group, &
2018 grid%frequency, grid%frequency_weights, fm_mat_s)
2021 IF (unit_nr > 0)
WRITE (unit_nr,
'(T3,A,T56,F25.5)')
'INTEG_INFO| Scaling parameter:', a_scaling
2023 grid%frequency_weights(:) = grid%frequency_weights(:)*a_scaling
2024 grid%frequency(:) = a_scaling/tan(grid%frequency(:))
2026 CALL timestop(handle)
2028 END SUBROUTINE get_clenshaw_grid
2045 SUBROUTINE calc_scaling_factor(a_scaling_ext, para_env, para_env_RPA, homo, virtual, Eigenval, &
2046 num_integ_points, num_integ_group, color_rpa_group, &
2047 tj_ext, wj_ext, fm_mat_S)
2048 REAL(kind=dp),
INTENT(OUT) :: a_scaling_ext
2049 TYPE(mp_para_env_type),
INTENT(IN) :: para_env, para_env_rpa
2050 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo, virtual
2051 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
2052 INTEGER,
INTENT(IN) :: num_integ_points, num_integ_group, &
2054 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
2055 INTENT(IN) :: tj_ext, wj_ext
2056 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s
2058 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_scaling_factor'
2060 INTEGER :: handle, icycle, jquad, ncol_local, &
2061 ncol_local_beta, nspins
2062 LOGICAL :: my_open_shell
2063 REAL(kind=dp) :: a_high, a_low, a_scaling, conv_param, eps, first_deriv, left_term, &
2064 right_term, right_term_ref, right_term_ref_beta, step
2065 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: cottj, d_ia, d_ia_beta, iaia_ri, &
2066 iaia_ri_beta, m_ia, m_ia_beta
2067 TYPE(mp_para_env_type),
POINTER :: para_env_col, para_env_col_beta
2069 CALL timeset(routinen, handle)
2072 my_open_shell = (nspins == 2)
2076 ALLOCATE (cottj(num_integ_points))
2079 DO jquad = 1, num_integ_points
2080 cottj(jquad) = 1.0_dp/tan(tj_ext(jquad))
2083 CALL calc_ia_ia_integrals(para_env_rpa, homo(1), virtual(1), ncol_local, right_term_ref, eigenval(:, 1, 1), &
2084 d_ia, iaia_ri, m_ia, fm_mat_s(1), para_env_col)
2087 IF (my_open_shell)
THEN
2088 CALL calc_ia_ia_integrals(para_env_rpa, homo(2), virtual(2), ncol_local_beta, right_term_ref_beta, eigenval(:, 1, 2), &
2089 d_ia_beta, iaia_ri_beta, m_ia_beta, fm_mat_s(2), para_env_col_beta)
2091 right_term_ref = right_term_ref + right_term_ref_beta
2095 IF (para_env%mepos == 0)
THEN
2096 CALL para_env%bcast(right_term_ref, 0)
2098 right_term_ref = 0.0_dp
2099 CALL para_env%bcast(right_term_ref, 0)
2104 conv_param = 100.0_dp*epsilon(right_term_ref)
2108 right_term = -right_term_ref
2109 DO icycle = 1, num_integ_points*2
2112 CALL calculate_objfunc(a_scaling, left_term, first_deriv, num_integ_points, my_open_shell, &
2113 m_ia, cottj, wj_ext, d_ia, d_ia_beta, m_ia_beta, &
2114 ncol_local, ncol_local_beta, num_integ_group, color_rpa_group, &
2115 para_env, para_env_col, para_env_col_beta)
2116 left_term = left_term/4.0_dp/pi*a_scaling
2118 IF (abs(left_term) > abs(right_term) .OR. abs(left_term + right_term) <= conv_param)
EXIT
2120 a_high = a_high + step
2124 IF (abs(left_term + right_term) >= conv_param)
THEN
2125 IF (a_scaling >= 2*num_integ_points*step)
THEN
2129 DO icycle = 1, num_integ_points*2
2130 a_scaling = (a_low + a_high)/2.0_dp
2132 CALL calculate_objfunc(a_scaling, left_term, first_deriv, num_integ_points, my_open_shell, &
2133 m_ia, cottj, wj_ext, d_ia, d_ia_beta, m_ia_beta, &
2134 ncol_local, ncol_local_beta, num_integ_group, color_rpa_group, &
2135 para_env, para_env_col, para_env_col_beta)
2136 left_term = left_term/4.0_dp/pi*a_scaling
2138 IF (abs(left_term) > abs(right_term))
THEN
2144 IF (abs(a_high - a_low) < 1.0e-5_dp)
EXIT
2151 a_scaling_ext = a_scaling
2152 CALL para_env%bcast(a_scaling_ext, 0)
2155 DEALLOCATE (iaia_ri)
2158 CALL mp_para_env_release(para_env_col)
2160 IF (my_open_shell)
THEN
2161 DEALLOCATE (iaia_ri_beta)
2162 DEALLOCATE (d_ia_beta)
2163 DEALLOCATE (m_ia_beta)
2164 CALL mp_para_env_release(para_env_col_beta)
2167 CALL timestop(handle)
2169 END SUBROUTINE calc_scaling_factor
2185 SUBROUTINE calc_ia_ia_integrals(para_env_RPA, homo, virtual, ncol_local, right_term_ref, Eigenval, &
2186 D_ia, iaia_RI, M_ia, fm_mat_S, para_env_col)
2188 TYPE(mp_para_env_type),
INTENT(IN) :: para_env_rpa
2189 INTEGER,
INTENT(IN) :: homo, virtual
2190 INTEGER,
INTENT(OUT) :: ncol_local
2191 REAL(kind=dp),
INTENT(OUT) :: right_term_ref
2192 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: eigenval
2193 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
2194 INTENT(OUT) :: d_ia, iaia_ri, m_ia
2195 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_s
2196 TYPE(mp_para_env_type),
POINTER :: para_env_col
2198 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_ia_ia_integrals'
2200 INTEGER :: avirt, color_col, color_row, handle, &
2201 i_global, iib, iocc, nrow_local
2202 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
2203 REAL(kind=dp) :: eigen_diff
2204 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: iaia_ri_dp
2205 TYPE(mp_para_env_type),
POINTER :: para_env_row
2207 CALL timeset(routinen, handle)
2212 CALL cp_fm_get_info(matrix=fm_mat_s, &
2213 nrow_local=nrow_local, &
2214 ncol_local=ncol_local, &
2215 row_indices=row_indices, &
2216 col_indices=col_indices)
2219 ALLOCATE (iaia_ri_dp(ncol_local))
2223 DO iib = 1, ncol_local
2224 iaia_ri_dp(iib) = iaia_ri_dp(iib) + dot_product(fm_mat_s%local_data(:, iib), fm_mat_s%local_data(:, iib))
2243 color_col = fm_mat_s%matrix_struct%context%mepos(2)
2244 ALLOCATE (para_env_col)
2245 CALL para_env_col%from_split(para_env_rpa, color_col)
2247 CALL para_env_col%sum(iaia_ri_dp)
2250 ALLOCATE (iaia_ri(ncol_local))
2251 DO iib = 1, ncol_local
2252 iaia_ri(iib) = iaia_ri_dp(iib)
2254 DEALLOCATE (iaia_ri_dp)
2259 ALLOCATE (d_ia(ncol_local))
2261 ALLOCATE (m_ia(ncol_local))
2263 DO iib = 1, ncol_local
2264 i_global = col_indices(iib)
2266 iocc = max(1, i_global - 1)/virtual + 1
2267 avirt = i_global - (iocc - 1)*virtual
2268 eigen_diff = eigenval(avirt + homo) - eigenval(iocc)
2270 d_ia(iib) = eigen_diff
2273 DO iib = 1, ncol_local
2274 m_ia(iib) = d_ia(iib)*d_ia(iib) + 2.0_dp*d_ia(iib)*iaia_ri(iib)
2277 right_term_ref = 0.0_dp
2278 DO iib = 1, ncol_local
2279 right_term_ref = right_term_ref + (sqrt(m_ia(iib)) - d_ia(iib) - iaia_ri(iib))
2281 right_term_ref = right_term_ref/2.0_dp
2284 color_row = fm_mat_s%matrix_struct%context%mepos(1)
2285 ALLOCATE (para_env_row)
2286 CALL para_env_row%from_split(para_env_rpa, color_row)
2289 CALL para_env_row%sum(right_term_ref)
2291 CALL mp_para_env_release(para_env_row)
2293 CALL timestop(handle)
2295 END SUBROUTINE calc_ia_ia_integrals
2318 SUBROUTINE calculate_objfunc(a_scaling, left_term, first_deriv, num_integ_points, my_open_shell, &
2319 M_ia, cottj, wj, D_ia, D_ia_beta, M_ia_beta, &
2320 ncol_local, ncol_local_beta, num_integ_group, color_rpa_group, &
2321 para_env, para_env_col, para_env_col_beta)
2322 REAL(kind=dp),
INTENT(IN) :: a_scaling
2323 REAL(kind=dp),
INTENT(INOUT) :: left_term, first_deriv
2324 INTEGER,
INTENT(IN) :: num_integ_points
2325 LOGICAL,
INTENT(IN) :: my_open_shell
2326 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
2327 INTENT(IN) :: m_ia, cottj, wj, d_ia, d_ia_beta, &
2329 INTEGER,
INTENT(IN) :: ncol_local, ncol_local_beta, &
2330 num_integ_group, color_rpa_group
2331 TYPE(mp_para_env_type),
INTENT(IN) :: para_env, para_env_col
2332 TYPE(mp_para_env_type),
POINTER :: para_env_col_beta
2334 INTEGER :: iib, jquad
2335 REAL(kind=dp) :: first_deriv_beta, left_term_beta, omega
2338 first_deriv = 0.0_dp
2339 left_term_beta = 0.0_dp
2340 first_deriv_beta = 0.0_dp
2341 DO jquad = 1, num_integ_points
2343 IF (
modulo(jquad, num_integ_group) /= color_rpa_group) cycle
2344 omega = a_scaling*cottj(jquad)
2346 DO iib = 1, ncol_local
2348 IF (
modulo(iib, para_env_col%num_pe) /= para_env_col%mepos) cycle
2350 left_term = left_term + wj(jquad)* &
2351 (log(1.0_dp + (m_ia(iib) - d_ia(iib)**2)/(omega**2 + d_ia(iib)**2)) - &
2352 (m_ia(iib) - d_ia(iib)**2)/(omega**2 + d_ia(iib)**2))
2353 first_deriv = first_deriv + wj(jquad)*cottj(jquad)**2* &
2354 ((-m_ia(iib) + d_ia(iib)**2)**2/((omega**2 + d_ia(iib)**2)**2*(omega**2 + m_ia(iib))))
2357 IF (my_open_shell)
THEN
2358 DO iib = 1, ncol_local_beta
2360 IF (
modulo(iib, para_env_col_beta%num_pe) /= para_env_col_beta%mepos) cycle
2362 left_term_beta = left_term_beta + wj(jquad)* &
2363 (log(1.0_dp + (m_ia_beta(iib) - d_ia_beta(iib)**2)/(omega**2 + d_ia_beta(iib)**2)) - &
2364 (m_ia_beta(iib) - d_ia_beta(iib)**2)/(omega**2 + d_ia_beta(iib)**2))
2365 first_deriv_beta = &
2366 first_deriv_beta + wj(jquad)*cottj(jquad)**2* &
2367 ((-m_ia_beta(iib) + d_ia_beta(iib)**2)**2/((omega**2 + d_ia_beta(iib)**2)**2*(omega**2 + m_ia_beta(iib))))
2374 CALL para_env%sum(left_term)
2375 CALL para_env%sum(first_deriv)
2377 IF (my_open_shell)
THEN
2378 CALL para_env%sum(left_term_beta)
2379 CALL para_env%sum(first_deriv_beta)
2381 left_term = left_term + left_term_beta
2382 first_deriv = first_deriv + first_deriv_beta
2385 END SUBROUTINE calculate_objfunc
2395 SUBROUTINE gap_and_max_eig_diff_kpoints(qs_env, para_env, gap, max_eig_diff, e_fermi)
2397 TYPE(qs_environment_type),
POINTER :: qs_env
2398 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
2399 REAL(kind=dp),
INTENT(OUT) :: gap, max_eig_diff, e_fermi
2401 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gap_and_max_eig_diff_kpoints'
2403 INTEGER :: handle, homo, ikpgr, ispin, kplocal, &
2405 INTEGER,
DIMENSION(2) :: kp_range
2406 REAL(kind=dp) :: e_homo, e_homo_temp, e_lumo, e_lumo_temp
2407 REAL(kind=dp),
DIMENSION(3) :: tmp
2408 REAL(kind=dp),
DIMENSION(:),
POINTER :: eigenvalues
2409 TYPE(kpoint_env_type),
POINTER :: kp
2410 TYPE(kpoint_type),
POINTER :: kpoint
2411 TYPE(mo_set_type),
POINTER :: mo_set
2413 CALL timeset(routinen, handle)
2415 CALL get_qs_env(qs_env, &
2418 mo_set => kpoint%kp_env(1)%kpoint_env%mos(1, 1)
2419 CALL get_mo_set(mo_set, nmo=nmo)
2421 CALL get_kpoint_info(kpoint, kp_range=kp_range)
2422 kplocal = kp_range(2) - kp_range(1) + 1
2425 max_eig_diff = 0.0_dp
2429 DO ikpgr = 1, kplocal
2430 kp => kpoint%kp_env(ikpgr)%kpoint_env
2431 nspin =
SIZE(kp%mos, 2)
2433 mo_set => kp%mos(1, ispin)
2434 CALL get_mo_set(mo_set, eigenvalues=eigenvalues, homo=homo)
2435 e_homo_temp = eigenvalues(homo)
2436 e_lumo_temp = eigenvalues(homo + 1)
2438 IF (e_homo_temp > e_homo) e_homo = e_homo_temp
2439 IF (e_lumo_temp < e_lumo) e_lumo = e_lumo_temp
2440 IF (eigenvalues(nmo) - eigenvalues(1) > max_eig_diff) max_eig_diff = eigenvalues(nmo) - eigenvalues(1)
2449 tmp(3) = max_eig_diff
2450 CALL para_env%max(tmp)
2452 gap = -tmp(2) - tmp(1)
2453 e_fermi = (tmp(1) - tmp(2))*0.5_dp
2454 max_eig_diff = tmp(3)
2456 CALL timestop(handle)
2458 END SUBROUTINE gap_and_max_eig_diff_kpoints
2473 SUBROUTINE determine_energy_range(qs_env, para_env, homo, Eigenval, do_ri_sos_laplace_mp2, &
2474 do_kpoints_cubic_RPA, Emin, Emax, e_range, e_fermi)
2476 TYPE(qs_environment_type),
POINTER :: qs_env
2477 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
2478 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
2479 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
2480 LOGICAL,
INTENT(IN) :: do_ri_sos_laplace_mp2, &
2481 do_kpoints_cubic_rpa
2482 REAL(kind=dp),
INTENT(OUT) :: emin, emax, e_range, e_fermi
2484 CHARACTER(LEN=*),
PARAMETER :: routinen =
'determine_energy_range'
2486 INTEGER :: handle, ispin, nspins
2487 LOGICAL :: my_do_kpoints
2488 TYPE(section_vals_type),
POINTER :: input
2490 CALL timeset(routinen, handle)
2495 my_do_kpoints = .false.
2496 IF (.NOT. do_ri_sos_laplace_mp2)
THEN
2497 my_do_kpoints = do_kpoints_cubic_rpa
2500 IF (my_do_kpoints)
THEN
2501 CALL gap_and_max_eig_diff_kpoints(qs_env, para_env, emin, emax, e_fermi)
2504 IF (qs_env%mp2_env%E_range <= 1.0_dp .OR. qs_env%mp2_env%E_gap <= 0.0_dp)
THEN
2507 DO ispin = 1, nspins
2508 IF (homo(ispin) > 0)
THEN
2509 emin = min(emin, eigenval(homo(ispin) + 1, 1, ispin) - eigenval(homo(ispin), 1, ispin))
2510 emax = max(emax, maxval(eigenval(:, :, ispin)) - minval(eigenval(:, :, ispin)))
2514 qs_env%mp2_env%e_range = e_range
2515 qs_env%mp2_env%e_gap = emin
2517 CALL get_qs_env(qs_env, input=input)
2518 CALL section_vals_val_set(input,
"DFT%XC%WF_CORRELATION%E_RANGE", r_val=e_range)
2519 CALL section_vals_val_set(input,
"DFT%XC%WF_CORRELATION%E_GAP", r_val=emin)
2521 e_range = qs_env%mp2_env%E_range
2522 emin = qs_env%mp2_env%E_gap
2530 IF (do_ri_sos_laplace_mp2)
THEN
2535 CALL timestop(handle)
2536 END SUBROUTINE determine_energy_range
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public wilhelm2016b
integer, save, public delben2015
integer, save, public wilhelm2016a
integer, save, public wilhelm2018
integer, save, public delben2013
integer, save, public ren2013
integer, save, public wilhelm2017
integer, save, public ren2011
integer, save, public gruneis2009
integer, save, public freeman1977
integer, save, public bates2013
Main routines for GW + Bethe-Salpeter for computing electronic excitations.
subroutine, public start_bse_calculation(fm_mat_s_ia_bse, fm_mat_s_ij_bse, fm_mat_s_ab_bse, fm_mat_q_static_bse_gemm, eigenval, eigenval_scf, homo, virtual, dimen_ri, dimen_ri_red, bse_lev_virt, gd_array, color_sub, mp2_env, qs_env, mo_coeff, unit_nr)
Main subroutine managing BSE calculations.
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Represents a complex full matrix distributed on many processors.
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_clear(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
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_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, nrow, ncol, set_zero)
creates a new full matrix with the given structure
This is the start of a dbt_api, all publically needed functions are exported here....
Counters to determine the performance of parallel DGEMMs.
elemental subroutine, public dgemm_counter_init(dgemm_counter, unit_nr, print_info)
Initialize a dgemm_counter.
subroutine, public dgemm_counter_write(dgemm_counter, para_env)
calculate and print flop rates
Types to describe group distributions.
elemental integer function, public maxsize(this)
...
Types and set/get functions for HFX.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
complex(kind=dp), parameter, public z_zero
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)
Routines to calculate the minimax coefficients in order to approximate 1/x as a sum over exponential ...
subroutine, public check_exp_minimax_range(k, rc, ierr)
Check that a minimax approximation is available for given input k, Rc. ierr == 0: everything ok ierr ...
Routines to calculate MP2 energy with laplace approach.
subroutine, public sos_mp2_postprocessing(fm_mat_q, erpa, tau_wjquad)
...
Routines for calculating RI-MP2 gradients.
subroutine, public array2fm(mat2d, fm_struct, my_start_row, my_end_row, my_start_col, my_end_col, gd_row, gd_col, group_grid_2_mepos, ngroup_row, ngroup_col, fm_mat, integ_group_size, color_group, do_release_mat)
redistribute local part of array to fm
Types needed for MP2 calculations.
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.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Auxiliary routines needed for RPA-exchange given blacs_env to another.
subroutine, public rpa_exchange_needed_mem(mp2_env, homo, virtual, dimen_ri, para_env, mem_per_rank, mem_per_repl)
...
Routines to calculate RI-RPA and SOS-MP2 gradients.
subroutine, public rpa_grad_finalize(rpa_grad, mp2_env, para_env_sub, para_env, qs_env, gd_array, color_sub, do_ri_sos_laplace_mp2, homo, virtual)
...
subroutine, public rpa_grad_copy_q(fm_mat_q, rpa_grad)
...
pure subroutine, public rpa_grad_needed_mem(homo, virtual, dimen_ri, mem_per_rank, mem_per_repl, do_ri_sos_laplace_mp2)
Calculates the necessary minimum memory for the Gradient code ion MiB.
subroutine, public rpa_grad_create(rpa_grad, fm_mat_q, fm_mat_s, homo, virtual, mp2_env, eigenval, unit_nr, do_ri_sos_laplace_mp2)
Creates the arrays of a rpa_grad_type.
subroutine, public rpa_grad_matrix_operations(mp2_env, rpa_grad, do_ri_sos_laplace_mp2, fm_mat_q, fm_mat_q_gemm, dgemm_counter, fm_mat_s, omega, homo, virtual, eigenval, weight, unit_nr)
...
Routines to calculate image charge corrections.
subroutine, public calculate_ic_correction(eigenval, mat_sinvvsinv, t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected, gw_corr_lev_tot, gw_corr_lev_occ, gw_corr_lev_virt, homo, unit_nr, print_ic_values, para_env, do_alpha, do_beta)
...
Routines treating GW and RPA calculations with kpoints.
subroutine, public invert_eps_compute_w_and_erpa_kp(dimen_ri, jquad, nkp, count_ev_sc_gw, para_env, erpa, grid, wkp_w, do_gw_im_time, do_ri_sigma_x, do_kpoints_from_gamma, cfm_mat_q, ikp_local, mat_p_omega, mat_p_omega_kp, qs_env, eps_filter_im_time, unit_nr, kpoints, fm_mat_minv_l_kpoints, fm_matrix_l_kpoints, fm_mat_w, fm_mat_ri_global_work, mat_minvvminv, fm_matrix_minv, fm_matrix_minv_vtrunc_minv)
...
subroutine, public get_bandstruc_and_k_dependent_mos(qs_env, eigenval_kp)
...
Routines for GW, continuous development [Jan Wilhelm].
subroutine, public deallocate_matrices_gw(fm_mat_s_gw_work, vec_w_gw, vec_sigma_c_gw, vec_omega_fit_gw, vec_sigma_x_minus_vxc_gw, eigenval_last, eigenval_scf, do_periodic, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, kpoints, vec_sigma_x_gw, my_do_gw)
...
subroutine, public allocate_matrices_gw(vec_sigma_c_gw, color_rpa_group, dimen_nm_gw, gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, num_integ_group, unit_nr, gw_corr_lev_tot, num_fit_points, omega_max_fit, do_minimax_quad, do_periodic, do_ri_sigma_x, my_do_gw, first_cycle_periodic_correction, grid, eigenval, vec_omega_fit_gw, vec_sigma_x_gw, delta_corr, eigenval_last, eigenval_scf, vec_w_gw, fm_mat_s_gw, fm_mat_s_gw_work, para_env, mp2_env, kpoints, nkp, nkp_self_energy, do_kpoints_cubic_rpa, do_kpoints_from_gamma)
...
subroutine, public compute_gw_self_energy(vec_sigma_c_gw, dimen_nm_gw, dimen_ri, gw_corr_lev_occ, gw_corr_lev_virt, homo, jquad, nmo, num_fit_points, do_im_time, do_periodic, first_cycle_periodic_correction, fermi_level_offset, omega, eigenval, delta_corr, vec_omega_fit_gw, vec_w_gw, grid, fm_mat_q, fm_mat_r_gw, fm_mat_s_gw, fm_mat_s_gw_work, mo_coeff, para_env, para_env_rpa, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, kpoints, qs_env, mp2_env)
...
subroutine, public get_fermi_level_offset(fermi_level_offset, fermi_level_offset_input, eigenval, homo)
...
subroutine, public allocate_matrices_gw_im_time(gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, num_integ_points, unit_nr, ri_blk_sizes, do_ic_model, para_env, fm_mat_w, fm_mat_q, mo_coeff, t_3c_overl_int_ao_mo, t_3c_o_mo_compressed, t_3c_o_mo_ind, t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, starts_array_mc, ends_array_mc, t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected, matrix_s, mat_w, t_3c_overl_int, t_3c_o_compressed, t_3c_o_ind, qs_env)
...
subroutine, public compute_w_cubic_gw(fm_mat_w, fm_mat_q, fm_mat_work, dimen_ri, fm_mat_l, grid, jquad, omega)
...
subroutine, public compute_qp_energies(vec_sigma_c_gw, count_ev_sc_gw, gw_corr_lev_occ, gw_corr_lev_tot, gw_corr_lev_virt, homo, nmo, num_fit_points, unit_nr, do_apply_ic_corr_to_gw, do_im_time, do_periodic, do_ri_sigma_x, first_cycle_periodic_correction, e_fermi, eps_filter, fermi_level_offset, delta_corr, eigenval, eigenval_last, eigenval_scf, iter_sc_gw0, exit_ev_gw, grid, vec_omega_fit_gw, vec_sigma_x_gw, ic_corr_list, cfm_mo_coeff, mo_coeff, fm_mat_w, para_env, para_env_rpa, mat_dm, mat_minvvminv, t_3c_o, t_3c_m, t_3c_overl_int_ao_mo, t_3c_o_compressed, t_3c_o_mo_compressed, t_3c_o_ind, t_3c_o_mo_ind, t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, mat_w, matrix_s, kpoints, mp2_env, qs_env, nkp_self_energy, do_kpoints_cubic_rpa, starts_array_mc, ends_array_mc)
...
subroutine, public deallocate_matrices_gw_im_time(do_ic_model, do_kpoints_cubic_rpa, fm_mat_w, t_3c_overl_int_ao_mo, t_3c_o_mo_compressed, t_3c_o_mo_ind, t_3c_overl_int_gw_ri, t_3c_overl_int_gw_ao, t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected, mat_w, qs_env)
...
Routines needed for cubic-scaling RPA and SOS-Laplace-MP2 forces.
subroutine, public calc_post_loop_forces(force_data, unit_nr, qs_env)
All the forces that can be calculated after the loop on the Laplace quaradture, using terms collected...
subroutine, public calc_rpa_loop_forces(force_data, mat_p_omega, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, cfm_mo_coeff, homo, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, nmo, eigenval, e_fermi, grid, cut_memory, ispin, open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
Updates the cubic-scaling RPA contribution to the forces at each quadrature point....
subroutine, public calc_laplace_loop_forces(force_data, mat_p_omega, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, cfm_mo_coeff, homo, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, nmo, eigenval, grid, cut_memory, pspin, qspin, open_shell, unit_nr, dbcsr_time, dbcsr_nflop, mp2_env, qs_env)
Updates the cubic-scaling SOS-Laplace-MP2 contribution to the forces at each quadrature point.
subroutine, public keep_initial_quad(grid, do_laplace, do_im_time, unit_nr, qs_env)
Overwrites the "optimal" Laplace quadrature with that of the first step.
subroutine, public init_im_time_forces(force_data, fm_matrix_pq, t_3c_m, unit_nr, mp2_env, qs_env)
Initializes and pre-calculates all needed tensors for the forces.
Types needed for cubic-scaling RPA and SOS-Laplace-MP2 forces.
subroutine, public im_time_force_release(force_data)
Cleans everything up.
Routines for low-scaling RPA/GW with imaginary time.
subroutine, public zero_mat_p_omega(mat_p_omega)
...
subroutine, public compute_mat_p_omega(mat_p_omega, cfm_mo_coeff, homo, mat_p_global, matrix_s, ispin, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, grid, e_fermi, eps_filter, alpha, eps_filter_im_time, eigenval, nmo, cut_memory, unit_nr, mp2_env, para_env, qs_env, do_kpoints_from_gamma, index_to_cell_3c, cell_to_index_3c, has_mat_p_blocks, do_ri_sos_laplace_mp2, dbcsr_time, dbcsr_nflop)
...
Routines to calculate RI-RPA energy.
subroutine, public rpa_ri_compute_en(qs_env, erpa, mp2_env, bib_c, bib_c_gw, bib_c_bse_ij, bib_c_bse_ab, para_env, para_env_sub, color_sub, gd_array, gd_b_virtual, gd_b_all, gd_b_occ_bse, gd_b_virt_bse, mo_coeff, fm_matrix_pq, fm_matrix_l_kpoints, fm_matrix_minv_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, kpoints, eigenval, nmo, homo, dimen_ri, dimen_ri_red, gw_corr_lev_occ, gw_corr_lev_virt, bse_lev_virt, unit_nr, do_ri_sos_laplace_mp2, my_do_gw, do_im_time, do_bse, matrix_s, mat_munu, mat_p_global, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, starts_array_mc, ends_array_mc, starts_array_mc_block, ends_array_mc_block, calc_forces)
...
Routines to calculate RI-RPA energy and Sigma correction to the RPA energies using the cubic spline b...
subroutine, public rpa_sigma_create(rpa_sigma, sigma_param, fm_mat_q, unit_nr, para_env)
... Collect the Q(w) (fm_mat_Q) matrix to create rpa_sigma a derived type variable....
subroutine, public finalize_rpa_sigma(rpa_sigma, unit_nr, e_sigma_corr, para_env, do_minimax_quad)
... Save the calculated value of E_c correction to the global variable and memory clean.
subroutine, public rpa_sigma_matrix_spectral(rpa_sigma, fm_mat_q, wj, para_env_rpa)
... Diagonalize and store the eigenvalues of fm_mat_Q in rpa_sigmasigma_eigenvalue.
Utility functions for RPA calculations.
subroutine, public alloc_im_time(qs_env, para_env, dimen_ri, dimen_ri_red, num_integ_points, nspins, fm_mat_q, cfm_mo_coeff, fm_matrix_minv_l_kpoints, fm_matrix_l_kpoints, mat_p_global, t_3c_o, matrix_s, kpoints, eps_filter_im_time, cut_memory, nkp, num_cells_dm, num_3c_repl, size_p, ikp_local, index_to_cell_3c, cell_to_index_3c, col_blk_size, do_ic_model, do_kpoints_cubic_rpa, do_kpoints_from_gamma, do_ri_sigma_x, my_open_shell, has_mat_p_blocks, wkp_w, cfm_mat_q, fm_mat_minv_l_kpoints, fm_mat_l_kpoints, fm_mat_ri_global_work, fm_mat_work, mat_dm, mat_l, mat_m_p_munu_occ, mat_m_p_munu_virt, mat_minvvminv, mat_p_omega, mat_p_omega_kp, mat_work, mo_coeff)
...
subroutine, public compute_erpa_by_freq_int(dimen_ri, trace_qomega, fm_mat_q, para_env_rpa, erpa, wjquad)
...
subroutine, public q_trace_and_add_unit_matrix(dimen_ri, trace_qomega, fm_mat_q)
...
subroutine, public calc_mat_q(fm_mat_s, do_ri_sos_laplace_mp2, first_cycle, virtual, eigenval, homo, omega, omega_old, jquad, mm_style, dimen_ri, dimen_ia, alpha, fm_mat_q, fm_mat_q_gemm, do_bse, fm_mat_q_static_bse_gemm, dgemm_counter, num_integ_points, count_ev_sc_gw)
...
subroutine, public contract_p_omega_with_mat_l(mat_p_omega, mat_l, mat_work, eps_filter_im_time, fm_mat_work, dimen_ri, dimen_ri_red, fm_mat_l, fm_mat_q)
...
subroutine, public dealloc_im_time(cfm_mo_coeff, index_to_cell_3c, cell_to_index_3c, do_ic_model, do_kpoints_cubic_rpa, do_kpoints_from_gamma, do_ri_sigma_x, has_mat_p_blocks, wkp_w, cfm_mat_q, fm_mat_minv_l_kpoints, fm_mat_l_kpoints, fm_matrix_minv, fm_matrix_minv_vtrunc_minv, fm_mat_ri_global_work, fm_mat_work, mat_dm, mat_l, mat_minvvminv, mat_p_omega, mat_p_omega_kp, t_3c_m, t_3c_o, t_3c_o_compressed, t_3c_o_ind, mat_work, qs_env)
...
subroutine, public remove_scaling_factor_rpa(fm_mat_s, virtual, eigenval_last, homo, omega_old)
...
Definition and construction of time/frequency grids for correlation methods.
subroutine, public build_minimax_time_frequency_grid(num_points, energy_min, energy_max, regularization, num_points_per_magnitude, grid, build_frequency, build_time, build_transforms, build_sine, time_scaling, time_weight_scaling, max_fit_error, print_warning, unit_nr, prefer_external_backend, used_external_backend)
Build a minimax time/frequency grid through the common backend boundary.
subroutine, public build_clenshaw_grid(num_points, grid)
Build a Clenshaw-Curtis frequency grid.
subroutine, public time_frequency_grid_release(grid)
Release all data owned by a time_frequency_grid_type object.
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
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
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment