59#include "./base/base_uses.f90"
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_small_cell_full_kp'
82 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gw_calc_small_cell_full_kp'
86 CALL timeset(routinen, handle)
95 CALL compute_chi(bs_env)
99 CALL compute_w_real_space(bs_env, qs_env)
106 CALL compute_sigma_x(bs_env, qs_env)
110 CALL compute_sigma_c(bs_env)
113 CALL compute_qp_energies(bs_env)
117 CALL timestop(handle)
125 SUBROUTINE compute_chi(bs_env)
128 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_chi'
130 INTEGER :: cell_dr(3), cell_r1(3), cell_r2(3), &
131 handle, i_cell_delta_r, i_cell_r1, &
132 i_cell_r2, i_t, i_task_delta_r_local, &
134 LOGICAL :: cell_found
135 REAL(kind=
dp) :: t1, tau
136 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: gocc_s, gvir_s, t_chi_r
137 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_gocc, t_gvir
139 CALL timeset(routinen, handle)
141 DO i_t = 1, bs_env%num_time_freq_points
143 CALL dbt_create_2c_r(gocc_s, bs_env%t_G, bs_env%nimages_scf_desymm)
144 CALL dbt_create_2c_r(gvir_s, bs_env%t_G, bs_env%nimages_scf_desymm)
145 CALL dbt_create_2c_r(t_chi_r, bs_env%t_chi, bs_env%nimages_scf_desymm)
146 CALL dbt_create_3c_r1_r2(t_gocc, bs_env%t_RI_AO__AO, bs_env%nimages_3c, bs_env%nimages_3c)
147 CALL dbt_create_3c_r1_r2(t_gvir, bs_env%t_RI_AO__AO, bs_env%nimages_3c, bs_env%nimages_3c)
150 tau = bs_env%imag_time_points(i_t)
152 DO ispin = 1, bs_env%n_spin
159 CALL g_occ_vir(bs_env, tau, gocc_s, ispin, occ=.true., vir=.false.)
160 CALL g_occ_vir(bs_env, tau, gvir_s, ispin, occ=.false., vir=.true.)
163 DO i_task_delta_r_local = 1, bs_env%n_tasks_Delta_R_local
165 IF (bs_env%skip_DR_chi(i_task_delta_r_local)) cycle
167 i_cell_delta_r = bs_env%task_Delta_R(i_task_delta_r_local)
169 DO i_cell_r2 = 1, bs_env%nimages_3c
171 cell_r2(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r2)
172 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
175 CALL add_r(cell_r2, cell_dr, bs_env%index_to_cell_3c, cell_r1, &
176 cell_found, bs_env%cell_to_index_3c, i_cell_r1)
179 IF (.NOT. cell_found) cycle
181 CALL g_times_3c(gocc_s, t_gocc, bs_env, i_cell_r1, i_cell_r2, &
182 i_task_delta_r_local, bs_env%skip_DR_R12_S_Goccx3c_chi)
183 CALL g_times_3c(gvir_s, t_gvir, bs_env, i_cell_r2, i_cell_r1, &
184 i_task_delta_r_local, bs_env%skip_DR_R12_S_Gvirx3c_chi)
189 CALL contract_m_occ_vir_to_chi(t_gocc, t_gvir, t_chi_r, bs_env, &
190 i_task_delta_r_local)
196 CALL bs_env%para_env%sync()
199 bs_env%mat_RI_RI_tensor, bs_env)
201 CALL destroy_t_1d(gocc_s)
202 CALL destroy_t_1d(gvir_s)
203 CALL destroy_t_1d(t_chi_r)
204 CALL destroy_t_2d(t_gocc)
205 CALL destroy_t_2d(t_gvir)
207 IF (bs_env%unit_nr > 0)
THEN
208 WRITE (bs_env%unit_nr,
'(T2,A,I13,A,I3,A,F7.1,A)') &
209 χτ
'Computed ^R(i) for time point', i_t,
' /', bs_env%num_time_freq_points, &
215 CALL timestop(handle)
217 END SUBROUTINE compute_chi
225 SUBROUTINE dbt_create_2c_r(R, template, nimages)
227 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: r
228 TYPE(dbt_type) :: template
231 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbt_create_2c_R'
233 INTEGER :: handle, i_cell_s
235 CALL timeset(routinen, handle)
237 ALLOCATE (r(nimages))
238 DO i_cell_s = 1, nimages
239 CALL dbt_create(template, r(i_cell_s))
242 CALL timestop(handle)
244 END SUBROUTINE dbt_create_2c_r
253 SUBROUTINE dbt_create_3c_r1_r2(t_3c_R1_R2, t_3c_template, nimages_1, nimages_2)
255 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_r1_r2
256 TYPE(dbt_type) :: t_3c_template
257 INTEGER :: nimages_1, nimages_2
259 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbt_create_3c_R1_R2'
261 INTEGER :: handle, i_cell, j_cell
263 CALL timeset(routinen, handle)
265 ALLOCATE (t_3c_r1_r2(nimages_1, nimages_2))
266 DO i_cell = 1, nimages_1
267 DO j_cell = 1, nimages_2
268 CALL dbt_create(t_3c_template, t_3c_r1_r2(i_cell, j_cell))
272 CALL timestop(handle)
274 END SUBROUTINE dbt_create_3c_r1_r2
286 SUBROUTINE g_times_3c(t_G_S, t_M, bs_env, i_cell_R1, i_cell_R2, i_task_Delta_R_local, &
288 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_g_s
289 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_m
291 INTEGER :: i_cell_r1, i_cell_r2, &
293 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :, :) :: skip_dr_r1_s_gx3c
295 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_times_3c'
297 INTEGER :: handle, i_cell_r1_p_s, i_cell_s
298 INTEGER(KIND=int_8) :: flop
299 INTEGER,
DIMENSION(3) :: cell_r1, cell_r1_plus_cell_s, cell_r2, &
301 LOGICAL :: cell_found
302 TYPE(dbt_type) :: t_3c_int
304 CALL timeset(routinen, handle)
306 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_int)
308 cell_r1(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r1)
309 cell_r2(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r2)
311 DO i_cell_s = 1, bs_env%nimages_scf_desymm
313 IF (skip_dr_r1_s_gx3c(i_task_delta_r_local, i_cell_r1, i_cell_s)) cycle
315 cell_s(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_s)
316 cell_r1_plus_cell_s(1:3) = cell_r1(1:3) + cell_s(1:3)
320 IF (.NOT. cell_found) cycle
322 i_cell_r1_p_s = bs_env%cell_to_index_3c(cell_r1_plus_cell_s(1), cell_r1_plus_cell_s(2), &
323 cell_r1_plus_cell_s(3))
325 IF (bs_env%nblocks_3c(i_cell_r2, i_cell_r1_p_s) == 0) cycle
327 CALL get_t_3c_int(t_3c_int, bs_env, i_cell_r2, i_cell_r1_p_s)
329 CALL dbt_contract(alpha=1.0_dp, &
331 tensor_2=t_g_s(i_cell_s), &
333 tensor_3=t_m(i_cell_r1, i_cell_r2), &
334 contract_1=[3], notcontract_1=[1, 2], map_1=[1, 2], &
335 contract_2=[2], notcontract_2=[1], map_2=[3], &
336 filter_eps=bs_env%eps_filter, flop=flop)
338 IF (flop == 0_int_8) skip_dr_r1_s_gx3c(i_task_delta_r_local, i_cell_r1, i_cell_s) = .true.
342 CALL dbt_destroy(t_3c_int)
344 CALL timestop(handle)
346 END SUBROUTINE g_times_3c
355 SUBROUTINE get_t_3c_int(t_3c_int, bs_env, j_cell, k_cell)
357 TYPE(dbt_type) :: t_3c_int
359 INTEGER :: j_cell, k_cell
361 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_t_3c_int'
365 CALL timeset(routinen, handle)
367 CALL dbt_clear(t_3c_int)
368 IF (j_cell < k_cell)
THEN
369 CALL dbt_copy(bs_env%t_3c_int(k_cell, j_cell), t_3c_int, order=[1, 3, 2])
371 CALL dbt_copy(bs_env%t_3c_int(j_cell, k_cell), t_3c_int)
374 CALL timestop(handle)
376 END SUBROUTINE get_t_3c_int
387 SUBROUTINE g_occ_vir(bs_env, tau, G_S, ispin, occ, vir)
390 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: g_s
394 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_occ_vir'
396 INTEGER :: handle, homo, i_cell_s, ikp, j, &
397 j_col_local, n_mo, ncol_local, &
399 INTEGER,
DIMENSION(:),
POINTER :: col_indices
400 REAL(kind=
dp) :: tau_e
402 CALL timeset(routinen, handle)
404 cpassert(occ .NEQV. vir)
407 ncol_local=ncol_local, &
408 col_indices=col_indices)
410 nkp = bs_env%nkp_scf_desymm
411 nimages = bs_env%nimages_scf_desymm
413 homo = bs_env%n_occ(ispin)
415 DO i_cell_s = 1, bs_env%nimages_scf_desymm
422 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), bs_env%cfm_work_mo)
425 DO j_col_local = 1, ncol_local
427 j = col_indices(j_col_local)
430 tau_e = abs(tau*0.5_dp*(bs_env%eigenval_scf(j, ikp, ispin) - bs_env%e_fermi(ispin)))
432 IF (tau_e < bs_env%stabilize_exp)
THEN
433 bs_env%cfm_work_mo%local_data(:, j_col_local) = &
434 bs_env%cfm_work_mo%local_data(:, j_col_local)*exp(-tau_e)
436 bs_env%cfm_work_mo%local_data(:, j_col_local) =
z_zero
439 IF ((occ .AND. j > homo) .OR. (vir .AND. j <= homo))
THEN
440 bs_env%cfm_work_mo%local_data(:, j_col_local) =
z_zero
446 matrix_a=bs_env%cfm_work_mo, matrix_b=bs_env%cfm_work_mo, &
447 beta=
z_zero, matrix_c=bs_env%cfm_work_mo_2)
451 bs_env%kpoints_scf_desymm, ikp)
456 DO i_cell_s = 1, bs_env%nimages_scf_desymm
458 bs_env%mat_ao_ao_tensor%matrix, g_s(i_cell_s), bs_env)
461 CALL timestop(handle)
463 END SUBROUTINE g_occ_vir
473 SUBROUTINE contract_m_occ_vir_to_chi(t_Gocc, t_Gvir, t_chi_R, bs_env, i_task_Delta_R_local)
474 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_gocc, t_gvir
475 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_chi_r
477 INTEGER :: i_task_delta_r_local
479 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_M_occ_vir_to_chi'
481 INTEGER :: handle, i_cell_delta_r, i_cell_r, &
482 i_cell_r1, i_cell_r1_minus_r, &
483 i_cell_r2, i_cell_r2_minus_r
484 INTEGER(KIND=int_8) :: flop, flop_tmp
485 INTEGER,
DIMENSION(3) :: cell_dr, cell_r, cell_r1, &
486 cell_r1_minus_r, cell_r2, &
488 LOGICAL :: cell_found
489 TYPE(dbt_type) :: t_gocc_2, t_gvir_2
491 CALL timeset(routinen, handle)
493 CALL dbt_create(bs_env%t_RI__AO_AO, t_gocc_2)
494 CALL dbt_create(bs_env%t_RI__AO_AO, t_gvir_2)
499 DO i_cell_r = 1, bs_env%nimages_scf_desymm
501 DO i_cell_r2 = 1, bs_env%nimages_3c
503 IF (bs_env%skip_DR_R_R2_MxM_chi(i_task_delta_r_local, i_cell_r2, i_cell_r)) cycle
505 i_cell_delta_r = bs_env%task_Delta_R(i_task_delta_r_local)
507 cell_r(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r)
508 cell_r2(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r2)
509 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
512 CALL add_r(cell_r2, cell_dr, bs_env%index_to_cell_3c, cell_r1, &
513 cell_found, bs_env%cell_to_index_3c, i_cell_r1)
514 IF (.NOT. cell_found) cycle
517 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
518 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
519 IF (.NOT. cell_found) cycle
522 CALL add_r(cell_r2, -cell_r, bs_env%index_to_cell_3c, cell_r2_minus_r, &
523 cell_found, bs_env%cell_to_index_3c, i_cell_r2_minus_r)
524 IF (.NOT. cell_found) cycle
527 CALL dbt_copy(t_gocc(i_cell_r1, i_cell_r2), t_gocc_2, order=[1, 3, 2])
528 CALL dbt_copy(t_gvir(i_cell_r2_minus_r, i_cell_r1_minus_r), t_gvir_2)
531 CALL dbt_contract(alpha=bs_env%spin_degeneracy, &
532 tensor_1=t_gocc_2, tensor_2=t_gvir_2, &
533 beta=1.0_dp, tensor_3=t_chi_r(i_cell_r), &
534 contract_1=[2, 3], notcontract_1=[1], map_1=[1], &
535 contract_2=[2, 3], notcontract_2=[1], map_2=[2], &
536 filter_eps=bs_env%eps_filter, move_data=.true., flop=flop_tmp)
538 IF (flop_tmp == 0_int_8) bs_env%skip_DR_R_R2_MxM_chi(i_task_delta_r_local, &
539 i_cell_r2, i_cell_r) = .true.
541 flop = flop + flop_tmp
547 IF (flop == 0_int_8) bs_env%skip_DR_chi(i_task_delta_r_local) = .true.
550 DO i_cell_r1 = 1, bs_env%nimages_3c
551 DO i_cell_r2 = 1, bs_env%nimages_3c
552 CALL dbt_clear(t_gocc(i_cell_r1, i_cell_r2))
553 CALL dbt_clear(t_gvir(i_cell_r1, i_cell_r2))
557 CALL dbt_destroy(t_gocc_2)
558 CALL dbt_destroy(t_gvir_2)
560 CALL timestop(handle)
562 END SUBROUTINE contract_m_occ_vir_to_chi
569 SUBROUTINE compute_w_real_space(bs_env, qs_env)
573 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_W_real_space'
575 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: chi_k_w, eps_k_w, w_k_w
576 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_inv, m_inv_v_sqrt, v_sqrt
577 INTEGER :: handle, i_t, ikp, ikp_local, j_w, n_ri, &
579 REAL(kind=
dp) :: freq_j, t1, time_i, weight_ij
580 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: chi_r, mwm_r, w_r
582 CALL timeset(routinen, handle)
585 nimages_scf_desymm = bs_env%nimages_scf_desymm
587 ALLOCATE (chi_k_w(n_ri, n_ri), eps_k_w(n_ri, n_ri), w_k_w(n_ri, n_ri))
588 ALLOCATE (chi_r(n_ri, n_ri, nimages_scf_desymm), w_r(n_ri, n_ri, nimages_scf_desymm), &
589 mwm_r(n_ri, n_ri, nimages_scf_desymm))
593 CALL compute_minv_and_vsqrt(bs_env, qs_env, m_inv_v_sqrt, m_inv, v_sqrt)
595 IF (bs_env%unit_nr > 0)
THEN
596 WRITE (bs_env%unit_nr,
'(T2,A,T58,A,F7.1,A)') &
597 'Computed V_PQ(k),',
'Execution time',
m_walltime() - t1,
' s'
598 WRITE (bs_env%unit_nr,
'(A)')
' '
603 DO j_w = 1, bs_env%num_time_freq_points
606 chi_r(:, :, :) = 0.0_dp
607 DO i_t = 1, bs_env%num_time_freq_points
608 freq_j = bs_env%imag_freq_points(j_w)
609 time_i = bs_env%imag_time_points(i_t)
610 weight_ij = bs_env%weights_cos_t_to_w(j_w, i_t)*cos(time_i*freq_j)
616 w_r(:, :, :) = 0.0_dp
617 DO ikp = 1, bs_env%nkp_chi_eps_W_orig_plus_extra
620 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
622 ikp_local = ikp_local + 1
625 CALL rs_to_kp(chi_r, chi_k_w, bs_env%kpoints_scf_desymm%index_to_cell, &
626 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
629 CALL power(chi_k_w, 1.0_dp, bs_env%eps_eigval_mat_RI)
634 CALL gemm_square(m_inv_v_sqrt(:, :, ikp_local),
'C', chi_k_w,
'N', m_inv_v_sqrt(:, :, ikp_local),
'N', eps_k_w)
637 CALL add_on_diag(eps_k_w,
z_one)
642 CALL power(eps_k_w, -1.0_dp, 0.0_dp)
645 CALL add_on_diag(eps_k_w, -
z_one)
648 CALL gemm_square(v_sqrt(:, :, ikp_local),
'N', eps_k_w,
'N', v_sqrt(:, :, ikp_local),
'C', w_k_w)
652 index_to_cell_ext=bs_env%kpoints_scf_desymm%index_to_cell)
656 CALL bs_env%para_env%sync()
657 CALL bs_env%para_env%sum(w_r)
661 CALL mult_w_with_minv(w_r, mwm_r, bs_env, qs_env)
664 DO i_t = 1, bs_env%num_time_freq_points
665 freq_j = bs_env%imag_freq_points(j_w)
666 time_i = bs_env%imag_time_points(i_t)
667 weight_ij = bs_env%weights_cos_w_to_t(i_t, j_w)*cos(time_i*freq_j)
673 IF (bs_env%unit_nr > 0)
THEN
674 WRITE (bs_env%unit_nr,
'(T2,A,T60,A,F7.1,A)') &
675 ωτ
'Computed W_PQ(k,i) for all k and ,',
'Execution time',
m_walltime() - t1,
' s'
676 WRITE (bs_env%unit_nr,
'(A)')
' '
679 CALL timestop(handle)
681 END SUBROUTINE compute_w_real_space
691 SUBROUTINE compute_minv_and_vsqrt(bs_env, qs_env, M_inv_V_sqrt, M_inv, V_sqrt)
694 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_inv_v_sqrt, m_inv, v_sqrt
696 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Minv_and_Vsqrt'
698 INTEGER :: handle, ikp, ikp_local, n_ri, nkp, &
700 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
702 CALL timeset(routinen, handle)
704 nkp = bs_env%nkp_chi_eps_W_orig_plus_extra
705 nkp_orig = bs_env%nkp_chi_eps_W_orig
711 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
712 nkp_local = nkp_local + 1
715 ALLOCATE (m_inv_v_sqrt(n_ri, n_ri, nkp_local), m_inv(n_ri, n_ri, nkp_local), &
716 v_sqrt(n_ri, n_ri, nkp_local))
718 m_inv_v_sqrt(:, :, :) =
z_zero
723 bs_env%kpoints_chi_eps_W%nkp_grid = bs_env%nkp_grid_chi_eps_W_orig
725 bs_env%size_lattice_sum_V, basis_type=
"RI_AUX", &
726 ikp_start=1, ikp_end=nkp_orig)
729 bs_env%kpoints_chi_eps_W%nkp_grid = bs_env%nkp_grid_chi_eps_W_extra
731 bs_env%size_lattice_sum_V, basis_type=
"RI_AUX", &
732 ikp_start=nkp_orig + 1, ikp_end=nkp)
737 CALL get_v_tr_r(m_r, bs_env%ri_metric, bs_env%regularization_RI, bs_env, qs_env)
743 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
745 ikp_local = ikp_local + 1
748 CALL rs_to_kp(m_r, m_inv(:, :, ikp_local), &
749 bs_env%kpoints_scf_desymm%index_to_cell, &
750 bs_env%kpoints_chi_eps_W%xkp(1:3, ikp))
753 CALL power(m_inv(:, :, ikp_local), -1.0_dp, 0.0_dp)
756 CALL power(v_sqrt(:, :, ikp_local), 0.5_dp, 0.0_dp)
759 CALL gemm_square(m_inv(:, :, ikp_local),
'N', v_sqrt(:, :, ikp_local),
'C', m_inv_v_sqrt(:, :, ikp_local))
763 CALL timestop(handle)
765 END SUBROUTINE compute_minv_and_vsqrt
772 SUBROUTINE add_on_diag(matrix, alpha)
773 COMPLEX(KIND=dp),
DIMENSION(:, :) :: matrix
774 COMPLEX(KIND=dp) :: alpha
776 CHARACTER(len=*),
PARAMETER :: routinen =
'add_on_diag'
778 INTEGER :: handle, i, n
780 CALL timeset(routinen, handle)
783 cpassert(n ==
SIZE(matrix, 2))
786 matrix(i, i) = matrix(i, i) + alpha
789 CALL timestop(handle)
791 END SUBROUTINE add_on_diag
800 SUBROUTINE mult_w_with_minv(W_R, MWM_R, bs_env, qs_env)
801 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: w_r, mwm_r
805 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mult_W_with_Minv'
807 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: m_inv, w_k, work
808 INTEGER :: handle, ikp, n_ri
809 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r
811 CALL timeset(routinen, handle)
814 CALL get_v_tr_r(m_r, bs_env%ri_metric, bs_env%regularization_RI, bs_env, qs_env)
817 ALLOCATE (m_inv(n_ri, n_ri), w_k(n_ri, n_ri), work(n_ri, n_ri))
818 mwm_r(:, :, :) = 0.0_dp
820 DO ikp = 1, bs_env%nkp_scf_desymm
823 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
827 bs_env%kpoints_scf_desymm%index_to_cell, &
828 bs_env%kpoints_scf_desymm%xkp(1:3, ikp))
831 CALL power(m_inv, -1.0_dp, 0.0_dp)
835 bs_env%kpoints_scf_desymm%index_to_cell, &
836 bs_env%kpoints_scf_desymm%xkp(1:3, ikp))
839 CALL gemm_square(m_inv,
'N', w_k,
'N', m_inv,
'N', work)
840 w_k(:, :) = work(:, :)
847 CALL bs_env%para_env%sync()
848 CALL bs_env%para_env%sum(mwm_r)
850 CALL timestop(handle)
852 END SUBROUTINE mult_w_with_minv
859 SUBROUTINE compute_sigma_x(bs_env, qs_env)
863 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Sigma_x'
865 INTEGER :: handle, i_task_delta_r_local, ispin
867 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: d_s, mi_vtr_mi_r, sigma_x_r
868 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_v
870 CALL timeset(routinen, handle)
872 CALL dbt_create_2c_r(mi_vtr_mi_r, bs_env%t_W, bs_env%nimages_scf_desymm)
873 CALL dbt_create_2c_r(d_s, bs_env%t_G, bs_env%nimages_scf_desymm)
874 CALL dbt_create_2c_r(sigma_x_r, bs_env%t_G, bs_env%nimages_scf_desymm)
875 CALL dbt_create_3c_r1_r2(t_v, bs_env%t_RI_AO__AO, bs_env%nimages_3c, bs_env%nimages_3c)
882 CALL get_minv_vtr_minv_r(mi_vtr_mi_r, bs_env, qs_env)
886 DO ispin = 1, bs_env%n_spin
890 CALL g_occ_vir(bs_env, 0.0_dp, d_s, ispin, occ=.true., vir=.false.)
893 DO i_task_delta_r_local = 1, bs_env%n_tasks_Delta_R_local
896 CALL contract_w(t_v, mi_vtr_mi_r, bs_env, i_task_delta_r_local)
901 CALL contract_to_sigma(sigma_x_r, t_v, d_s, i_task_delta_r_local, bs_env, &
902 occ=.true., vir=.false., clear_t_w=.true., fill_skip=.false.)
906 CALL bs_env%para_env%sync()
909 bs_env%mat_ao_ao_tensor, bs_env)
913 IF (bs_env%unit_nr > 0)
THEN
914 WRITE (bs_env%unit_nr,
'(T2,A,T58,A,F7.1,A)') &
915 Σ
'Computed ^x,',
' Execution time',
m_walltime() - t1,
' s'
916 WRITE (bs_env%unit_nr,
'(A)')
' '
919 CALL destroy_t_1d(mi_vtr_mi_r)
920 CALL destroy_t_1d(d_s)
921 CALL destroy_t_1d(sigma_x_r)
922 CALL destroy_t_2d(t_v)
924 CALL timestop(handle)
926 END SUBROUTINE compute_sigma_x
932 SUBROUTINE compute_sigma_c(bs_env)
935 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Sigma_c'
937 INTEGER :: handle, i_t, i_task_delta_r_local, ispin
938 REAL(kind=
dp) :: t1, tau
939 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: gocc_s, gvir_s, sigma_c_r_neg_tau, &
940 sigma_c_r_pos_tau, w_r
941 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_w
943 CALL timeset(routinen, handle)
945 CALL dbt_create_2c_r(gocc_s, bs_env%t_G, bs_env%nimages_scf_desymm)
946 CALL dbt_create_2c_r(gvir_s, bs_env%t_G, bs_env%nimages_scf_desymm)
947 CALL dbt_create_2c_r(w_r, bs_env%t_W, bs_env%nimages_scf_desymm)
948 CALL dbt_create_3c_r1_r2(t_w, bs_env%t_RI_AO__AO, bs_env%nimages_3c, bs_env%nimages_3c)
949 CALL dbt_create_2c_r(sigma_c_r_neg_tau, bs_env%t_G, bs_env%nimages_scf_desymm)
950 CALL dbt_create_2c_r(sigma_c_r_pos_tau, bs_env%t_G, bs_env%nimages_scf_desymm)
954 DO i_t = 1, bs_env%num_time_freq_points
956 DO ispin = 1, bs_env%n_spin
960 tau = bs_env%imag_time_points(i_t)
965 CALL g_occ_vir(bs_env, tau, gocc_s, ispin, occ=.true., vir=.false.)
966 CALL g_occ_vir(bs_env, tau, gvir_s, ispin, occ=.false., vir=.true.)
969 CALL fm_mwm_r_t_to_local_tensor_w_r(bs_env%fm_MWM_R_t(:, i_t), w_r, bs_env)
972 DO i_task_delta_r_local = 1, bs_env%n_tasks_Delta_R_local
974 IF (bs_env%skip_DR_Sigma(i_task_delta_r_local)) cycle
978 CALL contract_w(t_w, w_r, bs_env, i_task_delta_r_local)
984 CALL contract_to_sigma(sigma_c_r_neg_tau, t_w, gocc_s, i_task_delta_r_local, bs_env, &
985 occ=.true., vir=.false., clear_t_w=.false., fill_skip=.false.)
988 CALL contract_to_sigma(sigma_c_r_pos_tau, t_w, gvir_s, i_task_delta_r_local, bs_env, &
989 occ=.false., vir=.true., clear_t_w=.true., fill_skip=.true.)
993 CALL bs_env%para_env%sync()
996 bs_env%fm_Sigma_c_R_pos_tau(:, i_t, ispin), &
997 bs_env%mat_ao_ao, bs_env%mat_ao_ao_tensor, bs_env)
1000 bs_env%fm_Sigma_c_R_neg_tau(:, i_t, ispin), &
1001 bs_env%mat_ao_ao, bs_env%mat_ao_ao_tensor, bs_env)
1003 IF (bs_env%unit_nr > 0)
THEN
1004 WRITE (bs_env%unit_nr,
'(T2,A,I10,A,I3,A,F7.1,A)') &
1005 Στ
'Computed ^c(i) for time point ', i_t,
' /', bs_env%num_time_freq_points, &
1013 CALL destroy_t_1d(gocc_s)
1014 CALL destroy_t_1d(gvir_s)
1015 CALL destroy_t_1d(w_r)
1016 CALL destroy_t_1d(sigma_c_r_neg_tau)
1017 CALL destroy_t_1d(sigma_c_r_pos_tau)
1018 CALL destroy_t_2d(t_w)
1020 CALL timestop(handle)
1022 END SUBROUTINE compute_sigma_c
1030 SUBROUTINE get_minv_vtr_minv_r(Mi_Vtr_Mi_R, bs_env, qs_env)
1031 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: mi_vtr_mi_r
1035 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_Minv_Vtr_Minv_R'
1037 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: m_kp, mi_vtr_mi_kp, v_tr_kp
1038 INTEGER :: handle, i_cell_r, ikp, n_ri, &
1039 nimages_scf, nkp_scf
1040 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_r, mi_vtr_mi_r_arr, v_tr_r
1042 CALL timeset(routinen, handle)
1044 nimages_scf = bs_env%nimages_scf_desymm
1045 nkp_scf = bs_env%kpoints_scf_desymm%nkp
1048 CALL get_v_tr_r(v_tr_r, bs_env%trunc_coulomb, 0.0_dp, bs_env, qs_env)
1049 CALL get_v_tr_r(m_r, bs_env%ri_metric, bs_env%regularization_RI, bs_env, qs_env)
1051 ALLOCATE (v_tr_kp(n_ri, n_ri), m_kp(n_ri, n_ri), &
1052 mi_vtr_mi_kp(n_ri, n_ri), mi_vtr_mi_r_arr(n_ri, n_ri, nimages_scf))
1053 mi_vtr_mi_r_arr(:, :, :) = 0.0_dp
1057 IF (
modulo(ikp, bs_env%para_env%num_pe) /= bs_env%para_env%mepos) cycle
1059 CALL rs_to_kp(v_tr_r, v_tr_kp, bs_env%kpoints_scf_desymm%index_to_cell, &
1060 bs_env%kpoints_scf_desymm%xkp(1:3, ikp))
1062 CALL rs_to_kp(m_r, m_kp, bs_env%kpoints_scf_desymm%index_to_cell, &
1063 bs_env%kpoints_scf_desymm%xkp(1:3, ikp))
1065 CALL power(m_kp, -1.0_dp, 0.0_dp)
1067 CALL gemm_square(m_kp,
'N', v_tr_kp,
'N', m_kp,
'N', mi_vtr_mi_kp)
1069 CALL add_kp_to_all_rs(mi_vtr_mi_kp, mi_vtr_mi_r_arr, bs_env%kpoints_scf_desymm, ikp)
1071 CALL bs_env%para_env%sync()
1072 CALL bs_env%para_env%sum(mi_vtr_mi_r_arr)
1078 DO i_cell_r = 1, nimages_scf
1080 bs_env%mat_RI_RI_tensor%matrix, mi_vtr_mi_r(i_cell_r), bs_env)
1083 CALL timestop(handle)
1085 END SUBROUTINE get_minv_vtr_minv_r
1091 SUBROUTINE destroy_t_1d(t_1d)
1092 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: t_1d
1094 CHARACTER(LEN=*),
PARAMETER :: routinen =
'destroy_t_1d'
1096 INTEGER :: handle, i
1098 CALL timeset(routinen, handle)
1100 DO i = 1,
SIZE(t_1d)
1101 CALL dbt_destroy(t_1d(i))
1105 CALL timestop(handle)
1107 END SUBROUTINE destroy_t_1d
1113 SUBROUTINE destroy_t_2d(t_2d)
1114 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_2d
1116 CHARACTER(LEN=*),
PARAMETER :: routinen =
'destroy_t_2d'
1118 INTEGER :: handle, i, j
1120 CALL timeset(routinen, handle)
1122 DO i = 1,
SIZE(t_2d, 1)
1123 DO j = 1,
SIZE(t_2d, 2)
1124 CALL dbt_destroy(t_2d(i, j))
1129 CALL timestop(handle)
1131 END SUBROUTINE destroy_t_2d
1140 SUBROUTINE contract_w(t_W, W_R, bs_env, i_task_Delta_R_local)
1141 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_w
1142 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: w_r
1144 INTEGER :: i_task_delta_r_local
1146 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_W'
1148 INTEGER :: handle, i_cell_delta_r, i_cell_r1, &
1149 i_cell_r2, i_cell_r2_m_r1, i_cell_s1, &
1151 INTEGER,
DIMENSION(3) :: cell_dr, cell_r1, cell_r2, cell_r2_m_r1, &
1152 cell_s1, cell_s1_m_r2_p_r1
1153 LOGICAL :: cell_found
1154 TYPE(dbt_type) :: t_3c_int, t_w_tmp
1156 CALL timeset(routinen, handle)
1158 CALL dbt_create(bs_env%t_RI__AO_AO, t_w_tmp)
1159 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_int)
1161 i_cell_delta_r = bs_env%task_Delta_R(i_task_delta_r_local)
1163 DO i_cell_r1 = 1, bs_env%nimages_3c
1165 cell_r1(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r1)
1166 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
1169 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, &
1170 cell_found, bs_env%cell_to_index_3c, i_cell_s1)
1171 IF (.NOT. cell_found) cycle
1173 DO i_cell_r2 = 1, bs_env%nimages_scf_desymm
1175 cell_r2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r2)
1178 CALL add_r(cell_r2, -cell_r1, bs_env%index_to_cell_3c, cell_r2_m_r1, &
1179 cell_found, bs_env%cell_to_index_3c, i_cell_r2_m_r1)
1180 IF (.NOT. cell_found) cycle
1183 CALL add_r(cell_s1, cell_r2_m_r1, bs_env%index_to_cell_3c, cell_s1_m_r2_p_r1, &
1184 cell_found, bs_env%cell_to_index_3c, i_cell_s1_m_r1_p_r2)
1185 IF (.NOT. cell_found) cycle
1187 CALL get_t_3c_int(t_3c_int, bs_env, i_cell_s1_m_r1_p_r2, i_cell_r2_m_r1)
1192 CALL dbt_contract(alpha=1.0_dp, &
1193 tensor_1=w_r(i_cell_r2), &
1194 tensor_2=t_3c_int, &
1197 contract_1=[1], notcontract_1=[2], map_1=[1], &
1198 contract_2=[1], notcontract_2=[2, 3], map_2=[2, 3], &
1199 filter_eps=bs_env%eps_filter)
1202 CALL dbt_copy(t_w_tmp, t_w(i_cell_s1, i_cell_r1), order=[1, 2, 3], &
1203 move_data=.true., summation=.true.)
1209 CALL dbt_destroy(t_w_tmp)
1210 CALL dbt_destroy(t_3c_int)
1212 CALL timestop(handle)
1214 END SUBROUTINE contract_w
1228 SUBROUTINE contract_to_sigma(Sigma_R, t_W, G_S, i_task_Delta_R_local, bs_env, occ, vir, &
1229 clear_t_W, fill_skip)
1230 TYPE(dbt_type),
DIMENSION(:) :: sigma_r
1231 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_w
1232 TYPE(dbt_type),
DIMENSION(:) :: g_s
1233 INTEGER :: i_task_delta_r_local
1235 LOGICAL :: occ, vir, clear_t_w, fill_skip
1237 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_to_Sigma'
1239 INTEGER :: handle, handle2, i_cell_delta_r, i_cell_m_r1, i_cell_r, i_cell_r1, &
1240 i_cell_r1_minus_r, i_cell_s1, i_cell_s1_minus_r, i_cell_s1_p_s2_m_r1, i_cell_s2
1241 INTEGER(KIND=int_8) :: flop, flop_tmp
1242 INTEGER,
DIMENSION(3) :: cell_dr, cell_m_r1, cell_r, cell_r1, &
1243 cell_r1_minus_r, cell_s1, &
1244 cell_s1_minus_r, cell_s1_p_s2_m_r1, &
1246 LOGICAL :: cell_found
1247 REAL(kind=
dp) :: sign_sigma
1248 TYPE(dbt_type) :: t_3c_int, t_g, t_g_2
1250 CALL timeset(routinen, handle)
1252 cpassert(occ .EQV. (.NOT. vir))
1253 IF (occ) sign_sigma = -1.0_dp
1254 IF (vir) sign_sigma = 1.0_dp
1256 CALL dbt_create(bs_env%t_RI_AO__AO, t_g)
1257 CALL dbt_create(bs_env%t_RI_AO__AO, t_g_2)
1258 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_int)
1260 i_cell_delta_r = bs_env%task_Delta_R(i_task_delta_r_local)
1264 DO i_cell_r1 = 1, bs_env%nimages_3c
1266 cell_r1(1:3) = bs_env%index_to_cell_3c(1:3, i_cell_r1)
1267 cell_dr(1:3) = bs_env%index_to_cell_Delta_R(1:3, i_cell_delta_r)
1270 CALL add_r(cell_r1, cell_dr, bs_env%index_to_cell_3c, cell_s1, cell_found, &
1271 bs_env%cell_to_index_3c, i_cell_s1)
1272 IF (.NOT. cell_found) cycle
1274 DO i_cell_s2 = 1, bs_env%nimages_scf_desymm
1276 IF (bs_env%skip_DR_R1_S2_Gx3c_Sigma(i_task_delta_r_local, i_cell_r1, i_cell_s2)) cycle
1278 cell_s2(1:3) = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_s2)
1279 cell_m_r1(1:3) = -cell_r1(1:3)
1280 cell_s1_p_s2_m_r1(1:3) = cell_s1(1:3) + cell_s2(1:3) - cell_r1(1:3)
1283 IF (.NOT. cell_found) cycle
1286 IF (.NOT. cell_found) cycle
1288 i_cell_m_r1 = bs_env%cell_to_index_3c(cell_m_r1(1), cell_m_r1(2), cell_m_r1(3))
1289 i_cell_s1_p_s2_m_r1 = bs_env%cell_to_index_3c(cell_s1_p_s2_m_r1(1), &
1290 cell_s1_p_s2_m_r1(2), &
1291 cell_s1_p_s2_m_r1(3))
1293 CALL timeset(routinen//
"_3c_x_G", handle2)
1295 CALL get_t_3c_int(t_3c_int, bs_env, i_cell_m_r1, i_cell_s1_p_s2_m_r1)
1300 CALL dbt_contract(alpha=1.0_dp, &
1301 tensor_1=g_s(i_cell_s2), &
1302 tensor_2=t_3c_int, &
1305 contract_1=[2], notcontract_1=[1], map_1=[3], &
1306 contract_2=[3], notcontract_2=[1, 2], map_2=[1, 2], &
1307 filter_eps=bs_env%eps_filter, flop=flop_tmp)
1309 IF (flop_tmp == 0_int_8 .AND. fill_skip)
THEN
1310 bs_env%skip_DR_R1_S2_Gx3c_Sigma(i_task_delta_r_local, i_cell_r1, i_cell_s2) = .true.
1313 CALL timestop(handle2)
1317 CALL dbt_copy(t_g, t_g_2, order=[1, 3, 2], move_data=.true.)
1319 CALL timeset(routinen//
"_contract", handle2)
1321 DO i_cell_r = 1, bs_env%nimages_scf_desymm
1323 IF (bs_env%skip_DR_R1_R_MxM_Sigma(i_task_delta_r_local, i_cell_r1, i_cell_r)) cycle
1325 cell_r = bs_env%kpoints_scf_desymm%index_to_cell(1:3, i_cell_r)
1328 CALL add_r(cell_r1, -cell_r, bs_env%index_to_cell_3c, cell_r1_minus_r, &
1329 cell_found, bs_env%cell_to_index_3c, i_cell_r1_minus_r)
1330 IF (.NOT. cell_found) cycle
1333 CALL add_r(cell_s1, -cell_r, bs_env%index_to_cell_3c, cell_s1_minus_r, &
1334 cell_found, bs_env%cell_to_index_3c, i_cell_s1_minus_r)
1335 IF (.NOT. cell_found) cycle
1340 CALL dbt_contract(alpha=sign_sigma, &
1342 tensor_2=t_w(i_cell_s1_minus_r, i_cell_r1_minus_r), &
1344 tensor_3=sigma_r(i_cell_r), &
1345 contract_1=[1, 2], notcontract_1=[3], map_1=[1], &
1346 contract_2=[1, 2], notcontract_2=[3], map_2=[2], &
1347 filter_eps=bs_env%eps_filter, flop=flop_tmp)
1349 flop = flop + flop_tmp
1351 IF (flop_tmp == 0_int_8 .AND. fill_skip)
THEN
1352 bs_env%skip_DR_R1_R_MxM_Sigma(i_task_delta_r_local, i_cell_r1, i_cell_r) = .true.
1357 CALL dbt_clear(t_g_2)
1359 CALL timestop(handle2)
1363 IF (vir .AND. flop == 0_int_8) bs_env%skip_DR_Sigma(i_task_delta_r_local) = .true.
1367 DO i_cell_s1 = 1, bs_env%nimages_3c
1368 DO i_cell_r1 = 1, bs_env%nimages_3c
1369 CALL dbt_clear(t_w(i_cell_s1, i_cell_r1))
1374 CALL dbt_destroy(t_g)
1375 CALL dbt_destroy(t_g_2)
1376 CALL dbt_destroy(t_3c_int)
1378 CALL timestop(handle)
1380 END SUBROUTINE contract_to_sigma
1388 SUBROUTINE fm_mwm_r_t_to_local_tensor_w_r(fm_W_R, W_R, bs_env)
1390 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:) :: w_r
1393 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fm_MWM_R_t_to_local_tensor_W_R'
1395 INTEGER :: handle, i_cell_r
1397 CALL timeset(routinen, handle)
1400 DO i_cell_r = 1, bs_env%nimages_scf_desymm
1402 bs_env%mat_RI_RI_tensor%matrix, w_r(i_cell_r), bs_env)
1405 CALL timestop(handle)
1407 END SUBROUTINE fm_mwm_r_t_to_local_tensor_w_r
1413 SUBROUTINE compute_qp_energies(bs_env)
1416 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_QP_energies'
1418 INTEGER :: handle, ikp, ispin, j_t
1419 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_x_ikp_n
1420 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq, sigma_c_ikp_n_time
1423 CALL timeset(routinen, handle)
1425 CALL cp_cfm_create(cfm_mo_coeff, bs_env%fm_s_Gamma%matrix_struct)
1426 ALLOCATE (sigma_x_ikp_n(bs_env%n_ao))
1427 ALLOCATE (sigma_c_ikp_n_time(bs_env%n_ao, bs_env%num_time_freq_points, 2))
1428 ALLOCATE (sigma_c_ikp_n_freq(bs_env%n_ao, bs_env%num_time_freq_points, 2))
1430 DO ispin = 1, bs_env%n_spin
1432 DO ikp = 1, bs_env%nkp_bs_and_DOS
1435 CALL cp_cfm_to_cfm(bs_env%cfm_mo_coeff_kp(ikp, ispin), cfm_mo_coeff)
1439 CALL trafo_to_k_and_nn(bs_env%fm_Sigma_x_R, sigma_x_ikp_n, cfm_mo_coeff, bs_env, ikp)
1443 DO j_t = 1, bs_env%num_time_freq_points
1444 CALL trafo_to_k_and_nn(bs_env%fm_Sigma_c_R_pos_tau(:, j_t, ispin), &
1445 sigma_c_ikp_n_time(:, j_t, 1), cfm_mo_coeff, bs_env, ikp)
1446 CALL trafo_to_k_and_nn(bs_env%fm_Sigma_c_R_neg_tau(:, j_t, ispin), &
1447 sigma_c_ikp_n_time(:, j_t, 2), cfm_mo_coeff, bs_env, ikp)
1451 CALL time_to_freq(bs_env, sigma_c_ikp_n_time, sigma_c_ikp_n_freq, ispin)
1456 bs_env%v_xc_n(:, ikp, ispin), &
1457 bs_env%eigenval_scf(:, ikp, ispin), ikp, ispin)
1467 CALL timestop(handle)
1469 END SUBROUTINE compute_qp_energies
1479 SUBROUTINE trafo_to_k_and_nn(fm_rs, array_ikp_n, cfm_mo_coeff, bs_env, ikp)
1481 REAL(kind=
dp),
DIMENSION(:) :: array_ikp_n
1486 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_to_k_and_nn'
1488 INTEGER :: handle, n_ao
1492 CALL timeset(routinen, handle)
1496 CALL cp_fm_create(fm_ikp_re, cfm_mo_coeff%matrix_struct)
1499 CALL fm_rs_to_kp(cfm_ikp, fm_rs, bs_env%kpoints_DOS, ikp)
1515 CALL timestop(handle)
1517 END SUBROUTINE trafo_to_k_and_nn
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 pasquier2025
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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
This is the start of a dbt_api, all publically needed functions are exported here....
subroutine, public fm_to_local_tensor(fm_global, mat_global, mat_local, tensor, bs_env, atom_ranges)
...
subroutine, public local_dbt_to_global_fm(t_r, fm_r, mat_global, mat_local, bs_env)
...
subroutine, public local_array_to_fm(array_s, fm_s, weight, add)
...
subroutine, public fm_to_local_array(fm_s, array_s, weight, add)
...
subroutine, public gw_calc_small_cell_full_kp(qs_env, bs_env)
Perform GW band structure calculation.
subroutine, public get_v_tr_r(v_tr_r, pot_type, regularization_ri, bs_env, qs_env)
...
subroutine, public time_to_freq(bs_env, sigma_c_n_time, sigma_c_n_freq, ispin)
...
subroutine, public de_init_bs_env(bs_env)
...
subroutine, public analyt_conti_and_print(bs_env, sigma_c_ikp_n_freq, sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf, ikp, ispin)
...
subroutine, public add_r(cell_1, cell_2, index_to_cell, cell_1_plus_2, cell_found, cell_to_index, i_cell_1_plus_2)
...
subroutine, public power(matrix, exponent, eps, cond_nr, min_ev, max_ev)
...
subroutine, public is_cell_in_index_to_cell(cell, index_to_cell, cell_found)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Routines to compute the Coulomb integral V_(alpha beta)(k) for a k-point k using lattice summation in...
subroutine, public build_2c_coulomb_matrix_kp_small_cell(v_k, qs_env, kpoints, size_lattice_sum, basis_type, ikp_start, ikp_end)
...
Implements transformations from k-space to R-space for Fortran array matrices.
subroutine, public rs_to_kp(rs_real, ks_complex, index_to_cell, xkp, deriv_direction, hmat)
Integrate RS matrices (stored as Fortran array) into a kpoint matrix at given kp.
subroutine, public fm_add_kp_to_all_rs(cfm_kp, fm_rs, kpoints, ikp)
Adds given kpoint matrix to a single rs matrix.
subroutine, public add_kp_to_all_rs(array_kp, array_rs, kpoints, ikp, index_to_cell_ext)
Adds given kpoint matrix to all rs matrices.
subroutine, public fm_rs_to_kp(cfm_kp, fm_rs, kpoints, ikp)
Transforms array of fm RS matrices into cfm k-space matrix, at given kpoint index.
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
basic linear algebra operations for full matrixes
subroutine, public get_all_vbm_cbm_bandgaps(bs_env)
...
Represent a complex full matrix.