80#include "./base/base_uses.f90"
86 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_gw_kpoints_util'
128 Erpa, tau_tj, tj, wj, weights_cos_tf_w_to_t, wkp_W, do_gw_im_time, &
129 do_ri_Sigma_x, do_kpoints_from_Gamma, &
130 cfm_mat_Q, ikp_local, mat_P_omega, mat_P_omega_kp, &
131 qs_env, eps_filter_im_time, unit_nr, kpoints, fm_mat_Minv_L_kpoints, &
132 fm_matrix_L_kpoints, fm_mat_W, &
133 fm_mat_RI_global_work, mat_MinvVMinv, fm_matrix_Minv, &
134 fm_matrix_Minv_Vtrunc_Minv)
136 INTEGER,
INTENT(IN) :: dimen_ri, num_integ_points, jquad, nkp, &
139 REAL(kind=
dp),
INTENT(INOUT) :: erpa
140 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: tau_tj, tj, wj
141 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
142 INTENT(IN) :: weights_cos_tf_w_to_t
143 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wkp_w
144 LOGICAL,
INTENT(IN) :: do_gw_im_time, do_ri_sigma_x, &
145 do_kpoints_from_gamma
147 INTEGER,
INTENT(IN) :: ikp_local
148 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
150 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
151 INTEGER,
INTENT(IN) :: unit_nr
153 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_mat_minv_l_kpoints, &
155 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w
158 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_minv, &
159 fm_matrix_minv_vtrunc_minv
161 CHARACTER(LEN=*),
PARAMETER :: routinen =
'invert_eps_compute_W_and_Erpa_kp'
163 INTEGER :: handle, ikp
164 LOGICAL :: do_this_ikp
165 REAL(kind=
dp) :: t1, t2
166 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: trace_qomega
168 CALL timeset(routinen, handle)
172 IF (do_kpoints_from_gamma)
THEN
176 CALL transform_p_from_real_space_to_kpoints(mat_p_omega, mat_p_omega_kp, &
177 kpoints, eps_filter_im_time, jquad)
179 ALLOCATE (trace_qomega(dimen_ri))
181 IF (unit_nr > 0)
WRITE (unit_nr,
'(/T3,A,1X,I3)') &
182 'GW_INFO| Computing chi and W frequency point', jquad
187 do_this_ikp = (ikp_local == -1) .OR. (ikp_local == 0 .AND. ikp == 1) .OR. (ikp_local == ikp)
188 IF (.NOT. do_this_ikp) cycle
191 CALL compute_q_kp_rpa(cfm_mat_q, &
193 fm_mat_minv_l_kpoints(ikp, 1), &
194 fm_mat_minv_l_kpoints(ikp, 2), &
195 fm_mat_ri_global_work, &
196 dimen_ri, ikp, nkp, ikp_local, para_env, &
197 qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite)
200 CALL cholesky_decomp_q(cfm_mat_q, para_env, trace_qomega, dimen_ri)
203 CALL frequency_and_kpoint_integration(erpa, cfm_mat_q, para_env, trace_qomega, &
204 dimen_ri, wj(jquad), kpoints%wkp(ikp))
206 IF (do_gw_im_time)
THEN
209 IF (do_ri_sigma_x .AND. jquad == 1 .AND. count_ev_sc_gw == 1 .AND. do_kpoints_from_gamma)
THEN
211 CALL dbcsr_set(mat_minvvminv%matrix, 0.0_dp)
212 CALL copy_fm_to_dbcsr(fm_matrix_minv_vtrunc_minv(1, 1), mat_minvvminv%matrix, keep_sparsity=.false.)
215 IF (do_kpoints_from_gamma)
THEN
216 CALL compute_wc_real_space_tau_gw(fm_mat_w, cfm_mat_q, &
217 fm_matrix_l_kpoints(ikp, 1), &
218 fm_matrix_l_kpoints(ikp, 2), &
219 dimen_ri, num_integ_points, jquad, &
220 ikp, tj, tau_tj, weights_cos_tf_w_to_t, &
221 ikp_local, para_env, kpoints, qs_env, wkp_w)
228 IF (do_gw_im_time .AND. do_kpoints_from_gamma .AND. jquad == num_integ_points)
THEN
229 CALL wc_to_minv_wc_minv(fm_mat_w, fm_matrix_minv, para_env, dimen_ri, num_integ_points)
230 CALL deallocate_kp_matrices(fm_matrix_l_kpoints, fm_mat_minv_l_kpoints)
233 DEALLOCATE (trace_qomega)
237 IF (unit_nr > 0)
WRITE (unit_nr,
'(T6,A,T56,F25.1)')
'Execution time (s):', t2 - t1
239 CALL timestop(handle)
248 SUBROUTINE deallocate_kp_matrices(fm_matrix_L_kpoints, fm_mat_Minv_L_kpoints)
250 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
251 fm_mat_minv_l_kpoints
253 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_kp_matrices'
257 CALL timeset(routinen, handle)
262 CALL timestop(handle)
264 END SUBROUTINE deallocate_kp_matrices
275 REAL(kind=
dp) :: threshold, exponent
276 REAL(kind=
dp),
OPTIONAL :: min_eigval
278 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cp_cfm_power'
280 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues_exponent
281 INTEGER :: handle, i, ncol_global, nrow_global
282 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
285 CALL timeset(routinen, handle)
291 CALL cp_cfm_get_info(matrix, nrow_global=nrow_global, ncol_global=ncol_global)
292 cpassert(nrow_global == ncol_global)
293 ALLOCATE (eigenvalues(nrow_global), source=0.0_dp)
294 ALLOCATE (eigenvalues_exponent(nrow_global), source=
z_zero)
299 DO i = 1, nrow_global
300 IF (eigenvalues(i) > threshold)
THEN
301 eigenvalues_exponent(i) = cmplx((eigenvalues(i))**(0.5_dp*exponent), threshold, kind=
dp)
303 IF (
PRESENT(min_eigval))
THEN
304 eigenvalues_exponent(i) = cmplx(min_eigval, 0.0_dp, kind=
dp)
306 eigenvalues_exponent(i) =
z_zero
314 cfm_work, cfm_work,
z_zero, matrix)
316 DEALLOCATE (eigenvalues, eigenvalues_exponent)
320 CALL timestop(handle)
338 SUBROUTINE compute_q_kp_rpa(cfm_mat_Q, mat_P_omega_kp, fm_mat_L_re, fm_mat_L_im, &
339 fm_mat_RI_global_work, dimen_RI, ikp, nkp, ikp_local, para_env, &
340 make_chi_pos_definite)
343 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega_kp
344 TYPE(
cp_fm_type) :: fm_mat_l_re, fm_mat_l_im, &
345 fm_mat_ri_global_work
346 INTEGER,
INTENT(IN) :: dimen_ri, ikp, nkp, ikp_local
348 LOGICAL,
INTENT(IN) :: make_chi_pos_definite
350 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Q_kp_RPA'
356 CALL timeset(routinen, handle)
364 CALL cp_fm_create(fm_mat_work, fm_mat_l_re%matrix_struct)
369 CALL mat_p_to_subgroup(mat_p_omega_kp, fm_mat_ri_global_work, &
370 fm_mat_work, cfm_mat_q, ikp, nkp, ikp_local, para_env)
373 IF (make_chi_pos_definite)
THEN
374 CALL cp_cfm_power(cfm_mat_q, threshold=0.0_dp, exponent=1.0_dp)
382 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_q, cfm_mat_l, &
386 CALL parallel_gemm(
'C',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_l, cfm_mat_work, &
393 CALL timestop(handle)
395 END SUBROUTINE compute_q_kp_rpa
408 SUBROUTINE mat_p_to_subgroup(mat_P_omega_kp, fm_mat_RI_global_work, &
409 fm_mat_work, cfm_mat_Q, ikp, nkp, ikp_local, para_env)
411 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega_kp
412 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_mat_ri_global_work, fm_mat_work
414 INTEGER,
INTENT(IN) :: ikp, nkp, ikp_local
417 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mat_P_to_subgroup'
419 INTEGER :: handle, jkp
421 TYPE(
dbcsr_type),
POINTER :: mat_p_omega_im, mat_p_omega_re
423 CALL timeset(routinen, handle)
425 IF (ikp_local == -1)
THEN
427 mat_p_omega_re => mat_p_omega_kp(1, ikp)%matrix
432 mat_p_omega_im => mat_p_omega_kp(2, ikp)%matrix
443 mat_p_omega_re => mat_p_omega_kp(1, jkp)%matrix
450 IF (ikp_local == jkp)
THEN
466 mat_p_omega_im => mat_p_omega_kp(2, jkp)%matrix
473 IF (ikp_local == jkp)
THEN
491 CALL timestop(handle)
493 END SUBROUTINE mat_p_to_subgroup
502 SUBROUTINE cholesky_decomp_q(cfm_mat_Q, para_env, trace_Qomega, dimen_RI)
506 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: trace_qomega
507 INTEGER,
INTENT(IN) :: dimen_ri
509 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cholesky_decomp_Q'
511 INTEGER :: handle, i_global, iib, info_chol, &
512 j_global, jjb, ncol_local, nrow_local
513 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
516 CALL timeset(routinen, handle)
526 nrow_local=nrow_local, &
527 ncol_local=ncol_local, &
528 row_indices=row_indices, &
529 col_indices=col_indices)
532 trace_qomega = 0.0_dp
535 DO jjb = 1, ncol_local
536 j_global = col_indices(jjb)
537 DO iib = 1, nrow_local
538 i_global = row_indices(iib)
539 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
540 trace_qomega(i_global) = real(cfm_mat_q%local_data(iib, jjb))
541 cfm_mat_q%local_data(iib, jjb) = cfm_mat_q%local_data(iib, jjb) +
z_one
545 CALL para_env%sum(trace_qomega)
551 cpassert(info_chol == 0)
556 CALL timestop(handle)
558 END SUBROUTINE cholesky_decomp_q
570 SUBROUTINE frequency_and_kpoint_integration(Erpa, cfm_mat_Q, para_env, trace_Qomega, &
571 dimen_RI, freq_weight, kp_weight)
573 REAL(kind=
dp),
INTENT(INOUT) :: erpa
576 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: trace_qomega
577 INTEGER,
INTENT(IN) :: dimen_ri
578 REAL(kind=
dp),
INTENT(IN) :: freq_weight, kp_weight
580 CHARACTER(LEN=*),
PARAMETER :: routinen =
'frequency_and_kpoint_integration'
582 INTEGER :: handle, i_global, iib, j_global, jjb, &
583 ncol_local, nrow_local
584 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
585 REAL(kind=
dp) :: fcomega
586 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: q_log
588 CALL timeset(routinen, handle)
592 nrow_local=nrow_local, &
593 ncol_local=ncol_local, &
594 row_indices=row_indices, &
595 col_indices=col_indices)
597 ALLOCATE (q_log(dimen_ri))
601 DO jjb = 1, ncol_local
602 j_global = col_indices(jjb)
603 DO iib = 1, nrow_local
604 i_global = row_indices(iib)
605 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
606 q_log(i_global) = 2.0_dp*log(real(cfm_mat_q%local_data(iib, jjb)))
610 CALL para_env%sum(q_log)
614 IF (
modulo(iib, para_env%num_pe) /= para_env%mepos) cycle
616 fcomega = fcomega + (q_log(iib) - trace_qomega(iib))/2.0_dp
619 erpa = erpa + fcomega*freq_weight*kp_weight
623 CALL timestop(handle)
625 END SUBROUTINE frequency_and_kpoint_integration
633 SUBROUTINE get_dummys(tj_dummy, tau_tj_dummy, weights_cos_tf_w_to_t_dummy)
635 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
636 INTENT(INOUT) :: tj_dummy, tau_tj_dummy
637 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
638 INTENT(INOUT) :: weights_cos_tf_w_to_t_dummy
640 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_dummys'
644 CALL timeset(routinen, handle)
646 ALLOCATE (weights_cos_tf_w_to_t_dummy(1, 1))
647 ALLOCATE (tj_dummy(1))
648 ALLOCATE (tau_tj_dummy(1))
651 tau_tj_dummy(1) = 0.0_dp
652 weights_cos_tf_w_to_t_dummy(1, 1) = 1.0_dp
654 CALL timestop(handle)
656 END SUBROUTINE get_dummys
664 SUBROUTINE release_dummys(tj_dummy, tau_tj_dummy, weights_cos_tf_w_to_t_dummy)
666 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
667 INTENT(INOUT) :: tj_dummy, tau_tj_dummy
668 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
669 INTENT(INOUT) :: weights_cos_tf_w_to_t_dummy
671 CHARACTER(LEN=*),
PARAMETER :: routinen =
'release_dummys'
675 CALL timeset(routinen, handle)
677 DEALLOCATE (weights_cos_tf_w_to_t_dummy)
678 DEALLOCATE (tj_dummy)
679 DEALLOCATE (tau_tj_dummy)
681 CALL timestop(handle)
683 END SUBROUTINE release_dummys
694 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mat_p_omega
697 INTEGER,
INTENT(IN) :: jquad, unit_nr
699 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_mat_cell_T_from_mat_gamma'
701 INTEGER :: col, handle, i_cell, i_dim, j_cell, &
702 num_cells_p, num_integ_points, row
703 INTEGER,
DIMENSION(3) :: cell_grid_p, periodic
704 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell_p
705 LOGICAL :: i_cell_is_the_minimum_image_cell
706 REAL(kind=
dp) :: abs_rab_cell_i, abs_rab_cell_j
707 REAL(kind=
dp),
DIMENSION(3) :: cell_vector, cell_vector_j, rab_cell_i, &
709 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
710 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
715 CALL timeset(routinen, handle)
717 NULLIFY (cell, particle_set)
719 particle_set=particle_set)
720 CALL get_cell(cell=cell, h=hmat, periodic=periodic)
725 IF (periodic(i_dim) == 1)
THEN
726 cell_grid_p(i_dim) = max(min((kpoints%nkp_grid(i_dim)/2)*2 - 1, 1), 3)
728 cell_grid_p(i_dim) = 1
735 index_to_cell_p => kpoints%index_to_cell
737 num_cells_p =
SIZE(index_to_cell_p, 2)
739 num_integ_points =
SIZE(mat_p_omega, 1)
743 DO i_cell = 2, num_cells_p
745 mat_p_omega(1)%matrix)
748 IF (jquad == 1 .AND. unit_nr > 0)
THEN
749 WRITE (unit_nr,
'(T3,A,T66,ES15.2)')
'GW_INFO| RI regularization parameter: ', &
750 qs_env%mp2_env%ri_rpa_im_time%regularization_RI
751 WRITE (unit_nr,
'(T3,A,T66,ES15.2)')
'GW_INFO| eps_eigval_S: ', &
752 qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S
753 IF (qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite)
THEN
754 WRITE (unit_nr,
'(T3,A,T81)') &
755 'GW_INFO| Make chi(iw,k) positive definite? TRUE'
757 WRITE (unit_nr,
'(T3,A,T81)') &
758 'GW_INFO| Make chi(iw,k) positive definite? FALSE'
763 DO i_cell = 1, num_cells_p
769 cell_vector(1:3) = matmul(hmat, real(index_to_cell_p(1:3, i_cell),
dp))
770 rab_cell_i(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
771 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector(1:3))
772 abs_rab_cell_i = sqrt(rab_cell_i(1)**2 + rab_cell_i(2)**2 + rab_cell_i(3)**2)
775 i_cell_is_the_minimum_image_cell = .true.
776 DO j_cell = 1, num_cells_p
777 cell_vector_j(1:3) = matmul(hmat, real(index_to_cell_p(1:3, j_cell),
dp))
778 rab_cell_j(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
779 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector_j(1:3))
780 abs_rab_cell_j = sqrt(rab_cell_j(1)**2 + rab_cell_j(2)**2 + rab_cell_j(3)**2)
782 IF (abs_rab_cell_i > abs_rab_cell_j + 1.0e-6_dp)
THEN
783 i_cell_is_the_minimum_image_cell = .false.
787 IF (.NOT. i_cell_is_the_minimum_image_cell)
THEN
788 data_block(:, :) = data_block(:, :)*0.0_dp
796 CALL timestop(handle)
808 SUBROUTINE transform_p_from_real_space_to_kpoints(mat_P_omega, mat_P_omega_kp, &
809 kpoints, eps_filter_im_time, jquad)
811 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
813 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
814 INTEGER,
INTENT(IN) :: jquad
816 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_P_from_real_space_to_kpoints'
818 INTEGER :: handle, icell, nkp, num_integ_points
820 CALL timeset(routinen, handle)
822 num_integ_points =
SIZE(mat_p_omega, 1)
823 nkp =
SIZE(mat_p_omega, 2)
826 kpoints, eps_filter_im_time)
828 DO icell = 1,
SIZE(mat_p_omega, 2)
829 CALL dbcsr_set(mat_p_omega(jquad, icell)%matrix, 0.0_dp)
830 CALL dbcsr_filter(mat_p_omega(jquad, icell)%matrix, 1.0_dp)
833 CALL timestop(handle)
835 END SUBROUTINE transform_p_from_real_space_to_kpoints
847 kpoints, eps_filter_im_time, real_mat_real_space)
849 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: real_mat_kp, imag_mat_kp, mat_real_space
851 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
852 LOGICAL,
INTENT(IN),
OPTIONAL :: real_mat_real_space
854 CHARACTER(LEN=*),
PARAMETER :: routinen =
'real_space_to_kpoint_transform_rpa'
856 INTEGER :: handle, i_cell, ik, nkp, num_cells
857 INTEGER,
DIMENSION(3) :: cell
858 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
859 LOGICAL :: my_real_mat_real_space
860 REAL(kind=
dp) :: arg, coskl, sinkl
861 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
864 CALL timeset(routinen, handle)
866 my_real_mat_real_space = .true.
867 IF (
PRESENT(real_mat_real_space)) my_real_mat_real_space = real_mat_real_space
870 template=real_mat_kp(1)%matrix, &
871 matrix_type=dbcsr_type_no_symmetry)
878 NULLIFY (index_to_cell)
879 index_to_cell => kpoints%index_to_cell
881 num_cells =
SIZE(index_to_cell, 2)
883 cpassert(
SIZE(mat_real_space) >= num_cells/2 + 1)
890 CALL dbcsr_set(real_mat_kp(ik)%matrix, 0.0_dp)
891 CALL dbcsr_set(imag_mat_kp(ik)%matrix, 0.0_dp)
893 DO i_cell = 1, num_cells/2 + 1
895 cell(:) = index_to_cell(:, i_cell)
897 arg = real(cell(1),
dp)*xkp(1, ik) + real(cell(2),
dp)*xkp(2, ik) + real(cell(3),
dp)*xkp(3, ik)
898 coskl = cos(
twopi*arg)
899 sinkl = sin(
twopi*arg)
901 IF (my_real_mat_real_space)
THEN
902 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
903 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, sinkl)
905 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, -sinkl)
906 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
909 IF (.NOT. (cell(1) == 0 .AND. cell(2) == 0 .AND. cell(3) == 0))
THEN
913 IF (my_real_mat_real_space)
THEN
914 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, coskl)
915 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
920 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
921 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -coskl)
930 CALL dbcsr_filter(real_mat_kp(ik)%matrix, eps_filter_im_time)
931 CALL dbcsr_filter(imag_mat_kp(ik)%matrix, eps_filter_im_time)
937 CALL timestop(handle)
948 SUBROUTINE dbcsr_add_local(mat_a, mat_b, alpha, beta)
949 TYPE(
dbcsr_type),
INTENT(INOUT) :: mat_a, mat_b
950 REAL(kind=
dp),
INTENT(IN) :: alpha, beta
954 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block_to_compute, data_block
961 NULLIFY (block_to_compute)
963 row=row, col=col, block=block_to_compute, found=found)
967 block_to_compute(:, :) = alpha*block_to_compute(:, :) + beta*data_block(:, :)
972 END SUBROUTINE dbcsr_add_local
993 SUBROUTINE compute_wc_real_space_tau_gw(fm_mat_W_tau, cfm_mat_Q, fm_mat_L_re, fm_mat_L_im, &
994 dimen_RI, num_integ_points, jquad, &
995 ikp, tj, tau_tj, weights_cos_tf_w_to_t, ikp_local, &
996 para_env, kpoints, qs_env, wkp_W)
998 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w_tau
1000 TYPE(
cp_fm_type),
INTENT(IN) :: fm_mat_l_re, fm_mat_l_im
1001 INTEGER,
INTENT(IN) :: dimen_ri, num_integ_points, jquad, ikp
1002 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: tj
1003 REAL(kind=
dp),
DIMENSION(num_integ_points), &
1004 INTENT(IN) :: tau_tj
1005 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: weights_cos_tf_w_to_t
1006 INTEGER,
INTENT(IN) :: ikp_local
1010 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wkp_w
1012 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Wc_real_space_tau_GW'
1014 INTEGER :: handle, handle2, i_global, iatom, iatom_old, iib, iquad, irow, j_global, jatom, &
1015 jatom_old, jcol, jjb, jkp, ncol_local, nkp, nrow_local, num_cells
1016 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_from_ri_index
1017 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1018 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1019 REAL(kind=
dp) :: contribution, omega, tau, weight, &
1020 weight_im, weight_re
1021 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
1022 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp
1023 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1025 TYPE(
cp_cfm_type) :: cfm_mat_l, cfm_mat_work, cfm_mat_work_2
1026 TYPE(
cp_fm_type) :: fm_dummy, fm_mat_work_global, &
1030 CALL timeset(routinen, handle)
1032 CALL timeset(routinen//
"_1", handle2)
1047 CALL cp_fm_create(fm_mat_work_global, fm_mat_w_tau(1)%matrix_struct)
1050 CALL cp_fm_create(fm_mat_work_local, cfm_mat_q%matrix_struct)
1053 CALL timestop(handle2)
1055 CALL timeset(routinen//
"_2", handle2)
1065 nrow_local=nrow_local, &
1066 ncol_local=ncol_local, &
1067 row_indices=row_indices, &
1068 col_indices=col_indices)
1070 DO jjb = 1, ncol_local
1071 j_global = col_indices(jjb)
1072 DO iib = 1, nrow_local
1073 i_global = row_indices(iib)
1074 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
1075 cfm_mat_q%local_data(iib, jjb) = cfm_mat_q%local_data(iib, jjb) -
z_one
1080 CALL timestop(handle2)
1082 CALL timeset(routinen//
"_3", handle2)
1085 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_q, cfm_mat_l, &
1089 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_l, cfm_mat_work, &
1092 CALL timestop(handle2)
1094 CALL timeset(routinen//
"_4", handle2)
1097 index_to_cell => kpoints%index_to_cell
1098 num_cells =
SIZE(index_to_cell, 2)
1102 ALLOCATE (atom_from_ri_index(dimen_ri))
1106 NULLIFY (cell, particle_set)
1107 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
1113 nrow_local=nrow_local, &
1114 ncol_local=ncol_local, &
1115 row_indices=row_indices, &
1116 col_indices=col_indices)
1118 DO irow = 1, nrow_local
1119 DO jcol = 1, ncol_local
1121 iatom = atom_from_ri_index(row_indices(irow))
1122 jatom = atom_from_ri_index(col_indices(jcol))
1124 IF (iatom /= iatom_old .OR. jatom /= jatom_old)
THEN
1128 num_cells, iatom, jatom, xkp(1:3, ikp), wkp_w(ikp), &
1129 cell, index_to_cell, hmat, particle_set)
1136 contribution = weight_re*real(cfm_mat_work_2%local_data(irow, jcol)) + &
1137 weight_im*aimag(cfm_mat_work_2%local_data(irow, jcol))
1139 fm_mat_work_local%local_data(irow, jcol) = fm_mat_work_local%local_data(irow, jcol) + contribution
1144 CALL timestop(handle2)
1146 CALL timeset(routinen//
"_5", handle2)
1148 IF (ikp_local == -1)
THEN
1152 DO iquad = 1, num_integ_points
1156 weight = weights_cos_tf_w_to_t(iquad, jquad)*cos(tau*omega)
1158 IF (jquad == 1 .AND. ikp == 1)
THEN
1159 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
1162 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_w_tau(iquad), beta=weight, matrix_b=fm_mat_work_global)
1170 CALL para_env%sync()
1172 IF (ikp_local == jkp)
THEN
1178 CALL para_env%sync()
1180 DO iquad = 1, num_integ_points
1184 weight = weights_cos_tf_w_to_t(iquad, jquad)*cos(tau*omega)
1186 IF (jquad == 1 .AND. jkp == 1)
THEN
1187 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
1191 matrix_b=fm_mat_work_global)
1205 DEALLOCATE (atom_from_ri_index)
1207 CALL timestop(handle2)
1209 CALL timestop(handle)
1211 END SUBROUTINE compute_wc_real_space_tau_gw
1221 SUBROUTINE wc_to_minv_wc_minv(fm_mat_W, fm_matrix_Minv, para_env, dimen_RI, num_integ_points)
1223 TYPE(
cp_fm_type),
DIMENSION(:, :) :: fm_matrix_minv
1225 INTEGER :: dimen_ri, num_integ_points
1227 CHARACTER(LEN=*),
PARAMETER :: routinen =
'Wc_to_Minv_Wc_Minv'
1229 INTEGER :: handle, jquad
1230 TYPE(
cp_fm_type) :: fm_work_minv, fm_work_minv_w
1232 CALL timeset(routinen, handle)
1234 CALL cp_fm_create(fm_work_minv, fm_mat_w(1)%matrix_struct)
1237 CALL cp_fm_create(fm_work_minv_w, fm_mat_w(1)%matrix_struct)
1239 DO jquad = 1, num_integ_points
1241 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv, fm_mat_w(jquad), &
1242 0.0_dp, fm_work_minv_w)
1243 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv_w, fm_work_minv, &
1244 0.0_dp, fm_mat_w(jquad))
1252 CALL timestop(handle)
1254 END SUBROUTINE wc_to_minv_wc_minv
1268 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1269 INTENT(OUT) :: wkp_w, wkp_v
1271 REAL(kind=
dp),
DIMENSION(3, 3) :: h_inv
1272 INTEGER,
DIMENSION(3) :: periodic
1274 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp_W'
1276 INTEGER :: handle, i_x, ikp, info, j_y, k_z, &
1277 kpoint_weights_w_method, n_x, n_y, &
1278 n_z, nkp, nsuperfine, num_lin_eqs
1279 REAL(kind=
dp) :: exp_kpoints, integral, k_sq, weight
1280 REAL(kind=
dp),
DIMENSION(3) :: k_vec, x_vec
1281 REAL(kind=
dp),
DIMENSION(:),
POINTER :: right_side, wkp, wkp_tmp
1282 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: matrix_lin_eqs, xkp
1284 CALL timeset(routinen, handle)
1286 kpoint_weights_w_method = qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method
1300 ALLOCATE (wkp_v(nkp), wkp_w(nkp))
1304 IF (
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%wkp_V))
THEN
1305 wkp_v(:) = qs_env%mp2_env%ri_rpa_im_time%wkp_V(:)
1319 exp_kpoints = qs_env%mp2_env%ri_rpa_im_time%exp_tailored_weights
1322 IF (sum(periodic) == 2) exp_kpoints = -1.0_dp
1329 IF (periodic(1) == 1)
THEN
1334 IF (periodic(2) == 1)
THEN
1339 IF (periodic(3) == 1)
THEN
1347 weight = 1.0_dp/(real(n_x,
dp)*real(n_y,
dp)*real(n_z,
dp))
1352 IF (periodic(1) == 1)
THEN
1353 x_vec(1) = (real(i_x - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1357 IF (periodic(2) == 1)
THEN
1358 x_vec(2) = (real(j_y - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1362 IF (periodic(3) == 1)
THEN
1363 x_vec(3) = (real(k_z - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1368 k_vec = matmul(h_inv(1:3, 1:3), x_vec)
1369 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1370 integral = integral + weight*k_sq**(exp_kpoints*0.5_dp)
1376 num_lin_eqs = nkp + 2
1378 ALLOCATE (matrix_lin_eqs(num_lin_eqs, num_lin_eqs))
1379 matrix_lin_eqs(:, :) = 0.0_dp
1383 k_vec = matmul(h_inv(1:3, 1:3), xkp(1:3, ikp))
1384 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1386 matrix_lin_eqs(ikp, ikp) = 2.0_dp
1387 matrix_lin_eqs(ikp, nkp + 1) = 1.0_dp
1388 matrix_lin_eqs(nkp + 1, ikp) = 1.0_dp
1390 matrix_lin_eqs(ikp, nkp + 2) = k_sq**(exp_kpoints*0.5_dp)
1391 matrix_lin_eqs(nkp + 2, ikp) = k_sq**(exp_kpoints*0.5_dp)
1395 CALL invmat(matrix_lin_eqs, info)
1399 ALLOCATE (right_side(num_lin_eqs))
1401 right_side(nkp + 1) = 1.0_dp
1403 right_side(nkp + 2) = integral
1405 ALLOCATE (wkp_tmp(num_lin_eqs))
1407 wkp_tmp(1:num_lin_eqs) = matmul(matrix_lin_eqs, right_side)
1409 wkp_w(1:nkp) = wkp_tmp(1:nkp)
1411 DEALLOCATE (matrix_lin_eqs, right_side, wkp_tmp)
1415 CALL timestop(handle)
1426 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_kp
1428 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_bandstruc_and_k_dependent_MOs'
1430 INTEGER :: handle, ikp, ispin, nmo, nspins
1431 INTEGER,
DIMENSION(3) :: nkp_grid_g
1432 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ev
1433 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kpgeneral
1437 CALL timeset(routinen, handle)
1439 NULLIFY (qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1440 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1441 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1444 nkp_grid_g(1:3) = [1, 1, 1]
1446 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
1448 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1449 "MONKHORST-PACK", para_env%num_pe, &
1450 mp_grid=nkp_grid_g(1:3))
1452 IF (qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
1455 CALL get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1457 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1458 "GENERAL", para_env%num_pe, &
1459 kpgeneral=kpgeneral)
1461 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1462 "GENERAL", para_env%num_pe, &
1463 kpgeneral=kpgeneral, with_xc_terms=.false.)
1465 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
1466 nmo =
SIZE(eigenval_kp, 1)
1467 nspins =
SIZE(eigenval_kp, 3)
1469 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(nmo))
1470 qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(:) = eigenval_kp(:, 1, 1)
1472 DEALLOCATE (eigenval_kp)
1474 ALLOCATE (eigenval_kp(nmo, kpoints_sigma%nkp, nspins))
1476 DO ikp = 1, kpoints_sigma%nkp
1478 DO ispin = 1, nspins
1480 ev => kpoints_sigma%kp_env(ikp)%kpoint_env%mos(1, ispin)%eigenvalues
1482 eigenval_kp(:, ikp, ispin) = ev(:)
1488 DEALLOCATE (kpgeneral)
1492 CALL release_hfx_stuff(qs_env)
1494 CALL timestop(handle)
1502 SUBROUTINE release_hfx_stuff(qs_env)
1505 IF (
ASSOCIATED(qs_env%x_data) .AND. .NOT. qs_env%mp2_env%ri_g0w0%do_ri_Sigma_x)
THEN
1509 END SUBROUTINE release_hfx_stuff
1521 SUBROUTINE create_kp_and_calc_kp_orbitals(qs_env, kpoints, scheme, &
1522 group_size_ext, mp_grid, kpgeneral, with_xc_terms)
1526 CHARACTER(LEN=*),
INTENT(IN) :: scheme
1527 INTEGER :: group_size_ext
1528 INTEGER,
DIMENSION(3),
INTENT(IN),
OPTIONAL :: mp_grid
1529 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN), &
1530 OPTIONAL :: kpgeneral
1531 LOGICAL,
OPTIONAL :: with_xc_terms
1533 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_kp_and_calc_kp_orbitals'
1535 INTEGER :: handle, i_dim, i_re_im, ikp, ispin, nkp, &
1537 INTEGER,
DIMENSION(3) :: cell_grid, periodic
1538 LOGICAL :: my_with_xc_terms
1539 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1546 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_desymm
1547 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_ks_kp, mat_s_kp
1554 CALL timeset(routinen, handle)
1556 my_with_xc_terms = .true.
1557 IF (
PRESENT(with_xc_terms)) my_with_xc_terms = with_xc_terms
1560 para_env=para_env, &
1561 blacs_env=blacs_env, &
1562 matrix_s=matrix_s, &
1564 scf_control=scf_control, &
1569 group_size_ext=group_size_ext)
1578 CALL get_cell(cell=cell, periodic=periodic)
1583 IF (periodic(i_dim) == 1)
THEN
1584 cell_grid(i_dim) = max(min((kpoints%nkp_grid(i_dim)/2)*2 - 1, 1), 3)
1586 cell_grid(i_dim) = 1
1592 CALL get_qs_env(qs_env, matrix_s=matrix_s, scf_env=scf_env, scf_control=scf_control, dft_control=dft_control)
1594 NULLIFY (matrix_s_desymm)
1596 ALLOCATE (matrix_s_desymm(1)%matrix)
1597 CALL dbcsr_create(matrix=matrix_s_desymm(1)%matrix, template=matrix_s(1)%matrix, &
1598 matrix_type=dbcsr_type_no_symmetry)
1605 matrix_struct => kpoints%kp_env(1)%kpoint_env%wmat(1, 1)%matrix_struct
1613 nspins = dft_control%nspins
1615 DO ispin = 1, nspins
1618 IF (my_with_xc_terms)
THEN
1619 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix, kpoints, ispin)
1621 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix, &
1627 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 1)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(1, ispin))
1630 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 2)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(2, ispin))
1639 kp => kpoints%kp_env(ikp)%kpoint_env
1641 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
1642 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1645 qs_env%mp2_env%ri_rpa_im_time%make_overlap_mat_ao_pos_definite)
THEN
1646 CALL cp_cfm_geeig_canon(cksmat, csmat, cmos, eigenvalues, cwork, scf_control%eps_eigval)
1648 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
1653 kp%mos(2, ispin)%eigenvalues = eigenvalues
1664 DEALLOCATE (mat_ks_kp)
1671 DEALLOCATE (mat_s_kp)
1674 DEALLOCATE (matrix_s_desymm)
1682 CALL timestop(handle)
1684 END SUBROUTINE create_kp_and_calc_kp_orbitals
1702 LOGICAL,
INTENT(IN),
OPTIONAL :: real_mat_real_space
1704 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mat_kp_from_mat_gamma'
1706 INTEGER :: handle, i_cell, i_re_im, ikp, nkp, &
1708 INTEGER,
DIMENSION(3) :: periodic
1709 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1710 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1712 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_real_space
1714 CALL timeset(routinen, handle)
1717 CALL get_cell(cell=cell, periodic=periodic)
1718 num_cells = 3**(periodic(1) + periodic(2) + periodic(3))
1720 NULLIFY (mat_real_space)
1722 DO i_cell = 1, num_cells
1723 ALLOCATE (mat_real_space(i_cell)%matrix)
1724 CALL dbcsr_create(matrix=mat_real_space(i_cell)%matrix, &
1727 CALL dbcsr_set(mat_real_space(i_cell)%matrix, 0.0_dp)
1730 CALL dbcsr_copy(mat_real_space(1)%matrix, mat_gamma)
1734 NULLIFY (xkp, cell_to_index)
1735 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, cell_to_index=cell_to_index)
1737 IF (ispin == 1)
THEN
1742 ALLOCATE (mat_kp(ikp, i_re_im)%matrix)
1743 CALL dbcsr_create(matrix=mat_kp(ikp, i_re_im)%matrix, template=mat_gamma)
1745 CALL dbcsr_set(mat_kp(ikp, i_re_im)%matrix, 0.0_dp)
1750 IF (
PRESENT(real_mat_real_space))
THEN
1752 real_mat_real_space)
1757 DO i_cell = 1, num_cells
1760 DEALLOCATE (mat_real_space)
1762 CALL timestop(handle)
1771 SUBROUTINE get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1773 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kpgeneral
1775 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_kpgeneral_for_Sigma_kpoints'
1777 INTEGER :: handle, i_kp_in_kp_line, i_special_kp, &
1778 i_x, ikk, j_y, k_z, n_kp_in_kp_line, &
1780 INTEGER,
DIMENSION(:),
POINTER :: nkp_grid
1782 CALL timeset(routinen, handle)
1784 n_special_kp = qs_env%mp2_env%ri_g0w0%n_special_kp
1785 n_kp_in_kp_line = qs_env%mp2_env%ri_g0w0%n_kp_in_kp_line
1786 IF (n_special_kp > 0)
THEN
1787 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = n_kp_in_kp_line*(n_special_kp - 1) + 1
1789 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = 0
1792 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack = qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(1)* &
1793 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(2)* &
1794 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(3)
1796 qs_env%mp2_env%ri_g0w0%nkp_self_energy = qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp + &
1797 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack
1799 ALLOCATE (kpgeneral(3, qs_env%mp2_env%ri_g0w0%nkp_self_energy))
1801 IF (n_special_kp > 0)
THEN
1803 kpgeneral(1:3, 1) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, 1)
1807 DO i_special_kp = 2, n_special_kp
1808 DO i_kp_in_kp_line = 1, n_kp_in_kp_line
1811 kpgeneral(1:3, ikk) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1) + &
1812 REAL(i_kp_in_kp_line, kind=
dp)/real(n_kp_in_kp_line, kind=
dp)* &
1813 (qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp) - &
1814 qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1))
1825 nkp_grid => qs_env%mp2_env%ri_g0w0%kp_grid_Sigma
1827 DO i_x = 1, nkp_grid(1)
1828 DO j_y = 1, nkp_grid(2)
1829 DO k_z = 1, nkp_grid(3)
1831 kpgeneral(1, ikk) = real(2*i_x - nkp_grid(1) - 1, kind=
dp)/(2._dp*real(nkp_grid(1), kind=
dp))
1832 kpgeneral(2, ikk) = real(2*j_y - nkp_grid(2) - 1, kind=
dp)/(2._dp*real(nkp_grid(2), kind=
dp))
1833 kpgeneral(3, ikk) = real(2*k_z - nkp_grid(3) - 1, kind=
dp)/(2._dp*real(nkp_grid(3), kind=
dp))
1838 CALL timestop(handle)
1840 END SUBROUTINE get_kpgeneral_for_sigma_kpoints
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
methods related to the blacs parallel environment
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_uplo_to_full(matrix, workspace, uplo)
...
subroutine, public cp_cfm_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
subroutine, public cp_cfm_cholesky_invert(matrix, n, info_out)
Used to replace Cholesky decomposition by the inverse.
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
subroutine, public cp_cfm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical orthogonalization.
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_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
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
represent a full matrix distributed on many processors
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
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
Types and set/get functions for HFX.
subroutine, public hfx_release(x_data)
This routine deallocates all data structures
Defines the basic variable types.
integer, parameter, public dp
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mo_set(kpoint)
...
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group)
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
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)
Retrieve information from a kpoint environment.
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 gaussi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
subroutine, public invmat(a, info)
returns inverse of matrix using the lapack routines DGETRF and DGETRI
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Calculation of band structures.
subroutine, public calculate_kpoints_for_bs(kpoint, scheme, group_size_ext, mp_grid, kpgeneral)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, 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.
module that contains the definitions of the scf types
Utility routines for GW with imaginary time.
subroutine, public compute_weight_re_im(weight_re, weight_im, num_cells, iatom, jatom, xkp, wkp_w, cell, index_to_cell, hmat, particle_set)
...
subroutine, public get_atom_index_from_basis_function_index(qs_env, atom_from_basis_index, basis_size, basis_type, first_bf_from_atom)
...
Routines treating GW and RPA calculations with kpoints.
subroutine, public get_mat_cell_t_from_mat_gamma(mat_p_omega, qs_env, kpoints, jquad, unit_nr)
...
subroutine, public invert_eps_compute_w_and_erpa_kp(dimen_ri, num_integ_points, jquad, nkp, count_ev_sc_gw, para_env, erpa, tau_tj, tj, wj, weights_cos_tf_w_to_t, 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 real_space_to_kpoint_transform_rpa(real_mat_kp, imag_mat_kp, mat_real_space, kpoints, eps_filter_im_time, real_mat_real_space)
...
subroutine, public compute_wkp_w(qs_env, wkp_w, wkp_v, kpoints, h_inv, periodic)
...
subroutine, public get_bandstruc_and_k_dependent_mos(qs_env, eigenval_kp)
...
subroutine, public cp_cfm_power(matrix, threshold, exponent, min_eigval)
...
subroutine, public mat_kp_from_mat_gamma(qs_env, mat_kp, mat_gamma, kpoints, ispin, real_mat_real_space)
...
Routines for low-scaling RPA/GW with imaginary time.
subroutine, public init_cell_index_rpa(cell_grid, cell_to_index, index_to_cell, cell)
...
parameters that control an scf iteration
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
keeps the information about the structure of a full matrix
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment