45 USE dbcsr_api,
ONLY: &
46 dbcsr_copy, dbcsr_create, dbcsr_deallocate_matrix, dbcsr_desymmetrize, dbcsr_filter, &
47 dbcsr_get_block_p, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
48 dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_p_type, &
49 dbcsr_release, dbcsr_reserve_all_blocks, dbcsr_set, dbcsr_transposed, dbcsr_type, &
50 dbcsr_type_no_symmetry
81 #include "./base/base_uses.f90"
87 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_gw_kpoints_util'
129 Erpa, tau_tj, tj, wj, weights_cos_tf_w_to_t, wkp_W, do_gw_im_time, &
130 do_ri_Sigma_x, do_kpoints_from_Gamma, &
131 cfm_mat_Q, ikp_local, mat_P_omega, mat_P_omega_kp, &
132 qs_env, eps_filter_im_time, unit_nr, kpoints, fm_mat_Minv_L_kpoints, &
133 fm_matrix_L_kpoints, fm_mat_W, &
134 fm_mat_RI_global_work, mat_MinvVMinv, fm_matrix_Minv, &
135 fm_matrix_Minv_Vtrunc_Minv)
137 INTEGER,
INTENT(IN) :: dimen_ri, num_integ_points, jquad, nkp, &
139 TYPE(mp_para_env_type),
POINTER :: para_env
140 REAL(kind=
dp),
INTENT(INOUT) :: erpa
141 REAL(kind=
dp),
DIMENSION(0:num_integ_points), &
143 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: tj, wj
144 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
145 INTENT(IN) :: weights_cos_tf_w_to_t
146 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wkp_w
147 LOGICAL,
INTENT(IN) :: do_gw_im_time, do_ri_sigma_x, &
148 do_kpoints_from_gamma
149 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
150 INTEGER,
INTENT(IN) :: ikp_local
151 TYPE(dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
152 TYPE(qs_environment_type),
POINTER :: qs_env
153 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
154 INTEGER,
INTENT(IN) :: unit_nr
155 TYPE(kpoint_type),
POINTER :: kpoints
156 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_mat_minv_l_kpoints, &
158 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w
159 TYPE(cp_fm_type) :: fm_mat_ri_global_work
160 TYPE(dbcsr_p_type),
INTENT(IN) :: mat_minvvminv
161 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_minv, &
162 fm_matrix_minv_vtrunc_minv
164 CHARACTER(LEN=*),
PARAMETER :: routinen =
'invert_eps_compute_W_and_Erpa_kp'
166 INTEGER :: handle, ikp
167 LOGICAL :: do_this_ikp
168 REAL(kind=
dp) :: t1, t2
169 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: trace_qomega
171 CALL timeset(routinen, handle)
175 IF (do_kpoints_from_gamma)
THEN
179 CALL transform_p_from_real_space_to_kpoints(mat_p_omega, mat_p_omega_kp, &
180 kpoints, eps_filter_im_time, jquad)
182 ALLOCATE (trace_qomega(dimen_ri))
184 IF (unit_nr > 0)
WRITE (unit_nr,
'(/T3,A,1X,I3)') &
185 'GW_INFO| Computing chi and W frequency point', jquad
190 do_this_ikp = (ikp_local == -1) .OR. (ikp_local == 0 .AND. ikp == 1) .OR. (ikp_local == ikp)
191 IF (.NOT. do_this_ikp) cycle
194 CALL compute_q_kp_rpa(cfm_mat_q, &
196 fm_mat_minv_l_kpoints(ikp, 1), &
197 fm_mat_minv_l_kpoints(ikp, 2), &
198 fm_mat_ri_global_work, &
199 dimen_ri, ikp, nkp, ikp_local, para_env, &
200 qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite)
203 CALL cholesky_decomp_q(cfm_mat_q, para_env, trace_qomega, dimen_ri)
206 CALL frequency_and_kpoint_integration(erpa, cfm_mat_q, para_env, trace_qomega, &
207 dimen_ri, wj(jquad), kpoints%wkp(ikp))
209 IF (do_gw_im_time)
THEN
212 IF (do_ri_sigma_x .AND. jquad == 1 .AND. count_ev_sc_gw == 1 .AND. do_kpoints_from_gamma)
THEN
214 CALL dbcsr_set(mat_minvvminv%matrix, 0.0_dp)
215 CALL copy_fm_to_dbcsr(fm_matrix_minv_vtrunc_minv(1, 1), mat_minvvminv%matrix, keep_sparsity=.false.)
218 IF (do_kpoints_from_gamma)
THEN
219 CALL compute_wc_real_space_tau_gw(fm_mat_w, cfm_mat_q, &
220 fm_matrix_l_kpoints(ikp, 1), &
221 fm_matrix_l_kpoints(ikp, 2), &
222 dimen_ri, num_integ_points, jquad, &
223 ikp, tj, tau_tj, weights_cos_tf_w_to_t, &
224 ikp_local, para_env, kpoints, qs_env, wkp_w)
231 IF (do_gw_im_time .AND. do_kpoints_from_gamma .AND. jquad == num_integ_points)
THEN
232 CALL wc_to_minv_wc_minv(fm_mat_w, fm_matrix_minv, para_env, dimen_ri, num_integ_points)
233 CALL deallocate_kp_matrices(fm_matrix_l_kpoints, fm_mat_minv_l_kpoints)
236 DEALLOCATE (trace_qomega)
240 IF (unit_nr > 0)
WRITE (unit_nr,
'(T6,A,T56,F25.1)')
'Execution time (s):', t2 - t1
242 CALL timestop(handle)
251 SUBROUTINE deallocate_kp_matrices(fm_matrix_L_kpoints, fm_mat_Minv_L_kpoints)
253 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_matrix_l_kpoints, &
254 fm_mat_minv_l_kpoints
256 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_kp_matrices'
260 CALL timeset(routinen, handle)
262 CALL cp_fm_release(fm_mat_minv_l_kpoints)
263 CALL cp_fm_release(fm_matrix_l_kpoints)
265 CALL timestop(handle)
267 END SUBROUTINE deallocate_kp_matrices
277 TYPE(cp_cfm_type),
INTENT(INOUT) :: matrix
278 REAL(kind=
dp) :: threshold, exponent
279 REAL(kind=
dp),
OPTIONAL :: min_eigval
281 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cp_cfm_power'
282 COMPLEX(KIND=dp),
PARAMETER :: czero = cmplx(0.0_dp, 0.0_dp, kind=
dp)
284 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues_exponent
285 INTEGER :: handle, i, ncol_global, nrow_global
286 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
287 TYPE(cp_cfm_type) :: cfm_work
289 CALL timeset(routinen, handle)
295 CALL cp_cfm_get_info(matrix, nrow_global=nrow_global, ncol_global=ncol_global)
296 cpassert(nrow_global == ncol_global)
297 ALLOCATE (eigenvalues(nrow_global))
298 eigenvalues(:) = 0.0_dp
299 ALLOCATE (eigenvalues_exponent(nrow_global))
300 eigenvalues_exponent(:) = czero
305 DO i = 1, nrow_global
306 IF (eigenvalues(i) > threshold)
THEN
307 eigenvalues_exponent(i) = cmplx((eigenvalues(i))**(0.5_dp*exponent), threshold, kind=
dp)
309 IF (
PRESENT(min_eigval))
THEN
310 eigenvalues_exponent(i) = cmplx(min_eigval, 0.0_dp, kind=
dp)
312 eigenvalues_exponent(i) = czero
319 CALL parallel_gemm(
"N",
"C", nrow_global, nrow_global, nrow_global,
z_one, &
320 cfm_work, cfm_work,
z_zero, matrix)
322 DEALLOCATE (eigenvalues, eigenvalues_exponent)
326 CALL timestop(handle)
344 SUBROUTINE compute_q_kp_rpa(cfm_mat_Q, mat_P_omega_kp, fm_mat_L_re, fm_mat_L_im, &
345 fm_mat_RI_global_work, dimen_RI, ikp, nkp, ikp_local, para_env, &
346 make_chi_pos_definite)
348 TYPE(cp_cfm_type) :: cfm_mat_q
349 TYPE(dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega_kp
350 TYPE(cp_fm_type) :: fm_mat_l_re, fm_mat_l_im, &
351 fm_mat_ri_global_work
352 INTEGER,
INTENT(IN) :: dimen_ri, ikp, nkp, ikp_local
353 TYPE(mp_para_env_type),
POINTER :: para_env
354 LOGICAL,
INTENT(IN) :: make_chi_pos_definite
356 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Q_kp_RPA'
359 TYPE(cp_cfm_type) :: cfm_mat_l, cfm_mat_work
360 TYPE(cp_fm_type) :: fm_mat_work
362 CALL timeset(routinen, handle)
370 CALL cp_fm_create(fm_mat_work, fm_mat_l_re%matrix_struct)
375 CALL mat_p_to_subgroup(mat_p_omega_kp, fm_mat_ri_global_work, &
376 fm_mat_work, cfm_mat_q, ikp, nkp, ikp_local, para_env)
379 IF (make_chi_pos_definite)
THEN
380 CALL cp_cfm_power(cfm_mat_q, threshold=0.0_dp, exponent=1.0_dp)
388 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_q, cfm_mat_l, &
392 CALL parallel_gemm(
'C',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_l, cfm_mat_work, &
397 CALL cp_fm_release(fm_mat_work)
399 CALL timestop(handle)
401 END SUBROUTINE compute_q_kp_rpa
414 SUBROUTINE mat_p_to_subgroup(mat_P_omega_kp, fm_mat_RI_global_work, &
415 fm_mat_work, cfm_mat_Q, ikp, nkp, ikp_local, para_env)
417 TYPE(dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega_kp
418 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_ri_global_work, fm_mat_work
419 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
420 INTEGER,
INTENT(IN) :: ikp, nkp, ikp_local
421 TYPE(mp_para_env_type),
POINTER :: para_env
423 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mat_P_to_subgroup'
425 INTEGER :: handle, jkp
426 TYPE(cp_fm_type) :: fm_dummy
427 TYPE(dbcsr_type),
POINTER :: mat_p_omega_im, mat_p_omega_re
429 CALL timeset(routinen, handle)
431 IF (ikp_local == -1)
THEN
433 mat_p_omega_re => mat_p_omega_kp(1, ikp)%matrix
438 mat_p_omega_im => mat_p_omega_kp(2, ikp)%matrix
449 mat_p_omega_re => mat_p_omega_kp(1, jkp)%matrix
456 IF (ikp_local == jkp)
THEN
472 mat_p_omega_im => mat_p_omega_kp(2, jkp)%matrix
479 IF (ikp_local == jkp)
THEN
497 CALL timestop(handle)
499 END SUBROUTINE mat_p_to_subgroup
508 SUBROUTINE cholesky_decomp_q(cfm_mat_Q, para_env, trace_Qomega, dimen_RI)
510 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
511 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
512 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: trace_qomega
513 INTEGER,
INTENT(IN) :: dimen_ri
515 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cholesky_decomp_Q'
517 INTEGER :: handle, i_global, iib, info_chol, &
518 j_global, jjb, ncol_local, nrow_local
519 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
520 TYPE(cp_cfm_type) :: cfm_mat_q_tmp, cfm_mat_work
522 CALL timeset(routinen, handle)
532 nrow_local=nrow_local, &
533 ncol_local=ncol_local, &
534 row_indices=row_indices, &
535 col_indices=col_indices)
538 trace_qomega = 0.0_dp
541 DO jjb = 1, ncol_local
542 j_global = col_indices(jjb)
543 DO iib = 1, nrow_local
544 i_global = row_indices(iib)
545 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
546 trace_qomega(i_global) = real(cfm_mat_q%local_data(iib, jjb))
547 cfm_mat_q%local_data(iib, jjb) = cfm_mat_q%local_data(iib, jjb) +
z_one
551 CALL para_env%sum(trace_qomega)
553 CALL cp_cfm_to_cfm(cfm_mat_q, cfm_mat_q_tmp)
557 cpassert(info_chol == 0)
562 CALL timestop(handle)
564 END SUBROUTINE cholesky_decomp_q
576 SUBROUTINE frequency_and_kpoint_integration(Erpa, cfm_mat_Q, para_env, trace_Qomega, &
577 dimen_RI, freq_weight, kp_weight)
579 REAL(kind=
dp),
INTENT(INOUT) :: erpa
580 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
581 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
582 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: trace_qomega
583 INTEGER,
INTENT(IN) :: dimen_ri
584 REAL(kind=
dp),
INTENT(IN) :: freq_weight, kp_weight
586 CHARACTER(LEN=*),
PARAMETER :: routinen =
'frequency_and_kpoint_integration'
588 INTEGER :: handle, i_global, iib, j_global, jjb, &
589 ncol_local, nrow_local
590 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
591 REAL(kind=
dp) :: fcomega
592 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: q_log
594 CALL timeset(routinen, handle)
598 nrow_local=nrow_local, &
599 ncol_local=ncol_local, &
600 row_indices=row_indices, &
601 col_indices=col_indices)
603 ALLOCATE (q_log(dimen_ri))
607 DO jjb = 1, ncol_local
608 j_global = col_indices(jjb)
609 DO iib = 1, nrow_local
610 i_global = row_indices(iib)
611 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
612 q_log(i_global) = 2.0_dp*log(real(cfm_mat_q%local_data(iib, jjb)))
616 CALL para_env%sum(q_log)
620 IF (
modulo(iib, para_env%num_pe) /= para_env%mepos) cycle
622 fcomega = fcomega + (q_log(iib) - trace_qomega(iib))/2.0_dp
625 erpa = erpa + fcomega*freq_weight*kp_weight
629 CALL timestop(handle)
631 END SUBROUTINE frequency_and_kpoint_integration
639 SUBROUTINE get_dummys(tj_dummy, tau_tj_dummy, weights_cos_tf_w_to_t_dummy)
641 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
642 INTENT(INOUT) :: tj_dummy, tau_tj_dummy
643 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
644 INTENT(INOUT) :: weights_cos_tf_w_to_t_dummy
646 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_dummys'
650 CALL timeset(routinen, handle)
652 ALLOCATE (weights_cos_tf_w_to_t_dummy(1, 1))
653 ALLOCATE (tj_dummy(1))
654 ALLOCATE (tau_tj_dummy(1))
657 tau_tj_dummy(1) = 0.0_dp
658 weights_cos_tf_w_to_t_dummy(1, 1) = 1.0_dp
660 CALL timestop(handle)
670 SUBROUTINE release_dummys(tj_dummy, tau_tj_dummy, weights_cos_tf_w_to_t_dummy)
672 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
673 INTENT(INOUT) :: tj_dummy, tau_tj_dummy
674 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
675 INTENT(INOUT) :: weights_cos_tf_w_to_t_dummy
677 CHARACTER(LEN=*),
PARAMETER :: routinen =
'release_dummys'
681 CALL timeset(routinen, handle)
683 DEALLOCATE (weights_cos_tf_w_to_t_dummy)
684 DEALLOCATE (tj_dummy)
685 DEALLOCATE (tau_tj_dummy)
687 CALL timestop(handle)
700 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: mat_p_omega
701 TYPE(qs_environment_type),
POINTER :: qs_env
702 TYPE(kpoint_type),
POINTER :: kpoints
703 INTEGER,
INTENT(IN) :: jquad, unit_nr
705 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_mat_cell_T_from_mat_gamma'
707 INTEGER :: col, handle, i_cell, i_dim, j_cell, &
708 num_cells_p, num_integ_points, row
709 INTEGER,
DIMENSION(3) :: cell_grid_p, periodic
710 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell_p
711 LOGICAL :: i_cell_is_the_minimum_image_cell
712 REAL(kind=
dp) :: abs_rab_cell_i, abs_rab_cell_j
713 REAL(kind=
dp),
DIMENSION(3) :: cell_vector, cell_vector_j, rab_cell_i, &
715 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
716 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
717 TYPE(cell_type),
POINTER :: cell
718 TYPE(dbcsr_iterator_type) :: iter
719 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
721 CALL timeset(routinen, handle)
723 NULLIFY (cell, particle_set)
725 particle_set=particle_set)
726 CALL get_cell(cell=cell, h=hmat, periodic=periodic)
731 IF (periodic(i_dim) == 1)
THEN
732 cell_grid_p(i_dim) = max(min((kpoints%nkp_grid(i_dim)/2)*2 - 1, 1), 3)
734 cell_grid_p(i_dim) = 1
741 index_to_cell_p => kpoints%index_to_cell
743 num_cells_p =
SIZE(index_to_cell_p, 2)
745 num_integ_points =
SIZE(mat_p_omega, 1)
749 DO i_cell = 2, num_cells_p
750 CALL dbcsr_copy(mat_p_omega(i_cell)%matrix, &
751 mat_p_omega(1)%matrix)
754 IF (jquad == 1 .AND. unit_nr > 0)
THEN
755 WRITE (unit_nr,
'(T3,A,T66,ES15.2)')
'GW_INFO| RI regularization parameter: ', &
756 qs_env%mp2_env%ri_rpa_im_time%regularization_RI
757 WRITE (unit_nr,
'(T3,A,T66,ES15.2)')
'GW_INFO| eps_eigval_S: ', &
758 qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S
759 IF (qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite)
THEN
760 WRITE (unit_nr,
'(T3,A,T81)') &
761 'GW_INFO| Make chi(iw,k) positive definite? TRUE'
763 WRITE (unit_nr,
'(T3,A,T81)') &
764 'GW_INFO| Make chi(iw,k) positive definite? FALSE'
769 DO i_cell = 1, num_cells_p
771 CALL dbcsr_iterator_start(iter, mat_p_omega(i_cell)%matrix)
772 DO WHILE (dbcsr_iterator_blocks_left(iter))
773 CALL dbcsr_iterator_next_block(iter, row, col, data_block)
775 cell_vector(1:3) = matmul(hmat, real(index_to_cell_p(1:3, i_cell),
dp))
776 rab_cell_i(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
777 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector(1:3))
778 abs_rab_cell_i = sqrt(rab_cell_i(1)**2 + rab_cell_i(2)**2 + rab_cell_i(3)**2)
781 i_cell_is_the_minimum_image_cell = .true.
782 DO j_cell = 1, num_cells_p
783 cell_vector_j(1:3) = matmul(hmat, real(index_to_cell_p(1:3, j_cell),
dp))
784 rab_cell_j(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
785 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector_j(1:3))
786 abs_rab_cell_j = sqrt(rab_cell_j(1)**2 + rab_cell_j(2)**2 + rab_cell_j(3)**2)
788 IF (abs_rab_cell_i > abs_rab_cell_j + 1.0e-6_dp)
THEN
789 i_cell_is_the_minimum_image_cell = .false.
793 IF (.NOT. i_cell_is_the_minimum_image_cell)
THEN
794 data_block(:, :) = data_block(:, :)*0.0_dp
798 CALL dbcsr_iterator_stop(iter)
802 CALL timestop(handle)
814 SUBROUTINE transform_p_from_real_space_to_kpoints(mat_P_omega, mat_P_omega_kp, &
815 kpoints, eps_filter_im_time, jquad)
817 TYPE(dbcsr_p_type),
DIMENSION(:, :),
INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
818 TYPE(kpoint_type),
POINTER :: kpoints
819 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
820 INTEGER,
INTENT(IN) :: jquad
822 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_P_from_real_space_to_kpoints'
824 INTEGER :: handle, icell, nkp, num_integ_points
826 CALL timeset(routinen, handle)
828 num_integ_points =
SIZE(mat_p_omega, 1)
829 nkp =
SIZE(mat_p_omega, 2)
832 kpoints, eps_filter_im_time)
834 DO icell = 1,
SIZE(mat_p_omega, 2)
835 CALL dbcsr_set(mat_p_omega(jquad, icell)%matrix, 0.0_dp)
836 CALL dbcsr_filter(mat_p_omega(jquad, icell)%matrix, 1.0_dp)
839 CALL timestop(handle)
841 END SUBROUTINE transform_p_from_real_space_to_kpoints
853 kpoints, eps_filter_im_time, real_mat_real_space)
855 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: real_mat_kp, imag_mat_kp, mat_real_space
856 TYPE(kpoint_type),
POINTER :: kpoints
857 REAL(kind=
dp),
INTENT(IN) :: eps_filter_im_time
858 LOGICAL,
INTENT(IN),
OPTIONAL :: real_mat_real_space
860 CHARACTER(LEN=*),
PARAMETER :: routinen =
'real_space_to_kpoint_transform_rpa'
862 INTEGER :: handle, i_cell, ik, nkp, num_cells
863 INTEGER,
DIMENSION(3) :: cell
864 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
865 LOGICAL :: my_real_mat_real_space
866 REAL(kind=
dp) :: arg, coskl, sinkl
867 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
868 TYPE(dbcsr_type) :: mat_work
870 CALL timeset(routinen, handle)
872 my_real_mat_real_space = .true.
873 IF (
PRESENT(real_mat_real_space)) my_real_mat_real_space = real_mat_real_space
875 CALL dbcsr_create(matrix=mat_work, &
876 template=real_mat_kp(1)%matrix, &
877 matrix_type=dbcsr_type_no_symmetry)
878 CALL dbcsr_reserve_all_blocks(mat_work)
879 CALL dbcsr_set(mat_work, 0.0_dp)
884 NULLIFY (index_to_cell)
885 index_to_cell => kpoints%index_to_cell
887 num_cells =
SIZE(index_to_cell, 2)
889 cpassert(
SIZE(mat_real_space) >= num_cells/2 + 1)
893 CALL dbcsr_reserve_all_blocks(real_mat_kp(ik)%matrix)
894 CALL dbcsr_reserve_all_blocks(imag_mat_kp(ik)%matrix)
896 CALL dbcsr_set(real_mat_kp(ik)%matrix, 0.0_dp)
897 CALL dbcsr_set(imag_mat_kp(ik)%matrix, 0.0_dp)
899 DO i_cell = 1, num_cells/2 + 1
901 cell(:) = index_to_cell(:, i_cell)
903 arg = real(cell(1),
dp)*xkp(1, ik) + real(cell(2),
dp)*xkp(2, ik) + real(cell(3),
dp)*xkp(3, ik)
904 coskl = cos(
twopi*arg)
905 sinkl = sin(
twopi*arg)
907 IF (my_real_mat_real_space)
THEN
908 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
909 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, sinkl)
911 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, -sinkl)
912 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
915 IF (.NOT. (cell(1) == 0 .AND. cell(2) == 0 .AND. cell(3) == 0))
THEN
917 CALL dbcsr_transposed(mat_work, mat_real_space(i_cell)%matrix)
919 IF (my_real_mat_real_space)
THEN
920 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, coskl)
921 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
926 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
927 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -coskl)
930 CALL dbcsr_set(mat_work, 0.0_dp)
936 CALL dbcsr_filter(real_mat_kp(ik)%matrix, eps_filter_im_time)
937 CALL dbcsr_filter(imag_mat_kp(ik)%matrix, eps_filter_im_time)
941 CALL dbcsr_release(mat_work)
943 CALL timestop(handle)
954 SUBROUTINE dbcsr_add_local(mat_a, mat_b, alpha, beta)
955 TYPE(dbcsr_type),
INTENT(INOUT) :: mat_a, mat_b
956 REAL(kind=
dp),
INTENT(IN) :: alpha, beta
960 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block_to_compute, data_block
961 TYPE(dbcsr_iterator_type) :: iter
963 CALL dbcsr_iterator_start(iter, mat_b)
964 DO WHILE (dbcsr_iterator_blocks_left(iter))
965 CALL dbcsr_iterator_next_block(iter, row, col, data_block)
967 NULLIFY (block_to_compute)
968 CALL dbcsr_get_block_p(matrix=mat_a, &
969 row=row, col=col, block=block_to_compute, found=found)
973 block_to_compute(:, :) = alpha*block_to_compute(:, :) + beta*data_block(:, :)
976 CALL dbcsr_iterator_stop(iter)
978 END SUBROUTINE dbcsr_add_local
999 SUBROUTINE compute_wc_real_space_tau_gw(fm_mat_W_tau, cfm_mat_Q, fm_mat_L_re, fm_mat_L_im, &
1000 dimen_RI, num_integ_points, jquad, &
1001 ikp, tj, tau_tj, weights_cos_tf_w_to_t, ikp_local, &
1002 para_env, kpoints, qs_env, wkp_W)
1004 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w_tau
1005 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
1006 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_l_re, fm_mat_l_im
1007 INTEGER,
INTENT(IN) :: dimen_ri, num_integ_points, jquad, ikp
1008 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: tj
1009 REAL(kind=
dp),
DIMENSION(0:num_integ_points), &
1010 INTENT(IN) :: tau_tj
1011 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: weights_cos_tf_w_to_t
1012 INTEGER,
INTENT(IN) :: ikp_local
1013 TYPE(mp_para_env_type),
INTENT(IN),
POINTER :: para_env
1014 TYPE(kpoint_type),
INTENT(IN),
POINTER :: kpoints
1015 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
1016 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wkp_w
1018 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Wc_real_space_tau_GW'
1020 INTEGER :: handle, handle2, i_global, iatom, iatom_old, iib, iquad, irow, j_global, jatom, &
1021 jatom_old, jcol, jjb, jkp, ncol_local, nkp, nrow_local, num_cells
1022 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_from_ri_index
1023 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1024 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1025 REAL(kind=
dp) :: contribution, omega, tau, weight, &
1026 weight_im, weight_re
1027 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
1028 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp
1029 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1030 TYPE(cell_type),
POINTER :: cell
1031 TYPE(cp_cfm_type) :: cfm_mat_l, cfm_mat_work, cfm_mat_work_2
1032 TYPE(cp_fm_type) :: fm_dummy, fm_mat_work_global, &
1034 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1036 CALL timeset(routinen, handle)
1038 CALL timeset(routinen//
"_1", handle2)
1053 CALL cp_fm_create(fm_mat_work_global, fm_mat_w_tau(1)%matrix_struct)
1056 CALL cp_fm_create(fm_mat_work_local, cfm_mat_q%matrix_struct)
1059 CALL timestop(handle2)
1061 CALL timeset(routinen//
"_2", handle2)
1071 nrow_local=nrow_local, &
1072 ncol_local=ncol_local, &
1073 row_indices=row_indices, &
1074 col_indices=col_indices)
1076 DO jjb = 1, ncol_local
1077 j_global = col_indices(jjb)
1078 DO iib = 1, nrow_local
1079 i_global = row_indices(iib)
1080 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
1081 cfm_mat_q%local_data(iib, jjb) = cfm_mat_q%local_data(iib, jjb) -
z_one
1086 CALL timestop(handle2)
1088 CALL timeset(routinen//
"_3", handle2)
1091 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_q, cfm_mat_l, &
1095 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri,
z_one, cfm_mat_l, cfm_mat_work, &
1098 CALL timestop(handle2)
1100 CALL timeset(routinen//
"_4", handle2)
1103 index_to_cell => kpoints%index_to_cell
1104 num_cells =
SIZE(index_to_cell, 2)
1108 ALLOCATE (atom_from_ri_index(dimen_ri))
1112 NULLIFY (cell, particle_set)
1113 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
1119 nrow_local=nrow_local, &
1120 ncol_local=ncol_local, &
1121 row_indices=row_indices, &
1122 col_indices=col_indices)
1124 DO irow = 1, nrow_local
1125 DO jcol = 1, ncol_local
1127 iatom = atom_from_ri_index(row_indices(irow))
1128 jatom = atom_from_ri_index(col_indices(jcol))
1130 IF (iatom .NE. iatom_old .OR. jatom .NE. jatom_old)
THEN
1134 num_cells, iatom, jatom, xkp(1:3, ikp), wkp_w(ikp), &
1135 cell, index_to_cell, hmat, particle_set)
1142 contribution = weight_re*real(cfm_mat_work_2%local_data(irow, jcol)) + &
1143 weight_im*aimag(cfm_mat_work_2%local_data(irow, jcol))
1145 fm_mat_work_local%local_data(irow, jcol) = fm_mat_work_local%local_data(irow, jcol) + contribution
1150 CALL timestop(handle2)
1152 CALL timeset(routinen//
"_5", handle2)
1154 IF (ikp_local == -1)
THEN
1158 DO iquad = 1, num_integ_points
1162 weight = weights_cos_tf_w_to_t(iquad, jquad)*cos(tau*omega)
1164 IF (jquad == 1 .AND. ikp == 1)
THEN
1165 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
1168 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)
1176 CALL para_env%sync()
1178 IF (ikp_local == jkp)
THEN
1184 CALL para_env%sync()
1186 DO iquad = 1, num_integ_points
1190 weight = weights_cos_tf_w_to_t(iquad, jquad)*cos(tau*omega)
1192 IF (jquad == 1 .AND. jkp == 1)
THEN
1193 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
1197 matrix_b=fm_mat_work_global)
1208 CALL cp_fm_release(fm_mat_work_global)
1209 CALL cp_fm_release(fm_mat_work_local)
1211 DEALLOCATE (atom_from_ri_index)
1213 CALL timestop(handle2)
1215 CALL timestop(handle)
1217 END SUBROUTINE compute_wc_real_space_tau_gw
1227 SUBROUTINE wc_to_minv_wc_minv(fm_mat_W, fm_matrix_Minv, para_env, dimen_RI, num_integ_points)
1228 TYPE(cp_fm_type),
DIMENSION(:) :: fm_mat_w
1229 TYPE(cp_fm_type),
DIMENSION(:, :) :: fm_matrix_minv
1230 TYPE(mp_para_env_type),
INTENT(IN),
POINTER :: para_env
1231 INTEGER :: dimen_ri, num_integ_points
1233 CHARACTER(LEN=*),
PARAMETER :: routinen =
'Wc_to_Minv_Wc_Minv'
1235 INTEGER :: handle, jquad
1236 TYPE(cp_fm_type) :: fm_work_minv, fm_work_minv_w
1238 CALL timeset(routinen, handle)
1240 CALL cp_fm_create(fm_work_minv, fm_mat_w(1)%matrix_struct)
1243 CALL cp_fm_create(fm_work_minv_w, fm_mat_w(1)%matrix_struct)
1245 DO jquad = 1, num_integ_points
1247 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv, fm_mat_w(jquad), &
1248 0.0_dp, fm_work_minv_w)
1249 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv_w, fm_work_minv, &
1250 0.0_dp, fm_mat_w(jquad))
1254 CALL cp_fm_release(fm_work_minv)
1256 CALL cp_fm_release(fm_work_minv_w)
1258 CALL timestop(handle)
1260 END SUBROUTINE wc_to_minv_wc_minv
1273 TYPE(qs_environment_type),
POINTER :: qs_env
1274 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1275 INTENT(OUT) :: wkp_w, wkp_v
1276 TYPE(kpoint_type),
POINTER :: kpoints
1277 REAL(kind=
dp),
DIMENSION(3, 3) :: h_inv
1278 INTEGER,
DIMENSION(3) :: periodic
1280 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_wkp_W'
1282 INTEGER :: handle, i_x, ikp, info, j_y, k_z, &
1283 kpoint_weights_w_method, n_x, n_y, &
1284 n_z, nkp, nsuperfine, num_lin_eqs
1285 REAL(kind=
dp) :: exp_kpoints, integral, k_sq, weight
1286 REAL(kind=
dp),
DIMENSION(3) :: k_vec, x_vec
1287 REAL(kind=
dp),
DIMENSION(:),
POINTER :: right_side, wkp, wkp_tmp
1288 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: matrix_lin_eqs, xkp
1290 CALL timeset(routinen, handle)
1292 kpoint_weights_w_method = qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method
1306 ALLOCATE (wkp_v(nkp), wkp_w(nkp))
1310 IF (
ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%wkp_V))
THEN
1311 wkp_v(:) = qs_env%mp2_env%ri_rpa_im_time%wkp_V(:)
1325 exp_kpoints = qs_env%mp2_env%ri_rpa_im_time%exp_tailored_weights
1328 IF (sum(periodic) == 2) exp_kpoints = -1.0_dp
1335 IF (periodic(1) == 1)
THEN
1340 IF (periodic(2) == 1)
THEN
1345 IF (periodic(3) == 1)
THEN
1353 weight = 1.0_dp/(real(n_x,
dp)*real(n_y,
dp)*real(n_z,
dp))
1358 IF (periodic(1) == 1)
THEN
1359 x_vec(1) = (real(i_x - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1363 IF (periodic(2) == 1)
THEN
1364 x_vec(2) = (real(j_y - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1368 IF (periodic(3) == 1)
THEN
1369 x_vec(3) = (real(k_z - nsuperfine/2,
dp) - 0.5_dp)/real(nsuperfine,
dp)
1374 k_vec = matmul(h_inv(1:3, 1:3), x_vec)
1375 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1376 integral = integral + weight*k_sq**(exp_kpoints*0.5_dp)
1382 num_lin_eqs = nkp + 2
1384 ALLOCATE (matrix_lin_eqs(num_lin_eqs, num_lin_eqs))
1385 matrix_lin_eqs(:, :) = 0.0_dp
1389 k_vec = matmul(h_inv(1:3, 1:3), xkp(1:3, ikp))
1390 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1392 matrix_lin_eqs(ikp, ikp) = 2.0_dp
1393 matrix_lin_eqs(ikp, nkp + 1) = 1.0_dp
1394 matrix_lin_eqs(nkp + 1, ikp) = 1.0_dp
1396 matrix_lin_eqs(ikp, nkp + 2) = k_sq**(exp_kpoints*0.5_dp)
1397 matrix_lin_eqs(nkp + 2, ikp) = k_sq**(exp_kpoints*0.5_dp)
1401 CALL invmat(matrix_lin_eqs, info)
1405 ALLOCATE (right_side(num_lin_eqs))
1407 right_side(nkp + 1) = 1.0_dp
1409 right_side(nkp + 2) = integral
1411 ALLOCATE (wkp_tmp(num_lin_eqs))
1413 wkp_tmp(1:num_lin_eqs) = matmul(matrix_lin_eqs, right_side)
1415 wkp_w(1:nkp) = wkp_tmp(1:nkp)
1417 DEALLOCATE (matrix_lin_eqs, right_side, wkp_tmp)
1421 CALL timestop(handle)
1431 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat_q
1433 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cp_cfm_upper_to_full'
1435 INTEGER :: handle, i_global, iib, j_global, jjb, &
1436 ncol_local, nrow_local
1437 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1438 TYPE(cp_cfm_type) :: cfm_mat_work
1440 CALL timeset(routinen, handle)
1446 nrow_local=nrow_local, &
1447 ncol_local=ncol_local, &
1448 row_indices=row_indices, &
1449 col_indices=col_indices)
1451 DO jjb = 1, ncol_local
1452 j_global = col_indices(jjb)
1453 DO iib = 1, nrow_local
1454 i_global = row_indices(iib)
1455 IF (j_global < i_global)
THEN
1456 cfm_mat_q%local_data(iib, jjb) =
z_zero
1458 IF (j_global == i_global)
THEN
1459 cfm_mat_q%local_data(iib, jjb) = cfm_mat_q%local_data(iib, jjb)/(2.0_dp, 0.0_dp)
1470 CALL timestop(handle)
1480 TYPE(qs_environment_type),
POINTER :: qs_env
1481 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_kp
1483 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_bandstruc_and_k_dependent_MOs'
1485 INTEGER :: handle, ikp, ispin, nmo, nspins
1486 INTEGER,
DIMENSION(3) :: nkp_grid_g
1487 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ev
1488 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kpgeneral
1489 TYPE(kpoint_type),
POINTER :: kpoints_sigma
1490 TYPE(mp_para_env_type),
POINTER :: para_env
1492 CALL timeset(routinen, handle)
1494 NULLIFY (qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1495 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1496 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1499 nkp_grid_g(1:3) = (/1, 1, 1/)
1501 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
1503 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1504 "MONKHORST-PACK", para_env%num_pe, &
1505 mp_grid=nkp_grid_g(1:3))
1507 IF (qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
1510 CALL get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1512 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1513 "GENERAL", para_env%num_pe, &
1514 kpgeneral=kpgeneral)
1516 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1517 "GENERAL", para_env%num_pe, &
1518 kpgeneral=kpgeneral, with_xc_terms=.false.)
1520 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
1521 nmo =
SIZE(eigenval_kp, 1)
1522 nspins =
SIZE(eigenval_kp, 3)
1524 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(nmo))
1525 qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(:) = eigenval_kp(:, 1, 1)
1527 DEALLOCATE (eigenval_kp)
1529 ALLOCATE (eigenval_kp(nmo, kpoints_sigma%nkp, nspins))
1531 DO ikp = 1, kpoints_sigma%nkp
1533 DO ispin = 1, nspins
1535 ev => kpoints_sigma%kp_env(ikp)%kpoint_env%mos(1, ispin)%eigenvalues
1537 eigenval_kp(:, ikp, ispin) = ev(:)
1543 DEALLOCATE (kpgeneral)
1547 CALL release_hfx_stuff(qs_env)
1549 CALL timestop(handle)
1557 SUBROUTINE release_hfx_stuff(qs_env)
1558 TYPE(qs_environment_type),
POINTER :: qs_env
1560 IF (
ASSOCIATED(qs_env%x_data) .AND. .NOT. qs_env%mp2_env%ri_g0w0%do_ri_Sigma_x)
THEN
1564 END SUBROUTINE release_hfx_stuff
1576 SUBROUTINE create_kp_and_calc_kp_orbitals(qs_env, kpoints, scheme, &
1577 group_size_ext, mp_grid, kpgeneral, with_xc_terms)
1579 TYPE(qs_environment_type),
POINTER :: qs_env
1580 TYPE(kpoint_type),
POINTER :: kpoints
1581 CHARACTER(LEN=*),
INTENT(IN) :: scheme
1582 INTEGER :: group_size_ext
1583 INTEGER,
DIMENSION(3),
INTENT(IN),
OPTIONAL :: mp_grid
1584 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN), &
1585 OPTIONAL :: kpgeneral
1586 LOGICAL,
OPTIONAL :: with_xc_terms
1588 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_kp_and_calc_kp_orbitals'
1589 COMPLEX(KIND=dp),
PARAMETER :: cone = cmplx(1.0_dp, 0.0_dp, kind=
dp), &
1590 czero = cmplx(0.0_dp, 0.0_dp, kind=
dp), ione = cmplx(0.0_dp, 1.0_dp, kind=
dp)
1592 INTEGER :: handle, i_dim, i_re_im, ikp, ispin, nkp, &
1594 INTEGER,
DIMENSION(3) :: cell_grid, periodic
1595 LOGICAL :: my_with_xc_terms
1596 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1597 TYPE(cell_type),
POINTER :: cell
1598 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1599 TYPE(cp_cfm_type) :: cksmat, cmos, csmat, cwork
1600 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
1601 TYPE(cp_fm_type) :: fm_work
1602 TYPE(cp_fm_type),
POINTER :: imos, rmos
1603 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_desymm
1604 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_ks_kp, mat_s_kp
1605 TYPE(dft_control_type),
POINTER :: dft_control
1606 TYPE(kpoint_env_type),
POINTER :: kp
1607 TYPE(mp_para_env_type),
POINTER :: para_env
1608 TYPE(qs_scf_env_type),
POINTER :: scf_env
1609 TYPE(scf_control_type),
POINTER :: scf_control
1611 CALL timeset(routinen, handle)
1613 my_with_xc_terms = .true.
1614 IF (
PRESENT(with_xc_terms)) my_with_xc_terms = with_xc_terms
1617 para_env=para_env, &
1618 blacs_env=blacs_env, &
1619 matrix_s=matrix_s, &
1621 scf_control=scf_control, &
1626 group_size_ext=group_size_ext)
1635 CALL get_cell(cell=cell, periodic=periodic)
1640 IF (periodic(i_dim) == 1)
THEN
1641 cell_grid(i_dim) = max(min((kpoints%nkp_grid(i_dim)/2)*2 - 1, 1), 3)
1643 cell_grid(i_dim) = 1
1649 CALL get_qs_env(qs_env, matrix_s=matrix_s, scf_env=scf_env, scf_control=scf_control, dft_control=dft_control)
1651 NULLIFY (matrix_s_desymm)
1653 ALLOCATE (matrix_s_desymm(1)%matrix)
1654 CALL dbcsr_create(matrix=matrix_s_desymm(1)%matrix, template=matrix_s(1)%matrix, &
1655 matrix_type=dbcsr_type_no_symmetry)
1656 CALL dbcsr_desymmetrize(matrix_s(1)%matrix, matrix_s_desymm(1)%matrix)
1662 matrix_struct => kpoints%kp_env(1)%kpoint_env%wmat(1, 1)%matrix_struct
1670 nspins = dft_control%nspins
1672 DO ispin = 1, nspins
1675 IF (my_with_xc_terms)
THEN
1676 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix, kpoints, ispin)
1678 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix, &
1684 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 1)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(1, ispin))
1687 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 2)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(2, ispin))
1696 kp => kpoints%kp_env(ikp)%kpoint_env
1698 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
1699 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1702 qs_env%mp2_env%ri_rpa_im_time%make_overlap_mat_ao_pos_definite)
THEN
1703 CALL cp_cfm_geeig_canon(cksmat, csmat, cmos, eigenvalues, cwork, scf_control%eps_eigval)
1705 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
1710 kp%mos(2, ispin)%eigenvalues = eigenvalues
1718 CALL dbcsr_deallocate_matrix(mat_ks_kp(ikp, i_re_im)%matrix)
1721 DEALLOCATE (mat_ks_kp)
1725 CALL dbcsr_deallocate_matrix(mat_s_kp(ikp, i_re_im)%matrix)
1728 DEALLOCATE (mat_s_kp)
1730 CALL dbcsr_deallocate_matrix(matrix_s_desymm(1)%matrix)
1731 DEALLOCATE (matrix_s_desymm)
1737 CALL cp_fm_release(fm_work)
1739 CALL timestop(handle)
1741 END SUBROUTINE create_kp_and_calc_kp_orbitals
1754 TYPE(qs_environment_type),
POINTER :: qs_env
1755 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_kp
1756 TYPE(dbcsr_type) :: mat_gamma
1757 TYPE(kpoint_type),
POINTER :: kpoints
1759 LOGICAL,
INTENT(IN),
OPTIONAL :: real_mat_real_space
1761 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mat_kp_from_mat_gamma'
1763 INTEGER :: handle, i_cell, i_re_im, ikp, nkp, &
1765 INTEGER,
DIMENSION(3) :: periodic
1766 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1767 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1768 TYPE(cell_type),
POINTER :: cell
1769 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_real_space
1771 CALL timeset(routinen, handle)
1774 CALL get_cell(cell=cell, periodic=periodic)
1775 num_cells = 3**(periodic(1) + periodic(2) + periodic(3))
1777 NULLIFY (mat_real_space)
1779 DO i_cell = 1, num_cells
1780 ALLOCATE (mat_real_space(i_cell)%matrix)
1781 CALL dbcsr_create(matrix=mat_real_space(i_cell)%matrix, &
1783 CALL dbcsr_reserve_all_blocks(mat_real_space(i_cell)%matrix)
1784 CALL dbcsr_set(mat_real_space(i_cell)%matrix, 0.0_dp)
1787 CALL dbcsr_copy(mat_real_space(1)%matrix, mat_gamma)
1791 NULLIFY (xkp, cell_to_index)
1792 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, cell_to_index=cell_to_index)
1794 IF (ispin == 1)
THEN
1799 ALLOCATE (mat_kp(ikp, i_re_im)%matrix)
1800 CALL dbcsr_create(matrix=mat_kp(ikp, i_re_im)%matrix, template=mat_gamma)
1801 CALL dbcsr_reserve_all_blocks(mat_kp(ikp, i_re_im)%matrix)
1802 CALL dbcsr_set(mat_kp(ikp, i_re_im)%matrix, 0.0_dp)
1807 IF (
PRESENT(real_mat_real_space))
THEN
1809 real_mat_real_space)
1814 DO i_cell = 1, num_cells
1815 CALL dbcsr_deallocate_matrix(mat_real_space(i_cell)%matrix)
1817 DEALLOCATE (mat_real_space)
1819 CALL timestop(handle)
1828 SUBROUTINE get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1829 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
1830 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kpgeneral
1832 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_kpgeneral_for_Sigma_kpoints'
1834 INTEGER :: handle, i_kp_in_kp_line, i_special_kp, &
1835 i_x, ikk, j_y, k_z, n_kp_in_kp_line, &
1837 INTEGER,
DIMENSION(:),
POINTER :: nkp_grid
1839 CALL timeset(routinen, handle)
1841 n_special_kp = qs_env%mp2_env%ri_g0w0%n_special_kp
1842 n_kp_in_kp_line = qs_env%mp2_env%ri_g0w0%n_kp_in_kp_line
1843 IF (n_special_kp > 0)
THEN
1844 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = n_kp_in_kp_line*(n_special_kp - 1) + 1
1846 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = 0
1849 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack = qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(1)* &
1850 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(2)* &
1851 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(3)
1853 qs_env%mp2_env%ri_g0w0%nkp_self_energy = qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp + &
1854 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack
1856 ALLOCATE (kpgeneral(3, qs_env%mp2_env%ri_g0w0%nkp_self_energy))
1858 IF (n_special_kp > 0)
THEN
1860 kpgeneral(1:3, 1) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, 1)
1864 DO i_special_kp = 2, n_special_kp
1865 DO i_kp_in_kp_line = 1, n_kp_in_kp_line
1868 kpgeneral(1:3, ikk) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1) + &
1869 REAL(i_kp_in_kp_line, kind=
dp)/real(n_kp_in_kp_line, kind=
dp)* &
1870 (qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp) - &
1871 qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1))
1882 nkp_grid => qs_env%mp2_env%ri_g0w0%kp_grid_Sigma
1884 DO i_x = 1, nkp_grid(1)
1885 DO j_y = 1, nkp_grid(2)
1886 DO k_z = 1, nkp_grid(3)
1888 kpgeneral(1, ikk) = real(2*i_x - nkp_grid(1) - 1, kind=
dp)/(2._dp*real(nkp_grid(1), kind=
dp))
1889 kpgeneral(2, ikk) = real(2*j_y - nkp_grid(2) - 1, kind=
dp)/(2._dp*real(nkp_grid(2), kind=
dp))
1890 kpgeneral(3, ikk) = real(2*k_z - nkp_grid(3) - 1, kind=
dp)/(2._dp*real(nkp_grid(3), kind=
dp))
1895 CALL timestop(handle)
1897 END SUBROUTINE get_kpgeneral_for_sigma_kpoints
subroutine pbc(r, r_pbc, s, s_pbc, a, b, c, alpha, beta, gamma, debug, info, pbc0, h, hinv)
...
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(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b).
subroutine, public cp_cfm_transpose(matrix, trans, matrixt)
Transposes a BLACS distributed complex matrix.
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_cholesky_invert(matrix, n, info_out)
Used to replace Cholesky decomposition by the inverse.
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_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
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_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
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...
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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, rhs)
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_upper_to_full(cfm_mat_Q)
...
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