59 USE dbcsr_api,
ONLY: &
60 dbcsr_add_on_diag, dbcsr_copy, dbcsr_create, dbcsr_desymmetrize, dbcsr_filter, &
61 dbcsr_get_info, dbcsr_init_p, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
62 dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, &
63 dbcsr_p_type, dbcsr_release, dbcsr_release_p, dbcsr_scale, dbcsr_set, dbcsr_type, &
64 dbcsr_type_antisymmetric, dbcsr_type_no_symmetry
66 dbt_batched_contract_finalize, dbt_batched_contract_init, dbt_clear, dbt_contract, &
67 dbt_copy, dbt_copy_matrix_to_tensor, dbt_copy_tensor_to_matrix, dbt_create, dbt_destroy, &
68 dbt_get_block, dbt_get_info, dbt_iterator_blocks_left, dbt_iterator_next_block, &
69 dbt_iterator_start, dbt_iterator_stop, dbt_iterator_type, dbt_nblks_total, &
70 dbt_pgrid_create, dbt_pgrid_destroy, dbt_pgrid_type, dbt_type
114 USE pw_types,
ONLY: pw_c1d_gs_type,&
147 #include "./base/base_uses.f90"
153 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_gw'
192 num_integ_points, unit_nr, &
193 RI_blk_sizes, do_ic_model, &
194 para_env, fm_mat_W, fm_mat_Q, &
196 t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, &
197 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, &
198 starts_array_mc, ends_array_mc, &
199 t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, &
200 matrix_s, mat_W, t_3c_overl_int, &
201 t_3c_O_compressed, t_3c_O_ind, &
204 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo
205 INTEGER,
INTENT(IN) :: nmo, num_integ_points, unit_nr
206 INTEGER,
DIMENSION(:),
POINTER :: ri_blk_sizes
207 LOGICAL,
INTENT(IN) :: do_ic_model
208 TYPE(mp_para_env_type),
POINTER :: para_env
209 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
210 INTENT(OUT) :: fm_mat_w
211 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_q
212 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
213 TYPE(dbt_type) :: t_3c_overl_int_ao_mo
214 TYPE(hfx_compression_type),
ALLOCATABLE, &
215 DIMENSION(:) :: t_3c_o_mo_compressed
216 TYPE(two_dim_int_array),
ALLOCATABLE, &
217 DIMENSION(:),
INTENT(OUT) :: t_3c_o_mo_ind
218 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:), &
219 INTENT(INOUT) :: t_3c_overl_int_gw_ri, &
221 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc
222 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:), &
223 INTENT(INOUT) :: t_3c_overl_nnp_ic, &
224 t_3c_overl_nnp_ic_reflected
225 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
226 TYPE(dbcsr_type),
POINTER :: mat_w
227 TYPE(dbt_type),
DIMENSION(:, :) :: t_3c_overl_int
228 TYPE(hfx_compression_type),
DIMENSION(:, :, :) :: t_3c_o_compressed
229 TYPE(block_ind_type),
DIMENSION(:, :, :) :: t_3c_o_ind
230 TYPE(qs_environment_type),
POINTER :: qs_env
232 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_gw_im_time'
234 INTEGER :: handle, jquad, nspins
235 LOGICAL :: my_open_shell
236 TYPE(dbt_type) :: t_3c_overl_int_ao_mo_beta
238 CALL timeset(routinen, handle)
241 my_open_shell = (nspins == 2)
243 ALLOCATE (t_3c_o_mo_ind(nspins), t_3c_overl_int_gw_ao(nspins), t_3c_overl_int_gw_ri(nspins), &
244 t_3c_overl_nnp_ic(nspins), t_3c_overl_nnp_ic_reflected(nspins), t_3c_o_mo_compressed(nspins))
246 t_3c_o_compressed, t_3c_o_ind, &
247 t_3c_overl_int_ao_mo, t_3c_o_mo_compressed(1), t_3c_o_mo_ind(1)%array, &
248 t_3c_overl_int_gw_ri(1), t_3c_overl_int_gw_ao(1), &
249 starts_array_mc, ends_array_mc, &
250 mo_coeff(1), matrix_s, &
251 gw_corr_lev_occ(1), gw_corr_lev_virt(1), homo(1), nmo, &
254 t_3c_overl_nnp_ic(1), t_3c_overl_nnp_ic_reflected(1), &
255 qs_env, unit_nr, do_alpha=.true.)
257 IF (my_open_shell)
THEN
260 t_3c_o_compressed, t_3c_o_ind, &
261 t_3c_overl_int_ao_mo_beta, t_3c_o_mo_compressed(2), t_3c_o_mo_ind(2)%array, &
262 t_3c_overl_int_gw_ri(2), t_3c_overl_int_gw_ao(2), &
263 starts_array_mc, ends_array_mc, &
264 mo_coeff(2), matrix_s, &
265 gw_corr_lev_occ(2), gw_corr_lev_virt(2), homo(2), nmo, &
268 t_3c_overl_nnp_ic(2), t_3c_overl_nnp_ic_reflected(2), &
269 qs_env, unit_nr, do_alpha=.false.)
271 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
272 CALL dbt_destroy(t_3c_overl_int_ao_mo_beta)
277 ALLOCATE (fm_mat_w(num_integ_points))
279 DO jquad = 1, num_integ_points
281 CALL cp_fm_create(fm_mat_w(jquad), fm_mat_q%matrix_struct)
282 CALL cp_fm_to_fm(fm_mat_q, fm_mat_w(jquad))
288 CALL dbcsr_init_p(mat_w)
289 CALL dbcsr_create(matrix=mat_w, &
290 template=matrix_s(1)%matrix, &
291 matrix_type=dbcsr_type_no_symmetry, &
292 row_blk_size=ri_blk_sizes, &
293 col_blk_size=ri_blk_sizes)
295 CALL timestop(handle)
339 gw_corr_lev_occ, gw_corr_lev_virt, homo, &
340 nmo, num_integ_group, num_integ_points, unit_nr, &
341 gw_corr_lev_tot, num_fit_points, omega_max_fit, &
342 do_minimax_quad, do_periodic, do_ri_Sigma_x, my_do_gw, &
343 first_cycle_periodic_correction, &
344 a_scaling, Eigenval, tj, vec_omega_fit_gw, vec_Sigma_x_gw, &
345 delta_corr, Eigenval_last, Eigenval_scf, vec_W_gw, &
346 fm_mat_S_gw, fm_mat_S_gw_work, &
347 para_env, mp2_env, kpoints, nkp, nkp_self_energy, &
348 do_kpoints_cubic_RPA, do_kpoints_from_Gamma)
350 COMPLEX(KIND=dp),
ALLOCATABLE, &
351 DIMENSION(:, :, :, :),
INTENT(OUT) :: vec_sigma_c_gw
352 INTEGER,
INTENT(IN) :: color_rpa_group, dimen_nm_gw
353 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo
354 INTEGER,
INTENT(IN) :: nmo, num_integ_group, num_integ_points, &
356 INTEGER,
INTENT(INOUT) :: gw_corr_lev_tot, num_fit_points
357 REAL(kind=
dp) :: omega_max_fit
358 LOGICAL,
INTENT(IN) :: do_minimax_quad, do_periodic, &
359 do_ri_sigma_x, my_do_gw
360 LOGICAL,
INTENT(OUT) :: first_cycle_periodic_correction
361 REAL(kind=
dp),
INTENT(IN) :: a_scaling
362 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
363 INTENT(INOUT) :: eigenval
364 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
366 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
367 INTENT(OUT) :: vec_omega_fit_gw
368 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
369 INTENT(OUT) :: vec_sigma_x_gw
370 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
371 INTENT(INOUT) :: delta_corr
372 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
373 INTENT(OUT) :: eigenval_last, eigenval_scf
374 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
375 INTENT(OUT) :: vec_w_gw
376 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s_gw
377 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
378 INTENT(INOUT) :: fm_mat_s_gw_work
379 TYPE(mp_para_env_type),
POINTER :: para_env
380 TYPE(mp2_type) :: mp2_env
381 TYPE(kpoint_type),
POINTER :: kpoints
382 INTEGER,
INTENT(OUT) :: nkp, nkp_self_energy
383 LOGICAL,
INTENT(IN) :: do_kpoints_cubic_rpa, &
384 do_kpoints_from_gamma
386 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_matrices_gw'
388 INTEGER :: handle, iquad, ispin, jquad, nspins
389 LOGICAL :: my_open_shell
390 REAL(kind=
dp) :: omega
391 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: vec_omega_gw
393 CALL timeset(routinen, handle)
395 nspins =
SIZE(eigenval, 3)
396 my_open_shell = (nspins == 2)
398 gw_corr_lev_tot = gw_corr_lev_occ(1) + gw_corr_lev_virt(1)
401 ALLOCATE (vec_omega_gw(num_integ_points))
402 vec_omega_gw = 0.0_dp
404 DO jquad = 1, num_integ_points
405 IF (do_minimax_quad)
THEN
408 omega = a_scaling/tan(tj(jquad))
410 vec_omega_gw(jquad) = omega
416 DO jquad = 1, num_integ_points
417 IF (vec_omega_gw(jquad) < omega_max_fit)
THEN
418 num_fit_points = num_fit_points + 1
423 IF (mp2_env%ri_g0w0%nparam_pade > num_fit_points)
THEN
424 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A)") &
425 "Pade approximation: more parameters than data points. Reset # of parameters."
426 mp2_env%ri_g0w0%nparam_pade = num_fit_points
427 IF (unit_nr > 0)
WRITE (unit=unit_nr, fmt=
"(T3,A,T74,I7)") &
428 "Number of pade parameters:", mp2_env%ri_g0w0%nparam_pade
433 ALLOCATE (vec_omega_fit_gw(num_fit_points))
437 DO jquad = 1, num_integ_points
438 IF (vec_omega_gw(jquad) < omega_max_fit)
THEN
440 vec_omega_fit_gw(iquad) = vec_omega_gw(jquad)
444 DEALLOCATE (vec_omega_gw)
446 IF (do_kpoints_cubic_rpa)
THEN
448 IF (mp2_env%ri_g0w0%do_gamma_only_sigma)
THEN
451 nkp_self_energy = nkp
453 ELSE IF (do_kpoints_from_gamma)
THEN
455 IF (mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
456 nkp_self_energy = mp2_env%ri_g0w0%nkp_self_energy
464 ALLOCATE (vec_sigma_c_gw(gw_corr_lev_tot, num_fit_points, nkp_self_energy, nspins))
467 ALLOCATE (eigenval_scf(nmo, nkp_self_energy, nspins))
468 eigenval_scf(:, :, :) = eigenval(:, :, :)
470 ALLOCATE (eigenval_last(nmo, nkp_self_energy, nspins))
471 eigenval_last(:, :, :) = eigenval(:, :, :)
473 IF (do_periodic)
THEN
475 ALLOCATE (delta_corr(1 + homo(1) - gw_corr_lev_occ(1):homo(1) + gw_corr_lev_virt(1)))
476 delta_corr(:) = 0.0_dp
478 first_cycle_periodic_correction = .true.
482 ALLOCATE (vec_sigma_x_gw(nmo, nkp_self_energy, nspins))
483 vec_sigma_x_gw = 0.0_dp
488 cpassert(.NOT. do_minimax_quad)
491 ALLOCATE (fm_mat_s_gw_work(nspins))
493 CALL cp_fm_create(fm_mat_s_gw_work(ispin), fm_mat_s_gw(ispin)%matrix_struct)
494 CALL cp_fm_set_all(matrix=fm_mat_s_gw_work(ispin), alpha=0.0_dp)
497 ALLOCATE (vec_w_gw(dimen_nm_gw, nspins))
501 IF (do_ri_sigma_x)
THEN
503 CALL get_vec_sigma_x(vec_sigma_x_gw(:, :, 1), nmo, fm_mat_s_gw(1), para_env, num_integ_group, color_rpa_group, &
504 homo(1), gw_corr_lev_occ(1), mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, 1))
506 IF (my_open_shell)
THEN
507 CALL get_vec_sigma_x(vec_sigma_x_gw(:, :, 2), nmo, fm_mat_s_gw(2), para_env, num_integ_group, &
508 color_rpa_group, homo(2), gw_corr_lev_occ(2), &
509 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 2, 1))
516 CALL timestop(handle)
532 SUBROUTINE get_vec_sigma_x(vec_Sigma_x_gw, nmo, fm_mat_S_gw, para_env, num_integ_group, color_rpa_group, homo, &
533 gw_corr_lev_occ, vec_Sigma_x_minus_vxc_gw11)
535 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vec_sigma_x_gw
536 INTEGER,
INTENT(IN) :: nmo
537 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_s_gw
538 TYPE(mp_para_env_type),
POINTER :: para_env
539 INTEGER,
INTENT(IN) :: num_integ_group, color_rpa_group, homo, &
541 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: vec_sigma_x_minus_vxc_gw11
543 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_vec_sigma_x'
545 INTEGER :: handle, iib, m_global, n_global, &
546 ncol_local, nm_global, nrow_local
547 INTEGER,
DIMENSION(:),
POINTER :: col_indices
549 CALL timeset(routinen, handle)
552 nrow_local=nrow_local, &
553 ncol_local=ncol_local, &
554 col_indices=col_indices)
559 DO iib = 1, ncol_local
562 IF (
modulo(1, num_integ_group) /= color_rpa_group) cycle
564 nm_global = col_indices(iib)
567 n_global = max(1, nm_global - 1)/nmo + 1
568 m_global = nm_global - (n_global - 1)*nmo
569 n_global = n_global + homo - gw_corr_lev_occ
571 IF (m_global <= homo)
THEN
574 vec_sigma_x_gw(n_global, 1) = &
575 vec_sigma_x_gw(n_global, 1) - &
576 dot_product(fm_mat_s_gw%local_data(:, iib), fm_mat_s_gw%local_data(:, iib))
584 CALL para_env%sum(vec_sigma_x_gw)
586 vec_sigma_x_minus_vxc_gw11(:) = &
587 vec_sigma_x_minus_vxc_gw11(:) + &
590 CALL timestop(handle)
592 END SUBROUTINE get_vec_sigma_x
611 vec_Sigma_x_minus_vxc_gw, Eigenval_last, &
612 Eigenval_scf, do_periodic, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, kpoints, &
613 vec_Sigma_x_gw, my_do_gw)
615 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
616 INTENT(INOUT) :: fm_mat_s_gw_work
617 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
618 INTENT(INOUT) :: vec_w_gw
619 COMPLEX(KIND=dp),
ALLOCATABLE, &
620 DIMENSION(:, :, :, :),
INTENT(INOUT) :: vec_sigma_c_gw
621 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
622 INTENT(INOUT) :: vec_omega_fit_gw
623 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
624 INTENT(INOUT) :: vec_sigma_x_minus_vxc_gw, eigenval_last, &
626 LOGICAL,
INTENT(IN) :: do_periodic
627 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_re_mo_mo, &
628 matrix_berry_im_mo_mo
629 TYPE(kpoint_type),
POINTER :: kpoints
630 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
631 INTENT(INOUT) :: vec_sigma_x_gw
632 LOGICAL,
INTENT(IN) :: my_do_gw
634 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_matrices_gw'
636 INTEGER :: handle, nspins
637 LOGICAL :: my_open_shell
639 CALL timeset(routinen, handle)
641 nspins =
SIZE(eigenval_last, 3)
642 my_open_shell = (nspins == 2)
645 CALL cp_fm_release(fm_mat_s_gw_work)
646 DEALLOCATE (vec_sigma_x_minus_vxc_gw)
647 DEALLOCATE (vec_w_gw)
650 DEALLOCATE (vec_sigma_c_gw)
651 DEALLOCATE (vec_sigma_x_gw)
652 DEALLOCATE (vec_omega_fit_gw)
653 DEALLOCATE (eigenval_last)
654 DEALLOCATE (eigenval_scf)
656 IF (do_periodic)
THEN
662 CALL timestop(handle)
685 t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, &
686 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, &
687 t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, mat_W, &
690 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
691 INTENT(INOUT) :: weights_cos_tf_w_to_t, &
692 weights_sin_tf_t_to_w
693 LOGICAL,
INTENT(IN) :: do_ic_model, do_kpoints_cubic_rpa
694 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
695 INTENT(INOUT) :: fm_mat_w
696 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_overl_int_ao_mo
697 TYPE(hfx_compression_type),
ALLOCATABLE, &
698 DIMENSION(:) :: t_3c_o_mo_compressed
699 TYPE(two_dim_int_array),
ALLOCATABLE,
DIMENSION(:) :: t_3c_o_mo_ind
700 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:), &
701 INTENT(INOUT) :: t_3c_overl_int_gw_ri, &
702 t_3c_overl_int_gw_ao, &
704 t_3c_overl_nnp_ic_reflected
705 TYPE(dbcsr_type),
POINTER :: mat_w
706 TYPE(qs_environment_type),
POINTER :: qs_env
708 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_matrices_gw_im_time'
710 INTEGER :: handle, ispin, nspins, unused
711 LOGICAL :: my_open_shell
713 CALL timeset(routinen, handle)
715 nspins =
SIZE(t_3c_overl_int_gw_ri)
716 my_open_shell = (nspins == 2)
718 IF (
ALLOCATED(weights_cos_tf_w_to_t))
DEALLOCATE (weights_cos_tf_w_to_t)
719 IF (
ALLOCATED(weights_sin_tf_t_to_w))
DEALLOCATE (weights_sin_tf_t_to_w)
721 IF (.NOT. do_kpoints_cubic_rpa)
THEN
722 CALL cp_fm_release(fm_mat_w)
723 CALL dbcsr_release_p(mat_w)
727 CALL dbt_destroy(t_3c_overl_int_gw_ri(ispin))
728 CALL dbt_destroy(t_3c_overl_int_gw_ao(ispin))
730 DEALLOCATE (t_3c_overl_int_gw_ao, t_3c_overl_int_gw_ri)
731 IF (do_ic_model)
THEN
733 CALL dbt_destroy(t_3c_overl_nnp_ic(ispin))
734 CALL dbt_destroy(t_3c_overl_nnp_ic_reflected(ispin))
736 DEALLOCATE (t_3c_overl_nnp_ic, t_3c_overl_nnp_ic_reflected)
739 IF (.NOT. qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
741 DEALLOCATE (t_3c_o_mo_ind(ispin)%array)
744 DEALLOCATE (t_3c_o_mo_ind, t_3c_o_mo_compressed)
746 CALL dbt_destroy(t_3c_overl_int_ao_mo)
749 IF (qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma)
THEN
751 CALL dbcsr_release(qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
752 DEALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
754 CALL dbcsr_release(qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
755 DEALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
757 DEALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc)
758 DEALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks)
761 CALL timestop(handle)
803 gw_corr_lev_virt, homo, jquad, nmo, num_fit_points, &
804 num_integ_points, do_bse, do_im_time, do_periodic, &
805 first_cycle_periodic_correction, fermi_level_offset, &
806 omega, Eigenval, delta_corr, vec_omega_fit_gw, vec_W_gw, wj, &
807 fm_mat_Q, fm_mat_Q_static_bse, fm_mat_R_gw, fm_mat_S_gw, &
808 fm_mat_S_gw_work, mo_coeff, para_env, &
809 para_env_RPA, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, &
810 kpoints, qs_env, mp2_env)
812 COMPLEX(KIND=dp),
ALLOCATABLE, &
813 DIMENSION(:, :, :, :),
INTENT(INOUT) :: vec_sigma_c_gw
814 INTEGER,
INTENT(IN) :: dimen_nm_gw, dimen_ri
815 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo
816 INTEGER,
INTENT(IN) :: jquad, nmo, num_fit_points, &
818 LOGICAL,
INTENT(IN) :: do_bse, do_im_time, do_periodic
819 LOGICAL,
INTENT(INOUT) :: first_cycle_periodic_correction
820 REAL(kind=
dp),
INTENT(INOUT) :: fermi_level_offset, omega
821 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: eigenval
822 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
823 INTENT(INOUT) :: delta_corr
824 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
825 INTENT(IN) :: vec_omega_fit_gw
826 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
827 INTENT(INOUT) :: vec_w_gw
828 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
830 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_q, fm_mat_q_static_bse, &
832 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_s_gw, fm_mat_s_gw_work
833 TYPE(cp_fm_type),
INTENT(IN) :: mo_coeff
834 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_rpa
835 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_im_mo_mo, &
836 matrix_berry_re_mo_mo
837 TYPE(kpoint_type),
POINTER :: kpoints
838 TYPE(qs_environment_type),
POINTER :: qs_env
839 TYPE(mp2_type) :: mp2_env
841 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_GW_self_energy'
843 INTEGER :: handle, i_global, iib, ispin, j_global, &
844 jjb, ncol_local, nrow_local, nspins
845 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
847 CALL timeset(routinen, handle)
849 nspins =
SIZE(fm_mat_s_gw)
852 nrow_local=nrow_local, &
853 ncol_local=ncol_local, &
854 row_indices=row_indices, &
855 col_indices=col_indices)
857 IF (.NOT. do_im_time)
THEN
864 IF (do_bse .AND. jquad == num_integ_points)
THEN
865 CALL cp_fm_to_fm(fm_mat_q, fm_mat_q_static_bse)
869 IF (do_periodic)
THEN
870 CALL calc_periodic_correction(delta_corr, qs_env, para_env, para_env_rpa, &
871 mp2_env%ri_g0w0%kp_grid, homo(1), nmo, gw_corr_lev_occ(1), &
872 gw_corr_lev_virt(1), omega, mo_coeff, eigenval(:, 1), &
873 matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
874 first_cycle_periodic_correction, kpoints, &
875 mp2_env%ri_g0w0%do_mo_coeff_gamma, &
876 mp2_env%ri_g0w0%num_kp_grids, mp2_env%ri_g0w0%eps_kpoint, &
877 mp2_env%ri_g0w0%do_extra_kpoints, &
878 mp2_env%ri_g0w0%do_aux_bas_gw, mp2_env%ri_g0w0%frac_aux_mos)
886 DO jjb = 1, ncol_local
887 j_global = col_indices(jjb)
888 DO iib = 1, nrow_local
889 i_global = row_indices(iib)
890 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
891 fm_mat_q%local_data(iib, jjb) = fm_mat_q%local_data(iib, jjb) - 1.0_dp
899 CALL compute_gw_self_energy_deep(vec_sigma_c_gw(:, :, :, ispin), dimen_nm_gw, dimen_ri, &
900 gw_corr_lev_occ(ispin), homo(ispin), jquad, nmo, &
901 num_fit_points, do_periodic, fermi_level_offset, omega, eigenval(:, ispin), delta_corr, &
902 vec_omega_fit_gw, vec_w_gw(:, ispin), wj, fm_mat_q, &
903 fm_mat_s_gw(ispin), fm_mat_s_gw_work(ispin))
908 CALL timestop(handle)
921 REAL(kind=
dp),
INTENT(INOUT) :: fermi_level_offset
922 REAL(kind=
dp),
INTENT(IN) :: fermi_level_offset_input
923 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: eigenval
924 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
926 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_fermi_level_offset'
928 INTEGER :: handle, ispin, nspins
930 CALL timeset(routinen, handle)
932 nspins =
SIZE(eigenval, 2)
937 fermi_level_offset = fermi_level_offset_input
939 fermi_level_offset = min(fermi_level_offset, (eigenval(homo(ispin) + 1, ispin) - eigenval(homo(ispin), ispin))*0.5_dp)
942 CALL timestop(handle)
960 SUBROUTINE compute_w_cubic_gw(fm_mat_W, fm_mat_Q, fm_mat_work, dimen_RI, fm_mat_L, num_integ_points, &
961 tj, tau_tj, weights_cos_tf_w_to_t, jquad, omega)
962 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w
963 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_q, fm_mat_work
964 INTEGER,
INTENT(IN) :: dimen_ri
965 TYPE(cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: fm_mat_l
966 INTEGER,
INTENT(IN) :: num_integ_points
967 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
968 INTENT(IN) :: tj, tau_tj
969 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
970 INTENT(IN) :: weights_cos_tf_w_to_t
971 INTEGER,
INTENT(IN) :: jquad
972 REAL(kind=
dp),
INTENT(INOUT) :: omega
974 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_W_cubic_GW'
976 INTEGER :: handle, i_global, iib, iquad, j_global, &
977 jjb, ncol_local, nrow_local
978 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
979 REAL(kind=
dp) :: tau, weight
981 CALL timeset(routinen, handle)
984 nrow_local=nrow_local, &
985 ncol_local=ncol_local, &
986 row_indices=row_indices, &
987 col_indices=col_indices)
997 DO jjb = 1, ncol_local
998 j_global = col_indices(jjb)
999 DO iib = 1, nrow_local
1000 i_global = row_indices(iib)
1001 IF (j_global == i_global .AND. i_global <= dimen_ri)
THEN
1002 fm_mat_q%local_data(iib, jjb) = fm_mat_q%local_data(iib, jjb) - 1.0_dp
1008 CALL parallel_gemm(
'T',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_mat_l(1, 1), fm_mat_q, &
1009 0.0_dp, fm_mat_work)
1011 CALL parallel_gemm(
'N',
'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_mat_work, fm_mat_l(1, 1), &
1015 DO iquad = 1, num_integ_points
1019 weight = weights_cos_tf_w_to_t(iquad, jquad)*cos(tau*omega)
1021 IF (jquad == 1)
THEN
1027 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_w(iquad), beta=weight, matrix_b=fm_mat_q)
1031 CALL timestop(handle)
1056 SUBROUTINE compute_gw_self_energy_deep(vec_Sigma_c_gw, dimen_nm_gw, dimen_RI, gw_corr_lev_occ, homo, jquad, nmo, num_fit_points, &
1057 do_periodic, fermi_level_offset, omega, Eigenval, delta_corr, vec_omega_fit_gw, vec_W_gw, &
1058 wj, fm_mat_Q, fm_mat_S_gw, fm_mat_S_gw_work)
1060 COMPLEX(KIND=dp),
DIMENSION(:, :, :), &
1061 INTENT(INOUT) :: vec_sigma_c_gw
1062 INTEGER,
INTENT(IN) :: dimen_nm_gw, dimen_ri, gw_corr_lev_occ, &
1063 homo, jquad, nmo, num_fit_points
1064 LOGICAL,
INTENT(IN) :: do_periodic
1065 REAL(kind=
dp),
INTENT(IN) :: fermi_level_offset
1066 REAL(kind=
dp),
INTENT(INOUT) :: omega
1067 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: eigenval
1068 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: delta_corr, vec_omega_fit_gw
1069 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: vec_w_gw
1070 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: wj
1071 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_q, fm_mat_s_gw, fm_mat_s_gw_work
1073 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_GW_self_energy_deep'
1075 INTEGER :: handle, iib, iquad, m_global, n_global, &
1076 ncol_local, nm_global
1077 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1078 REAL(kind=
dp) :: delta_corr_nn, e_fermi, omega_i, &
1081 CALL timeset(routinen, handle)
1084 CALL parallel_gemm(transa=
"N", transb=
"N", m=dimen_ri, n=dimen_nm_gw, k=dimen_ri, alpha=1.0_dp, &
1085 matrix_a=fm_mat_q, matrix_b=fm_mat_s_gw, beta=0.0_dp, &
1086 matrix_c=fm_mat_s_gw_work)
1089 ncol_local=ncol_local, &
1090 row_indices=row_indices, &
1091 col_indices=col_indices)
1097 DO iib = 1, ncol_local
1098 nm_global = col_indices(iib)
1099 vec_w_gw(nm_global) = vec_w_gw(nm_global) + &
1100 dot_product(fm_mat_s_gw_work%local_data(:, iib), fm_mat_s_gw%local_data(:, iib))
1103 n_global = max(1, nm_global - 1)/nmo + 1
1104 m_global = nm_global - (n_global - 1)*nmo
1105 n_global = n_global + homo - gw_corr_lev_occ
1108 DO iquad = 1, num_fit_points
1111 IF (n_global <= homo)
THEN
1112 sign_occ_virt = -1.0_dp
1114 sign_occ_virt = 1.0_dp
1117 omega_i = vec_omega_fit_gw(iquad)*sign_occ_virt
1121 IF (n_global <= homo)
THEN
1122 e_fermi = eigenval(homo) + fermi_level_offset
1124 e_fermi = eigenval(homo + 1) - fermi_level_offset
1128 IF (do_periodic .AND. row_indices(1) == 1 .AND. n_global == m_global)
THEN
1129 delta_corr_nn = delta_corr(n_global)
1131 delta_corr_nn = 0.0_dp
1137 vec_sigma_c_gw(n_global - homo + gw_corr_lev_occ, iquad, 1) = &
1138 vec_sigma_c_gw(n_global - homo + gw_corr_lev_occ, iquad, 1) - &
1139 0.5_dp/
pi*wj(jquad)/2.0_dp*(vec_w_gw(nm_global) + delta_corr_nn)* &
1140 (1.0_dp/(
gaussi*(omega + omega_i) + e_fermi - eigenval(m_global)) + &
1141 1.0_dp/(
gaussi*(-omega + omega_i) + e_fermi - eigenval(m_global)))
1146 CALL timestop(handle)
1148 END SUBROUTINE compute_gw_self_energy_deep
1217 gw_corr_lev_tot, gw_corr_lev_virt, homo, &
1218 nmo, num_fit_points, num_integ_points, &
1219 unit_nr, do_apply_ic_corr_to_gw, do_im_time, &
1220 do_periodic, do_ri_Sigma_x, &
1221 first_cycle_periodic_correction, e_fermi, eps_filter, &
1222 fermi_level_offset, delta_corr, Eigenval, &
1223 Eigenval_last, Eigenval_scf, iter_sc_GW0, exit_ev_gw, tau_tj, tj, &
1224 vec_omega_fit_gw, vec_Sigma_x_gw, ic_corr_list, &
1225 weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, &
1226 fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, fm_mo_coeff_occ, &
1227 fm_mo_coeff_virt, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, &
1228 mo_coeff, fm_mat_W, para_env, para_env_RPA, mat_dm, mat_MinvVMinv, &
1229 t_3c_O, t_3c_M, t_3c_overl_int_ao_mo, &
1230 t_3c_O_compressed, t_3c_O_mo_compressed, &
1231 t_3c_O_ind, t_3c_O_mo_ind, &
1232 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, matrix_berry_im_mo_mo, &
1233 matrix_berry_re_mo_mo, mat_W, matrix_s, &
1234 kpoints, mp2_env, qs_env, nkp_self_energy, do_kpoints_cubic_RPA, &
1235 starts_array_mc, ends_array_mc)
1237 COMPLEX(KIND=dp),
DIMENSION(:, :, :, :), &
1238 INTENT(OUT) :: vec_sigma_c_gw
1239 INTEGER,
INTENT(IN) :: count_ev_sc_gw
1240 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ
1241 INTEGER,
INTENT(IN) :: gw_corr_lev_tot
1242 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_virt, homo
1243 INTEGER,
INTENT(IN) :: nmo, num_fit_points, num_integ_points, &
1245 LOGICAL,
INTENT(IN) :: do_apply_ic_corr_to_gw, do_im_time, &
1246 do_periodic, do_ri_sigma_x
1247 LOGICAL,
INTENT(INOUT) :: first_cycle_periodic_correction
1248 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: e_fermi
1249 REAL(kind=
dp),
INTENT(IN) :: eps_filter, fermi_level_offset
1250 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1251 INTENT(INOUT) :: delta_corr
1252 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: eigenval
1253 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
1254 INTENT(INOUT) :: eigenval_last, eigenval_scf
1255 INTEGER,
INTENT(IN) :: iter_sc_gw0
1256 LOGICAL,
INTENT(INOUT) :: exit_ev_gw
1257 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
1258 INTENT(INOUT) :: tau_tj, tj, vec_omega_fit_gw
1259 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
1260 INTENT(INOUT) :: vec_sigma_x_gw
1261 TYPE(one_dim_real_array),
DIMENSION(2),
INTENT(IN) :: ic_corr_list
1262 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
1263 INTENT(IN) :: weights_cos_tf_t_to_w, &
1264 weights_sin_tf_t_to_w
1265 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff_occ_scaled, &
1266 fm_mo_coeff_virt_scaled
1267 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mo_coeff_occ, fm_mo_coeff_virt
1268 TYPE(cp_fm_type),
INTENT(IN) :: fm_scaled_dm_occ_tau, &
1269 fm_scaled_dm_virt_tau, mo_coeff
1270 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
1271 INTENT(IN) :: fm_mat_w
1272 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_rpa
1273 TYPE(dbcsr_p_type),
INTENT(IN) :: mat_dm, mat_minvvminv
1274 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_o
1275 TYPE(dbt_type) :: t_3c_m, t_3c_overl_int_ao_mo
1276 TYPE(hfx_compression_type),
ALLOCATABLE, &
1277 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_compressed
1278 TYPE(hfx_compression_type),
DIMENSION(:) :: t_3c_o_mo_compressed
1279 TYPE(block_ind_type),
ALLOCATABLE, &
1280 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_ind
1281 TYPE(two_dim_int_array),
DIMENSION(:) :: t_3c_o_mo_ind
1282 TYPE(dbt_type),
DIMENSION(:) :: t_3c_overl_int_gw_ri, &
1283 t_3c_overl_int_gw_ao
1284 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_im_mo_mo, &
1285 matrix_berry_re_mo_mo
1286 TYPE(dbcsr_type),
POINTER :: mat_w
1287 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
1288 TYPE(kpoint_type),
POINTER :: kpoints
1289 TYPE(mp2_type) :: mp2_env
1290 TYPE(qs_environment_type),
POINTER :: qs_env
1291 INTEGER,
INTENT(IN) :: nkp_self_energy
1292 LOGICAL,
INTENT(IN) :: do_kpoints_cubic_rpa
1293 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc
1295 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_QP_energies'
1297 INTEGER :: count_ev_sc_gw_print, count_sc_gw0, count_sc_gw0_print, crossing_search, handle, &
1298 idos, ikp, ispin, iunit, n_level_gw, ndos, nspins, num_points_corr, num_poles
1299 LOGICAL :: do_kpoints_sigma, my_open_shell
1300 REAL(kind=
dp) :: dos_lower_bound, dos_precision, dos_upper_bound, e_cbm_gw, e_cbm_gw_beta, &
1301 e_cbm_scf, e_cbm_scf_beta, e_vbm_gw, e_vbm_gw_beta, e_vbm_scf, e_vbm_scf_beta, stop_crit
1302 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: vec_gw_dos
1303 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: m_value, vec_gw_energ, z_value
1304 TYPE(kpoint_type),
POINTER :: kpoints_sigma
1306 CALL timeset(routinen, handle)
1309 my_open_shell = (nspins == 2)
1311 do_kpoints_sigma = mp2_env%ri_g0w0%do_kpoints_Sigma
1313 DO count_sc_gw0 = 1, iter_sc_gw0
1316 IF (do_im_time .AND. .NOT. do_kpoints_cubic_rpa .AND. .NOT. do_kpoints_sigma)
THEN
1317 num_points_corr = mp2_env%ri_g0w0%num_omega_points
1319 DO ispin = 1, nspins
1320 CALL compute_self_energy_cubic_gw(num_integ_points, nmo, tau_tj, tj, &
1321 matrix_s, fm_mo_coeff_occ(ispin), &
1322 fm_mo_coeff_virt(ispin), fm_mo_coeff_occ_scaled, &
1323 fm_mo_coeff_virt_scaled, fm_scaled_dm_occ_tau, &
1324 fm_scaled_dm_virt_tau, eigenval(:, 1, ispin), eps_filter, &
1325 e_fermi(ispin), fm_mat_w, &
1326 gw_corr_lev_tot, gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), homo(ispin), &
1327 count_ev_sc_gw, count_sc_gw0, &
1328 t_3c_overl_int_ao_mo, t_3c_o_mo_compressed(ispin), &
1329 t_3c_o_mo_ind(ispin)%array, &
1330 t_3c_overl_int_gw_ri(ispin), t_3c_overl_int_gw_ao(ispin), &
1331 mat_w, mat_minvvminv, mat_dm, &
1332 weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, vec_sigma_c_gw(:, :, :, ispin), &
1333 do_periodic, num_points_corr, delta_corr, qs_env, para_env, para_env_rpa, &
1334 mp2_env, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
1335 first_cycle_periodic_correction, kpoints, num_fit_points, mo_coeff, &
1336 do_ri_sigma_x, vec_sigma_x_gw(:, :, ispin), unit_nr, ispin)
1341 IF (do_kpoints_sigma)
THEN
1342 CALL compute_self_energy_cubic_gw_kpoints(num_integ_points, tau_tj, tj, &
1343 matrix_s, eigenval(:, :, :), e_fermi, fm_mat_w, &
1344 gw_corr_lev_tot, gw_corr_lev_occ, gw_corr_lev_virt, homo, &
1345 count_ev_sc_gw, count_sc_gw0, &
1346 t_3c_o, t_3c_m, t_3c_o_compressed, t_3c_o_ind, &
1347 mat_w, mat_minvvminv, &
1348 weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, vec_sigma_c_gw(:, :, :, :), &
1350 mp2_env, num_fit_points, mo_coeff, &
1351 do_ri_sigma_x, vec_sigma_x_gw(:, :, :), unit_nr, nspins, &
1352 starts_array_mc, ends_array_mc, eps_filter)
1356 IF (do_periodic .AND. mp2_env%ri_g0w0%do_average_deg_levels)
THEN
1358 DO ispin = 1, nspins
1359 CALL average_degenerate_levels(vec_sigma_c_gw(:, :, :, ispin), &
1360 eigenval(1 + homo(ispin) - gw_corr_lev_occ(ispin): &
1361 homo(ispin) + gw_corr_lev_virt(ispin), 1, ispin), &
1362 mp2_env%ri_g0w0%eps_eigenval)
1366 IF (.NOT. do_im_time)
THEN
1367 CALL para_env%sum(vec_sigma_c_gw)
1370 CALL para_env%sync()
1373 num_poles = mp2_env%ri_g0w0%num_poles
1374 crossing_search = mp2_env%ri_g0w0%crossing_search
1377 ALLOCATE (vec_gw_energ(gw_corr_lev_tot, nkp_self_energy, nspins))
1378 vec_gw_energ = 0.0_dp
1379 ALLOCATE (z_value(gw_corr_lev_tot, nkp_self_energy, nspins))
1381 ALLOCATE (m_value(gw_corr_lev_tot, nkp_self_energy, nspins))
1387 e_vbm_gw_beta = -1.0e3
1388 e_cbm_gw_beta = 1.0e3
1389 e_vbm_scf_beta = -1.0e3
1390 e_cbm_scf_beta = 1.0e3
1393 dos_precision = mp2_env%ri_g0w0%dos_prec
1394 dos_upper_bound = mp2_env%ri_g0w0%dos_upper
1395 dos_lower_bound = mp2_env%ri_g0w0%dos_lower
1397 IF (dos_lower_bound >= dos_upper_bound)
THEN
1398 CALL cp_abort(__location__,
"Invalid settings for GW_DOS calculation!")
1401 IF (dos_precision /= 0)
THEN
1402 ndos = int((dos_upper_bound - dos_lower_bound)/dos_precision)
1403 ALLOCATE (vec_gw_dos(ndos))
1408 DO ikp = 1, nkp_self_energy
1410 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
1413 DO n_level_gw = 1, gw_corr_lev_tot
1415 IF (
modulo(n_level_gw, para_env%num_pe) /= para_env%mepos) cycle
1417 SELECT CASE (mp2_env%ri_g0w0%analytic_continuation)
1419 CALL fit_and_continuation_2pole(vec_gw_energ(:, ikp, 1), vec_omega_fit_gw, &
1420 z_value(:, ikp, 1), m_value(:, ikp, 1), vec_sigma_c_gw(:, :, ikp, 1), &
1421 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, ikp), &
1422 eigenval(:, ikp, 1), eigenval_scf(:, ikp, 1), n_level_gw, &
1423 gw_corr_lev_occ(1), num_poles, &
1424 num_fit_points, crossing_search, homo(1), stop_crit, &
1425 fermi_level_offset, do_im_time)
1429 z_value(:, ikp, 1), m_value(:, ikp, 1), vec_sigma_c_gw(:, :, ikp, 1), &
1430 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, ikp), &
1431 eigenval(:, ikp, 1), eigenval_scf(:, ikp, 1), n_level_gw, &
1432 gw_corr_lev_occ(1), mp2_env%ri_g0w0%nparam_pade, &
1433 num_fit_points, crossing_search, homo(1), fermi_level_offset, &
1434 do_im_time, mp2_env%ri_g0w0%print_self_energy, count_ev_sc_gw, &
1435 vec_gw_dos, dos_lower_bound, dos_precision, ndos, &
1436 mp2_env%ri_g0w0%min_level_self_energy, &
1437 mp2_env%ri_g0w0%max_level_self_energy, mp2_env%ri_g0w0%dos_eta, &
1438 mp2_env%ri_g0w0%dos_min, mp2_env%ri_g0w0%dos_max)
1441 cpabort(
"Only two-model and Pade approximation are implemented.")
1444 IF (my_open_shell)
THEN
1445 SELECT CASE (mp2_env%ri_g0w0%analytic_continuation)
1447 CALL fit_and_continuation_2pole( &
1448 vec_gw_energ(:, ikp, 2), vec_omega_fit_gw, &
1449 z_value(:, ikp, 2), m_value(:, ikp, 2), vec_sigma_c_gw(:, :, ikp, 2), &
1450 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 2, ikp), &
1451 eigenval(:, ikp, 2), eigenval_scf(:, ikp, 2), n_level_gw, &
1452 gw_corr_lev_occ(2), num_poles, &
1453 num_fit_points, crossing_search, homo(2), stop_crit, &
1454 fermi_level_offset, do_im_time)
1457 z_value(:, ikp, 2), m_value(:, ikp, 2), vec_sigma_c_gw(:, :, ikp, 2), &
1458 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 2, ikp), &
1459 eigenval(:, ikp, 2), eigenval_scf(:, ikp, 2), n_level_gw, &
1460 gw_corr_lev_occ(2), mp2_env%ri_g0w0%nparam_pade, &
1461 num_fit_points, crossing_search, homo(2), &
1462 fermi_level_offset, do_im_time, &
1463 mp2_env%ri_g0w0%print_self_energy, count_ev_sc_gw, &
1464 vec_gw_dos, dos_lower_bound, dos_precision, ndos, &
1465 mp2_env%ri_g0w0%min_level_self_energy, &
1466 mp2_env%ri_g0w0%max_level_self_energy, mp2_env%ri_g0w0%dos_eta, &
1467 mp2_env%ri_g0w0%dos_min, mp2_env%ri_g0w0%dos_max)
1469 cpabort(
"Only two-pole model and Pade approximation are implemented.")
1476 CALL para_env%sum(vec_gw_energ)
1477 CALL para_env%sum(z_value)
1478 CALL para_env%sum(m_value)
1480 IF (dos_precision /= 0.0_dp)
THEN
1481 CALL para_env%sum(vec_gw_dos)
1484 CALL check_nan(vec_gw_energ, 0.0_dp)
1485 CALL check_nan(z_value, 1.0_dp)
1486 CALL check_nan(m_value, 0.0_dp)
1488 IF (do_im_time .OR. mp2_env%ri_g0w0%iter_sc_GW0 == 1)
THEN
1489 count_ev_sc_gw_print = count_ev_sc_gw
1490 count_sc_gw0_print = count_sc_gw0
1492 count_ev_sc_gw_print = count_sc_gw0
1493 count_sc_gw0_print = count_ev_sc_gw
1497 IF (my_open_shell)
THEN
1499 CALL print_and_update_for_ev_sc( &
1500 vec_gw_energ(:, ikp, 1), &
1501 z_value(:, ikp, 1), m_value(:, ikp, 1), mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, ikp), &
1502 eigenval(:, ikp, 1), eigenval_last(:, ikp, 1), eigenval_scf(:, ikp, 1), &
1503 gw_corr_lev_occ(1), gw_corr_lev_virt(1), gw_corr_lev_tot, &
1504 crossing_search, homo(1), unit_nr, count_ev_sc_gw_print, count_sc_gw0_print, &
1505 ikp, nkp_self_energy, kpoints_sigma, 1, e_vbm_gw, e_cbm_gw, e_vbm_scf, e_cbm_scf)
1507 CALL print_and_update_for_ev_sc( &
1508 vec_gw_energ(:, ikp, 2), &
1509 z_value(:, ikp, 2), m_value(:, ikp, 2), mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 2, ikp), &
1510 eigenval(:, ikp, 2), eigenval_last(:, ikp, 2), eigenval_scf(:, ikp, 2), &
1511 gw_corr_lev_occ(2), gw_corr_lev_virt(2), gw_corr_lev_tot, &
1512 crossing_search, homo(2), unit_nr, count_ev_sc_gw_print, count_sc_gw0_print, &
1513 ikp, nkp_self_energy, kpoints_sigma, 2, e_vbm_gw_beta, e_cbm_gw_beta, e_vbm_scf_beta, e_cbm_scf_beta)
1515 IF (do_apply_ic_corr_to_gw .AND. count_ev_sc_gw == 1)
THEN
1517 CALL apply_ic_corr(eigenval(:, ikp, 1), eigenval_scf(:, ikp, 1), ic_corr_list(1)%array, &
1518 gw_corr_lev_occ(1), gw_corr_lev_virt(1), gw_corr_lev_tot, &
1519 homo(1), nmo, unit_nr, do_alpha=.true.)
1521 CALL apply_ic_corr(eigenval(:, ikp, 2), eigenval_scf(:, ikp, 2), ic_corr_list(2)%array, &
1522 gw_corr_lev_occ(2), gw_corr_lev_virt(2), gw_corr_lev_tot, &
1523 homo(2), nmo, unit_nr, do_beta=.true.)
1529 CALL print_and_update_for_ev_sc( &
1530 vec_gw_energ(:, ikp, 1), &
1531 z_value(:, ikp, 1), m_value(:, ikp, 1), mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, ikp), &
1532 eigenval(:, ikp, 1), eigenval_last(:, ikp, 1), eigenval_scf(:, ikp, 1), &
1533 gw_corr_lev_occ(1), gw_corr_lev_virt(1), gw_corr_lev_tot, &
1534 crossing_search, homo(1), unit_nr, count_ev_sc_gw_print, count_sc_gw0_print, &
1535 ikp, nkp_self_energy, kpoints_sigma, 0, e_vbm_gw, e_cbm_gw, e_vbm_scf, e_cbm_scf)
1537 IF (do_apply_ic_corr_to_gw .AND. count_ev_sc_gw == 1)
THEN
1539 CALL apply_ic_corr(eigenval(:, ikp, 1), eigenval_scf(:, ikp, 1), ic_corr_list(1)%array, &
1540 gw_corr_lev_occ(1), gw_corr_lev_virt(1), gw_corr_lev_tot, &
1541 homo(1), nmo, unit_nr)
1549 IF (nkp_self_energy > 1 .AND. unit_nr > 0)
THEN
1551 CALL print_gaps(e_vbm_scf, e_cbm_scf, e_vbm_scf_beta, e_cbm_scf_beta, &
1552 e_vbm_gw, e_cbm_gw, e_vbm_gw_beta, e_cbm_gw_beta, my_open_shell, unit_nr)
1558 IF (mp2_env%ri_g0w0%soc_type /=
soc_none)
THEN
1559 CALL calculate_and_print_soc(qs_env, eigenval_scf, eigenval_scf, gw_corr_lev_occ, gw_corr_lev_virt, &
1560 homo, unit_nr, do_soc_gw=.false., do_soc_scf=.true.)
1561 CALL calculate_and_print_soc(qs_env, eigenval, eigenval_scf, gw_corr_lev_occ, gw_corr_lev_virt, &
1562 homo, unit_nr, do_soc_gw=.true., do_soc_scf=.false.)
1567 IF (dos_precision /= 0.0_dp)
THEN
1569 CALL open_file(
'spectral.dat', unit_number=iunit, file_status=
"UNKNOWN", file_action=
"WRITE")
1573 WRITE (iunit,
'(E17.10, E17.10)') (dos_lower_bound + real(idos - 1, kind=
dp)*dos_precision)*
evolt, &
1578 DEALLOCATE (vec_gw_dos)
1581 DEALLOCATE (z_value)
1582 DEALLOCATE (m_value)
1583 DEALLOCATE (vec_gw_energ)
1585 exit_ev_gw = .false.
1588 IF (abs(eigenval(homo(1), 1, 1) - eigenval_last(homo(1), 1, 1) - &
1589 eigenval(homo(1) + 1, 1, 1) + eigenval_last(homo(1) + 1, 1, 1)) &
1590 < mp2_env%ri_g0w0%eps_iter)
THEN
1591 IF (count_sc_gw0 == 1) exit_ev_gw = .true.
1595 DO ispin = 1, nspins
1596 CALL shift_unshifted_levels(eigenval(:, 1, ispin), eigenval_last(:, 1, ispin), gw_corr_lev_occ(ispin), &
1597 gw_corr_lev_virt(ispin), homo(ispin), nmo)
1600 IF (do_im_time .AND. do_kpoints_sigma .AND. mp2_env%ri_g0w0%print_local_bandgap)
THEN
1601 CALL print_local_bandgap(qs_env, eigenval, gw_corr_lev_occ(1), gw_corr_lev_virt(1), homo(1),
"GW")
1602 CALL print_local_bandgap(qs_env, eigenval_scf, gw_corr_lev_occ(1), gw_corr_lev_virt(1), homo(1),
"DFT")
1606 IF (.NOT. do_im_time)
EXIT
1610 CALL timestop(handle)
1626 SUBROUTINE calculate_and_print_soc(qs_env, Eigenval, Eigenval_scf, gw_corr_lev_occ, gw_corr_lev_virt, &
1627 homo, unit_nr, do_soc_gw, do_soc_scf)
1628 TYPE(qs_environment_type),
POINTER :: qs_env
1629 REAL(kind=
dp),
DIMENSION(:, :, :) :: eigenval, eigenval_scf
1630 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo
1632 LOGICAL :: do_soc_gw, do_soc_scf
1634 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calculate_and_print_soc'
1636 INTEGER :: handle, i_dim, i_glob, i_row, ikp, j_col, j_glob, n_level_gw, nao, ncol_local, &
1637 nder, nkind, nkp_self_energy, nrow_local, periodic(3), size_real_space
1638 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: index0
1639 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1640 LOGICAL :: calculate_forces, use_virial
1641 REAL(kind=
dp) :: avg_occ_qp_shift, avg_virt_qp_shift, e_cbm_gw_soc, e_gap_gw_soc, e_homo, &
1642 e_homo_gw_soc, e_i, e_j, e_lumo, e_lumo_gw_soc, e_vbm_gw_soc, e_window, eps_ppnl
1643 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues_without_soc_sorted
1644 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1645 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1646 TYPE(cell_type),
POINTER :: cell
1647 TYPE(cp_cfm_type) :: cfm_mat_h_double, cfm_mat_h_ks, &
1648 cfm_mat_s_double, cfm_mat_work_double, &
1649 cfm_mo_coeff, cfm_mo_coeff_double
1650 TYPE(cp_fm_type),
POINTER :: imos, rmos
1651 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_desymm
1652 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_vsoc_l_nosymm, mat_vsoc_lx_kp, &
1653 mat_vsoc_ly_kp, mat_vsoc_lz_kp, &
1654 matrix_dummy, matrix_l, &
1656 TYPE(dft_control_type),
POINTER :: dft_control
1657 TYPE(kpoint_type),
POINTER :: kpoints_sigma
1658 TYPE(mp_para_env_type),
POINTER :: para_env
1659 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
1660 POINTER :: sab_orb, sap_ppnl
1661 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1662 TYPE(qs_force_type),
DIMENSION(:),
POINTER :: force
1663 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1664 TYPE(scf_control_type),
POINTER :: scf_control
1665 TYPE(virial_type),
POINTER :: virial
1667 CALL timeset(routinen, handle)
1669 cpassert(do_soc_gw .NEQV. do_soc_scf)
1672 matrix_s=matrix_s, &
1673 para_env=para_env, &
1674 qs_kind_set=qs_kind_set, &
1676 atomic_kind_set=atomic_kind_set, &
1677 particle_set=particle_set, &
1678 sap_ppnl=sap_ppnl, &
1679 dft_control=dft_control, &
1682 scf_control=scf_control)
1684 calculate_forces = .false.
1685 use_virial = .false.
1687 eps_ppnl = dft_control%qs_control%eps_ppnl
1689 CALL get_cell(cell=cell, periodic=periodic)
1691 size_real_space = 3**(periodic(1) + periodic(2) + periodic(3))
1696 ALLOCATE (matrix_l(i_dim, 1)%matrix)
1697 CALL dbcsr_create(matrix_l(i_dim, 1)%matrix, template=matrix_s(1)%matrix, &
1698 matrix_type=dbcsr_type_antisymmetric)
1700 CALL dbcsr_set(matrix_l(i_dim, 1)%matrix, 0.0_dp)
1703 NULLIFY (matrix_pot_dummy)
1705 ALLOCATE (matrix_pot_dummy(1, 1)%matrix)
1706 CALL dbcsr_create(matrix_pot_dummy(1, 1)%matrix, template=matrix_s(1)%matrix)
1708 CALL dbcsr_set(matrix_pot_dummy(1, 1)%matrix, 0.0_dp)
1710 CALL build_core_ppnl(matrix_pot_dummy, matrix_dummy, force, virial, calculate_forces, use_virial, nder, &
1711 qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, eps_ppnl, &
1712 nimages=1, basis_type=
"ORB", matrix_l=matrix_l)
1714 CALL alloc_mat_set_2d(mat_vsoc_l_nosymm, 3, size_real_space, matrix_s(1)%matrix, explicitly_no_symmetry=.true.)
1716 CALL dbcsr_desymmetrize(matrix_l(i_dim, 1)%matrix, mat_vsoc_l_nosymm(i_dim, 1)%matrix)
1719 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
1721 CALL mat_kp_from_mat_gamma(qs_env, mat_vsoc_lx_kp, mat_vsoc_l_nosymm(1, 1)%matrix, kpoints_sigma, 1, .false.)
1722 CALL mat_kp_from_mat_gamma(qs_env, mat_vsoc_ly_kp, mat_vsoc_l_nosymm(2, 1)%matrix, kpoints_sigma, 1, .false.)
1723 CALL mat_kp_from_mat_gamma(qs_env, mat_vsoc_lz_kp, mat_vsoc_l_nosymm(3, 1)%matrix, kpoints_sigma, 1, .false.)
1725 nkp_self_energy = kpoints_sigma%nkp
1727 CALL get_mo_set(kpoints_sigma%kp_env(1)%kpoint_env%mos(1, 1), mo_coeff=rmos)
1729 CALL create_cfm_double_row_col_size(rmos, cfm_mat_h_double)
1730 CALL create_cfm_double_row_col_size(rmos, cfm_mat_s_double)
1731 CALL create_cfm_double_row_col_size(rmos, cfm_mo_coeff_double)
1732 CALL create_cfm_double_row_col_size(rmos, cfm_mat_work_double)
1741 NULLIFY (matrix_s_desymm)
1743 ALLOCATE (matrix_s_desymm(1)%matrix)
1744 CALL dbcsr_create(matrix=matrix_s_desymm(1)%matrix, template=matrix_s(1)%matrix, &
1745 matrix_type=dbcsr_type_no_symmetry)
1746 CALL dbcsr_desymmetrize(matrix_s(1)%matrix, matrix_s_desymm(1)%matrix)
1748 ALLOCATE (eigenvalues(2*nao))
1749 eigenvalues = 0.0_dp
1750 ALLOCATE (eigenvalues_without_soc_sorted(2*nao))
1752 e_window = qs_env%mp2_env%ri_g0w0%soc_energy_window
1753 IF (unit_nr > 0)
THEN
1754 WRITE (unit_nr,
'(T3,A)')
' '
1755 WRITE (unit_nr,
'(T3,A)')
'------------------------------------------------------------------------------'
1756 WRITE (unit_nr,
'(T3,A)')
' '
1757 WRITE (unit_nr,
'(T3,A,F42.1)')
'GW_SOC_INFO | SOC energy window (eV)', e_window*
evolt
1760 e_vbm_gw_soc = -1000.0_dp
1761 e_cbm_gw_soc = 1000.0_dp
1763 DO ikp = 1, nkp_self_energy
1765 CALL get_mo_set(kpoints_sigma%kp_env(ikp)%kpoint_env%mos(1, 1), mo_coeff=rmos)
1766 CALL get_mo_set(kpoints_sigma%kp_env(ikp)%kpoint_env%mos(2, 1), mo_coeff=imos)
1770 avg_occ_qp_shift = sum(eigenval(homo(1) - gw_corr_lev_occ(1) + 1:homo(1), ikp, 1) - &
1771 eigenval_scf(homo(1) - gw_corr_lev_occ(1) + 1:homo(1), ikp, 1))/gw_corr_lev_occ(1)
1772 avg_virt_qp_shift = sum(eigenval(homo(1):homo(1) + gw_corr_lev_virt(1), ikp, 1) - &
1773 eigenval_scf(homo(1):homo(1) + gw_corr_lev_virt(1), ikp, 1))/gw_corr_lev_virt(1)
1775 IF (gw_corr_lev_occ(1) < homo(1))
THEN
1776 eigenval(1:homo(1) - gw_corr_lev_occ(1), ikp, 1) = eigenval_scf(1:homo(1) - gw_corr_lev_occ(1), ikp, 1) &
1779 IF (gw_corr_lev_virt(1) < nao - homo(1) + 1)
THEN
1780 eigenval(homo(1) + gw_corr_lev_virt(1) + 1:nao, ikp, 1) = eigenval_scf(homo(1) + gw_corr_lev_virt(1) + 1:nao, ikp, 1) &
1785 CALL add_dbcsr_submatrix(cfm_mat_h_double, mat_vsoc_lx_kp(ikp, 1:2), cfm_mat_h_ks, nao + 1, 1,
z_one, .true.)
1786 CALL add_dbcsr_submatrix(cfm_mat_h_double, mat_vsoc_ly_kp(ikp, 1:2), cfm_mat_h_ks, nao + 1, 1,
gaussi, .true.)
1787 CALL add_dbcsr_submatrix(cfm_mat_h_double, mat_vsoc_lz_kp(ikp, 1:2), cfm_mat_h_ks, 1, 1,
z_one, .false.)
1788 CALL add_dbcsr_submatrix(cfm_mat_h_double, mat_vsoc_lz_kp(ikp, 1:2), cfm_mat_h_ks, nao + 1, nao + 1, -
z_one, .false.)
1791 cfm_mo_coeff_double%local_data =
z_zero
1792 CALL add_cfm_submatrix(cfm_mo_coeff_double, cfm_mo_coeff, 1, 1)
1793 CALL add_cfm_submatrix(cfm_mo_coeff_double, cfm_mo_coeff, nao + 1, nao + 1)
1796 nrow_local=nrow_local, &
1797 ncol_local=ncol_local, &
1798 row_indices=row_indices, &
1799 col_indices=col_indices)
1801 CALL parallel_gemm(transa=
"N", transb=
"N", m=2*nao, n=2*nao, k=2*nao, alpha=
z_one, &
1802 matrix_a=cfm_mat_h_double, matrix_b=cfm_mo_coeff_double, beta=
z_zero, &
1803 matrix_c=cfm_mat_work_double)
1805 CALL parallel_gemm(transa=
"C", transb=
"N", m=2*nao, n=2*nao, k=2*nao, alpha=
z_one, &
1806 matrix_a=cfm_mo_coeff_double, matrix_b=cfm_mat_work_double, beta=
z_zero, &
1807 matrix_c=cfm_mat_h_double)
1810 nrow_local=nrow_local, &
1811 ncol_local=ncol_local, &
1812 row_indices=row_indices, &
1813 col_indices=col_indices)
1817 e_homo = eigenval(homo(1), ikp, 1)
1818 e_lumo = eigenval(homo(1) + 1, ikp, 1)
1820 CALL para_env%sync()
1822 DO i_row = 1, nrow_local
1823 DO j_col = 1, ncol_local
1824 i_glob = row_indices(i_row)
1825 j_glob = col_indices(j_col)
1826 IF (i_glob .LE. nao)
THEN
1827 e_i = eigenval(i_glob, ikp, 1)
1829 e_i = eigenval(i_glob - nao, ikp, 1)
1831 IF (j_glob .LE. nao)
THEN
1832 e_j = eigenval(j_glob, ikp, 1)
1834 e_j = eigenval(j_glob - nao, ikp, 1)
1838 IF (i_glob == j_glob)
THEN
1839 cfm_mat_h_double%local_data(i_row, j_col) = cfm_mat_h_double%local_data(i_row, j_col) + e_i*
z_one
1840 cfm_mat_s_double%local_data(i_row, j_col) =
z_one
1842 IF (e_i < e_homo - 0.5_dp*e_window .OR. e_i > e_lumo + 0.5_dp*e_window .OR. &
1843 e_j < e_homo - 0.5_dp*e_window .OR. e_j > e_lumo + 0.5_dp*e_window)
THEN
1844 cfm_mat_h_double%local_data(i_row, j_col) =
z_zero
1851 CALL para_env%sync()
1853 eigenvalues = 0.0_dp
1854 CALL cp_cfm_geeig_canon(cfm_mat_h_double, cfm_mat_s_double, cfm_mo_coeff_double, eigenvalues, &
1855 cfm_mat_work_double, scf_control%eps_eigval)
1857 eigenvalues_without_soc_sorted(1:nao) = eigenval(:, ikp, 1)
1858 eigenvalues_without_soc_sorted(nao + 1:2*nao) = eigenval(:, ikp, 1)
1859 ALLOCATE (index0(2*nao))
1860 CALL sort(eigenvalues_without_soc_sorted, 2*nao, index0)
1863 e_homo_gw_soc = maxval(eigenvalues(2*homo(1) - 2*gw_corr_lev_occ(1) + 1:2*homo(1)))
1864 e_lumo_gw_soc = minval(eigenvalues(2*homo(1) + 1:2*homo(1) + 2*gw_corr_lev_virt(1)))
1865 e_gap_gw_soc = e_lumo_gw_soc - e_homo_gw_soc
1866 IF (e_homo_gw_soc > e_vbm_gw_soc) e_vbm_gw_soc = e_homo_gw_soc
1867 IF (e_lumo_gw_soc < e_cbm_gw_soc) e_cbm_gw_soc = e_lumo_gw_soc
1869 IF (unit_nr > 0)
THEN
1870 WRITE (unit_nr,
'(T3,A)')
' '
1871 WRITE (unit_nr,
'(T3,A7,I3,A3,I3,A8,3F7.3,A12,3F7.3)')
'Kpoint ', ikp,
' /', nkp_self_energy, &
1872 ' xkp =', kpoints_sigma%xkp(1, ikp), kpoints_sigma%xkp(2, ikp), kpoints_sigma%xkp(3, ikp), &
1873 ' and xkp =', -kpoints_sigma%xkp(1, ikp), -kpoints_sigma%xkp(2, ikp), -kpoints_sigma%xkp(3, ikp)
1874 WRITE (unit_nr,
'(T3,A)')
' '
1876 WRITE (unit_nr,
'(T3,A)')
' '
1877 WRITE (unit_nr,
'(T3,A,F13.4)')
'GW_SOC_INFO | Average GW shift of occupied levels compared to SCF', &
1878 avg_occ_qp_shift*
evolt
1879 WRITE (unit_nr,
'(T3,A,F11.4)')
'GW_SOC_INFO | Average GW shift of unoccupied levels compared to SCF', &
1880 avg_virt_qp_shift*
evolt
1881 WRITE (unit_nr,
'(T3,A)')
' '
1882 WRITE (unit_nr,
'(T3,2A)')
'Molecular orbital E_GW with SOC (eV) E_GW without SOC (eV) SOC shift (eV)'
1884 WRITE (unit_nr,
'(T3,2A)')
'Molecular orbital E_SCF with SOC (eV) E_SCF without SOC (eV) SOC shift (eV)'
1887 DO n_level_gw = 2*(homo(1) - gw_corr_lev_occ(1)) + 1, 2*homo(1)
1888 WRITE (unit_nr,
'(T3,I4,A,3F21.4)') n_level_gw,
' ( occ ) ', eigenvalues(n_level_gw)*
evolt, &
1889 eigenvalues_without_soc_sorted(n_level_gw)*
evolt, &
1890 (eigenvalues(n_level_gw) - eigenvalues_without_soc_sorted(n_level_gw))*
evolt
1892 DO n_level_gw = 2*homo(1) + 1, 2*(homo(1) + gw_corr_lev_virt(1))
1893 WRITE (unit_nr,
'(T3,I4,A,3F21.4)') n_level_gw,
' ( vir ) ', eigenvalues(n_level_gw)*
evolt, &
1894 eigenvalues_without_soc_sorted(n_level_gw)*
evolt, &
1895 (eigenvalues(n_level_gw) - eigenvalues_without_soc_sorted(n_level_gw))*
evolt
1897 WRITE (unit_nr,
'(T3,A)')
' '
1899 WRITE (unit_nr,
'(T3,A,F38.4)')
'GW+SOC direct gap at current kpoint (eV)', e_gap_gw_soc*
evolt
1901 WRITE (unit_nr,
'(T3,A,F37.4)')
'SCF+SOC direct gap at current kpoint (eV)', e_gap_gw_soc*
evolt
1903 WRITE (unit_nr,
'(T3,A)')
' '
1904 WRITE (unit_nr,
'(T3,A)')
'------------------------------------------------------------------------------'
1909 IF (unit_nr > 0)
THEN
1910 WRITE (unit_nr,
'(T3,A)')
' '
1912 WRITE (unit_nr,
'(T3,A,F46.4)')
'GW+SOC valence band maximum (eV)', e_vbm_gw_soc*
evolt
1913 WRITE (unit_nr,
'(T3,A,F43.4)')
'GW+SOC conduction band minimum (eV)', e_cbm_gw_soc*
evolt
1914 WRITE (unit_nr,
'(T3,A,F59.4)')
'GW+SOC bandgap (eV)', (e_cbm_gw_soc - e_vbm_gw_soc)*
evolt
1916 WRITE (unit_nr,
'(T3,A,F45.4)')
'SCF+SOC valence band maximum (eV)', e_vbm_gw_soc*
evolt
1917 WRITE (unit_nr,
'(T3,A,F42.4)')
'SCF+SOC conduction band minimum (eV)', e_cbm_gw_soc*
evolt
1918 WRITE (unit_nr,
'(T3,A,F58.4)')
'SCF+SOC bandgap (eV)', (e_cbm_gw_soc - e_vbm_gw_soc)*
evolt
1936 DEALLOCATE (eigenvalues)
1938 CALL timestop(handle)
1940 END SUBROUTINE calculate_and_print_soc
1952 SUBROUTINE add_dbcsr_submatrix(cfm_mat_target, mat_source, cfm_source_template, &
1953 nstart_row, nstart_col, factor, add_also_herm_conj)
1954 TYPE(cp_cfm_type) :: cfm_mat_target
1955 TYPE(dbcsr_p_type),
DIMENSION(:) :: mat_source
1956 TYPE(cp_cfm_type) :: cfm_source_template
1957 INTEGER :: nstart_row, nstart_col
1958 COMPLEX(KIND=dp) :: factor
1959 LOGICAL :: add_also_herm_conj
1961 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_dbcsr_submatrix'
1963 INTEGER :: handle, nao
1964 TYPE(cp_cfm_type) :: cfm_mat_work_double, &
1965 cfm_mat_work_double_2
1966 TYPE(cp_fm_type) :: fm_mat_work_double_im, &
1967 fm_mat_work_double_re, fm_mat_work_im, &
1970 CALL timeset(routinen, handle)
1972 CALL cp_fm_create(fm_mat_work_double_re, cfm_mat_target%matrix_struct)
1973 CALL cp_fm_create(fm_mat_work_double_im, cfm_mat_target%matrix_struct)
1977 CALL cp_cfm_create(cfm_mat_work_double, cfm_mat_target%matrix_struct)
1978 CALL cp_cfm_create(cfm_mat_work_double_2, cfm_mat_target%matrix_struct)
1982 CALL cp_fm_create(fm_mat_work_re, cfm_source_template%matrix_struct)
1983 CALL cp_fm_create(fm_mat_work_im, cfm_source_template%matrix_struct)
1991 nrow=nao, ncol=nao, &
1992 s_firstrow=1, s_firstcol=1, &
1993 t_firstrow=nstart_row, t_firstcol=nstart_col)
1996 nrow=nao, ncol=nao, &
1997 s_firstrow=1, s_firstcol=1, &
1998 t_firstrow=nstart_row, t_firstcol=nstart_col)
2003 CALL cp_cfm_scale(factor, cfm_mat_work_double)
2007 IF (add_also_herm_conj)
THEN
2012 CALL cp_fm_release(fm_mat_work_double_re)
2013 CALL cp_fm_release(fm_mat_work_double_im)
2016 CALL cp_fm_release(fm_mat_work_re)
2017 CALL cp_fm_release(fm_mat_work_im)
2019 CALL timestop(handle)
2030 SUBROUTINE add_cfm_submatrix(cfm_mat_target, cfm_mat_source, nstart_row, nstart_col)
2032 TYPE(cp_cfm_type) :: cfm_mat_target, cfm_mat_source
2033 INTEGER :: nstart_row, nstart_col
2035 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_cfm_submatrix'
2037 INTEGER :: handle, nao
2038 TYPE(cp_fm_type) :: fm_mat_work_double_im, &
2039 fm_mat_work_double_re, fm_mat_work_im, &
2042 CALL timeset(routinen, handle)
2044 CALL cp_fm_create(fm_mat_work_double_re, cfm_mat_target%matrix_struct)
2045 CALL cp_fm_create(fm_mat_work_double_im, cfm_mat_target%matrix_struct)
2049 CALL cp_fm_create(fm_mat_work_re, cfm_mat_source%matrix_struct)
2050 CALL cp_fm_create(fm_mat_work_im, cfm_mat_source%matrix_struct)
2051 CALL cp_cfm_to_fm(cfm_mat_source, fm_mat_work_re, fm_mat_work_im)
2056 nrow=nao, ncol=nao, &
2057 s_firstrow=1, s_firstcol=1, &
2058 t_firstrow=nstart_row, t_firstcol=nstart_col)
2061 nrow=nao, ncol=nao, &
2062 s_firstrow=1, s_firstcol=1, &
2063 t_firstrow=nstart_row, t_firstcol=nstart_col)
2068 CALL cp_fm_release(fm_mat_work_double_re)
2069 CALL cp_fm_release(fm_mat_work_double_im)
2070 CALL cp_fm_release(fm_mat_work_re)
2071 CALL cp_fm_release(fm_mat_work_im)
2073 CALL timestop(handle)
2075 END SUBROUTINE add_cfm_submatrix
2082 SUBROUTINE create_cfm_double_row_col_size(fm_orig, cfm_double)
2083 TYPE(cp_fm_type) :: fm_orig
2084 TYPE(cp_cfm_type) :: cfm_double
2086 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_cfm_double_row_col_size'
2088 INTEGER :: handle, ncol_global_orig, &
2090 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_double
2092 CALL timeset(routinen, handle)
2094 CALL cp_fm_get_info(matrix=fm_orig, nrow_global=nrow_global_orig, ncol_global=ncol_global_orig)
2097 nrow_global=2*nrow_global_orig, &
2098 ncol_global=2*ncol_global_orig, &
2099 template_fmstruct=fm_orig%matrix_struct)
2105 CALL timestop(handle)
2122 SUBROUTINE print_gaps(E_VBM_SCF, E_CBM_SCF, E_VBM_SCF_beta, E_CBM_SCF_beta, &
2123 E_VBM_GW, E_CBM_GW, E_VBM_GW_beta, E_CBM_GW_beta, my_open_shell, unit_nr)
2125 REAL(kind=
dp) :: e_vbm_scf, e_cbm_scf, e_vbm_scf_beta, &
2126 e_cbm_scf_beta, e_vbm_gw, e_cbm_gw, &
2127 e_vbm_gw_beta, e_cbm_gw_beta
2128 LOGICAL :: my_open_shell
2131 IF (my_open_shell)
THEN
2132 WRITE (unit_nr,
'(T3,A)')
' '
2133 WRITE (unit_nr,
'(T3,A,F43.4)')
'Alpha SCF valence band maximum (eV)', e_vbm_scf*
evolt
2134 WRITE (unit_nr,
'(T3,A,F40.4)')
'Alpha SCF conduction band minimum (eV)', e_cbm_scf*
evolt
2135 WRITE (unit_nr,
'(T3,A,F56.4)')
'Alpha SCF bandgap (eV)', (e_cbm_scf - e_vbm_scf)*
evolt
2136 WRITE (unit_nr,
'(T3,A)')
' '
2137 WRITE (unit_nr,
'(T3,A,F44.4)')
'Beta SCF valence band maximum (eV)', e_vbm_scf_beta*
evolt
2138 WRITE (unit_nr,
'(T3,A,F41.4)')
'Beta SCF conduction band minimum (eV)', e_cbm_scf_beta*
evolt
2139 WRITE (unit_nr,
'(T3,A,F57.4)')
'Beta SCF bandgap (eV)', (e_cbm_scf_beta - e_vbm_scf_beta)*
evolt
2140 WRITE (unit_nr,
'(T3,A)')
' '
2141 WRITE (unit_nr,
'(T3,A,F44.4)')
'Alpha GW valence band maximum (eV)', e_vbm_gw*
evolt
2142 WRITE (unit_nr,
'(T3,A,F41.4)')
'Alpha GW conduction band minimum (eV)', e_cbm_gw*
evolt
2143 WRITE (unit_nr,
'(T3,A,F57.4)')
'Alpha GW bandgap (eV)', (e_cbm_gw - e_vbm_gw)*
evolt
2144 WRITE (unit_nr,
'(T3,A)')
' '
2145 WRITE (unit_nr,
'(T3,A,F45.4)')
'Beta GW valence band maximum (eV)', e_vbm_gw_beta*
evolt
2146 WRITE (unit_nr,
'(T3,A,F42.4)')
'Beta GW conduction band minimum (eV)', e_cbm_gw_beta*
evolt
2147 WRITE (unit_nr,
'(T3,A,F58.4)')
'Beta GW bandgap (eV)', (e_cbm_gw_beta - e_vbm_gw_beta)*
evolt
2149 WRITE (unit_nr,
'(T3,A)')
' '
2150 WRITE (unit_nr,
'(T3,A,F49.4)')
'SCF valence band maximum (eV)', e_vbm_scf*
evolt
2151 WRITE (unit_nr,
'(T3,A,F46.4)')
'SCF conduction band minimum (eV)', e_cbm_scf*
evolt
2152 WRITE (unit_nr,
'(T3,A,F62.4)')
'SCF bandgap (eV)', (e_cbm_scf - e_vbm_scf)*
evolt
2153 WRITE (unit_nr,
'(T3,A)')
' '
2154 WRITE (unit_nr,
'(T3,A,F50.4)')
'GW valence band maximum (eV)', e_vbm_gw*
evolt
2155 WRITE (unit_nr,
'(T3,A,F47.4)')
'GW conduction band minimum (eV)', e_cbm_gw*
evolt
2156 WRITE (unit_nr,
'(T3,A,F63.4)')
'GW bandgap (eV)', (e_cbm_gw - e_vbm_gw)*
evolt
2159 END SUBROUTINE print_gaps
2166 SUBROUTINE check_nan(array, real_value)
2167 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :), &
2168 INTENT(INOUT) :: array
2169 REAL(kind=
dp),
INTENT(IN) :: real_value
2171 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_NaN'
2173 INTEGER :: handle, i, j, k
2175 CALL timeset(routinen, handle)
2177 DO i = 1,
SIZE(array, 1)
2178 DO j = 1,
SIZE(array, 2)
2179 DO k = 1,
SIZE(array, 3)
2182 IF (array(i, j, k) .NE. array(i, j, k)) array(i, j, k) = real_value
2188 CALL timestop(handle)
2201 SUBROUTINE print_local_bandgap(qs_env, Eigenval, gw_corr_lev_occ, gw_corr_lev_virt, homo, dft_gw_char)
2202 TYPE(qs_environment_type),
POINTER :: qs_env
2203 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
2204 INTEGER :: gw_corr_lev_occ, gw_corr_lev_virt, homo
2205 CHARACTER(len=*) :: dft_gw_char
2207 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_local_bandgap'
2209 INTEGER :: handle, i_e
2210 TYPE(pw_c1d_gs_type) :: rho_g_dummy
2211 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
2212 TYPE(pw_r3d_rs_type) :: e_cbm_rspace, e_gap_rspace, e_vbm_rspace
2213 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: ldos
2215 CALL timeset(routinen, handle)
2217 CALL create_real_space_grids(e_gap_rspace, e_vbm_rspace, e_cbm_rspace, rho_g_dummy, ldos, auxbas_pw_pool, qs_env)
2219 CALL calculate_e_gap_rspace(e_gap_rspace, e_vbm_rspace, e_cbm_rspace, rho_g_dummy, &
2220 ldos, qs_env, eigenval, gw_corr_lev_occ, gw_corr_lev_virt, homo, dft_gw_char)
2222 CALL auxbas_pw_pool%give_back_pw(e_gap_rspace)
2223 CALL auxbas_pw_pool%give_back_pw(e_vbm_rspace)
2224 CALL auxbas_pw_pool%give_back_pw(e_cbm_rspace)
2225 CALL auxbas_pw_pool%give_back_pw(rho_g_dummy)
2226 DO i_e = 1,
SIZE(ldos)
2227 CALL auxbas_pw_pool%give_back_pw(ldos(i_e))
2231 CALL timestop(handle)
2233 END SUBROUTINE print_local_bandgap
2249 SUBROUTINE calculate_e_gap_rspace(E_gap_rspace, E_VBM_rspace, E_CBM_rspace, rho_g_dummy, &
2250 LDOS, qs_env, Eigenval, gw_corr_lev_occ, gw_corr_lev_virt, homo, dft_gw_char)
2251 TYPE(pw_r3d_rs_type) :: e_gap_rspace, e_vbm_rspace, e_cbm_rspace
2252 TYPE(pw_c1d_gs_type) :: rho_g_dummy
2253 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: ldos
2254 TYPE(qs_environment_type),
POINTER :: qs_env
2255 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
2256 INTEGER :: gw_corr_lev_occ, gw_corr_lev_virt, homo
2257 CHARACTER(len=*) :: dft_gw_char
2259 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calculate_E_gap_rspace'
2261 INTEGER :: handle, i_e, i_img, i_spin, i_x, i_y, i_z, ikp, imo, n_e, n_e_occ, n_x_end, &
2262 n_x_start, n_y_end, n_y_start, n_z_end, n_z_start, nimg, nkp, nkp_self_energy
2263 REAL(kind=
dp) :: avg_ldos_occ, avg_ldos_virt, d_e, e_cbm, &
2264 e_cbm_at_k, e_diff, e_vbm, e_vbm_at_k
2265 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: e_array
2266 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occupation
2267 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
2268 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_work
2269 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
2270 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_weighted
2271 TYPE(dft_control_type),
POINTER :: dft_control
2272 TYPE(kpoint_type),
POINTER :: kpoints_sigma
2273 TYPE(mp2_type),
POINTER :: mp2_env
2274 TYPE(mp_para_env_type),
POINTER :: para_env
2275 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2277 TYPE(particle_list_type),
POINTER :: particles
2278 TYPE(qs_ks_env_type),
POINTER :: ks_env
2279 TYPE(qs_scf_env_type),
POINTER :: scf_env
2280 TYPE(qs_subsys_type),
POINTER :: subsys
2281 TYPE(section_vals_type),
POINTER :: gw_section
2283 CALL timeset(routinen, handle)
2285 CALL get_qs_env(qs_env=qs_env, para_env=para_env, mp2_env=mp2_env, ks_env=ks_env, matrix_s=matrix_s, &
2286 scf_env=scf_env, sab_orb=sab_orb, dft_control=dft_control, subsys=subsys)
2289 nkp =
SIZE(eigenval, 2)
2295 e_vbm_at_k = maxval(eigenval(homo - gw_corr_lev_occ + 1:homo, ikp, 1))
2296 IF (e_vbm_at_k > e_vbm) e_vbm = e_vbm_at_k
2298 e_cbm_at_k = minval(eigenval(homo + 1:homo + gw_corr_lev_virt, ikp, 1))
2299 IF (e_cbm_at_k < e_cbm) e_cbm = e_cbm_at_k
2303 d_e = mp2_env%ri_g0w0%energy_spacing_print_loc_bandgap
2305 n_e = int(mp2_env%ri_g0w0%energy_window_print_loc_bandgap/d_e)
2308 ALLOCATE (e_array(n_e))
2310 e_array(i_e) = e_vbm - real(n_e_occ - i_e, kind=
dp)*d_e
2312 DO i_e = n_e_occ + 1, n_e
2313 e_array(i_e) = e_cbm + real(i_e - n_e_occ - 1, kind=
dp)*d_e
2316 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
2318 nkp_self_energy = kpoints_sigma%nkp
2319 cpassert(nkp == nkp_self_energy)
2321 kpoints_sigma%sab_nl => sab_orb
2323 DEALLOCATE (kpoints_sigma%cell_to_index)
2324 NULLIFY (kpoints_sigma%cell_to_index)
2327 nimg = maxval(kpoints_sigma%cell_to_index)
2329 NULLIFY (rho_ao_weighted)
2334 ALLOCATE (rho_ao_weighted(i_spin, i_img)%matrix)
2335 CALL dbcsr_create(matrix=rho_ao_weighted(i_spin, i_img)%matrix, template=matrix_s(1)%matrix)
2337 CALL dbcsr_set(rho_ao_weighted(i_spin, i_img)%matrix, 0.0_dp)
2341 ALLOCATE (fm_work(nimg))
2342 matrix_struct => kpoints_sigma%kp_env(1)%kpoint_env%mos(1, 1)%mo_coeff%matrix_struct
2351 CALL get_mo_set(kpoints_sigma%kp_env(ikp)%kpoint_env%mos(1, 1), &
2352 occupation_numbers=occupation)
2354 occupation(:) = 0.0_dp
2355 DO imo = homo - gw_corr_lev_occ + 1, homo + gw_corr_lev_virt
2356 e_diff = e_array(i_e) - eigenval(imo, ikp, 1)
2357 occupation(imo) = exp(-(e_diff/d_e)**2)
2362 CALL get_mo_set(kpoints_sigma%kp_env(1)%kpoint_env%mos(1, 1), &
2363 occupation_numbers=occupation)
2370 matrix_s(1)%matrix, sab_orb, fm_work)
2372 rho_ao => rho_ao_weighted(1, :)
2376 rho_gspace=rho_g_dummy, &
2381 CALL dbcsr_set(rho_ao_weighted(i_spin, i_img)%matrix, 0.0_dp)
2387 n_x_start = lbound(ldos(1)%array, 1)
2388 n_x_end = ubound(ldos(1)%array, 1)
2389 n_y_start = lbound(ldos(1)%array, 2)
2390 n_y_end = ubound(ldos(1)%array, 2)
2391 n_z_start = lbound(ldos(1)%array, 3)
2392 n_z_end = ubound(ldos(1)%array, 3)
2394 CALL pw_zero(e_vbm_rspace)
2395 CALL pw_zero(e_cbm_rspace)
2397 DO i_x = n_x_start, n_x_end
2398 DO i_y = n_y_start, n_y_end
2399 DO i_z = n_z_start, n_z_end
2401 avg_ldos_occ = 0.0_dp
2403 avg_ldos_occ = avg_ldos_occ + ldos(i_e)%array(i_x, i_y, i_z)
2405 avg_ldos_occ = avg_ldos_occ/real(n_e_occ, kind=
dp)
2407 avg_ldos_virt = 0.0_dp
2408 DO i_e = n_e_occ + 1, n_e
2409 avg_ldos_virt = avg_ldos_virt + ldos(i_e)%array(i_x, i_y, i_z)
2411 avg_ldos_virt = avg_ldos_virt/real(n_e - n_e_occ, kind=
dp)
2414 DO i_e = n_e_occ, 1, -1
2415 IF (ldos(i_e)%array(i_x, i_y, i_z) > mp2_env%ri_g0w0%ldos_thresh_print_loc_bandgap*avg_ldos_occ)
THEN
2416 e_vbm_rspace%array(i_x, i_y, i_z) = e_array(i_e)
2422 DO i_e = n_e_occ + 1, n_e
2423 IF (ldos(i_e)%array(i_x, i_y, i_z) > mp2_env%ri_g0w0%ldos_thresh_print_loc_bandgap*avg_ldos_virt)
THEN
2424 e_cbm_rspace%array(i_x, i_y, i_z) = e_array(i_e)
2433 CALL pw_scale(e_vbm_rspace,
evolt)
2434 CALL pw_scale(e_cbm_rspace,
evolt)
2436 CALL pw_copy(e_cbm_rspace, e_gap_rspace)
2437 CALL pw_axpy(e_vbm_rspace, e_gap_rspace, -1.0_dp)
2442 CALL print_file(e_gap_rspace, dft_gw_char//
"_Gap_in_eV", gw_section, particles, mp2_env)
2443 CALL print_file(e_vbm_rspace, dft_gw_char//
"_VBM_in_eV", gw_section, particles, mp2_env)
2444 CALL print_file(e_cbm_rspace, dft_gw_char//
"_CBM_in_eV", gw_section, particles, mp2_env)
2445 CALL print_file(ldos(n_e_occ), dft_gw_char//
"_LDOS_VBM_in_eV", gw_section, particles, mp2_env)
2446 CALL print_file(ldos(n_e_occ + 1), dft_gw_char//
"_LDOS_CBM_in_eV", gw_section, particles, mp2_env)
2450 CALL cp_fm_release(fm_work)
2452 DEALLOCATE (e_array)
2454 NULLIFY (kpoints_sigma%sab_nl)
2456 CALL timestop(handle)
2458 END SUBROUTINE calculate_e_gap_rspace
2468 SUBROUTINE print_file(pw_print, middle_name, gw_section, particles, mp2_env)
2469 TYPE(pw_r3d_rs_type) :: pw_print
2470 CHARACTER(len=*) :: middle_name
2471 TYPE(section_vals_type),
POINTER :: gw_section
2472 TYPE(particle_list_type),
POINTER :: particles
2473 TYPE(mp2_type),
POINTER :: mp2_env
2475 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_file'
2477 INTEGER :: handle, unit_nr_cube
2479 TYPE(cp_logger_type),
POINTER :: logger
2481 CALL timeset(routinen, handle)
2486 unit_nr_cube =
cp_print_key_unit_nr(logger, gw_section,
"PRINT%LOCAL_BANDGAP", extension=
".cube", &
2487 middle_name=middle_name, file_form=
"FORMATTED", mpi_io=mpi_io)
2488 CALL cp_pw_to_cube(pw_print, unit_nr_cube, middle_name, particles=particles, &
2489 stride=mp2_env%ri_g0w0%stride_loc_bandgap, mpi_io=mpi_io)
2491 "PRINT%LOCAL_BANDGAP", mpi_io=mpi_io)
2493 CALL timestop(handle)
2495 END SUBROUTINE print_file
2507 SUBROUTINE create_real_space_grids(E_gap_rspace, E_VBM_rspace, E_CBM_rspace, rho_g_dummy, LDOS, auxbas_pw_pool, qs_env)
2508 TYPE(pw_r3d_rs_type) :: e_gap_rspace, e_vbm_rspace, e_cbm_rspace
2509 TYPE(pw_c1d_gs_type) :: rho_g_dummy
2510 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: ldos
2511 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
2512 TYPE(qs_environment_type),
POINTER :: qs_env
2514 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_real_space_grids'
2516 INTEGER :: handle, i_e, n_e
2517 TYPE(mp2_type),
POINTER :: mp2_env
2518 TYPE(pw_env_type),
POINTER :: pw_env
2520 CALL timeset(routinen, handle)
2522 CALL get_qs_env(qs_env=qs_env, mp2_env=mp2_env, pw_env=pw_env)
2524 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2526 CALL auxbas_pw_pool%create_pw(e_gap_rspace)
2527 CALL auxbas_pw_pool%create_pw(e_vbm_rspace)
2528 CALL auxbas_pw_pool%create_pw(e_cbm_rspace)
2529 CALL auxbas_pw_pool%create_pw(rho_g_dummy)
2531 n_e = int(mp2_env%ri_g0w0%energy_window_print_loc_bandgap/ &
2532 mp2_env%ri_g0w0%energy_spacing_print_loc_bandgap)
2534 ALLOCATE (ldos(n_e))
2537 CALL auxbas_pw_pool%create_pw(ldos(i_e))
2540 CALL timestop(handle)
2542 END SUBROUTINE create_real_space_grids
2569 SUBROUTINE calc_periodic_correction(delta_corr, qs_env, para_env, para_env_RPA, kp_grid, homo, nmo, &
2570 gw_corr_lev_occ, gw_corr_lev_virt, omega, fm_mo_coeff, Eigenval, &
2571 matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
2572 first_cycle_periodic_correction, kpoints, do_mo_coeff_Gamma_only, &
2573 num_kp_grids, eps_kpoint, do_extra_kpoints, do_aux_bas, frac_aux_mos)
2575 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
2576 INTENT(INOUT) :: delta_corr
2577 TYPE(qs_environment_type),
POINTER :: qs_env
2578 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_rpa
2579 INTEGER,
DIMENSION(:),
POINTER :: kp_grid
2580 INTEGER,
INTENT(IN) :: homo, nmo, gw_corr_lev_occ, &
2582 REAL(kind=
dp),
INTENT(IN) :: omega
2583 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff
2584 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eigenval
2585 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_re_mo_mo, &
2586 matrix_berry_im_mo_mo
2587 LOGICAL,
INTENT(INOUT) :: first_cycle_periodic_correction
2588 TYPE(kpoint_type),
POINTER :: kpoints
2589 LOGICAL,
INTENT(IN) :: do_mo_coeff_gamma_only
2590 INTEGER,
INTENT(IN) :: num_kp_grids
2591 REAL(kind=
dp),
INTENT(IN) :: eps_kpoint
2592 LOGICAL,
INTENT(IN) :: do_extra_kpoints, do_aux_bas
2593 REAL(kind=
dp),
INTENT(IN) :: frac_aux_mos
2595 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_periodic_correction'
2598 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eps_head, eps_inv_head
2599 REAL(kind=
dp),
DIMENSION(3, 3) :: h_inv
2601 CALL timeset(routinen, handle)
2603 IF (first_cycle_periodic_correction)
THEN
2605 CALL get_kpoints(qs_env, kpoints, kp_grid, num_kp_grids, para_env, h_inv, nmo, do_mo_coeff_gamma_only, &
2608 CALL get_berry_phase(qs_env, kpoints, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, fm_mo_coeff, &
2609 para_env, do_mo_coeff_gamma_only, homo, nmo, gw_corr_lev_virt, eps_kpoint, do_aux_bas, &
2614 CALL compute_eps_head_berry(eps_head, kpoints, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, para_env_rpa, &
2615 qs_env, homo, eigenval, omega)
2617 CALL compute_eps_inv_head(eps_inv_head, eps_head, kpoints)
2619 CALL kpoint_sum_for_eps_inv_head_berry(delta_corr, eps_inv_head, kpoints, qs_env, &
2620 matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
2621 homo, gw_corr_lev_occ, gw_corr_lev_virt, para_env_rpa, &
2624 DEALLOCATE (eps_head, eps_inv_head)
2626 first_cycle_periodic_correction = .false.
2628 CALL timestop(handle)
2630 END SUBROUTINE calc_periodic_correction
2644 SUBROUTINE compute_eps_head_berry(eps_head, kpoints, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, para_env_RPA, &
2645 qs_env, homo, Eigenval, omega)
2647 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
2648 INTENT(OUT) :: eps_head
2649 TYPE(kpoint_type),
POINTER :: kpoints
2650 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_berry_re_mo_mo, &
2651 matrix_berry_im_mo_mo
2652 TYPE(mp_para_env_type),
INTENT(IN) :: para_env_rpa
2653 TYPE(qs_environment_type),
POINTER :: qs_env
2654 INTEGER,
INTENT(IN) :: homo
2655 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eigenval
2656 REAL(kind=
dp),
INTENT(IN) :: omega
2658 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_eps_head_Berry'
2660 INTEGER :: col, col_end_in_block, col_offset, col_size, handle, i_col, i_row, ikp, nkp, row, &
2661 row_offset, row_size, row_start_in_block
2662 REAL(kind=
dp) :: abs_k_square, cell_volume, &
2663 correct_kpoint(3), cos_square, &
2664 eigen_diff, relative_kpoint(3), &
2666 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: p_head
2667 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
2668 TYPE(cell_type),
POINTER :: cell
2669 TYPE(dbcsr_iterator_type) :: iter
2671 CALL timeset(routinen, handle)
2674 CALL get_cell(cell=cell, deth=cell_volume)
2676 NULLIFY (data_block)
2680 ALLOCATE (p_head(nkp))
2683 ALLOCATE (eps_head(nkp))
2684 eps_head(:) = 0.0_dp
2688 relative_kpoint(1:3) = matmul(cell%hmat, kpoints%xkp(1:3, ikp))
2690 correct_kpoint(1:3) =
twopi*kpoints%xkp(1:3, ikp)
2692 abs_k_square = (correct_kpoint(1))**2 + (correct_kpoint(2))**2 + (correct_kpoint(3))**2
2695 CALL dbcsr_iterator_start(iter, matrix_berry_re_mo_mo(ikp)%matrix)
2696 DO WHILE (dbcsr_iterator_blocks_left(iter))
2698 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
2699 row_size=row_size, col_size=col_size, &
2700 row_offset=row_offset, col_offset=col_offset)
2702 IF (row_offset + row_size <= homo .OR. col_offset > homo) cycle
2704 IF (row_offset <= homo)
THEN
2705 row_start_in_block = homo - row_offset + 2
2707 row_start_in_block = 1
2710 IF (col_offset + col_size - 1 > homo)
THEN
2711 col_end_in_block = homo - col_offset + 1
2713 col_end_in_block = col_size
2716 DO i_row = row_start_in_block, row_size
2718 DO i_col = 1, col_end_in_block
2720 eigen_diff = eigenval(i_col + col_offset - 1) - eigenval(i_row + row_offset - 1)
2722 cos_square = (data_block(i_row, i_col))**2
2724 p_head(ikp) = p_head(ikp) + 2.0_dp*eigen_diff/(omega**2 + eigen_diff**2)*cos_square/abs_k_square
2732 CALL dbcsr_iterator_stop(iter)
2735 CALL dbcsr_iterator_start(iter, matrix_berry_im_mo_mo(ikp)%matrix)
2736 DO WHILE (dbcsr_iterator_blocks_left(iter))
2738 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
2739 row_size=row_size, col_size=col_size, &
2740 row_offset=row_offset, col_offset=col_offset)
2742 IF (row_offset + row_size <= homo .OR. col_offset > homo) cycle
2744 IF (row_offset <= homo)
THEN
2745 row_start_in_block = homo - row_offset + 2
2747 row_start_in_block = 1
2750 IF (col_offset + col_size - 1 > homo)
THEN
2751 col_end_in_block = homo - col_offset + 1
2753 col_end_in_block = col_size
2756 DO i_row = row_start_in_block, row_size
2758 DO i_col = 1, col_end_in_block
2760 eigen_diff = eigenval(i_col + col_offset - 1) - eigenval(i_row + row_offset - 1)
2762 sin_square = (data_block(i_row, i_col))**2
2764 p_head(ikp) = p_head(ikp) + 2.0_dp*eigen_diff/(omega**2 + eigen_diff**2)*sin_square/abs_k_square
2772 CALL dbcsr_iterator_stop(iter)
2776 CALL para_env_rpa%sum(p_head)
2780 eps_head(:) = 1.0_dp - 2.0_dp*p_head(:)/cell_volume*
fourpi
2784 CALL timestop(handle)
2786 END SUBROUTINE compute_eps_head_berry
2804 SUBROUTINE get_berry_phase(qs_env, kpoints, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, fm_mo_coeff, para_env, &
2805 do_mo_coeff_Gamma_only, homo, nmo, gw_corr_lev_virt, eps_kpoint, do_aux_bas, &
2807 TYPE(qs_environment_type),
POINTER :: qs_env
2808 TYPE(kpoint_type),
POINTER :: kpoints
2809 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_re_mo_mo, &
2810 matrix_berry_im_mo_mo
2811 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff
2812 TYPE(mp_para_env_type),
POINTER :: para_env
2813 LOGICAL,
INTENT(IN) :: do_mo_coeff_gamma_only
2814 INTEGER,
INTENT(IN) :: homo, nmo, gw_corr_lev_virt
2815 REAL(kind=
dp),
INTENT(IN) :: eps_kpoint
2816 LOGICAL,
INTENT(IN) :: do_aux_bas
2817 REAL(kind=
dp),
INTENT(IN) :: frac_aux_mos
2819 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_berry_phase'
2821 INTEGER :: col_index, handle, i_col_local, ikind, &
2822 ikp, nao_aux, ncol_local, nkind, nkp, &
2824 INTEGER,
DIMENSION(:),
POINTER :: col_indices
2825 REAL(
dp) :: abs_kpoint, correct_kpoint(3), &
2827 REAL(kind=
dp),
DIMENSION(:),
POINTER :: evals_p, evals_p_sqrt_inv
2828 TYPE(cell_type),
POINTER :: cell
2829 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_aux_aux
2830 TYPE(cp_fm_type) :: fm_mat_eigv_p, fm_mat_p, fm_mat_p_sqrt_inv, fm_mat_s_aux_aux_inv, &
2831 fm_mat_scaled_eigv_p, fm_mat_work_aux_aux
2832 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, matrix_s_aux_aux, &
2834 TYPE(dbcsr_type),
POINTER :: cosmat, cosmat_desymm, mat_mo_coeff_aux, mat_mo_coeff_aux_2, &
2835 mat_mo_coeff_gamma_all, mat_mo_coeff_gamma_occ_and_gw, mat_mo_coeff_im, mat_mo_coeff_re, &
2836 mat_work_aux_orb, mat_work_aux_orb_2, matrix_p, matrix_p_sqrt, matrix_p_sqrt_inv, &
2837 matrix_s_inv_aux_aux, sinmat, sinmat_desymm, tmp
2838 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: gw_aux_basis_set_list, orb_basis_set_list
2839 TYPE(gto_basis_set_type),
POINTER :: basis_set_gw_aux
2840 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
2841 POINTER :: sab_orb, sab_orb_mic, sgwgw_list, &
2843 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2844 TYPE(qs_kind_type),
POINTER :: qs_kind
2845 TYPE(qs_ks_env_type),
POINTER :: ks_env
2847 CALL timeset(routinen, handle)
2851 NULLIFY (matrix_berry_re_mo_mo, matrix_s, cell, matrix_berry_im_mo_mo, sinmat, cosmat, tmp, &
2852 cosmat_desymm, sinmat_desymm, qs_kind_set, orb_basis_set_list, sab_orb_mic)
2856 matrix_s=matrix_s, &
2857 qs_kind_set=qs_kind_set, &
2862 ALLOCATE (orb_basis_set_list(nkind))
2868 NULLIFY (mat_mo_coeff_re)
2869 CALL dbcsr_init_p(mat_mo_coeff_re)
2870 CALL dbcsr_create(matrix=mat_mo_coeff_re, &
2871 template=matrix_s(1)%matrix, &
2872 matrix_type=dbcsr_type_no_symmetry)
2874 NULLIFY (mat_mo_coeff_im)
2875 CALL dbcsr_init_p(mat_mo_coeff_im)
2876 CALL dbcsr_create(matrix=mat_mo_coeff_im, &
2877 template=matrix_s(1)%matrix, &
2878 matrix_type=dbcsr_type_no_symmetry)
2880 NULLIFY (mat_mo_coeff_gamma_all)
2881 CALL dbcsr_init_p(mat_mo_coeff_gamma_all)
2882 CALL dbcsr_create(matrix=mat_mo_coeff_gamma_all, &
2883 template=matrix_s(1)%matrix, &
2884 matrix_type=dbcsr_type_no_symmetry)
2886 CALL copy_fm_to_dbcsr(fm_mo_coeff, mat_mo_coeff_gamma_all, keep_sparsity=.false.)
2888 NULLIFY (mat_mo_coeff_gamma_occ_and_gw)
2889 CALL dbcsr_init_p(mat_mo_coeff_gamma_occ_and_gw)
2890 CALL dbcsr_create(matrix=mat_mo_coeff_gamma_occ_and_gw, &
2891 template=matrix_s(1)%matrix, &
2892 matrix_type=dbcsr_type_no_symmetry)
2894 CALL copy_fm_to_dbcsr(fm_mo_coeff, mat_mo_coeff_gamma_occ_and_gw, keep_sparsity=.false.)
2896 IF (.NOT. do_aux_bas)
THEN
2899 CALL dbcsr_init_p(cosmat)
2900 CALL dbcsr_init_p(sinmat)
2901 CALL dbcsr_init_p(tmp)
2902 CALL dbcsr_init_p(cosmat_desymm)
2903 CALL dbcsr_init_p(sinmat_desymm)
2904 CALL dbcsr_create(matrix=cosmat, template=matrix_s(1)%matrix)
2905 CALL dbcsr_create(matrix=sinmat, template=matrix_s(1)%matrix)
2906 CALL dbcsr_create(matrix=tmp, &
2907 template=matrix_s(1)%matrix, &
2908 matrix_type=dbcsr_type_no_symmetry)
2909 CALL dbcsr_create(matrix=cosmat_desymm, &
2910 template=matrix_s(1)%matrix, &
2911 matrix_type=dbcsr_type_no_symmetry)
2912 CALL dbcsr_create(matrix=sinmat_desymm, &
2913 template=matrix_s(1)%matrix, &
2914 matrix_type=dbcsr_type_no_symmetry)
2915 CALL dbcsr_copy(cosmat, matrix_s(1)%matrix)
2916 CALL dbcsr_copy(sinmat, matrix_s(1)%matrix)
2917 CALL dbcsr_set(cosmat, 0.0_dp)
2918 CALL dbcsr_set(sinmat, 0.0_dp)
2925 NULLIFY (gw_aux_basis_set_list)
2926 ALLOCATE (gw_aux_basis_set_list(nkind))
2930 NULLIFY (gw_aux_basis_set_list(ikind)%gto_basis_set)
2932 NULLIFY (basis_set_gw_aux)
2934 qs_kind => qs_kind_set(ikind)
2935 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set_gw_aux, basis_type=
"AUX_GW")
2936 cpassert(
ASSOCIATED(basis_set_gw_aux))
2938 basis_set_gw_aux%kind_radius = orb_basis_set_list(ikind)%gto_basis_set%kind_radius
2940 gw_aux_basis_set_list(ikind)%gto_basis_set => basis_set_gw_aux
2945 NULLIFY (sgwgw_list, sgworb_list)
2947 CALL setup_neighbor_list(sgworb_list, gw_aux_basis_set_list, orb_basis_set_list, qs_env=qs_env)
2949 NULLIFY (matrix_s_aux_aux, matrix_s_aux_orb)
2953 gw_aux_basis_set_list, gw_aux_basis_set_list, sgwgw_list)
2956 gw_aux_basis_set_list, orb_basis_set_list, sgworb_list)
2958 CALL dbcsr_get_info(matrix_s_aux_aux(1)%matrix, nfullrows_total=nao_aux)
2960 nmo_for_aux_bas = floor(frac_aux_mos*real(nao_aux, kind=
dp))
2963 context=fm_mo_coeff%matrix_struct%context, &
2964 nrow_global=nao_aux, &
2965 ncol_global=nao_aux, &
2968 NULLIFY (mat_work_aux_orb)
2969 CALL dbcsr_init_p(mat_work_aux_orb)
2970 CALL dbcsr_create(matrix=mat_work_aux_orb, &
2971 template=matrix_s_aux_orb(1)%matrix, &
2972 matrix_type=dbcsr_type_no_symmetry)
2974 NULLIFY (mat_work_aux_orb_2)
2975 CALL dbcsr_init_p(mat_work_aux_orb_2)
2976 CALL dbcsr_create(matrix=mat_work_aux_orb_2, &
2977 template=matrix_s_aux_orb(1)%matrix, &
2978 matrix_type=dbcsr_type_no_symmetry)
2980 NULLIFY (mat_mo_coeff_aux)
2981 CALL dbcsr_init_p(mat_mo_coeff_aux)
2982 CALL dbcsr_create(matrix=mat_mo_coeff_aux, &
2983 template=matrix_s_aux_orb(1)%matrix, &
2984 matrix_type=dbcsr_type_no_symmetry)
2986 NULLIFY (mat_mo_coeff_aux_2)
2987 CALL dbcsr_init_p(mat_mo_coeff_aux_2)
2988 CALL dbcsr_create(matrix=mat_mo_coeff_aux_2, &
2989 template=matrix_s_aux_orb(1)%matrix, &
2990 matrix_type=dbcsr_type_no_symmetry)
2992 NULLIFY (matrix_s_inv_aux_aux)
2993 CALL dbcsr_init_p(matrix_s_inv_aux_aux)
2994 CALL dbcsr_create(matrix=matrix_s_inv_aux_aux, &
2995 template=matrix_s_aux_aux(1)%matrix, &
2996 matrix_type=dbcsr_type_no_symmetry)
2999 CALL dbcsr_init_p(matrix_p)
3000 CALL dbcsr_create(matrix=matrix_p, &
3001 template=matrix_s(1)%matrix, &
3002 matrix_type=dbcsr_type_no_symmetry)
3004 NULLIFY (matrix_p_sqrt)
3005 CALL dbcsr_init_p(matrix_p_sqrt)
3006 CALL dbcsr_create(matrix=matrix_p_sqrt, &
3007 template=matrix_s(1)%matrix, &
3008 matrix_type=dbcsr_type_no_symmetry)
3010 NULLIFY (matrix_p_sqrt_inv)
3011 CALL dbcsr_init_p(matrix_p_sqrt_inv)
3012 CALL dbcsr_create(matrix=matrix_p_sqrt_inv, &
3013 template=matrix_s(1)%matrix, &
3014 matrix_type=dbcsr_type_no_symmetry)
3016 CALL cp_fm_create(fm_mat_s_aux_aux_inv, fm_struct_aux_aux, name=
"inverse overlap mat")
3017 CALL cp_fm_create(fm_mat_work_aux_aux, fm_struct_aux_aux, name=
"work mat")
3019 CALL cp_fm_create(fm_mat_eigv_p, fm_mo_coeff%matrix_struct)
3020 CALL cp_fm_create(fm_mat_scaled_eigv_p, fm_mo_coeff%matrix_struct)
3021 CALL cp_fm_create(fm_mat_p_sqrt_inv, fm_mo_coeff%matrix_struct)
3024 ALLOCATE (evals_p(nmo))
3026 NULLIFY (evals_p_sqrt_inv)
3027 ALLOCATE (evals_p_sqrt_inv(nmo))
3036 CALL copy_fm_to_dbcsr(fm_mat_s_aux_aux_inv, matrix_s_inv_aux_aux, keep_sparsity=.false.)
3038 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s_inv_aux_aux, matrix_s_aux_orb(1)%matrix, 0.0_dp, mat_work_aux_orb, &
3039 filter_eps=1.0e-15_dp)
3041 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, mat_work_aux_orb, mat_mo_coeff_gamma_all, 0.0_dp, mat_mo_coeff_aux_2, &
3042 last_column=nmo_for_aux_bas, filter_eps=1.0e-15_dp)
3044 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s_aux_aux(1)%matrix, mat_mo_coeff_aux_2, 0.0_dp, mat_work_aux_orb, &
3045 filter_eps=1.0e-15_dp)
3047 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_aux_2, mat_work_aux_orb, 0.0_dp, matrix_p, &
3048 filter_eps=1.0e-15_dp)
3052 CALL cp_fm_syevd(fm_mat_p, fm_mat_eigv_p, evals_p)
3055 evals_p_sqrt_inv(1:nmo - nmo_for_aux_bas) = 0.0_dp
3056 evals_p_sqrt_inv(nmo - nmo_for_aux_bas + 1:nmo) = 1.0_dp/sqrt(evals_p(nmo - nmo_for_aux_bas + 1:nmo))
3058 CALL cp_fm_to_fm(fm_mat_eigv_p, fm_mat_scaled_eigv_p)
3061 ncol_local=ncol_local, &
3062 col_indices=col_indices)
3064 CALL para_env%sync()
3067 DO i_col_local = 1, ncol_local
3069 col_index = col_indices(i_col_local)
3071 fm_mat_scaled_eigv_p%local_data(:, i_col_local) = &
3072 fm_mat_scaled_eigv_p%local_data(:, i_col_local)*evals_p_sqrt_inv(col_index)
3076 CALL para_env%sync()
3078 CALL parallel_gemm(transa=
"N", transb=
"T", m=nmo, n=nmo, k=nmo, alpha=1.0_dp, &
3079 matrix_a=fm_mat_eigv_p, matrix_b=fm_mat_scaled_eigv_p, beta=0.0_dp, &
3080 matrix_c=fm_mat_p_sqrt_inv)
3082 CALL copy_fm_to_dbcsr(fm_mat_p_sqrt_inv, matrix_p_sqrt_inv, keep_sparsity=.false.)
3084 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, mat_mo_coeff_aux_2, matrix_p_sqrt_inv, 0.0_dp, mat_mo_coeff_aux, &
3085 filter_eps=1.0e-15_dp)
3088 CALL dbcsr_init_p(cosmat)
3089 CALL dbcsr_init_p(sinmat)
3090 CALL dbcsr_init_p(tmp)
3091 CALL dbcsr_init_p(cosmat_desymm)
3092 CALL dbcsr_init_p(sinmat_desymm)
3093 CALL dbcsr_create(matrix=cosmat, template=matrix_s_aux_aux(1)%matrix)
3094 CALL dbcsr_create(matrix=sinmat, template=matrix_s_aux_aux(1)%matrix)
3095 CALL dbcsr_create(matrix=tmp, &
3096 template=matrix_s_aux_orb(1)%matrix, &
3097 matrix_type=dbcsr_type_no_symmetry)
3098 CALL dbcsr_create(matrix=cosmat_desymm, &
3099 template=matrix_s_aux_aux(1)%matrix, &
3100 matrix_type=dbcsr_type_no_symmetry)
3101 CALL dbcsr_create(matrix=sinmat_desymm, &
3102 template=matrix_s_aux_aux(1)%matrix, &
3103 matrix_type=dbcsr_type_no_symmetry)
3104 CALL dbcsr_copy(cosmat, matrix_s_aux_aux(1)%matrix)
3105 CALL dbcsr_copy(sinmat, matrix_s_aux_aux(1)%matrix)
3106 CALL dbcsr_set(cosmat, 0.0_dp)
3107 CALL dbcsr_set(sinmat, 0.0_dp)
3113 CALL dbcsr_release_p(mat_mo_coeff_gamma_all)
3114 CALL dbcsr_release_p(mat_mo_coeff_gamma_occ_and_gw)
3116 NULLIFY (mat_mo_coeff_gamma_all)
3117 CALL dbcsr_init_p(mat_mo_coeff_gamma_all)
3118 CALL dbcsr_create(matrix=mat_mo_coeff_gamma_all, &
3119 template=matrix_s_aux_orb(1)%matrix, &
3120 matrix_type=dbcsr_type_no_symmetry)
3122 CALL dbcsr_copy(mat_mo_coeff_gamma_all, mat_mo_coeff_aux)
3124 NULLIFY (mat_mo_coeff_gamma_occ_and_gw)
3125 CALL dbcsr_init_p(mat_mo_coeff_gamma_occ_and_gw)
3126 CALL dbcsr_create(matrix=mat_mo_coeff_gamma_occ_and_gw, &
3127 template=matrix_s_aux_orb(1)%matrix, &
3128 matrix_type=dbcsr_type_no_symmetry)
3130 CALL dbcsr_copy(mat_mo_coeff_gamma_occ_and_gw, mat_mo_coeff_aux)
3132 DEALLOCATE (evals_p, evals_p_sqrt_inv)
3136 CALL remove_unnecessary_blocks(mat_mo_coeff_gamma_occ_and_gw, homo, gw_corr_lev_virt)
3140 ALLOCATE (matrix_berry_re_mo_mo(ikp)%matrix)
3141 CALL dbcsr_init_p(matrix_berry_re_mo_mo(ikp)%matrix)
3142 CALL dbcsr_create(matrix_berry_re_mo_mo(ikp)%matrix, &
3143 template=matrix_s(1)%matrix, &
3144 matrix_type=dbcsr_type_no_symmetry)
3145 CALL dbcsr_desymmetrize(matrix_s(1)%matrix, matrix_berry_re_mo_mo(ikp)%matrix)
3146 CALL dbcsr_set(matrix_berry_re_mo_mo(ikp)%matrix, 0.0_dp)
3148 ALLOCATE (matrix_berry_im_mo_mo(ikp)%matrix)
3149 CALL dbcsr_init_p(matrix_berry_im_mo_mo(ikp)%matrix)
3150 CALL dbcsr_create(matrix_berry_im_mo_mo(ikp)%matrix, &
3151 template=matrix_s(1)%matrix, &
3152 matrix_type=dbcsr_type_no_symmetry)
3153 CALL dbcsr_desymmetrize(matrix_s(1)%matrix, matrix_berry_im_mo_mo(ikp)%matrix)
3154 CALL dbcsr_set(matrix_berry_im_mo_mo(ikp)%matrix, 0.0_dp)
3156 correct_kpoint(1:3) = -
twopi*kpoints%xkp(1:3, ikp)
3158 abs_kpoint = sqrt(correct_kpoint(1)**2 + correct_kpoint(2)**2 + correct_kpoint(3)**2)
3160 IF (abs_kpoint < eps_kpoint)
THEN
3162 scale_kpoint = eps_kpoint/abs_kpoint
3163 correct_kpoint(:) = correct_kpoint(:)*scale_kpoint
3168 IF (do_aux_bas)
THEN
3170 basis_type=
"AUX_GW")
3176 IF (do_mo_coeff_gamma_only)
THEN
3178 CALL dbcsr_desymmetrize(cosmat, cosmat_desymm)
3180 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, cosmat_desymm, mat_mo_coeff_gamma_occ_and_gw, 0.0_dp, tmp, &
3181 filter_eps=1.0e-15_dp)
3183 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_gamma_all, tmp, 0.0_dp, &
3184 matrix_berry_re_mo_mo(ikp)%matrix, filter_eps=1.0e-15_dp)
3186 CALL dbcsr_desymmetrize(sinmat, sinmat_desymm)
3188 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, sinmat_desymm, mat_mo_coeff_gamma_occ_and_gw, 0.0_dp, tmp, &
3189 filter_eps=1.0e-15_dp)
3191 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_gamma_all, tmp, 0.0_dp, &
3192 matrix_berry_im_mo_mo(ikp)%matrix, filter_eps=1.0e-15_dp)
3198 mat_mo_coeff_re, keep_sparsity=.false.)
3201 mat_mo_coeff_im, keep_sparsity=.false.)
3203 CALL dbcsr_desymmetrize(cosmat, cosmat_desymm)
3205 CALL dbcsr_desymmetrize(sinmat, sinmat_desymm)
3208 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, cosmat_desymm, mat_mo_coeff_re, 0.0_dp, tmp)
3211 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_gamma_all, tmp, 0.0_dp, &
3212 matrix_berry_re_mo_mo(ikp)%matrix)
3215 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, sinmat_desymm, mat_mo_coeff_re, 0.0_dp, tmp)
3218 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_gamma_all, tmp, 0.0_dp, &
3219 matrix_berry_im_mo_mo(ikp)%matrix)
3222 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, cosmat_desymm, mat_mo_coeff_im, 0.0_dp, tmp)
3225 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, mat_mo_coeff_gamma_all, tmp, 1.0_dp, &
3226 matrix_berry_im_mo_mo(ikp)%matrix)
3229 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, sinmat_desymm, mat_mo_coeff_im, 0.0_dp, tmp)
3232 CALL dbcsr_multiply(
'T',
'N', -1.0_dp, mat_mo_coeff_gamma_all, tmp, 1.0_dp, &
3233 matrix_berry_re_mo_mo(ikp)%matrix)
3237 IF (abs_kpoint < eps_kpoint)
THEN
3239 CALL dbcsr_scale(matrix_berry_im_mo_mo(ikp)%matrix, 1.0_dp/scale_kpoint)
3240 CALL dbcsr_set(matrix_berry_re_mo_mo(ikp)%matrix, 0.0_dp)
3241 CALL dbcsr_add_on_diag(matrix_berry_re_mo_mo(ikp)%matrix, 1.0_dp)
3247 CALL dbcsr_release_p(cosmat)
3248 CALL dbcsr_release_p(sinmat)
3249 CALL dbcsr_release_p(mat_mo_coeff_re)
3250 CALL dbcsr_release_p(mat_mo_coeff_im)
3251 CALL dbcsr_release_p(mat_mo_coeff_gamma_all)
3252 CALL dbcsr_release_p(mat_mo_coeff_gamma_occ_and_gw)
3253 CALL dbcsr_release_p(tmp)
3254 CALL dbcsr_release_p(cosmat_desymm)
3255 CALL dbcsr_release_p(sinmat_desymm)
3256 DEALLOCATE (orb_basis_set_list)
3260 IF (do_aux_bas)
THEN
3262 DEALLOCATE (gw_aux_basis_set_list)
3265 CALL dbcsr_release_p(mat_work_aux_orb)
3266 CALL dbcsr_release_p(mat_work_aux_orb_2)
3267 CALL dbcsr_release_p(mat_mo_coeff_aux)
3268 CALL dbcsr_release_p(mat_mo_coeff_aux_2)
3269 CALL dbcsr_release_p(matrix_s_inv_aux_aux)
3270 CALL dbcsr_release_p(matrix_p)
3271 CALL dbcsr_release_p(matrix_p_sqrt)
3272 CALL dbcsr_release_p(matrix_p_sqrt_inv)
3276 CALL cp_fm_release(fm_mat_s_aux_aux_inv)
3277 CALL cp_fm_release(fm_mat_work_aux_aux)
3278 CALL cp_fm_release(fm_mat_p)
3279 CALL cp_fm_release(fm_mat_eigv_p)
3280 CALL cp_fm_release(fm_mat_scaled_eigv_p)
3281 CALL cp_fm_release(fm_mat_p_sqrt_inv)
3289 CALL timestop(handle)
3291 END SUBROUTINE get_berry_phase
3299 SUBROUTINE remove_unnecessary_blocks(mat_mo_coeff_Gamma_occ_and_GW, homo, gw_corr_lev_virt)
3301 TYPE(dbcsr_type),
POINTER :: mat_mo_coeff_gamma_occ_and_gw
3302 INTEGER,
INTENT(IN) :: homo, gw_corr_lev_virt
3304 INTEGER :: col, col_offset, row
3305 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
3306 TYPE(dbcsr_iterator_type) :: iter
3308 CALL dbcsr_iterator_start(iter, mat_mo_coeff_gamma_occ_and_gw)
3310 DO WHILE (dbcsr_iterator_blocks_left(iter))
3312 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
3313 col_offset=col_offset)
3315 IF (col_offset > homo + gw_corr_lev_virt)
THEN
3323 CALL dbcsr_iterator_stop(iter)
3325 CALL dbcsr_filter(mat_mo_coeff_gamma_occ_and_gw, 1.0e-15_dp)
3327 END SUBROUTINE remove_unnecessary_blocks
3343 SUBROUTINE kpoint_sum_for_eps_inv_head_berry(delta_corr, eps_inv_head, kpoints, qs_env, matrix_berry_re_mo_mo, &
3344 matrix_berry_im_mo_mo, homo, gw_corr_lev_occ, gw_corr_lev_virt, &
3345 para_env_RPA, do_extra_kpoints)
3347 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
3348 INTENT(INOUT) :: delta_corr
3349 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eps_inv_head
3350 TYPE(kpoint_type),
POINTER :: kpoints
3351 TYPE(qs_environment_type),
POINTER :: qs_env
3352 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_berry_re_mo_mo, &
3353 matrix_berry_im_mo_mo
3354 INTEGER,
INTENT(IN) :: homo, gw_corr_lev_occ, gw_corr_lev_virt
3355 TYPE(mp_para_env_type),
INTENT(IN),
OPTIONAL :: para_env_rpa
3356 LOGICAL,
INTENT(IN) :: do_extra_kpoints
3358 INTEGER :: col, col_offset, col_size, i_col, i_row, &
3359 ikp, m_level, n_level_gw, nkp, row, &
3360 row_offset, row_size
3361 REAL(kind=
dp) :: abs_k_square, cell_volume, &
3362 check_int_one_over_ksq, contribution, &
3364 REAL(kind=
dp),
DIMENSION(3) :: correct_kpoint
3365 REAL(kind=
dp),
DIMENSION(:),
POINTER :: delta_corr_extra
3366 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
3367 TYPE(cell_type),
POINTER :: cell
3368 TYPE(dbcsr_iterator_type) :: iter, iter_new
3372 CALL get_cell(cell=cell, deth=cell_volume)
3378 IF (do_extra_kpoints)
THEN
3379 NULLIFY (delta_corr_extra)
3380 ALLOCATE (delta_corr_extra(1 + homo - gw_corr_lev_occ:homo + gw_corr_lev_virt))
3381 delta_corr_extra = 0.0_dp
3384 check_int_one_over_ksq = 0.0_dp
3388 weight = kpoints%wkp(ikp)
3390 correct_kpoint(1:3) =
twopi*kpoints%xkp(1:3, ikp)
3392 abs_k_square = (correct_kpoint(1))**2 + (correct_kpoint(2))**2 + (correct_kpoint(3))**2
3395 CALL dbcsr_iterator_start(iter, matrix_berry_re_mo_mo(ikp)%matrix)
3396 DO WHILE (dbcsr_iterator_blocks_left(iter))
3398 CALL dbcsr_iterator_next_block(iter, row, col, data_block, &
3399 row_size=row_size, col_size=col_size, &
3400 row_offset=row_offset, col_offset=col_offset)
3402 DO i_col = 1, col_size
3404 DO n_level_gw = 1 + homo - gw_corr_lev_occ, homo + gw_corr_lev_virt
3406 IF (n_level_gw == i_col + col_offset - 1)
THEN
3408 DO i_row = 1, row_size
3410 contribution = weight*(eps_inv_head(ikp) - 1.0_dp)/abs_k_square*(data_block(i_row, i_col))**2
3412 m_level = i_row + row_offset - 1
3415 IF (m_level .NE. n_level_gw) cycle
3417 IF (.NOT. do_extra_kpoints)
THEN
3419 delta_corr(n_level_gw) = delta_corr(n_level_gw) + contribution
3423 IF (ikp <= nkp*8/9)
THEN
3425 delta_corr(n_level_gw) = delta_corr(n_level_gw) + contribution
3429 delta_corr_extra(n_level_gw) = delta_corr_extra(n_level_gw) + contribution
3445 CALL dbcsr_iterator_stop(iter)
3448 CALL dbcsr_iterator_start(iter_new, matrix_berry_im_mo_mo(ikp)%matrix)
3449 DO WHILE (dbcsr_iterator_blocks_left(iter_new))
3451 CALL dbcsr_iterator_next_block(iter_new, row, col, data_block, &
3452 row_size=row_size, col_size=col_size, &
3453 row_offset=row_offset, col_offset=col_offset)
3455 DO i_col = 1, col_size
3457 DO n_level_gw = 1 + homo - gw_corr_lev_occ, homo + gw_corr_lev_virt
3459 IF (n_level_gw == i_col + col_offset - 1)
THEN
3461 DO i_row = 1, row_size
3463 m_level = i_row + row_offset - 1
3465 contribution = weight*(eps_inv_head(ikp) - 1.0_dp)/abs_k_square*(data_block(i_row, i_col))**2
3468 IF (m_level .NE. n_level_gw) cycle
3470 IF (.NOT. do_extra_kpoints)
THEN
3472 delta_corr(n_level_gw) = delta_corr(n_level_gw) + contribution
3476 IF (ikp <= nkp*8/9)
THEN
3478 delta_corr(n_level_gw) = delta_corr(n_level_gw) + contribution
3482 delta_corr_extra(n_level_gw) = delta_corr_extra(n_level_gw) + contribution
3498 CALL dbcsr_iterator_stop(iter_new)
3500 check_int_one_over_ksq = check_int_one_over_ksq + weight/abs_k_square
3505 delta_corr = delta_corr/cell_volume*
fourpi
3507 check_int_one_over_ksq = check_int_one_over_ksq/cell_volume
3509 CALL para_env_rpa%sum(delta_corr)
3511 IF (do_extra_kpoints)
THEN
3513 delta_corr_extra = delta_corr_extra/cell_volume*
fourpi
3515 CALL para_env_rpa%sum(delta_corr_extra)
3517 delta_corr(:) = delta_corr(:) + (delta_corr(:) - delta_corr_extra(:))
3519 DEALLOCATE (delta_corr_extra)
3523 END SUBROUTINE kpoint_sum_for_eps_inv_head_berry
3531 SUBROUTINE compute_eps_inv_head(eps_inv_head, eps_head, kpoints)
3532 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
3533 INTENT(OUT) :: eps_inv_head
3534 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eps_head
3535 TYPE(kpoint_type),
POINTER :: kpoints
3537 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_eps_inv_head'
3539 INTEGER :: handle, ikp, nkp
3541 CALL timeset(routinen, handle)
3545 ALLOCATE (eps_inv_head(nkp))
3549 eps_inv_head(ikp) = 1.0_dp/eps_head(ikp)
3553 CALL timestop(handle)
3555 END SUBROUTINE compute_eps_inv_head
3569 SUBROUTINE get_kpoints(qs_env, kpoints, kp_grid, num_kp_grids, para_env, h_inv, nmo, &
3570 do_mo_coeff_Gamma_only, do_extra_kpoints)
3571 TYPE(qs_environment_type),
POINTER :: qs_env
3572 TYPE(kpoint_type),
POINTER :: kpoints
3573 INTEGER,
DIMENSION(:),
POINTER :: kp_grid
3574 INTEGER,
INTENT(IN) :: num_kp_grids
3575 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
3576 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT) :: h_inv
3577 INTEGER,
INTENT(IN) :: nmo
3578 LOGICAL,
INTENT(IN) :: do_mo_coeff_gamma_only, do_extra_kpoints
3580 INTEGER :: end_kp, i, i_grid_level, ix, iy, iz, &
3581 nkp_inner_grid, nkp_outer_grid, &
3583 INTEGER,
DIMENSION(3) :: outer_kp_grid
3584 REAL(kind=
dp) :: kpoint_weight_left, single_weight
3585 REAL(kind=
dp),
DIMENSION(3) :: kpt_latt, reducing_factor
3586 TYPE(cell_type),
POINTER :: cell
3587 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
3589 NULLIFY (kpoints, cell, particle_set)
3592 cpassert(mod(kp_grid(1)*kp_grid(2)*kp_grid(3), 2) == 0)
3593 IF (do_extra_kpoints)
THEN
3594 cpassert(do_mo_coeff_gamma_only)
3597 IF (do_mo_coeff_gamma_only)
THEN
3599 outer_kp_grid(1) = kp_grid(1) - 1
3600 outer_kp_grid(2) = kp_grid(2) - 1
3601 outer_kp_grid(3) = kp_grid(3) - 1
3603 CALL get_qs_env(qs_env=qs_env, cell=cell, particle_set=particle_set)
3609 kpoints%kp_scheme =
"GENERAL"
3610 kpoints%symmetry = .false.
3611 kpoints%verbose = .false.
3612 kpoints%full_grid = .false.
3613 kpoints%use_real_wfn = .false.
3614 kpoints%eps_geo = 1.e-6_dp
3615 npoints = kp_grid(1)*kp_grid(2)*kp_grid(3)/2 + &
3616 (num_kp_grids - 1)*((outer_kp_grid(1) + 1)/2*outer_kp_grid(2)*outer_kp_grid(3) - 1)
3618 IF (do_extra_kpoints)
THEN
3620 cpassert(num_kp_grids == 1)
3621 cpassert(mod(kp_grid(1), 4) == 0)
3622 cpassert(mod(kp_grid(2), 4) == 0)
3623 cpassert(mod(kp_grid(3), 4) == 0)
3627 IF (do_extra_kpoints)
THEN
3629 npoints = kp_grid(1)*kp_grid(2)*kp_grid(3)/2 + kp_grid(1)*kp_grid(2)*kp_grid(3)/2/8
3633 kpoints%full_grid = .true.
3634 kpoints%nkp = npoints
3635 ALLOCATE (kpoints%xkp(3, npoints), kpoints%wkp(npoints))
3636 kpoints%xkp = 0.0_dp
3637 kpoints%wkp = 0.0_dp
3639 nkp_outer_grid = outer_kp_grid(1)*outer_kp_grid(2)*outer_kp_grid(3)
3640 nkp_inner_grid = kp_grid(1)*kp_grid(2)*kp_grid(3)
3643 reducing_factor(:) = 1.0_dp
3644 kpoint_weight_left = 1.0_dp
3647 DO i_grid_level = 1, num_kp_grids - 1
3649 single_weight = kpoint_weight_left/real(nkp_outer_grid, kind=
dp)
3653 DO ix = 1, outer_kp_grid(1)
3654 DO iy = 1, outer_kp_grid(2)
3655 DO iz = 1, outer_kp_grid(3)
3658 IF (2*ix - outer_kp_grid(1) - 1 == 0 .AND. 2*iy - outer_kp_grid(2) - 1 == 0 .AND. &
3659 2*iz - outer_kp_grid(3) - 1 == 0) cycle
3662 IF (2*ix - outer_kp_grid(1) - 1 < 0) cycle
3665 kpt_latt(1) = real(2*ix - outer_kp_grid(1) - 1, kind=
dp)/(2._dp*real(outer_kp_grid(1), kind=
dp)) &
3667 kpt_latt(2) = real(2*iy - outer_kp_grid(2) - 1, kind=
dp)/(2._dp*real(outer_kp_grid(2), kind=
dp)) &
3669 kpt_latt(3) = real(2*iz - outer_kp_grid(3) - 1, kind=
dp)/(2._dp*real(outer_kp_grid(3), kind=
dp)) &
3671 kpoints%xkp(1:3, i) = matmul(transpose(h_inv), kpt_latt(:))
3673 IF (2*ix - outer_kp_grid(1) - 1 == 0)
THEN
3674 kpoints%wkp(i) = single_weight
3676 kpoints%wkp(i) = 2._dp*single_weight
3685 kpoint_weight_left = kpoint_weight_left - sum(kpoints%wkp(start_kp:end_kp))
3687 reducing_factor(1) = reducing_factor(1)/real(outer_kp_grid(1), kind=
dp)
3688 reducing_factor(2) = reducing_factor(2)/real(outer_kp_grid(2), kind=
dp)
3689 reducing_factor(3) = reducing_factor(3)/real(outer_kp_grid(3), kind=
dp)
3693 single_weight = kpoint_weight_left/real(nkp_inner_grid, kind=
dp)
3696 DO ix = 1, kp_grid(1)
3697 DO iy = 1, kp_grid(2)
3698 DO iz = 1, kp_grid(3)
3701 IF (2*ix - kp_grid(1) - 1 < 0) cycle
3704 kpt_latt(1) = real(2*ix - kp_grid(1) - 1, kind=
dp)/(2._dp*real(kp_grid(1), kind=
dp))*reducing_factor(1)
3705 kpt_latt(2) = real(2*iy - kp_grid(2) - 1, kind=
dp)/(2._dp*real(kp_grid(2), kind=
dp))*reducing_factor(2)
3706 kpt_latt(3) = real(2*iz - kp_grid(3) - 1, kind=
dp)/(2._dp*real(kp_grid(3), kind=
dp))*reducing_factor(3)
3708 kpoints%xkp(1:3, i) = matmul(transpose(h_inv), kpt_latt(:))
3710 kpoints%wkp(i) = 2._dp*single_weight
3716 IF (do_extra_kpoints)
THEN
3718 single_weight = kpoint_weight_left/real(kp_grid(1)*kp_grid(2)*kp_grid(3)/8, kind=
dp)
3720 DO ix = 1, kp_grid(1)/2
3721 DO iy = 1, kp_grid(2)/2
3722 DO iz = 1, kp_grid(3)/2
3725 IF (2*ix - kp_grid(1)/2 - 1 < 0) cycle
3728 kpt_latt(1) = real(2*ix - kp_grid(1)/2 - 1, kind=
dp)/(real(kp_grid(1), kind=
dp))
3729 kpt_latt(2) = real(2*iy - kp_grid(2)/2 - 1, kind=
dp)/(real(kp_grid(2), kind=
dp))
3730 kpt_latt(3) = real(2*iz - kp_grid(3)/2 - 1, kind=
dp)/(real(kp_grid(3), kind=
dp))
3732 kpoints%xkp(1:3, i) = matmul(transpose(h_inv), kpt_latt(:))
3734 kpoints%wkp(i) = 2._dp*single_weight
3743 ALLOCATE (kpoints%kp_sym(kpoints%nkp))
3744 DO i = 1, kpoints%nkp
3745 NULLIFY (kpoints%kp_sym(i)%kpoint_sym)
3752 TYPE(qs_environment_type),
POINTER :: qs_env_kp_gamma_only
3755 CALL get_qs_env(qs_env=qs_env, cell=cell, particle_set=particle_set)
3757 CALL calculate_kp_orbitals(qs_env_kp_gamma_only, kpoints,
"MONKHORST-PACK", nadd=nmo, mp_grid=kp_grid(1:3), &
3758 group_size_ext=para_env%num_pe)
3761 DEALLOCATE (qs_env_kp_gamma_only)
3766 END SUBROUTINE get_kpoints
3774 PURE SUBROUTINE average_degenerate_levels(vec_Sigma_c_gw, Eigenval_DFT, eps_eigenval)
3775 COMPLEX(KIND=dp),
DIMENSION(:, :, :), &
3776 INTENT(INOUT) :: vec_sigma_c_gw
3777 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: eigenval_dft
3778 REAL(kind=dp),
INTENT(IN) :: eps_eigenval
3780 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: avg_self_energy
3781 INTEGER :: degeneracy, first_degenerate_level, i_deg_level, i_level_gw, j_deg_level, jquad, &
3782 num_deg_levels, num_integ_points, num_levels_gw
3783 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: list_degenerate_levels
3785 num_levels_gw =
SIZE(vec_sigma_c_gw, 1)
3787 ALLOCATE (list_degenerate_levels(num_levels_gw))
3788 list_degenerate_levels = 1
3790 num_integ_points =
SIZE(vec_sigma_c_gw, 2)
3792 ALLOCATE (avg_self_energy(num_integ_points))
3794 DO i_level_gw = 2, num_levels_gw
3796 IF (abs(eigenval_dft(i_level_gw) - eigenval_dft(i_level_gw - 1)) < eps_eigenval)
THEN
3798 list_degenerate_levels(i_level_gw) = list_degenerate_levels(i_level_gw - 1)
3802 list_degenerate_levels(i_level_gw) = list_degenerate_levels(i_level_gw - 1) + 1
3808 num_deg_levels = list_degenerate_levels(num_levels_gw)
3810 DO i_deg_level = 1, num_deg_levels
3814 DO i_level_gw = 1, num_levels_gw
3816 IF (degeneracy == 0 .AND. i_deg_level == list_degenerate_levels(i_level_gw))
THEN
3818 first_degenerate_level = i_level_gw
3822 IF (i_deg_level == list_degenerate_levels(i_level_gw))
THEN
3824 degeneracy = degeneracy + 1
3830 DO jquad = 1, num_integ_points
3832 avg_self_energy(jquad) = sum(vec_sigma_c_gw(first_degenerate_level:first_degenerate_level + degeneracy - 1, jquad, 1)) &
3833 /real(degeneracy, kind=dp)
3837 DO j_deg_level = 0, degeneracy - 1
3839 vec_sigma_c_gw(first_degenerate_level + j_deg_level, :, 1) = avg_self_energy(:)
3845 END SUBROUTINE average_degenerate_levels
3867 SUBROUTINE fit_and_continuation_2pole(vec_gw_energ, vec_omega_fit_gw, &
3868 z_value, m_value, vec_Sigma_c_gw, vec_Sigma_x_minus_vxc_gw, &
3869 Eigenval, Eigenval_scf, n_level_gw, gw_corr_lev_occ, num_poles, &
3870 num_fit_points, crossing_search, homo, stop_crit, &
3871 fermi_level_offset, do_gw_im_time)
3873 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: vec_gw_energ, vec_omega_fit_gw, z_value, &
3875 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN) :: vec_sigma_c_gw
3876 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: vec_sigma_x_minus_vxc_gw, eigenval, &
3878 INTEGER,
INTENT(IN) :: n_level_gw, gw_corr_lev_occ, num_poles, &
3879 num_fit_points, crossing_search, homo
3880 REAL(kind=dp),
INTENT(IN) :: stop_crit, fermi_level_offset
3881 LOGICAL,
INTENT(IN) :: do_gw_im_time
3883 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fit_and_continuation_2pole'
3885 COMPLEX(KIND=dp) :: func_val, rho1
3886 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: dlambda, dlambda_2, lambda, &
3887 lambda_without_offset, vec_b_gw, &
3889 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: mat_a_gw, mat_b_gw
3890 INTEGER :: handle4, ierr, iii, iiter, info, &
3891 integ_range, jjj, jquad, kkk, &
3892 max_iter_fit, n_level_gw_ref, num_var, &
3894 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
3895 LOGICAL :: could_exit
3896 REAL(kind=dp) :: chi2, chi2_old, delta, deriv_val_real, e_fermi, gw_energ, ldown, &
3897 level_energ_gw, lup, range_step, scalparam, sign_occ_virt, stat_error
3898 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: lambda_im, lambda_re, stat_errors, &
3899 vec_n_gw, vec_omega_fit_gw_sign
3900 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: mat_n_gw
3902 max_iter_fit = 10000
3904 num_var = 2*num_poles + 1
3905 ALLOCATE (lambda(num_var))
3907 ALLOCATE (lambda_without_offset(num_var))
3908 lambda_without_offset = z_zero
3909 ALLOCATE (lambda_re(num_var))
3911 ALLOCATE (lambda_im(num_var))
3914 ALLOCATE (vec_omega_fit_gw_sign(num_fit_points))
3916 IF (n_level_gw <= gw_corr_lev_occ)
THEN
3917 sign_occ_virt = -1.0_dp
3919 sign_occ_virt = 1.0_dp
3922 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
3924 DO jquad = 1, num_fit_points
3925 vec_omega_fit_gw_sign(jquad) = abs(vec_omega_fit_gw(jquad))*sign_occ_virt
3929 range_step = (vec_omega_fit_gw_sign(num_fit_points) - vec_omega_fit_gw_sign(1))/(num_poles - 1)
3930 DO iii = 1, num_poles
3931 lambda_im(2*iii + 1) = vec_omega_fit_gw_sign(1) + (iii - 1)*range_step
3933 range_step = (vec_omega_fit_gw_sign(num_fit_points) - vec_omega_fit_gw_sign(1))/num_poles
3934 DO iii = 1, num_poles
3935 lambda_re(2*iii + 1) = abs(vec_omega_fit_gw_sign(1) + (iii - 0.5_dp)*range_step)
3939 lambda(iii) = lambda_re(iii) + gaussi*lambda_im(iii)
3942 CALL calc_chi2(chi2_old, lambda, vec_sigma_c_gw, vec_omega_fit_gw_sign, num_poles, &
3943 num_fit_points, n_level_gw)
3945 ALLOCATE (mat_a_gw(num_poles + 1, num_poles + 1))
3946 ALLOCATE (vec_b_gw(num_poles + 1))
3947 ALLOCATE (ipiv(num_poles + 1))
3951 mat_a_gw(1:num_poles + 1, 1) = z_one
3952 integ_range = num_fit_points/num_poles
3953 DO kkk = 1, num_poles + 1
3954 xpos = (kkk - 1)*integ_range + 1
3955 xpos = min(xpos, num_fit_points)
3957 DO iii = 1, num_poles
3959 func_val = z_one/(gaussi*vec_omega_fit_gw_sign(xpos) - &
3960 cmplx(lambda_re(jjj + 1), lambda_im(jjj + 1), kind=dp))
3961 mat_a_gw(kkk, iii + 1) = func_val
3963 vec_b_gw(kkk) = vec_sigma_c_gw(n_level_gw, xpos)
3967 CALL zgetrf(num_poles + 1, num_poles + 1, mat_a_gw, num_poles + 1, ipiv, info)
3969 CALL zgetrs(
'N', num_poles + 1, 1, mat_a_gw, num_poles + 1, ipiv, vec_b_gw, num_poles + 1, info)
3971 lambda_re(1) = real(vec_b_gw(1))
3972 lambda_im(1) = aimag(vec_b_gw(1))
3973 DO iii = 1, num_poles
3975 lambda_re(jjj) = real(vec_b_gw(iii + 1))
3976 lambda_im(jjj) = aimag(vec_b_gw(iii + 1))
3979 DEALLOCATE (mat_a_gw)
3980 DEALLOCATE (vec_b_gw)
3983 ALLOCATE (mat_a_gw(num_var*2, num_var*2))
3984 ALLOCATE (mat_b_gw(num_fit_points, num_var*2))
3985 ALLOCATE (dlambda(num_fit_points))
3986 ALLOCATE (dlambda_2(num_fit_points))
3987 ALLOCATE (vec_b_gw(num_var*2))
3988 ALLOCATE (vec_b_gw_copy(num_var*2))
3989 ALLOCATE (ipiv(num_var*2))
3994 could_exit = .false.
3997 DO iiter = 1, max_iter_fit
3999 CALL timeset(routinen//
"_fit_loop_1", handle4)
4003 lambda(iii) = lambda_re(iii) + gaussi*lambda_im(iii)
4007 DO kkk = 1, num_fit_points
4008 func_val = lambda(1)
4009 DO iii = 1, num_poles
4011 func_val = func_val + lambda(jjj)/(vec_omega_fit_gw_sign(kkk)*gaussi - lambda(jjj + 1))
4013 dlambda(kkk) = vec_sigma_c_gw(n_level_gw, kkk) - func_val
4015 rho1 = sum(dlambda*dlambda)
4019 DO iii = 1, num_fit_points
4020 mat_b_gw(iii, 1) = 1.0_dp
4021 mat_b_gw(iii, num_var + 1) = gaussi
4023 DO iii = 1, num_poles
4025 DO kkk = 1, num_fit_points
4026 mat_b_gw(kkk, jjj) = 1.0_dp/(gaussi*vec_omega_fit_gw_sign(kkk) - lambda(jjj + 1))
4027 mat_b_gw(kkk, jjj + num_var) = gaussi/(gaussi*vec_omega_fit_gw_sign(kkk) - lambda(jjj + 1))
4028 mat_b_gw(kkk, jjj + 1) = lambda(jjj)/(gaussi*vec_omega_fit_gw_sign(kkk) - lambda(jjj + 1))**2
4029 mat_b_gw(kkk, jjj + 1 + num_var) = (-lambda_im(jjj) + gaussi*lambda_re(jjj))/ &
4030 (gaussi*vec_omega_fit_gw_sign(kkk) - lambda(jjj + 1))**2
4034 CALL timestop(handle4)
4036 CALL timeset(routinen//
"_fit_matmul_1", handle4)
4038 CALL zgemm(
'C',
'N', num_var*2, num_var*2, num_fit_points, z_one, mat_b_gw, num_fit_points, mat_b_gw, num_fit_points, &
4039 z_zero, mat_a_gw, num_var*2)
4040 CALL timestop(handle4)
4042 CALL timeset(routinen//
"_fit_zgemv_1", handle4)
4043 CALL zgemv(
'C', num_fit_points, num_var*2, z_one, mat_b_gw, num_fit_points, dlambda, 1, &
4044 z_zero, vec_b_gw, 1)
4046 CALL timestop(handle4)
4049 DO iii = 1, num_var*2
4050 mat_a_gw(iii, iii) = mat_a_gw(iii, iii) + scalparam*mat_a_gw(iii, iii)
4057 CALL timeset(routinen//
"_fit_lin_eq_2", handle4)
4059 CALL zgetrf(2*num_var, 2*num_var, mat_a_gw, 2*num_var, ipiv, info)
4061 CALL zgetrs(
'N', 2*num_var, 1, mat_a_gw, 2*num_var, ipiv, vec_b_gw, 2*num_var, info)
4063 CALL timestop(handle4)
4066 lambda(iii) = lambda_re(iii) + gaussi*lambda_im(iii) + vec_b_gw(iii) + vec_b_gw(iii + num_var)
4070 CALL calc_chi2(chi2, lambda, vec_sigma_c_gw, vec_omega_fit_gw_sign, num_poles, &
4071 num_fit_points, n_level_gw)
4074 IF (chi2 < 1.0e-30_dp)
EXIT
4076 IF (chi2 < chi2_old)
THEN
4077 scalparam = max(scalparam/ldown, 1e-12_dp)
4079 lambda_re(iii) = lambda_re(iii) + real(vec_b_gw(iii) + vec_b_gw(iii + num_var))
4080 lambda_im(iii) = lambda_im(iii) + aimag(vec_b_gw(iii) + vec_b_gw(iii + num_var))
4082 IF (chi2_old/chi2 - 1.0_dp < stop_crit) could_exit = .true.
4085 scalparam = scalparam*lup
4087 IF (scalparam > 100.0_dp .AND. could_exit)
EXIT
4089 IF (scalparam > 1e+10_dp) scalparam = 1e-4_dp
4093 IF (.NOT. do_gw_im_time)
THEN
4097 func_val = lambda(1)
4098 DO iii = 1, num_poles
4101 func_val = func_val + lambda(jjj)/(-lambda(jjj + 1))
4104 lambda_re(1) = lambda_re(1) - real(func_val) + real(vec_sigma_c_gw(n_level_gw, num_fit_points))
4105 lambda_im(1) = lambda_im(1) - aimag(func_val) + aimag(vec_sigma_c_gw(n_level_gw, num_fit_points))
4109 lambda_without_offset(:) = lambda(:)
4112 lambda(iii) = cmplx(lambda_re(iii), lambda_im(iii), kind=dp)
4115 IF (do_gw_im_time)
THEN
4118 e_fermi = 0.5_dp*(eigenval(homo) + eigenval(homo + 1))
4122 IF (n_level_gw <= gw_corr_lev_occ)
THEN
4123 e_fermi = eigenval(homo) + fermi_level_offset
4125 e_fermi = eigenval(homo + 1) - fermi_level_offset
4130 IF (crossing_search == ri_rpa_g0w0_crossing_z_shot .OR. &
4131 crossing_search == ri_rpa_g0w0_crossing_newton)
THEN
4134 func_val = lambda(1)
4135 z_value(n_level_gw) = 1.0_dp
4136 DO iii = 1, num_poles
4138 z_value(n_level_gw) = z_value(n_level_gw) + real(lambda(jjj)/ &
4139 (eigenval(n_level_gw_ref) - e_fermi - lambda(jjj + 1))**2)
4140 func_val = func_val + lambda(jjj)/(eigenval(n_level_gw_ref) - e_fermi - lambda(jjj + 1))
4143 m_value(n_level_gw) = 1.0_dp - z_value(n_level_gw)
4144 z_value(n_level_gw) = 1.0_dp/z_value(n_level_gw)
4145 gw_energ = real(func_val)
4146 vec_gw_energ(n_level_gw) = gw_energ
4149 IF (crossing_search == ri_rpa_g0w0_crossing_newton)
THEN
4151 level_energ_gw = (eigenval_scf(n_level_gw_ref) - &
4152 m_value(n_level_gw)*eigenval(n_level_gw_ref) + &
4153 vec_gw_energ(n_level_gw) + &
4154 vec_sigma_x_minus_vxc_gw(n_level_gw_ref))* &
4161 func_val = lambda(1)
4162 z_value(n_level_gw) = 1.0_dp
4163 DO iii = 1, num_poles
4165 func_val = func_val + lambda(jjj)/(level_energ_gw - e_fermi - lambda(jjj + 1))
4169 deriv_val_real = -1.0_dp
4170 DO iii = 1, num_poles
4172 deriv_val_real = deriv_val_real + real(lambda(jjj))/((abs(level_energ_gw - e_fermi - lambda(jjj + 1)))**2) &
4173 - (real(lambda(jjj))*(level_energ_gw - e_fermi) - real(lambda(jjj)*conjg(lambda(jjj + 1))))* &
4174 2.0_dp*(level_energ_gw - e_fermi - real(lambda(jjj + 1)))/ &
4175 ((abs(level_energ_gw - e_fermi - lambda(jjj + 1)))**2)
4179 delta = (eigenval_scf(n_level_gw_ref) + vec_sigma_x_minus_vxc_gw(n_level_gw_ref) + real(func_val) - level_energ_gw)/ &
4182 level_energ_gw = level_energ_gw - delta
4184 IF (abs(delta) < 1.0e-08)
EXIT
4190 vec_gw_energ(n_level_gw) = real(func_val)
4191 z_value(n_level_gw) = 1.0_dp
4192 m_value(n_level_gw) = 0.0_dp
4197 cpabort(
"Only NONE, ZSHOT and NEWTON implemented for 2-pole model")
4207 CALL calc_chi2(chi2, lambda_without_offset, vec_sigma_c_gw, vec_omega_fit_gw_sign, num_poles, &
4208 num_fit_points, n_level_gw)
4211 stat_error = sqrt(chi2/num_fit_points)
4214 ALLOCATE (vec_n_gw(num_var*2))
4217 ALLOCATE (mat_n_gw(num_var*2, num_var*2))
4220 DO iii = 1, num_var*2
4221 CALL calc_mat_n(vec_n_gw(iii), lambda_without_offset, vec_sigma_c_gw, vec_omega_fit_gw_sign, &
4222 iii, iii, num_poles, num_fit_points, n_level_gw, 0.001_dp)
4225 DO iii = 1, num_var*2
4226 DO jjj = 1, num_var*2
4227 CALL calc_mat_n(mat_n_gw(iii, jjj), lambda_without_offset, vec_sigma_c_gw, vec_omega_fit_gw_sign, &
4228 iii, jjj, num_poles, num_fit_points, n_level_gw, 0.001_dp)
4232 CALL dgetrf(2*num_var, 2*num_var, mat_n_gw, 2*num_var, ipiv, info)
4235 CALL dgetri(2*num_var, mat_n_gw, 2*num_var, ipiv, vec_b_gw, 2*num_var, info)
4237 ALLOCATE (stat_errors(2*num_var))
4238 stat_errors = 0.0_dp
4240 DO iii = 1, 2*num_var
4241 stat_errors(iii) = sqrt(abs(mat_n_gw(iii, iii)))*stat_error
4244 DEALLOCATE (mat_n_gw)
4245 DEALLOCATE (vec_n_gw)
4246 DEALLOCATE (mat_a_gw)
4247 DEALLOCATE (mat_b_gw)
4248 DEALLOCATE (stat_errors)
4249 DEALLOCATE (dlambda)
4250 DEALLOCATE (dlambda_2)
4251 DEALLOCATE (vec_b_gw)
4252 DEALLOCATE (vec_b_gw_copy)
4254 DEALLOCATE (vec_omega_fit_gw_sign)
4256 DEALLOCATE (lambda_without_offset)
4257 DEALLOCATE (lambda_re)
4258 DEALLOCATE (lambda_im)
4260 END SUBROUTINE fit_and_continuation_2pole
4293 z_value, m_value, vec_Sigma_c_gw, vec_Sigma_x_minus_vxc_gw, &
4294 Eigenval, Eigenval_scf, n_level_gw, gw_corr_lev_occ, nparam_pade, &
4295 num_fit_points, crossing_search, homo, &
4296 fermi_level_offset, do_gw_im_time, print_self_energy, count_ev_sc_GW, &
4297 vec_gw_dos, dos_lower_bound, dos_precision, ndos, &
4298 min_level_self_energy, max_level_self_energy, dos_eta, dos_min, dos_max)
4301 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: vec_gw_energ
4302 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: vec_omega_fit_gw
4303 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: z_value, m_value
4304 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN) :: vec_sigma_c_gw
4305 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: vec_sigma_x_minus_vxc_gw, eigenval, &
4307 INTEGER,
INTENT(IN) :: n_level_gw, gw_corr_lev_occ, &
4308 nparam_pade, num_fit_points, &
4309 crossing_search, homo
4310 REAL(kind=dp),
INTENT(IN) :: fermi_level_offset
4311 LOGICAL,
INTENT(IN) :: do_gw_im_time, print_self_energy
4312 INTEGER,
INTENT(IN) :: count_ev_sc_gw
4313 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:),
OPTIONAL :: vec_gw_dos
4314 REAL(kind=dp),
OPTIONAL :: dos_lower_bound, dos_precision
4315 INTEGER,
INTENT(IN),
OPTIONAL :: ndos, min_level_self_energy, &
4316 max_level_self_energy
4317 REAL(kind=dp),
OPTIONAL :: dos_eta
4318 INTEGER,
INTENT(IN),
OPTIONAL :: dos_min, dos_max
4320 CHARACTER(LEN=*),
PARAMETER :: routinen =
'continuation_pade'
4322 CHARACTER(LEN=5) :: string_level
4323 CHARACTER(len=default_path_length) :: filename
4324 COMPLEX(KIND=dp) :: sigma_c_pade, sigma_c_pade_im_freq
4325 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: coeff_pade, omega_points_pade, &
4327 INTEGER :: handle, i_omega, idos, iunit, jquad, &
4328 n_level_gw_ref, num_omega
4329 REAL(kind=dp) :: e_fermi, energy_val, level_energ_gw, &
4330 omega, omega_dos, omega_dos_pade_eval, &
4332 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: vec_omega_fit_gw_sign, &
4333 vec_omega_fit_gw_sign_reorder, &
4334 vec_sigma_imag, vec_sigma_real
4336 CALL timeset(routinen, handle)
4338 ALLOCATE (vec_omega_fit_gw_sign(num_fit_points))
4340 IF (n_level_gw <= gw_corr_lev_occ)
THEN
4341 sign_occ_virt = -1.0_dp
4343 sign_occ_virt = 1.0_dp
4346 DO jquad = 1, num_fit_points
4347 vec_omega_fit_gw_sign(jquad) = abs(vec_omega_fit_gw(jquad))*sign_occ_virt
4350 IF (do_gw_im_time)
THEN
4353 e_fermi = 0.5_dp*(eigenval(homo) + eigenval(homo + 1))
4357 IF (n_level_gw <= gw_corr_lev_occ)
THEN
4358 e_fermi = eigenval(homo) + fermi_level_offset
4360 e_fermi = eigenval(homo + 1) - fermi_level_offset
4364 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
4367 ALLOCATE (sigma_c_gw_reorder(num_fit_points))
4368 ALLOCATE (vec_omega_fit_gw_sign_reorder(num_fit_points))
4370 IF (do_gw_im_time)
THEN
4371 DO jquad = 1, num_fit_points
4372 sigma_c_gw_reorder(jquad) = vec_sigma_c_gw(n_level_gw, jquad)
4373 vec_omega_fit_gw_sign_reorder(jquad) = vec_omega_fit_gw_sign(jquad)
4376 DO jquad = 1, num_fit_points
4377 sigma_c_gw_reorder(jquad) = vec_sigma_c_gw(n_level_gw, num_fit_points - jquad + 1)
4378 vec_omega_fit_gw_sign_reorder(jquad) = vec_omega_fit_gw_sign(num_fit_points - jquad + 1)
4383 ALLOCATE (coeff_pade(nparam_pade))
4384 ALLOCATE (omega_points_pade(nparam_pade))
4386 CALL get_pade_parameters(sigma_c_gw_reorder, vec_omega_fit_gw_sign_reorder, &
4387 num_fit_points, nparam_pade, omega_points_pade, coeff_pade)
4390 IF ((crossing_search == ri_rpa_g0w0_crossing_bisection) .OR. &
4391 (crossing_search == ri_rpa_g0w0_crossing_newton))
THEN
4392 energy_val = eigenval(n_level_gw_ref) - e_fermi
4393 CALL evaluate_pade_function(energy_val, nparam_pade, omega_points_pade, &
4394 coeff_pade, sigma_c_pade)
4395 CALL get_z_and_m_value_pade(energy_val, nparam_pade, omega_points_pade, &
4396 coeff_pade, z_value(n_level_gw), m_value(n_level_gw))
4397 level_energ_gw = (eigenval_scf(n_level_gw_ref) - &
4398 m_value(n_level_gw)*eigenval(n_level_gw_ref) + &
4399 REAL(sigma_c_pade) + &
4400 vec_sigma_x_minus_vxc_gw(n_level_gw_ref))* &
4404 iunit = cp_logger_get_default_unit_nr()
4406 IF (
PRESENT(min_level_self_energy) .AND.
PRESENT(max_level_self_energy))
THEN
4407 IF (n_level_gw_ref >= min_level_self_energy .AND. n_level_gw_ref <= max_level_self_energy)
THEN
4408 ALLOCATE (vec_sigma_real(ndos))
4409 ALLOCATE (vec_sigma_imag(ndos))
4410 WRITE (string_level,
"(I4)") n_level_gw_ref
4411 string_level = adjustl(string_level)
4420 IF (
PRESENT(ndos))
THEN
4423 omega_dos = dos_lower_bound + real(idos - 1, kind=dp)*dos_precision
4424 omega_dos_pade_eval = omega_dos - e_fermi
4425 CALL evaluate_pade_function(omega_dos_pade_eval, nparam_pade, omega_points_pade, &
4426 coeff_pade, sigma_c_pade)
4428 IF (n_level_gw_ref >= min_level_self_energy .AND. &
4429 n_level_gw_ref <= max_level_self_energy .AND. iunit > 0)
THEN
4431 vec_sigma_real(idos) = (real(sigma_c_pade))
4432 vec_sigma_imag(idos) = (aimag(sigma_c_pade))
4436 IF (n_level_gw_ref >= dos_min .AND. &
4437 (n_level_gw_ref <= dos_max .OR. dos_max > 0))
THEN
4438 vec_gw_dos(idos) = vec_gw_dos(idos) + &
4439 (abs(aimag(sigma_c_pade)) + dos_eta) &
4441 (omega_dos - eigenval_scf(n_level_gw_ref) - &
4442 (real(sigma_c_pade) + vec_sigma_x_minus_vxc_gw(n_level_gw_ref)) &
4444 + (abs(aimag(sigma_c_pade)) + dos_eta)**2 &
4452 IF (
PRESENT(min_level_self_energy) .AND.
PRESENT(max_level_self_energy))
THEN
4453 IF (n_level_gw_ref >= min_level_self_energy .AND. &
4454 n_level_gw_ref <= max_level_self_energy .AND. iunit > 0)
THEN
4456 CALL open_file(
'self_energy_re_'//trim(string_level)//
'.dat', unit_number=iunit, &
4457 file_status=
"UNKNOWN", file_action=
"WRITE")
4459 omega_dos = dos_lower_bound + real(idos - 1, kind=dp)*dos_precision
4460 WRITE (iunit,
'(F17.10, F17.10)') omega_dos*evolt, vec_sigma_real(idos)*evolt
4463 CALL close_file(iunit)
4465 CALL open_file(
'self_energy_im_'//trim(string_level)//
'.dat', unit_number=iunit, &
4466 file_status=
"UNKNOWN", file_action=
"WRITE")
4468 omega_dos = dos_lower_bound + real(idos - 1, kind=dp)*dos_precision
4469 WRITE (iunit,
'(F17.10, F17.10)') omega_dos*evolt, vec_sigma_imag(idos)*evolt
4472 CALL close_file(iunit)
4474 DEALLOCATE (vec_sigma_real)
4475 DEALLOCATE (vec_sigma_imag)
4480 SELECT CASE (crossing_search)
4481 CASE (ri_rpa_g0w0_crossing_z_shot)
4482 energy_val = eigenval(n_level_gw_ref) - e_fermi
4483 CALL evaluate_pade_function(energy_val, nparam_pade, omega_points_pade, &
4484 coeff_pade, sigma_c_pade)
4485 vec_gw_energ(n_level_gw) = real(sigma_c_pade)
4487 CALL get_z_and_m_value_pade(energy_val, nparam_pade, omega_points_pade, &
4488 coeff_pade, z_value(n_level_gw), m_value(n_level_gw))
4490 CASE (ri_rpa_g0w0_crossing_bisection)
4491 CALL get_sigma_c_bisection_pade(vec_gw_energ(n_level_gw), eigenval_scf(n_level_gw_ref), &
4492 vec_sigma_x_minus_vxc_gw(n_level_gw_ref), e_fermi, &
4493 nparam_pade, omega_points_pade, coeff_pade, &
4494 n_level_gw_ref, start_val=level_energ_gw)
4495 z_value(n_level_gw) = 1.0_dp
4496 m_value(n_level_gw) = 0.0_dp
4498 CASE (ri_rpa_g0w0_crossing_newton)
4499 CALL get_sigma_c_newton_pade(vec_gw_energ(n_level_gw), eigenval_scf(n_level_gw_ref), &
4500 vec_sigma_x_minus_vxc_gw(n_level_gw_ref), e_fermi, &
4501 nparam_pade, omega_points_pade, coeff_pade, &
4502 n_level_gw_ref, start_val=level_energ_gw)
4503 z_value(n_level_gw) = 1.0_dp
4504 m_value(n_level_gw) = 0.0_dp
4507 cpabort(
"Only Z_SHOT, NEWTON, and BISECTION crossing search implemented.")
4510 IF (print_self_energy)
THEN
4512 IF (count_ev_sc_gw == 1)
THEN
4514 IF (n_level_gw_ref < 10)
THEN
4515 WRITE (filename,
"(A26,I1)")
"G0W0_self_energy_level_000", n_level_gw_ref
4516 ELSE IF (n_level_gw_ref < 100)
THEN
4517 WRITE (filename,
"(A25,I2)")
"G0W0_self_energy_level_00", n_level_gw_ref
4518 ELSE IF (n_level_gw_ref < 1000)
THEN
4519 WRITE (filename,
"(A24,I3)")
"G0W0_self_energy_level_0", n_level_gw_ref
4521 WRITE (filename,
"(A23,I4)")
"G0W0_self_energy_level_", n_level_gw_ref
4526 IF (n_level_gw_ref < 10)
THEN
4527 WRITE (filename,
"(A11,I1,A22,I1)")
"evGW_cycle_", count_ev_sc_gw, &
4528 "_self_energy_level_000", n_level_gw_ref
4529 ELSE IF (n_level_gw_ref < 100)
THEN
4530 WRITE (filename,
"(A11,I1,A21,I2)")
"evGW_cycle_", count_ev_sc_gw, &
4531 "_self_energy_level_00", n_level_gw_ref
4532 ELSE IF (n_level_gw_ref < 1000)
THEN
4533 WRITE (filename,
"(A11,I1,A20,I3)")
"evGW_cycle_", count_ev_sc_gw, &
4534 "_self_energy_level_0", n_level_gw_ref
4536 WRITE (filename,
"(A11,I1,A19,I4)")
"evGW_cycle_", count_ev_sc_gw, &
4537 "_self_energy_level_", n_level_gw_ref
4542 CALL open_file(trim(filename), unit_number=iunit, file_status=
"UNKNOWN", file_action=
"WRITE")
4546 WRITE (iunit,
"(2A42)")
" omega (eV) Sigma(omega) (eV) ", &
4547 " omega - e_n^DFT - Sigma_n^x - v_n^xc (eV)"
4549 DO i_omega = 0, num_omega
4551 omega = -50.0_dp/evolt + real(i_omega, kind=dp)/real(num_omega, kind=dp)*100.0_dp/evolt
4553 CALL evaluate_pade_function(omega - e_fermi, nparam_pade, omega_points_pade, &
4554 coeff_pade, sigma_c_pade)
4556 WRITE (iunit,
"(F12.2,2F17.5)") omega*evolt, real(sigma_c_pade)*evolt, &
4557 (omega - eigenval_scf(n_level_gw_ref) - vec_sigma_x_minus_vxc_gw(n_level_gw_ref))*evolt
4561 WRITE (iunit,
"(A51,A39)")
" w (eV) Re(Sigma(i*w)) (eV) Im(Sigma(i*w)) (eV) ", &
4562 " Re(Fit(i*w)) (eV) Im(Fit(iw)) (eV)"
4564 DO jquad = 1, num_fit_points
4566 CALL evaluate_pade_function(vec_omega_fit_gw_sign_reorder(jquad), &
4567 nparam_pade, omega_points_pade, &
4568 coeff_pade, sigma_c_pade_im_freq, do_imag_freq=.true.)
4570 WRITE (iunit,
"(F12.2,4F17.5)") vec_omega_fit_gw_sign_reorder(jquad)*evolt, &
4571 REAL(sigma_c_gw_reorder(jquad)*evolt), &
4572 aimag(sigma_c_gw_reorder(jquad)*evolt), &
4573 REAL(sigma_c_pade_im_freq*evolt), &
4574 aimag(sigma_c_pade_im_freq*evolt)
4578 CALL close_file(iunit)
4582 DEALLOCATE (vec_omega_fit_gw_sign)
4583 DEALLOCATE (sigma_c_gw_reorder)
4584 DEALLOCATE (vec_omega_fit_gw_sign_reorder)
4585 DEALLOCATE (coeff_pade, omega_points_pade)
4587 CALL timestop(handle)
4601 PURE SUBROUTINE get_pade_parameters(y, x, num_fit_points, nparam, xpoints, coeff)
4603 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: y
4604 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: x
4605 INTEGER,
INTENT(IN) :: num_fit_points, nparam
4606 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(INOUT) :: xpoints, coeff
4608 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: ypoints
4609 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: g_mat
4610 INTEGER :: idat, iparam, nstep
4612 nstep = int(num_fit_points/(nparam - 1))
4614 ALLOCATE (ypoints(nparam))
4617 DO iparam = 1, nparam - 1
4618 xpoints(iparam) = gaussi*x(idat)
4619 ypoints(iparam) = y(idat)
4622 xpoints(nparam) = gaussi*x(num_fit_points)
4623 ypoints(nparam) = y(num_fit_points)
4627 ALLOCATE (g_mat(nparam, nparam))
4628 g_mat(:, 1) = ypoints(:)
4629 DO iparam = 2, nparam
4630 DO idat = iparam, nparam
4631 g_mat(idat, iparam) = (g_mat(iparam - 1, iparam - 1) - g_mat(idat, iparam - 1))/ &
4632 ((xpoints(idat) - xpoints(iparam - 1))*g_mat(idat, iparam - 1))
4636 DO iparam = 1, nparam
4637 coeff(iparam) = g_mat(iparam, iparam)
4640 DEALLOCATE (ypoints)
4643 END SUBROUTINE get_pade_parameters
4654 PURE SUBROUTINE evaluate_pade_function(x_val, nparam, xpoints, coeff, func_val, do_imag_freq)
4656 REAL(kind=dp),
INTENT(IN) :: x_val
4657 INTEGER,
INTENT(IN) :: nparam
4658 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: xpoints, coeff
4659 COMPLEX(KIND=dp),
INTENT(OUT) :: func_val
4660 LOGICAL,
INTENT(IN),
OPTIONAL :: do_imag_freq
4663 LOGICAL :: my_do_imag_freq
4665 my_do_imag_freq = .false.
4666 IF (
PRESENT(do_imag_freq)) my_do_imag_freq = do_imag_freq
4669 DO iparam = nparam, 2, -1
4670 IF (my_do_imag_freq)
THEN
4671 func_val = z_one + coeff(iparam)*(gaussi*x_val - xpoints(iparam - 1))/func_val
4673 func_val = z_one + coeff(iparam)*(x_val*z_one - xpoints(iparam - 1))/func_val
4677 func_val = coeff(1)/func_val
4679 END SUBROUTINE evaluate_pade_function
4690 PURE SUBROUTINE get_z_and_m_value_pade(x_val, nparam, xpoints, coeff, z_value, m_value)
4692 REAL(kind=dp),
INTENT(IN) :: x_val
4693 INTEGER,
INTENT(IN) :: nparam
4694 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: xpoints, coeff
4695 REAL(kind=dp),
INTENT(OUT),
OPTIONAL :: z_value, m_value
4697 COMPLEX(KIND=dp) :: denominator, dev_denominator, &
4698 dev_numerator, dev_val, func_val, &
4704 DO iparam = nparam, 2, -1
4705 numerator = coeff(iparam)*(x_val*z_one - xpoints(iparam - 1))
4706 dev_numerator = coeff(iparam)*z_one
4707 denominator = func_val
4708 dev_denominator = dev_val
4709 dev_val = dev_numerator/denominator - (numerator*dev_denominator)/(denominator**2)
4710 func_val = z_one + coeff(iparam)*(x_val*z_one - xpoints(iparam - 1))/func_val
4713 dev_val = -1.0_dp*coeff(1)/(func_val**2)*dev_val
4714 func_val = coeff(1)/func_val
4716 IF (
PRESENT(z_value))
THEN
4717 z_value = 1.0_dp - real(dev_val)
4718 z_value = 1.0_dp/z_value
4720 IF (
PRESENT(m_value)) m_value = real(dev_val)
4722 END SUBROUTINE get_z_and_m_value_pade
4736 SUBROUTINE get_sigma_c_bisection_pade(gw_energ, Eigenval_scf, Sigma_x_minus_vxc_gw, e_fermi, &
4737 nparam_pade, omega_points_pade, coeff_pade, n_level_gw_ref, start_val)
4739 REAL(kind=dp),
INTENT(OUT) :: gw_energ
4740 REAL(kind=dp),
INTENT(IN) :: eigenval_scf, sigma_x_minus_vxc_gw, &
4742 INTEGER,
INTENT(IN) :: nparam_pade
4743 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: omega_points_pade, coeff_pade
4744 INTEGER,
INTENT(IN) :: n_level_gw_ref
4745 REAL(kind=dp),
INTENT(IN),
OPTIONAL :: start_val
4747 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_sigma_c_bisection_pade'
4749 CHARACTER(LEN=512) :: error_msg
4750 CHARACTER(LEN=64) :: n_level_gw_ref_char
4751 COMPLEX(KIND=dp) :: sigma_c
4752 INTEGER :: handle, icount
4753 REAL(kind=dp) :: delta, energy_val, my_start_val, &
4754 qp_energy, qp_energy_old, threshold
4756 CALL timeset(routinen, handle)
4758 threshold = 1.0e-7_dp
4760 IF (
PRESENT(start_val))
THEN
4761 my_start_val = start_val
4763 my_start_val = eigenval_scf
4766 qp_energy = my_start_val
4767 qp_energy_old = my_start_val
4771 DO WHILE (abs(delta) > threshold)
4773 qp_energy = qp_energy_old + 0.5_dp*delta
4774 qp_energy_old = qp_energy
4775 energy_val = qp_energy - e_fermi
4776 CALL evaluate_pade_function(energy_val, nparam_pade, omega_points_pade, &
4777 coeff_pade, sigma_c)
4778 qp_energy = eigenval_scf + real(sigma_c) + sigma_x_minus_vxc_gw
4779 delta = qp_energy - qp_energy_old
4780 IF (icount > 500)
THEN
4781 WRITE (n_level_gw_ref_char,
'(I10)') n_level_gw_ref
4782 WRITE (error_msg,
'(A,A,A)')
" Self-consistent quasi-particle solution of "// &
4783 "MO ", trim(n_level_gw_ref_char),
" has not been found."
4789 gw_energ = real(sigma_c)
4791 CALL timestop(handle)
4793 END SUBROUTINE get_sigma_c_bisection_pade
4807 SUBROUTINE get_sigma_c_newton_pade(gw_energ, Eigenval_scf, Sigma_x_minus_vxc_gw, e_fermi, &
4808 nparam_pade, omega_points_pade, coeff_pade, n_level_gw_ref, start_val)
4810 REAL(kind=dp),
INTENT(OUT) :: gw_energ
4811 REAL(kind=dp),
INTENT(IN) :: eigenval_scf, sigma_x_minus_vxc_gw, &
4813 INTEGER,
INTENT(IN) :: nparam_pade
4814 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: omega_points_pade, coeff_pade
4815 INTEGER,
INTENT(IN) :: n_level_gw_ref
4816 REAL(kind=dp),
INTENT(IN),
OPTIONAL :: start_val
4818 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_sigma_c_newton_pade'
4820 CHARACTER(LEN=512) :: error_msg
4821 CHARACTER(LEN=64) :: n_level_gw_ref_char
4822 COMPLEX(KIND=dp) :: sigma_c
4823 INTEGER :: handle, icount
4824 REAL(kind=dp) :: delta, energy_val, m_value, &
4825 my_start_val, qp_energy, &
4826 qp_energy_old, threshold
4828 CALL timeset(routinen, handle)
4830 threshold = 1.0e-7_dp
4832 IF (
PRESENT(start_val))
THEN
4833 my_start_val = start_val
4835 my_start_val = eigenval_scf
4838 qp_energy = my_start_val
4839 qp_energy_old = my_start_val
4843 DO WHILE (abs(delta) > threshold)
4845 energy_val = qp_energy - e_fermi
4846 CALL evaluate_pade_function(energy_val, nparam_pade, omega_points_pade, &
4847 coeff_pade, sigma_c)
4849 CALL get_z_and_m_value_pade(energy_val, nparam_pade, omega_points_pade, &
4850 coeff_pade, m_value=m_value)
4851 qp_energy_old = qp_energy
4852 qp_energy = qp_energy - (eigenval_scf + sigma_x_minus_vxc_gw + real(sigma_c) - qp_energy)/ &
4854 delta = qp_energy - qp_energy_old
4855 IF (icount > 500)
THEN
4856 WRITE (n_level_gw_ref_char,
'(I10)') n_level_gw_ref
4857 WRITE (error_msg,
'(A,A,A)')
" Self-consistent quasi-particle solution of "// &
4858 "MO ", trim(n_level_gw_ref_char),
" has not been found."
4864 gw_energ = real(sigma_c)
4866 CALL timestop(handle)
4868 END SUBROUTINE get_sigma_c_newton_pade
4897 SUBROUTINE print_and_update_for_ev_sc(vec_gw_energ, &
4898 z_value, m_value, vec_Sigma_x_minus_vxc_gw, Eigenval, &
4899 Eigenval_last, Eigenval_scf, &
4900 gw_corr_lev_occ, gw_corr_lev_virt, gw_corr_lev_tot, &
4901 crossing_search, homo, unit_nr, count_ev_sc_GW, count_sc_GW0, &
4902 ikp, nkp_self_energy, kpoints, ispin, E_VBM_GW, E_CBM_GW, &
4903 E_VBM_SCF, E_CBM_SCF)
4905 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: vec_gw_energ, z_value, m_value
4906 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: vec_sigma_x_minus_vxc_gw, eigenval, &
4907 eigenval_last, eigenval_scf
4908 INTEGER,
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, gw_corr_lev_tot, crossing_search, &
4909 homo, unit_nr, count_ev_sc_gw, count_sc_gw0, ikp, nkp_self_energy
4910 TYPE(kpoint_type),
INTENT(IN),
POINTER :: kpoints
4911 INTEGER,
INTENT(IN) :: ispin
4912 REAL(kind=dp),
INTENT(INOUT),
OPTIONAL :: e_vbm_gw, e_cbm_gw, e_vbm_scf, e_cbm_scf
4914 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_and_update_for_ev_sc'
4916 CHARACTER(4) :: occ_virt
4917 INTEGER :: handle, n_level_gw, n_level_gw_ref
4918 LOGICAL :: do_alpha, do_beta, do_closed_shell, &
4919 do_kpoints, is_energy_okay
4920 REAL(kind=dp) :: e_gap_gw, e_homo_gw, e_homo_scf, &
4921 e_lumo_gw, e_lumo_scf, new_energy
4923 CALL timeset(routinen, handle)
4925 do_alpha = (ispin == 1)
4926 do_beta = (ispin == 2)
4927 do_closed_shell = .NOT. (do_alpha .OR. do_beta)
4928 do_kpoints = (nkp_self_energy > 1)
4930 eigenval_last(:) = eigenval(:)
4932 IF (unit_nr > 0)
THEN
4934 IF (count_ev_sc_gw == 1 .AND. count_sc_gw0 == 1 .AND. ikp == 1)
THEN
4936 WRITE (unit_nr, *)
' '
4938 IF (do_alpha .OR. do_closed_shell)
THEN
4939 WRITE (unit_nr, *)
' '
4940 WRITE (unit_nr,
'(T3,A)')
'******************************************************************************'
4941 WRITE (unit_nr,
'(T3,A)')
'** **'
4942 WRITE (unit_nr,
'(T3,A)')
'** GW QUASIPARTICLE ENERGIES **'
4943 WRITE (unit_nr,
'(T3,A)')
'** **'
4944 WRITE (unit_nr,
'(T3,A)')
'******************************************************************************'
4945 WRITE (unit_nr,
'(T3,A)')
' '
4946 WRITE (unit_nr,
'(T3,A)')
' '
4947 WRITE (unit_nr,
'(T3,A)')
'The GW quasiparticle energies are calculated according to: '
4949 IF (crossing_search == ri_rpa_g0w0_crossing_z_shot)
THEN
4950 WRITE (unit_nr,
'(T3,A)')
'E_GW = E_SCF + Z * ( Sigc(E_SCF) + Sigx - vxc )'
4952 WRITE (unit_nr,
'(T3,A)')
' '
4953 WRITE (unit_nr,
'(T3,A)')
' E_GW = E_SCF + Sigc(E_GW) + Sigx - vxc '
4954 WRITE (unit_nr,
'(T3,A)')
' '
4955 WRITE (unit_nr,
'(T3,A)')
'Upper equation is solved self-consistently for E_GW, see Eq. (12) in J. Phys.'
4956 WRITE (unit_nr,
'(T3,A)')
'Chem. Lett. 9, 306 (2018), doi: 10.1021/acs.jpclett.7b02740'
4958 WRITE (unit_nr, *)
' '
4959 WRITE (unit_nr, *)
' '
4960 WRITE (unit_nr,
'(T3,A)')
'------------'
4961 WRITE (unit_nr,
'(T3,A)')
'G0W0 results'
4962 WRITE (unit_nr,
'(T3,A)')
'------------'
4966 IF (.NOT. do_kpoints)
THEN
4968 WRITE (unit_nr, *)
' '
4969 WRITE (unit_nr,
'(T3,A)')
'---------------------------------------'
4970 WRITE (unit_nr,
'(T3,A)')
'GW quasiparticle energies of alpha spins'
4971 WRITE (unit_nr,
'(T3,A)')
'----------------------------------------'
4972 ELSE IF (do_beta)
THEN
4973 WRITE (unit_nr, *)
' '
4974 WRITE (unit_nr,
'(T3,A)')
'---------------------------------------'
4975 WRITE (unit_nr,
'(T3,A)')
'GW quasiparticle energies of beta spins'
4976 WRITE (unit_nr,
'(T3,A)')
'---------------------------------------'
4982 IF (count_ev_sc_gw > 1)
THEN
4983 WRITE (unit_nr, *)
' '
4984 WRITE (unit_nr,
'(T3,A)')
'---------------------------------------'
4985 WRITE (unit_nr,
'(T3,A,I4)')
'Eigenvalue-selfconsistency cycle: ', count_ev_sc_gw
4986 WRITE (unit_nr,
'(T3,A)')
'---------------------------------------'
4989 IF (count_sc_gw0 > 1)
THEN
4990 WRITE (unit_nr,
'(T3,A)')
'----------------------------------'
4991 WRITE (unit_nr,
'(T3,A,I4)')
'scGW0 selfconsistency cycle: ', count_sc_gw0
4992 WRITE (unit_nr,
'(T3,A)')
'----------------------------------'
4995 IF (do_kpoints)
THEN
4996 WRITE (unit_nr, *)
' '
4997 WRITE (unit_nr,
'(T3,A7,I3,A3,I3,A8,3F7.3,A12,3F7.3)')
'Kpoint ', ikp,
' /', nkp_self_energy, &
4998 ' xkp =', kpoints%xkp(1, ikp), kpoints%xkp(2, ikp), kpoints%xkp(3, ikp), &
4999 ' and xkp =', -kpoints%xkp(1, ikp), -kpoints%xkp(2, ikp), -kpoints%xkp(3, ikp)
5000 WRITE (unit_nr,
'(T3,A72)')
'(Relative Brillouin zone size: [-0.5, 0.5] x [-0.5, 0.5] x [-0.5, 0.5])'
5001 WRITE (unit_nr, *)
' '
5003 WRITE (unit_nr,
'(T3,A)')
'GW quasiparticle energies of alpha spins:'
5004 ELSE IF (do_beta)
THEN
5005 WRITE (unit_nr,
'(T3,A)')
'GW quasiparticle energies of beta spins:'
5011 DO n_level_gw = 1, gw_corr_lev_tot
5013 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
5015 new_energy = (eigenval_scf(n_level_gw_ref) - &
5016 m_value(n_level_gw)*eigenval(n_level_gw_ref) + &
5017 vec_gw_energ(n_level_gw) + &
5018 vec_sigma_x_minus_vxc_gw(n_level_gw_ref))* &
5021 is_energy_okay = .true.
5023 IF (n_level_gw_ref > homo .AND. new_energy < eigenval(homo))
THEN
5024 is_energy_okay = .false.
5027 IF (is_energy_okay)
THEN
5028 eigenval(n_level_gw_ref) = new_energy
5033 IF (unit_nr > 0)
THEN
5034 WRITE (unit_nr,
'(T3,A)')
' '
5035 IF (crossing_search == ri_rpa_g0w0_crossing_z_shot)
THEN
5036 WRITE (unit_nr,
'(T13,2A)')
'MO E_SCF (eV) Sigc (eV) Sigx-vxc (eV) Z E_GW (eV)'
5038 WRITE (unit_nr,
'(T3,2A)')
'Molecular orbital E_SCF (eV) Sigc (eV) Sigx-vxc (eV) E_GW (eV)'
5042 DO n_level_gw = 1, gw_corr_lev_tot
5043 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
5044 IF (n_level_gw <= gw_corr_lev_occ)
THEN
5050 IF (unit_nr > 0)
THEN
5051 IF (crossing_search == ri_rpa_g0w0_crossing_z_shot)
THEN
5052 WRITE (unit_nr,
'(T3,I4,3A,5F13.4)') &
5053 n_level_gw_ref,
' ( ', occ_virt,
') ', &
5054 eigenval_last(n_level_gw_ref)*evolt, &
5055 vec_gw_energ(n_level_gw)*evolt, &
5056 vec_sigma_x_minus_vxc_gw(n_level_gw_ref)*evolt, &
5057 z_value(n_level_gw), &
5058 eigenval(n_level_gw_ref)*evolt
5060 WRITE (unit_nr,
'(T3,I4,3A,4F16.4)') &
5061 n_level_gw_ref,
' ( ', occ_virt,
') ', &
5062 eigenval_last(n_level_gw_ref)*evolt, &
5063 vec_gw_energ(n_level_gw)*evolt, &
5064 vec_sigma_x_minus_vxc_gw(n_level_gw_ref)*evolt, &
5065 eigenval(n_level_gw_ref)*evolt
5070 e_homo_scf = maxval(eigenval_last(homo - gw_corr_lev_occ + 1:homo))
5071 e_lumo_scf = minval(eigenval_last(homo + 1:homo + gw_corr_lev_virt))
5073 e_homo_gw = maxval(eigenval(homo - gw_corr_lev_occ + 1:homo))
5074 e_lumo_gw = minval(eigenval(homo + 1:homo + gw_corr_lev_virt))
5075 e_gap_gw = e_lumo_gw - e_homo_gw
5077 IF (
PRESENT(e_vbm_scf) .AND.
PRESENT(e_cbm_scf) .AND. &
5078 PRESENT(e_vbm_gw) .AND.
PRESENT(e_cbm_gw))
THEN
5079 IF (e_homo_scf > e_vbm_scf) e_vbm_scf = e_homo_scf
5080 IF (e_lumo_scf < e_cbm_scf) e_cbm_scf = e_lumo_scf
5081 IF (e_homo_gw > e_vbm_gw) e_vbm_gw = e_homo_gw
5082 IF (e_lumo_gw < e_cbm_gw) e_cbm_gw = e_lumo_gw
5085 IF (unit_nr > 0)
THEN
5087 IF (do_kpoints)
THEN
5088 IF (do_closed_shell)
THEN
5089 WRITE (unit_nr,
'(T3,A)')
' '
5090 WRITE (unit_nr,
'(T3,A,F42.4)')
'GW direct gap at current kpoint (eV)', e_gap_gw*evolt
5091 ELSE IF (do_alpha)
THEN
5092 WRITE (unit_nr,
'(T3,A)')
' '
5093 WRITE (unit_nr,
'(T3,A,F36.4)')
'Alpha GW direct gap at current kpoint (eV)', e_gap_gw*evolt
5094 ELSE IF (do_beta)
THEN
5095 WRITE (unit_nr,
'(T3,A)')
' '
5096 WRITE (unit_nr,
'(T3,A,F37.4)')
'Beta GW direct gap at current kpoint (eV)', e_gap_gw*evolt
5099 IF (do_closed_shell)
THEN
5100 WRITE (unit_nr,
'(T3,A)')
' '
5101 WRITE (unit_nr,
'(T3,A,F57.4)')
'GW HOMO-LUMO gap (eV)', e_gap_gw*evolt
5102 ELSE IF (do_alpha)
THEN
5103 WRITE (unit_nr,
'(T3,A)')
' '
5104 WRITE (unit_nr,
'(T3,A,F51.4)')
'Alpha GW HOMO-LUMO gap (eV)', e_gap_gw*evolt
5105 ELSE IF (do_beta)
THEN
5106 WRITE (unit_nr,
'(T3,A)')
' '
5107 WRITE (unit_nr,
'(T3,A,F52.4)')
'Beta GW HOMO-LUMO gap (eV)', e_gap_gw*evolt
5112 IF (unit_nr > 0)
THEN
5113 WRITE (unit_nr, *)
' '
5114 WRITE (unit_nr,
'(T3,A)')
'------------------------------------------------------------------------------'
5117 CALL timestop(handle)
5119 END SUBROUTINE print_and_update_for_ev_sc
5130 PURE SUBROUTINE shift_unshifted_levels(Eigenval, Eigenval_last, gw_corr_lev_occ, gw_corr_lev_virt, &
5133 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: eigenval, eigenval_last
5134 INTEGER,
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo, &
5137 INTEGER :: n_level_gw, n_level_gw_ref
5138 REAL(kind=dp) :: eigen_diff
5142 IF (gw_corr_lev_occ < homo .AND. gw_corr_lev_occ > 0)
THEN
5147 DO n_level_gw = 1, gw_corr_lev_occ
5148 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
5149 eigen_diff = eigen_diff + eigenval(n_level_gw_ref) - eigenval_last(n_level_gw_ref)
5151 eigen_diff = eigen_diff/gw_corr_lev_occ
5154 DO n_level_gw = 1, homo - gw_corr_lev_occ
5155 eigenval(n_level_gw) = eigenval(n_level_gw) + eigen_diff
5161 IF (gw_corr_lev_virt < nmo - homo .AND. gw_corr_lev_virt > 0)
THEN
5165 DO n_level_gw = 1, gw_corr_lev_virt
5166 n_level_gw_ref = n_level_gw + homo
5167 eigen_diff = eigen_diff + eigenval(n_level_gw_ref) - eigenval_last(n_level_gw_ref)
5169 eigen_diff = eigen_diff/gw_corr_lev_virt
5172 DO n_level_gw = homo + gw_corr_lev_virt + 1, nmo
5173 eigenval(n_level_gw) = eigenval(n_level_gw) + eigen_diff
5178 END SUBROUTINE shift_unshifted_levels
5195 SUBROUTINE calc_mat_n(N_ij, Lambda, Sigma_c, vec_omega_fit_gw, i, j, &
5196 num_poles, num_fit_points, n_level_gw, h)
5197 REAL(kind=dp),
INTENT(OUT) :: n_ij
5198 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:), &
5199 INTENT(IN) :: lambda
5200 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN) :: sigma_c
5201 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
5202 INTENT(IN) :: vec_omega_fit_gw
5203 INTEGER,
INTENT(IN) :: i, j, num_poles, num_fit_points, &
5205 REAL(kind=dp),
INTENT(IN) :: h
5207 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_mat_N'
5209 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: lambda_tmp
5210 INTEGER :: handle, num_var
5211 REAL(kind=dp) :: chi2, chi2_sum
5213 CALL timeset(routinen, handle)
5215 num_var = 2*num_poles + 1
5216 ALLOCATE (lambda_tmp(num_var))
5221 lambda_tmp(:) = lambda(:)
5222 CALL calc_chi2(chi2, lambda_tmp, sigma_c, vec_omega_fit_gw, num_poles, &
5223 num_fit_points, n_level_gw)
5226 lambda_tmp(:) = lambda(:)
5227 IF (
modulo(i, 2) == 0)
THEN
5228 lambda_tmp(i/2) = lambda_tmp(i/2) + h*z_one
5230 lambda_tmp((i + 1)/2) = lambda_tmp((i + 1)/2) + h*gaussi
5232 IF (
modulo(j, 2) == 0)
THEN
5233 lambda_tmp(j/2) = lambda_tmp(j/2) + h*z_one
5235 lambda_tmp((j + 1)/2) = lambda_tmp((j + 1)/2) + h*gaussi
5237 CALL calc_chi2(chi2, lambda_tmp, sigma_c, vec_omega_fit_gw, num_poles, &
5238 num_fit_points, n_level_gw)
5239 chi2_sum = chi2_sum + chi2
5241 IF (
modulo(i, 2) == 0)
THEN
5242 lambda_tmp(i/2) = lambda_tmp(i/2) - 2.0_dp*h*z_one
5244 lambda_tmp((i + 1)/2) = lambda_tmp((i + 1)/2) - 2.0_dp*h*gaussi
5246 CALL calc_chi2(chi2, lambda_tmp, sigma_c, vec_omega_fit_gw, num_poles, &
5247 num_fit_points, n_level_gw)
5248 chi2_sum = chi2_sum - chi2
5250 IF (
modulo(j, 2) == 0)
THEN
5251 lambda_tmp(j/2) = lambda_tmp(j/2) - 2.0_dp*h*z_one
5253 lambda_tmp((j + 1)/2) = lambda_tmp((j + 1)/2) - 2.0_dp*h*gaussi
5255 CALL calc_chi2(chi2, lambda_tmp, sigma_c, vec_omega_fit_gw, num_poles, &
5256 num_fit_points, n_level_gw)
5257 chi2_sum = chi2_sum + chi2
5259 IF (
modulo(i, 2) == 0)
THEN
5260 lambda_tmp(i/2) = lambda_tmp(i/2) + 2.0_dp*h*z_one
5262 lambda_tmp((i + 1)/2) = lambda_tmp((i + 1)/2) + 2.0_dp*h*gaussi
5264 CALL calc_chi2(chi2, lambda_tmp, sigma_c, vec_omega_fit_gw, num_poles, &
5265 num_fit_points, n_level_gw)
5266 chi2_sum = chi2_sum - chi2
5269 n_ij = 1.0_dp/2.0_dp*chi2_sum/(4.0_dp*h*h)
5271 DEALLOCATE (lambda_tmp)
5273 CALL timestop(handle)
5275 END SUBROUTINE calc_mat_n
5287 PURE SUBROUTINE calc_chi2(chi2, Lambda, Sigma_c, vec_omega_fit_gw, num_poles, &
5288 num_fit_points, n_level_gw)
5289 REAL(kind=dp),
INTENT(OUT) :: chi2
5290 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(IN) :: lambda
5291 COMPLEX(KIND=dp),
DIMENSION(:, :),
INTENT(IN) :: sigma_c
5292 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: vec_omega_fit_gw
5293 INTEGER,
INTENT(IN) :: num_poles, num_fit_points, n_level_gw
5295 COMPLEX(KIND=dp) :: func_val
5296 INTEGER :: iii, jjj, kkk
5299 DO kkk = 1, num_fit_points
5300 func_val = lambda(1)
5301 DO iii = 1, num_poles
5304 func_val = func_val + lambda(jjj)/(gaussi*vec_omega_fit_gw(kkk) - lambda(jjj + 1))
5306 chi2 = chi2 + (abs(sigma_c(n_level_gw, kkk) - func_val))**2
5309 END SUBROUTINE calc_chi2
5363 SUBROUTINE compute_self_energy_cubic_gw(num_integ_points, nmo, tau_tj, tj, &
5364 matrix_s, fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, &
5365 fm_mo_coeff_virt_scaled, fm_scaled_dm_occ_tau, &
5366 fm_scaled_dm_virt_tau, Eigenval, eps_filter, &
5367 e_fermi, fm_mat_W, &
5368 gw_corr_lev_tot, gw_corr_lev_occ, gw_corr_lev_virt, homo, &
5369 count_ev_sc_GW, count_sc_GW0, &
5370 t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, &
5371 t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, &
5372 mat_W, mat_MinvVMinv, mat_dm, &
5373 weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, vec_Sigma_c_gw, &
5374 do_periodic, num_points_corr, delta_corr, qs_env, para_env, para_env_RPA, &
5375 mp2_env, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
5376 first_cycle_periodic_correction, kpoints, num_fit_points, fm_mo_coeff, &
5377 do_ri_Sigma_x, vec_Sigma_x_gw, unit_nr, ispin)
5378 INTEGER,
INTENT(IN) :: num_integ_points, nmo
5379 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
5380 INTENT(IN) :: tau_tj, tj
5381 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_s
5382 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, &
5383 fm_mo_coeff_virt_scaled, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau
5384 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: eigenval
5385 REAL(kind=dp),
INTENT(IN) :: eps_filter
5386 REAL(kind=dp),
INTENT(INOUT) :: e_fermi
5387 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w
5388 INTEGER,
INTENT(IN) :: gw_corr_lev_tot, gw_corr_lev_occ, &
5389 gw_corr_lev_virt, homo, &
5390 count_ev_sc_gw, count_sc_gw0
5391 TYPE(dbt_type) :: t_3c_overl_int_ao_mo
5392 TYPE(hfx_compression_type) :: t_3c_o_mo_compressed
5393 INTEGER,
DIMENSION(:, :) :: t_3c_o_mo_ind
5394 TYPE(dbt_type) :: t_3c_overl_int_gw_ri, &
5395 t_3c_overl_int_gw_ao
5396 TYPE(dbcsr_type),
INTENT(INOUT),
TARGET :: mat_w
5397 TYPE(dbcsr_p_type) :: mat_minvvminv, mat_dm
5398 REAL(kind=dp),
DIMENSION(:, :),
INTENT(IN) :: weights_cos_tf_t_to_w, &
5399 weights_sin_tf_t_to_w
5400 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
INTENT(OUT) :: vec_sigma_c_gw
5401 LOGICAL,
INTENT(IN) :: do_periodic
5402 INTEGER,
INTENT(IN) :: num_points_corr
5403 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
5404 INTENT(INOUT) :: delta_corr
5405 TYPE(qs_environment_type),
POINTER :: qs_env
5406 TYPE(mp_para_env_type),
POINTER :: para_env, para_env_rpa
5407 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
5408 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_berry_re_mo_mo, &
5409 matrix_berry_im_mo_mo
5410 LOGICAL,
INTENT(INOUT) :: first_cycle_periodic_correction
5411 TYPE(kpoint_type),
POINTER :: kpoints
5412 INTEGER,
INTENT(IN) :: num_fit_points
5413 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff
5414 LOGICAL,
INTENT(IN) :: do_ri_sigma_x
5415 REAL(kind=dp),
DIMENSION(:, :),
INTENT(INOUT) :: vec_sigma_x_gw
5416 INTEGER,
INTENT(IN) :: unit_nr, ispin
5418 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_self_energy_cubic_gw'
5420 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: delta_corr_omega
5421 INTEGER :: gw_lev_end, gw_lev_start, handle, handle3, i, iblk_mo, iquad, jquad, mo_end, &
5422 mo_start, n_level_gw, n_level_gw_ref, nblk_mo, unit_nr_prv
5423 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: batch_range_mo, dist1, dist2, mo_bsizes, &
5424 mo_offsets, sizes_ao, sizes_ri
5425 INTEGER,
DIMENSION(2) :: mo_bounds, pdims_2d
5426 LOGICAL :: memory_info
5427 REAL(kind=dp) :: ext_scaling, omega, omega_i, omega_sign, &
5428 sign_occ_virt, t_i_clenshaw, tau, &
5429 weight_cos, weight_i, weight_sin
5430 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: vec_sigma_c_gw_cos_omega, &
5431 vec_sigma_c_gw_cos_tau, vec_sigma_c_gw_neg_tau, vec_sigma_c_gw_pos_tau, &
5432 vec_sigma_c_gw_sin_omega, vec_sigma_c_gw_sin_tau
5433 TYPE(dbcsr_type),
TARGET :: mat_greens_fct_occ, mat_greens_fct_virt
5434 TYPE(dbt_pgrid_type) :: pgrid_2d
5435 TYPE(dbt_type) :: t_3c_ctr_ao, t_3c_ctr_ri, t_ao_tmp, &
5436 t_dm, t_greens_fct_occ, &
5437 t_greens_fct_virt, t_ri_tmp, &
5440 CALL timeset(routinen, handle)
5442 CALL decompress_tensor(t_3c_overl_int_ao_mo, t_3c_o_mo_ind, t_3c_o_mo_compressed, &
5443 mp2_env%ri_rpa_im_time%eps_compress)
5445 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_gw_ri)
5446 CALL dbt_copy(t_3c_overl_int_ao_mo, t_3c_overl_int_gw_ao, order=[2, 1, 3], move_data=.true.)
5448 memory_info = mp2_env%ri_rpa_im_time%memory_info
5449 IF (memory_info)
THEN
5450 unit_nr_prv = unit_nr
5455 mo_start = homo - gw_corr_lev_occ + 1
5456 mo_end = homo + gw_corr_lev_virt
5457 cpassert(mo_end - mo_start + 1 == gw_corr_lev_tot)
5459 vec_sigma_c_gw = z_zero
5460 ALLOCATE (vec_sigma_c_gw_pos_tau(gw_corr_lev_tot, num_integ_points))
5461 vec_sigma_c_gw_pos_tau = 0.0_dp
5462 ALLOCATE (vec_sigma_c_gw_neg_tau(gw_corr_lev_tot, num_integ_points))
5463 vec_sigma_c_gw_neg_tau = 0.0_dp
5464 ALLOCATE (vec_sigma_c_gw_cos_tau(gw_corr_lev_tot, num_integ_points))
5465 vec_sigma_c_gw_cos_tau = 0.0_dp
5466 ALLOCATE (vec_sigma_c_gw_sin_tau(gw_corr_lev_tot, num_integ_points))
5467 vec_sigma_c_gw_sin_tau = 0.0_dp
5469 ALLOCATE (vec_sigma_c_gw_cos_omega(gw_corr_lev_tot, num_integ_points))
5470 vec_sigma_c_gw_cos_omega = 0.0_dp
5471 ALLOCATE (vec_sigma_c_gw_sin_omega(gw_corr_lev_tot, num_integ_points))
5472 vec_sigma_c_gw_sin_omega = 0.0_dp
5474 ALLOCATE (delta_corr_omega(1 + homo - gw_corr_lev_occ:homo + gw_corr_lev_virt, num_integ_points))
5475 delta_corr_omega(:, :) = z_zero
5477 CALL dbcsr_create(matrix=mat_greens_fct_occ, &
5478 template=matrix_s(1)%matrix, &
5479 matrix_type=dbcsr_type_no_symmetry)
5481 CALL dbcsr_create(matrix=mat_greens_fct_virt, &
5482 template=matrix_s(1)%matrix, &
5483 matrix_type=dbcsr_type_no_symmetry)
5485 e_fermi = 0.5_dp*(eigenval(homo) + eigenval(homo + 1))
5487 nblk_mo = dbt_nblks_total(t_3c_overl_int_gw_ao, 3)
5488 ALLOCATE (mo_offsets(nblk_mo))
5489 ALLOCATE (mo_bsizes(nblk_mo))
5490 ALLOCATE (batch_range_mo(nblk_mo - 1))
5491 CALL dbt_get_info(t_3c_overl_int_gw_ao, blk_offset_3=mo_offsets, blk_size_3=mo_bsizes)
5494 CALL dbt_pgrid_create(para_env, pdims_2d, pgrid_2d)
5495 ALLOCATE (sizes_ri(dbt_nblks_total(t_3c_overl_int_gw_ri, 1)))
5496 CALL dbt_get_info(t_3c_overl_int_gw_ri, blk_size_1=sizes_ri)
5498 CALL create_2c_tensor(t_w, dist1, dist2, pgrid_2d, sizes_ri, sizes_ri, name=
"(RI|RI)")
5500 DEALLOCATE (dist1, dist2)
5502 CALL dbt_create(mat_w, t_ri_tmp, name=
"(RI|RI)")
5504 CALL dbt_create(t_3c_overl_int_gw_ri, t_3c_ctr_ri)
5505 CALL dbt_create(t_3c_overl_int_gw_ao, t_3c_ctr_ao)
5507 ALLOCATE (sizes_ao(dbt_nblks_total(t_3c_overl_int_gw_ao, 1)))
5508 CALL dbt_get_info(t_3c_overl_int_gw_ao, blk_size_1=sizes_ao)
5509 CALL create_2c_tensor(t_greens_fct_occ, dist1, dist2, pgrid_2d, sizes_ao, sizes_ao, name=
"(AO|AO)")
5510 DEALLOCATE (dist1, dist2)
5511 CALL create_2c_tensor(t_greens_fct_virt, dist1, dist2, pgrid_2d, sizes_ao, sizes_ao, name=
"(AO|AO)")
5512 DEALLOCATE (dist1, dist2)
5514 DO jquad = 1, num_integ_points
5516 CALL compute_greens_function_time(mat_greens_fct_occ, mat_greens_fct_virt, &
5517 fm_mo_coeff_occ, fm_mo_coeff_virt, &
5518 fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, &
5519 fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, eigenval, &
5520 nmo, eps_filter, e_fermi, tau_tj(jquad), para_env)
5522 CALL dbcsr_set(mat_w, 0.0_dp)
5523 CALL copy_fm_to_dbcsr(fm_mat_w(jquad), mat_w, keep_sparsity=.false.)
5525 IF (jquad == 1)
CALL dbt_create(mat_greens_fct_occ, t_ao_tmp, name=
"(AO|AO)")
5527 CALL dbt_copy_matrix_to_tensor(mat_w, t_ri_tmp)
5528 CALL dbt_copy(t_ri_tmp, t_w)
5529 CALL dbt_copy_matrix_to_tensor(mat_greens_fct_occ, t_ao_tmp)
5530 CALL dbt_copy(t_ao_tmp, t_greens_fct_occ)
5531 CALL dbt_copy_matrix_to_tensor(mat_greens_fct_virt, t_ao_tmp)
5532 CALL dbt_copy(t_ao_tmp, t_greens_fct_virt)
5534 batch_range_mo(:) = [(i, i=2, nblk_mo)]
5535 CALL dbt_batched_contract_init(t_3c_overl_int_gw_ao, batch_range_3=batch_range_mo)
5536 CALL dbt_batched_contract_init(t_3c_overl_int_gw_ri, batch_range_3=batch_range_mo)
5537 CALL dbt_batched_contract_init(t_3c_ctr_ao, batch_range_3=batch_range_mo)
5538 CALL dbt_batched_contract_init(t_3c_ctr_ri, batch_range_3=batch_range_mo)
5539 CALL dbt_batched_contract_init(t_w)
5540 CALL dbt_batched_contract_init(t_greens_fct_occ)
5541 CALL dbt_batched_contract_init(t_greens_fct_virt)
5545 DO iblk_mo = 2, nblk_mo - 1
5546 mo_bounds = [mo_offsets(iblk_mo), mo_offsets(iblk_mo) + mo_bsizes(iblk_mo) - 1]
5547 CALL contract_cubic_gw(t_3c_overl_int_gw_ao, t_3c_overl_int_gw_ri, &
5548 t_greens_fct_occ, t_w, [1.0_dp, -1.0_dp], &
5549 mo_bounds, unit_nr_prv, &
5550 t_3c_ctr_ri, t_3c_ctr_ao, calculate_ctr_ri=.true.)
5551 CALL trace_sigma_gw(t_3c_ctr_ao, t_3c_ctr_ri, vec_sigma_c_gw_neg_tau(:, jquad), mo_start, mo_bounds, para_env)
5553 CALL contract_cubic_gw(t_3c_overl_int_gw_ao, t_3c_overl_int_gw_ri, &
5554 t_greens_fct_virt, t_w, [1.0_dp, 1.0_dp], &
5555 mo_bounds, unit_nr_prv, &
5556 t_3c_ctr_ri, t_3c_ctr_ao, calculate_ctr_ri=.false.)
5558 CALL trace_sigma_gw(t_3c_ctr_ao, t_3c_ctr_ri, vec_sigma_c_gw_pos_tau(:, jquad), mo_start, mo_bounds, para_env)
5560 CALL dbt_batched_contract_finalize(t_3c_overl_int_gw_ao)
5561 CALL dbt_batched_contract_finalize(t_3c_overl_int_gw_ri)
5562 CALL dbt_batched_contract_finalize(t_3c_ctr_ao)
5563 CALL dbt_batched_contract_finalize(t_3c_ctr_ri)
5564 CALL dbt_batched_contract_finalize(t_w)
5565 CALL dbt_batched_contract_finalize(t_greens_fct_occ)
5566 CALL dbt_batched_contract_finalize(t_greens_fct_virt)
5568 CALL dbt_clear(t_3c_ctr_ao)
5569 CALL dbt_clear(t_3c_ctr_ri)
5571 vec_sigma_c_gw_cos_tau(:, jquad) = 0.5_dp*(vec_sigma_c_gw_pos_tau(:, jquad) + &
5572 vec_sigma_c_gw_neg_tau(:, jquad))
5574 vec_sigma_c_gw_sin_tau(:, jquad) = 0.5_dp*(vec_sigma_c_gw_pos_tau(:, jquad) - &
5575 vec_sigma_c_gw_neg_tau(:, jquad))
5578 CALL dbt_destroy(t_w)
5580 CALL dbt_destroy(t_greens_fct_occ)
5581 CALL dbt_destroy(t_greens_fct_virt)
5584 DO jquad = 1, num_fit_points
5586 DO iquad = 1, num_integ_points
5590 weight_cos = weights_cos_tf_t_to_w(jquad, iquad)*cos(omega*tau)
5591 weight_sin = weights_sin_tf_t_to_w(jquad, iquad)*sin(omega*tau)
5593 vec_sigma_c_gw_cos_omega(:, jquad) = vec_sigma_c_gw_cos_omega(:, jquad) + &
5594 weight_cos*vec_sigma_c_gw_cos_tau(:, iquad)
5596 vec_sigma_c_gw_sin_omega(:, jquad) = vec_sigma_c_gw_sin_omega(:, jquad) + &
5597 weight_sin*vec_sigma_c_gw_sin_tau(:, iquad)
5605 vec_sigma_c_gw_sin_omega(1:gw_corr_lev_occ, :) = -vec_sigma_c_gw_sin_omega(1:gw_corr_lev_occ, :)
5607 vec_sigma_c_gw(:, 1:num_fit_points, 1) = vec_sigma_c_gw_cos_omega(:, 1:num_fit_points) + &
5608 gaussi*vec_sigma_c_gw_sin_omega(:, 1:num_fit_points)
5610 CALL dbcsr_release(mat_greens_fct_occ)
5611 CALL dbcsr_release(mat_greens_fct_virt)
5613 IF (do_ri_sigma_x .AND. count_ev_sc_gw == 1 .AND. count_sc_gw0 == 1)
THEN
5615 CALL timeset(routinen//
"_RI_HFX_operation_1", handle3)
5618 CALL parallel_gemm(transa=
"N", transb=
"T", m=nmo, n=nmo, k=nmo, alpha=1.0_dp, &
5619 matrix_a=fm_mo_coeff_occ, matrix_b=fm_mo_coeff_occ, beta=0.0_dp, &
5620 matrix_c=fm_scaled_dm_occ_tau)
5622 CALL timestop(handle3)
5624 CALL timeset(routinen//
"_RI_HFX_operation_2", handle3)
5626 CALL copy_fm_to_dbcsr(fm_scaled_dm_occ_tau, &
5628 keep_sparsity=.false.)
5630 CALL timestop(handle3)
5632 CALL create_2c_tensor(t_dm, dist1, dist2, pgrid_2d, sizes_ao, sizes_ao, name=
"(AO|AO)")
5633 DEALLOCATE (dist1, dist2)
5635 CALL dbt_copy_matrix_to_tensor(mat_dm%matrix, t_ao_tmp)
5636 CALL dbt_copy(t_ao_tmp, t_dm)
5638 CALL create_2c_tensor(t_sinvvsinv, dist1, dist2, pgrid_2d, sizes_ri, sizes_ri, name=
"(RI|RI)")
5639 DEALLOCATE (dist1, dist2)
5641 CALL dbt_copy_matrix_to_tensor(mat_minvvminv%matrix, t_ri_tmp)
5642 CALL dbt_copy(t_ri_tmp, t_sinvvsinv)
5644 CALL dbt_batched_contract_init(t_3c_overl_int_gw_ao, batch_range_3=batch_range_mo)
5645 CALL dbt_batched_contract_init(t_3c_overl_int_gw_ri, batch_range_3=batch_range_mo)
5646 CALL dbt_batched_contract_init(t_3c_ctr_ri, batch_range_3=batch_range_mo)
5647 CALL dbt_batched_contract_init(t_3c_ctr_ao, batch_range_3=batch_range_mo)
5648 CALL dbt_batched_contract_init(t_dm)
5649 CALL dbt_batched_contract_init(t_sinvvsinv)
5651 DO iblk_mo = 2, nblk_mo - 1
5652 mo_bounds = [mo_offsets(iblk_mo), mo_offsets(iblk_mo) + mo_bsizes(iblk_mo) - 1]
5654 CALL contract_cubic_gw(t_3c_overl_int_gw_ao, t_3c_overl_int_gw_ri, &
5655 t_dm, t_sinvvsinv, [1.0_dp, -1.0_dp], &
5656 mo_bounds, unit_nr_prv, &
5657 t_3c_ctr_ri, t_3c_ctr_ao, calculate_ctr_ri=.true.)
5659 CALL trace_sigma_gw(t_3c_ctr_ao, t_3c_ctr_ri, vec_sigma_x_gw(mo_start:mo_end, 1), mo_start, mo_bounds, para_env)
5661 CALL dbt_batched_contract_finalize(t_3c_overl_int_gw_ao)
5662 CALL dbt_batched_contract_finalize(t_3c_overl_int_gw_ri)
5663 CALL dbt_batched_contract_finalize(t_dm)
5664 CALL dbt_batched_contract_finalize(t_sinvvsinv)
5665 CALL dbt_batched_contract_finalize(t_3c_ctr_ri)
5666 CALL dbt_batched_contract_finalize(t_3c_ctr_ao)
5668 CALL dbt_destroy(t_dm)
5669 CALL dbt_destroy(t_sinvvsinv)
5671 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, ispin, 1) = &
5672 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, ispin, 1) + &
5673 vec_sigma_x_gw(:, 1)
5677 CALL dbt_pgrid_destroy(pgrid_2d)
5679 CALL dbt_destroy(t_3c_ctr_ri)
5680 CALL dbt_destroy(t_3c_ctr_ao)
5681 CALL dbt_destroy(t_ao_tmp)
5682 CALL dbt_destroy(t_ri_tmp)
5685 IF (do_periodic)
THEN
5687 ext_scaling = 0.2_dp
5690 DO iquad = 1, num_points_corr
5693 t_i_clenshaw = iquad*pi/(2.0_dp*num_points_corr)
5694 omega_i = ext_scaling/tan(t_i_clenshaw)
5696 IF (iquad < num_points_corr)
THEN
5697 weight_i = ext_scaling*pi/(num_points_corr*sin(t_i_clenshaw)**2)
5699 weight_i = ext_scaling*pi/(2.0_dp*num_points_corr*sin(t_i_clenshaw)**2)
5702 CALL calc_periodic_correction(delta_corr, qs_env, para_env, para_env_rpa, &
5703 mp2_env%ri_g0w0%kp_grid, homo, nmo, gw_corr_lev_occ, &
5704 gw_corr_lev_virt, omega_i, fm_mo_coeff, eigenval, &
5705 matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, &
5706 first_cycle_periodic_correction, kpoints, &
5707 mp2_env%ri_g0w0%do_mo_coeff_gamma, &
5708 mp2_env%ri_g0w0%num_kp_grids, mp2_env%ri_g0w0%eps_kpoint, &
5709 mp2_env%ri_g0w0%do_extra_kpoints, &
5710 mp2_env%ri_g0w0%do_aux_bas_gw, mp2_env%ri_g0w0%frac_aux_mos)
5712 DO n_level_gw = 1, gw_corr_lev_tot
5714 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
5716 IF (n_level_gw <= gw_corr_lev_occ)
THEN
5717 sign_occ_virt = -1.0_dp
5719 sign_occ_virt = 1.0_dp
5722 DO jquad = 1, num_integ_points
5724 omega_sign = tj(jquad)*sign_occ_virt
5726 delta_corr_omega(n_level_gw_ref, jquad) = &
5727 delta_corr_omega(n_level_gw_ref, jquad) - &
5728 0.5_dp/pi*weight_i/2.0_dp*delta_corr(n_level_gw_ref)* &
5729 (1.0_dp/(gaussi*(omega_i + omega_sign) + e_fermi - eigenval(n_level_gw_ref)) + &
5730 1.0_dp/(gaussi*(-omega_i + omega_sign) + e_fermi - eigenval(n_level_gw_ref)))
5738 gw_lev_start = 1 + homo - gw_corr_lev_occ
5739 gw_lev_end = homo + gw_corr_lev_virt
5742 vec_sigma_c_gw(1:gw_corr_lev_tot, :, 1) = vec_sigma_c_gw(1:gw_corr_lev_tot, :, 1) + &
5743 delta_corr_omega(gw_lev_start:gw_lev_end, 1:num_fit_points)
5747 DEALLOCATE (vec_sigma_c_gw_pos_tau)
5748 DEALLOCATE (vec_sigma_c_gw_neg_tau)
5749 DEALLOCATE (vec_sigma_c_gw_cos_tau)
5750 DEALLOCATE (vec_sigma_c_gw_sin_tau)
5751 DEALLOCATE (vec_sigma_c_gw_cos_omega)
5752 DEALLOCATE (vec_sigma_c_gw_sin_omega)
5753 DEALLOCATE (delta_corr_omega)
5755 CALL timestop(handle)
5757 END SUBROUTINE compute_self_energy_cubic_gw
5796 SUBROUTINE compute_self_energy_cubic_gw_kpoints(num_integ_points, tau_tj, tj, &
5797 matrix_s, Eigenval, e_fermi, fm_mat_W, &
5798 gw_corr_lev_tot, gw_corr_lev_occ, gw_corr_lev_virt, homo, &
5799 count_ev_sc_GW, count_sc_GW0, &
5800 t_3c_O, t_3c_M, t_3c_O_compressed, t_3c_O_ind, &
5801 mat_W, mat_MinvVMinv, &
5802 weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, vec_Sigma_c_gw, &
5804 mp2_env, num_fit_points, fm_mo_coeff, &
5805 do_ri_Sigma_x, vec_Sigma_x_gw, unit_nr, nspins, &
5806 starts_array_mc, ends_array_mc, eps_filter)
5808 INTEGER,
INTENT(IN) :: num_integ_points
5809 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:), &
5810 INTENT(IN) :: tau_tj, tj
5811 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_s
5812 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(IN) :: eigenval
5813 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: e_fermi
5814 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_w
5815 INTEGER,
INTENT(IN) :: gw_corr_lev_tot
5816 INTEGER,
DIMENSION(:),
INTENT(IN) :: gw_corr_lev_occ, gw_corr_lev_virt, homo
5817 INTEGER,
INTENT(IN) :: count_ev_sc_gw, count_sc_gw0
5818 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_o
5819 TYPE(dbt_type) :: t_3c_m
5820 TYPE(hfx_compression_type),
ALLOCATABLE, &
5821 DIMENSION(:, :, :) :: t_3c_o_compressed
5822 TYPE(block_ind_type),
ALLOCATABLE, &
5823 DIMENSION(:, :, :),
INTENT(INOUT) :: t_3c_o_ind
5824 TYPE(dbcsr_type),
INTENT(INOUT),
TARGET :: mat_w
5825 TYPE(dbcsr_p_type) :: mat_minvvminv
5826 REAL(kind=dp),
DIMENSION(:, :),
INTENT(IN) :: weights_cos_tf_t_to_w, &
5827 weights_sin_tf_t_to_w
5828 COMPLEX(KIND=dp),
DIMENSION(:, :, :, :), &
5829 INTENT(OUT) :: vec_sigma_c_gw
5830 TYPE(qs_environment_type),
POINTER :: qs_env
5831 TYPE(mp_para_env_type),
POINTER :: para_env
5832 TYPE(mp2_type),
INTENT(INOUT) :: mp2_env
5833 INTEGER,
INTENT(IN) :: num_fit_points
5834 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff
5835 LOGICAL,
INTENT(IN) :: do_ri_sigma_x
5836 REAL(kind=dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: vec_sigma_x_gw
5837 INTEGER,
INTENT(IN) :: unit_nr, nspins
5838 INTEGER,
DIMENSION(:),
INTENT(IN) :: starts_array_mc, ends_array_mc
5839 REAL(kind=dp),
INTENT(IN) :: eps_filter
5841 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_self_energy_cubic_gw_kpoints'
5843 INTEGER :: cut_memory, handle, handle2, i_mem, &
5844 iquad, ispin, j_mem, jquad, &
5845 nkp_self_energy, num_points, &
5847 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: dist1, dist2, sizes_ao, sizes_ri
5848 INTEGER,
DIMENSION(2) :: mo_end, mo_start, pdims_2d
5849 INTEGER,
DIMENSION(2, 1) :: bounds_ri_i
5850 INTEGER,
DIMENSION(2, 2) :: bounds_ao_ao_j
5851 INTEGER,
DIMENSION(3) :: dims_3c
5852 LOGICAL :: memory_info
5853 REAL(kind=dp) :: omega, t1, t2, tau, weight_cos, &
5855 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: vec_sigma_c_gw_cos_omega, &
5856 vec_sigma_c_gw_cos_tau, vec_sigma_c_gw_neg_tau, vec_sigma_c_gw_pos_tau, &
5857 vec_sigma_c_gw_sin_omega, vec_sigma_c_gw_sin_tau
5858 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_p_greens_fct_occ, &
5859 mat_p_greens_fct_virt
5860 TYPE(dbcsr_type),
TARGET :: mat_greens_fct_occ, mat_greens_fct_virt, mat_mo_coeff, &
5861 mat_self_energy_ao_ao_neg_tau, mat_self_energy_ao_ao_pos_tau
5862 TYPE(dbt_pgrid_type) :: pgrid_2d
5863 TYPE(dbt_type) :: t_3c_m_w_tmp, t_3c_o_all, t_3c_o_w, &
5864 t_ao_tmp, t_greens_fct_occ, &
5865 t_greens_fct_virt, t_ri_tmp, t_w
5867 CALL timeset(routinen, handle)
5869 memory_info = mp2_env%ri_rpa_im_time%memory_info
5870 IF (memory_info)
THEN
5871 unit_nr_prv = unit_nr
5876 cut_memory = mp2_env%ri_rpa_im_time%cut_memory
5878 DO ispin = 1, nspins
5879 mo_start(ispin) = homo(ispin) - gw_corr_lev_occ(ispin) + 1
5880 mo_end(ispin) = homo(ispin) + gw_corr_lev_virt(ispin)
5881 cpassert(mo_end(ispin) - mo_start(ispin) + 1 == gw_corr_lev_tot)
5884 nkp_self_energy = mp2_env%ri_g0w0%nkp_self_energy
5886 vec_sigma_c_gw = z_zero
5887 ALLOCATE (vec_sigma_c_gw_pos_tau(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5888 vec_sigma_c_gw_pos_tau = 0.0_dp
5889 ALLOCATE (vec_sigma_c_gw_neg_tau(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5890 vec_sigma_c_gw_neg_tau = 0.0_dp
5891 ALLOCATE (vec_sigma_c_gw_cos_tau(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5892 vec_sigma_c_gw_cos_tau = 0.0_dp
5893 ALLOCATE (vec_sigma_c_gw_sin_tau(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5894 vec_sigma_c_gw_sin_tau = 0.0_dp
5896 ALLOCATE (vec_sigma_c_gw_cos_omega(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5897 vec_sigma_c_gw_cos_omega = 0.0_dp
5898 ALLOCATE (vec_sigma_c_gw_sin_omega(gw_corr_lev_tot, num_integ_points, nkp_self_energy, nspins))
5899 vec_sigma_c_gw_sin_omega = 0.0_dp
5901 CALL dbcsr_create(matrix=mat_greens_fct_occ, &
5902 template=matrix_s(1)%matrix, &
5903 matrix_type=dbcsr_type_no_symmetry)
5905 CALL dbcsr_create(matrix=mat_greens_fct_virt, &
5906 template=matrix_s(1)%matrix, &
5907 matrix_type=dbcsr_type_no_symmetry)
5909 CALL dbcsr_create(matrix=mat_self_energy_ao_ao_neg_tau, &
5910 template=matrix_s(1)%matrix, &
5911 matrix_type=dbcsr_type_no_symmetry)
5913 CALL dbcsr_create(matrix=mat_self_energy_ao_ao_pos_tau, &
5914 template=matrix_s(1)%matrix, &
5915 matrix_type=dbcsr_type_no_symmetry)
5917 CALL dbcsr_create(matrix=mat_mo_coeff, &
5918 template=matrix_s(1)%matrix, &
5919 matrix_type=dbcsr_type_no_symmetry)
5921 CALL copy_fm_to_dbcsr(fm_mo_coeff, mat_mo_coeff, keep_sparsity=.false.)
5923 DO ispin = 1, nspins
5924 e_fermi(ispin) = 0.5_dp*(maxval(eigenval(homo, :, ispin)) + minval(eigenval(homo + 1, :, ispin)))
5928 CALL dbt_pgrid_create(para_env, pdims_2d, pgrid_2d)
5929 ALLOCATE (sizes_ri(dbt_nblks_total(t_3c_o(1, 1), 1)))
5930 CALL dbt_get_info(t_3c_o(1, 1), blk_size_1=sizes_ri)
5932 CALL create_2c_tensor(t_w, dist1, dist2, pgrid_2d, sizes_ri, sizes_ri, name=
"(RI|RI)")
5933 DEALLOCATE (dist1, dist2)
5935 CALL dbt_create(mat_w, t_ri_tmp, name=
"(RI|RI)")
5937 ALLOCATE (sizes_ao(dbt_nblks_total(t_3c_o(1, 1), 2)))
5938 CALL dbt_get_info(t_3c_o(1, 1), blk_size_2=sizes_ao)
5939 CALL create_2c_tensor(t_greens_fct_occ, dist1, dist2, pgrid_2d, sizes_ao, sizes_ao, name=
"(AO|AO)")
5941 DEALLOCATE (dist1, dist2)
5942 CALL create_2c_tensor(t_greens_fct_virt, dist1, dist2, pgrid_2d, sizes_ao, sizes_ao, name=
"(AO|AO)")
5943 DEALLOCATE (dist1, dist2)
5945 CALL dbt_get_info(t_3c_m, nfull_total=dims_3c)
5947 CALL dbt_create(t_3c_o(1, 1), t_3c_o_all, name=
"O (RI AO | AO)")
5950 DO i_mem = 1, cut_memory
5951 CALL decompress_tensor(t_3c_o(1, 1), &
5952 t_3c_o_ind(1, 1, i_mem)%ind, &
5953 t_3c_o_compressed(1, 1, i_mem), &
5954 mp2_env%ri_rpa_im_time%eps_compress)
5955 CALL dbt_copy(t_3c_o(1, 1), t_3c_o_all, summation=.true., move_data=.true.)
5958 CALL dbt_create(t_3c_m, t_3c_m_w_tmp, name=
"M W (RI | AO AO)")
5959 CALL dbt_create(t_3c_o(1, 1), t_3c_o_w, name=
"M W (RI AO | AO)")
5961 CALL dbt_create(mat_greens_fct_occ, t_ao_tmp, name=
"(AO|AO)")
5963 IF (count_ev_sc_gw == 1 .AND. count_sc_gw0 == 1 .AND. do_ri_sigma_x)
THEN
5964 num_points = num_integ_points + 1
5966 num_points = num_integ_points
5969 DO jquad = 1, num_points
5973 IF (jquad <= num_integ_points)
THEN
5976 IF (unit_nr > 0)
WRITE (unit_nr,
'(/T3,A,1X,I3)') &
5977 'GW_INFO| Computing self-energy time point', jquad
5981 IF (unit_nr > 0)
WRITE (unit_nr,
'(/T3,A,1X,I3)') &
5982 'GW_INFO| Computing exchange self-energy'
5985 IF (jquad <= num_integ_points)
THEN
5986 CALL dbcsr_set(mat_w, 0.0_dp)
5987 CALL copy_fm_to_dbcsr(fm_mat_w(jquad), mat_w, keep_sparsity=.false.)
5988 CALL dbt_copy_matrix_to_tensor(mat_w, t_ri_tmp)
5990 CALL dbt_copy_matrix_to_tensor(mat_minvvminv%matrix, t_ri_tmp)
5993 CALL dbt_copy(t_ri_tmp, t_w)
5995 DO ispin = 1, nspins
5997 CALL compute_periodic_dm(mat_p_greens_fct_occ, qs_env, &
5998 ispin, num_points, jquad, e_fermi(ispin), tau, &
5999 remove_occ=.false., remove_virt=.true., &
6000 alloc_dm=(jquad == 1 .AND. ispin == 1))
6002 CALL compute_periodic_dm(mat_p_greens_fct_virt, qs_env, &
6003 ispin, num_points, jquad, e_fermi(ispin), tau, &
6004 remove_occ=.true., remove_virt=.false., &
6005 alloc_dm=(jquad == 1 .AND. ispin == 1))
6007 CALL dbcsr_set(mat_greens_fct_occ, 0.0_dp)
6008 CALL dbcsr_copy(mat_greens_fct_occ, mat_p_greens_fct_occ(jquad, 1)%matrix)
6010 CALL dbcsr_set(mat_greens_fct_virt, 0.0_dp)
6011 CALL dbcsr_copy(mat_greens_fct_virt, mat_p_greens_fct_virt(jquad, 1)%matrix)
6013 CALL dbt_copy_matrix_to_tensor(mat_greens_fct_occ, t_ao_tmp)
6014 CALL dbt_copy(t_ao_tmp, t_greens_fct_occ)
6016 CALL dbt_copy_matrix_to_tensor(mat_greens_fct_virt, t_ao_tmp)
6017 CALL dbt_copy(t_ao_tmp, t_greens_fct_virt)
6019 CALL dbcsr_set(mat_self_energy_ao_ao_neg_tau, 0.0_dp)
6020 CALL dbcsr_set(mat_self_energy_ao_ao_pos_tau, 0.0_dp)
6022 CALL dbt_copy(t_3c_o_all, t_3c_m)
6024 CALL dbt_batched_contract_init(t_3c_o_w)
6028 DO i_mem = 1, cut_memory
6034 bounds_ri_i(:, 1) = [qs_env%mp2_env%ri_rpa_im_time%starts_array_mc_RI(i_mem), &
6035 qs_env%mp2_env%ri_rpa_im_time%ends_array_mc_RI(i_mem)]
6037 DO j_mem = 1, cut_memory
6039 bounds_ao_ao_j(:, 1) = [starts_array_mc(j_mem), ends_array_mc(j_mem)]
6040 bounds_ao_ao_j(:, 2) = [1, dims_3c(3)]
6042 CALL timeset(
"tensor_operation_3c_W", handle2)
6044 CALL dbt_contract(1.0_dp, t_w, t_3c_m, 0.0_dp, &
6046 contract_1=[2], notcontract_1=[1], &
6047 contract_2=[1], notcontract_2=[2, 3], &
6048 map_1=[1], map_2=[2, 3], &
6049 bounds_2=bounds_ri_i, &
6050 bounds_3=bounds_ao_ao_j, &
6051 filter_eps=eps_filter, &
6052 unit_nr=unit_nr_prv)
6054 CALL dbt_copy(t_3c_m_w_tmp, t_3c_o_w, order=[1, 2, 3], move_data=.true.)
6056 CALL timestop(handle2)
6058 CALL contract_to_self_energy(t_3c_o_all, t_greens_fct_occ, t_3c_o_w, &
6059 mat_self_energy_ao_ao_neg_tau, &
6060 bounds_ao_ao_j, bounds_ri_i, unit_nr_prv, &
6061 eps_filter, do_occ=.true., do_virt=.false.)
6063 CALL contract_to_self_energy(t_3c_o_all, t_greens_fct_virt, t_3c_o_w, &
6064 mat_self_energy_ao_ao_pos_tau, &
6065 bounds_ao_ao_j, bounds_ri_i, unit_nr_prv, &
6066 eps_filter, do_occ=.false., do_virt=.true.)
6076 CALL dbt_batched_contract_finalize(t_3c_o_w)
6080 IF (jquad <= num_integ_points)
THEN
6082 CALL trafo_to_mo_and_kpoints(qs_env, mat_self_energy_ao_ao_neg_tau, vec_sigma_c_gw_neg_tau(:, jquad, :, ispin), &
6083 homo(ispin), gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), ispin)
6085 CALL trafo_to_mo_and_kpoints(qs_env, mat_self_energy_ao_ao_pos_tau, vec_sigma_c_gw_pos_tau(:, jquad, :, ispin), &
6086 homo(ispin), gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), ispin)
6088 vec_sigma_c_gw_cos_tau(:, jquad, :, ispin) = 0.5_dp*(vec_sigma_c_gw_pos_tau(:, jquad, :, ispin) + &
6089 vec_sigma_c_gw_neg_tau(:, jquad, :, ispin))
6091 vec_sigma_c_gw_sin_tau(:, jquad, :, ispin) = 0.5_dp*(vec_sigma_c_gw_pos_tau(:, jquad, :, ispin) - &
6092 vec_sigma_c_gw_neg_tau(:, jquad, :, ispin))
6096 vec_sigma_x_gw(mo_start(ispin):mo_end(ispin), :, ispin), &
6097 homo(ispin), gw_corr_lev_occ(ispin), gw_corr_lev_virt(ispin), ispin)
6105 IF (unit_nr > 0)
WRITE (unit_nr,
'(T6,A,T56,F25.1)')
'Execution time (s):', t2 - t1
6109 IF (count_ev_sc_gw == 1 .AND. count_sc_gw0 == 1)
THEN
6113 IF (do_ri_sigma_x)
THEN
6114 DO ispin = 1, nspins
6115 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, ispin, :) = mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, ispin, :) + &
6116 vec_sigma_x_gw(:, :, ispin)
6123 DO jquad = 1, num_fit_points
6125 DO iquad = 1, num_integ_points
6129 weight_cos = weights_cos_tf_t_to_w(jquad, iquad)*cos(omega*tau)
6130 weight_sin = weights_sin_tf_t_to_w(jquad, iquad)*sin(omega*tau)
6132 vec_sigma_c_gw_cos_omega(:, jquad, :, :) = vec_sigma_c_gw_cos_omega(:, jquad, :, :) + &
6133 weight_cos*vec_sigma_c_gw_cos_tau(:, iquad, :, :)
6135 vec_sigma_c_gw_sin_omega(:, jquad, :, :) = vec_sigma_c_gw_sin_omega(:, jquad, :, :) + &
6136 weight_sin*vec_sigma_c_gw_sin_tau(:, iquad, :, :)
6144 DO ispin = 1, nspins
6145 vec_sigma_c_gw_sin_omega(1:gw_corr_lev_occ(ispin), :, :, ispin) = &
6146 -vec_sigma_c_gw_sin_omega(1:gw_corr_lev_occ(ispin), :, :, ispin)
6149 vec_sigma_c_gw(:, 1:num_fit_points, :, :) = vec_sigma_c_gw_cos_omega(:, 1:num_fit_points, :, :) + &
6150 gaussi*vec_sigma_c_gw_sin_omega(:, 1:num_fit_points, :, :)
6152 CALL dbt_pgrid_destroy(pgrid_2d)
6154 CALL dbcsr_release(mat_greens_fct_occ)
6155 CALL dbcsr_release(mat_greens_fct_virt)
6156 CALL dbcsr_release(mat_self_energy_ao_ao_neg_tau)
6157 CALL dbcsr_release(mat_self_energy_ao_ao_pos_tau)
6158 CALL dbcsr_release(mat_mo_coeff)
6160 CALL dbcsr_deallocate_matrix_set(mat_p_greens_fct_occ)
6161 CALL dbcsr_deallocate_matrix_set(mat_p_greens_fct_virt)
6163 CALL dbt_destroy(t_w)
6164 CALL dbt_destroy(t_ri_tmp)
6165 CALL dbt_destroy(t_greens_fct_occ)
6166 CALL dbt_destroy(t_greens_fct_virt)
6167 CALL dbt_destroy(t_ao_tmp)
6168 CALL dbt_destroy(t_3c_o_all)
6169 CALL dbt_destroy(t_3c_m_w_tmp)
6170 CALL dbt_destroy(t_3c_o_w)
6172 DEALLOCATE (vec_sigma_c_gw_pos_tau)
6173 DEALLOCATE (vec_sigma_c_gw_neg_tau)
6174 DEALLOCATE (vec_sigma_c_gw_cos_tau)
6175 DEALLOCATE (vec_sigma_c_gw_sin_tau)
6176 DEALLOCATE (vec_sigma_c_gw_cos_omega)
6177 DEALLOCATE (vec_sigma_c_gw_sin_omega)
6179 CALL timestop(handle)
6181 END SUBROUTINE compute_self_energy_cubic_gw_kpoints
6188 TYPE(qs_environment_type),
POINTER :: qs_env
6190 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_minus_vxc_kpoints'
6192 INTEGER :: handle, ikp, ispin, nkp_self_energy, &
6194 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: diag_sigma_x_minus_vxc_mo_mo
6195 TYPE(cp_cfm_type) :: cfm_mo_coeff, ks_mat_ao_ao, &
6196 ks_mat_no_xc_ao_ao, vxc_ao_ao, &
6197 vxc_ao_mo, vxc_mo_mo
6198 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
6199 TYPE(cp_fm_type) :: fm_dummy, fm_sigma_x_minus_vxc_mo_mo, &
6200 fm_tmp_im, fm_tmp_re
6201 TYPE(dft_control_type),
POINTER :: dft_control
6202 TYPE(kpoint_type),
POINTER :: kpoints_sigma, kpoints_sigma_no_xc
6203 TYPE(mp_para_env_type),
POINTER :: para_env
6205 CALL timeset(routinen, handle)
6207 CALL get_qs_env(qs_env, para_env=para_env, dft_control=dft_control)
6209 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
6211 kpoints_sigma_no_xc => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc
6213 nkp_self_energy = kpoints_sigma%nkp
6215 nspins = dft_control%nspins
6217 matrix_struct => kpoints_sigma%kp_env(1)%kpoint_env%wmat(1, 1)%matrix_struct
6219 CALL cp_cfm_create(ks_mat_ao_ao, matrix_struct)
6220 CALL cp_cfm_create(ks_mat_no_xc_ao_ao, matrix_struct)
6221 CALL cp_cfm_create(vxc_ao_ao, matrix_struct)
6222 CALL cp_cfm_create(vxc_ao_mo, matrix_struct)
6223 CALL cp_cfm_create(vxc_mo_mo, matrix_struct)
6224 CALL cp_cfm_create(cfm_mo_coeff, matrix_struct)
6225 CALL cp_fm_create(fm_sigma_x_minus_vxc_mo_mo, matrix_struct)
6226 CALL cp_fm_create(fm_tmp_re, matrix_struct)
6227 CALL cp_fm_create(fm_tmp_im, matrix_struct)
6229 CALL cp_cfm_get_info(cfm_mo_coeff, nrow_global=nmo)
6230 ALLOCATE (diag_sigma_x_minus_vxc_mo_mo(nmo))
6232 DEALLOCATE (qs_env%mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw)
6234 ALLOCATE (qs_env%mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(nmo, 2, nkp_self_energy))
6236 DO ikp = 1, nkp_self_energy
6238 DO ispin = 1, nspins
6240 associate(mos => kpoints_sigma%kp_env(ikp)%kpoint_env%mos)
6241 IF (
ASSOCIATED(mos(1, ispin)%mo_coeff))
THEN
6242 CALL cp_fm_copy_general(mos(1, ispin)%mo_coeff, fm_tmp_re, para_env)
6244 CALL cp_fm_copy_general(fm_dummy, fm_tmp_re, para_env)
6246 IF (
ASSOCIATED(mos(2, ispin)%mo_coeff))
THEN
6247 CALL cp_fm_copy_general(mos(2, ispin)%mo_coeff, fm_tmp_im, para_env)
6249 CALL cp_fm_copy_general(fm_dummy, fm_tmp_im, para_env)
6253 CALL cp_fm_to_cfm(fm_tmp_re, fm_tmp_im, cfm_mo_coeff)
6255 CALL cp_fm_to_cfm(kpoints_sigma%kp_env(ikp)%kpoint_env%wmat(1, ispin), &
6256 kpoints_sigma%kp_env(ikp)%kpoint_env%wmat(2, ispin), ks_mat_ao_ao)
6257 associate(wmat => kpoints_sigma_no_xc%kp_env(ikp)%kpoint_env%wmat)
6258 IF (
ASSOCIATED(wmat(1, ispin)%matrix_struct))
THEN
6259 CALL cp_fm_copy_general(wmat(1, ispin), fm_tmp_re, para_env)
6261 CALL cp_fm_copy_general(fm_dummy, fm_tmp_re, para_env)
6263 IF (
ASSOCIATED(wmat(2, ispin)%matrix_struct))
THEN
6264 CALL cp_fm_copy_general(wmat(2, ispin), fm_tmp_im, para_env)
6266 CALL cp_fm_copy_general(fm_dummy, fm_tmp_im, para_env)
6270 CALL cp_fm_to_cfm(fm_tmp_re, fm_tmp_im, vxc_ao_ao)
6272 CALL parallel_gemm(
'N',
'N', nmo, nmo, nmo, z_one, vxc_ao_ao, cfm_mo_coeff, z_zero, vxc_ao_mo)
6273 CALL parallel_gemm(
'C',
'N', nmo, nmo, nmo, z_one, cfm_mo_coeff, vxc_ao_mo, z_zero, vxc_mo_mo)
6275 CALL cp_cfm_to_fm(vxc_mo_mo, fm_sigma_x_minus_vxc_mo_mo)
6277 CALL cp_fm_get_diag(fm_sigma_x_minus_vxc_mo_mo, diag_sigma_x_minus_vxc_mo_mo)
6279 qs_env%mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, ispin, ikp) = diag_sigma_x_minus_vxc_mo_mo(:)
6285 CALL cp_cfm_release(ks_mat_ao_ao)
6286 CALL cp_cfm_release(ks_mat_no_xc_ao_ao)
6287 CALL cp_cfm_release(vxc_ao_ao)
6288 CALL cp_cfm_release(vxc_ao_mo)
6289 CALL cp_cfm_release(vxc_mo_mo)
6290 CALL cp_cfm_release(cfm_mo_coeff)
6291 CALL cp_fm_release(fm_sigma_x_minus_vxc_mo_mo)
6292 CALL cp_fm_release(fm_tmp_re)
6293 CALL cp_fm_release(fm_tmp_im)
6295 DEALLOCATE (diag_sigma_x_minus_vxc_mo_mo)
6297 CALL timestop(handle)
6312 homo, gw_corr_lev_occ, gw_corr_lev_virt, ispin)
6313 TYPE(qs_environment_type),
POINTER :: qs_env
6314 TYPE(dbcsr_type),
TARGET :: mat_self_energy_ao_ao
6315 REAL(kind=dp),
DIMENSION(:, :) :: vec_sigma
6316 INTEGER :: homo, gw_corr_lev_occ, gw_corr_lev_virt, &
6319 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trafo_to_mo_and_kpoints'
6321 INTEGER :: handle, ikp, nkp_self_energy, nmo, &
6322 periodic(3), size_real_space
6323 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: diag_self_energy
6324 TYPE(cell_type),
POINTER :: cell
6325 TYPE(cp_cfm_type) :: cfm_mo_coeff, cfm_self_energy_ao_ao, &
6326 cfm_self_energy_ao_mo, &
6327 cfm_self_energy_mo_mo
6328 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
6329 TYPE(cp_fm_type) :: fm_self_energy_mo_mo
6330 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_self_energy_ao_ao_kp_im, &
6331 mat_self_energy_ao_ao_kp_re, mat_self_energy_ao_ao_real_space
6332 TYPE(kpoint_type),
POINTER :: kpoints_sigma
6333 TYPE(mp_para_env_type),
POINTER :: para_env
6335 CALL timeset(routinen, handle)
6337 CALL get_qs_env(qs_env, cell=cell, para_env=para_env)
6338 CALL get_cell(cell=cell, periodic=periodic)
6340 size_real_space = 3**(periodic(1) + periodic(2) + periodic(3))
6342 CALL alloc_mat_set(mat_self_energy_ao_ao_real_space, size_real_space, mat_self_energy_ao_ao)
6344 CALL dbcsr_copy(mat_self_energy_ao_ao_real_space(1)%matrix, mat_self_energy_ao_ao)
6346 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
6348 CALL get_mat_cell_t_from_mat_gamma(mat_self_energy_ao_ao_real_space, qs_env, kpoints_sigma, 0, 0)
6350 nkp_self_energy = kpoints_sigma%nkp
6352 CALL alloc_mat_set(mat_self_energy_ao_ao_kp_re, nkp_self_energy, mat_self_energy_ao_ao)
6353 CALL alloc_mat_set(mat_self_energy_ao_ao_kp_im, nkp_self_energy, mat_self_energy_ao_ao)
6355 CALL real_space_to_kpoint_transform_rpa(mat_self_energy_ao_ao_kp_re, mat_self_energy_ao_ao_kp_im, &
6356 mat_self_energy_ao_ao_real_space, kpoints_sigma, 1.0e-50_dp)
6358 CALL dbcsr_get_info(mat_self_energy_ao_ao, nfullrows_total=nmo)
6359 ALLOCATE (diag_self_energy(nmo))
6361 matrix_struct => kpoints_sigma%kp_env(1)%kpoint_env%mos(1, 1)%mo_coeff%matrix_struct
6363 CALL cp_cfm_create(cfm_self_energy_ao_ao, matrix_struct)
6364 CALL cp_cfm_create(cfm_self_energy_ao_mo, matrix_struct)
6365 CALL cp_cfm_create(cfm_self_energy_mo_mo, matrix_struct)
6366 CALL cp_cfm_set_all(cfm_self_energy_ao_ao, z_zero)
6367 CALL cp_cfm_set_all(cfm_self_energy_ao_mo, z_zero)
6368 CALL cp_cfm_set_all(cfm_self_energy_mo_mo, z_zero)
6370 CALL cp_fm_create(fm_self_energy_mo_mo, matrix_struct)
6371 CALL cp_cfm_create(cfm_mo_coeff, matrix_struct)
6373 DO ikp = 1, nkp_self_energy
6375 CALL dbcsr_to_cfm(mat_self_energy_ao_ao_kp_re(ikp)%matrix, &
6376 mat_self_energy_ao_ao_kp_im(ikp)%matrix, cfm_self_energy_ao_ao)
6378 CALL cp_fm_to_cfm(kpoints_sigma%kp_env(ikp)%kpoint_env%mos(1, ispin)%mo_coeff, &
6379 kpoints_sigma%kp_env(ikp)%kpoint_env%mos(2, ispin)%mo_coeff, cfm_mo_coeff)
6381 CALL parallel_gemm(
'N',
'N', nmo, nmo, nmo, z_one, cfm_self_energy_ao_ao, cfm_mo_coeff, &
6382 z_zero, cfm_self_energy_ao_mo)
6384 CALL parallel_gemm(
'C',
'N', nmo, nmo, nmo, z_one, cfm_mo_coeff, cfm_self_energy_ao_mo, &
6385 z_zero, cfm_self_energy_mo_mo)
6387 CALL cp_cfm_to_fm(cfm_self_energy_mo_mo, fm_self_energy_mo_mo)
6389 CALL cp_fm_get_diag(fm_self_energy_mo_mo, diag_self_energy)
6391 vec_sigma(:, ikp) = diag_self_energy(homo - gw_corr_lev_occ + 1:homo + gw_corr_lev_virt)
6395 CALL dbcsr_deallocate_matrix_set(mat_self_energy_ao_ao_real_space)
6396 CALL dbcsr_deallocate_matrix_set(mat_self_energy_ao_ao_kp_re)
6397 CALL dbcsr_deallocate_matrix_set(mat_self_energy_ao_ao_kp_im)
6399 CALL cp_cfm_release(cfm_self_energy_ao_ao)
6400 CALL cp_cfm_release(cfm_self_energy_ao_mo)
6401 CALL cp_cfm_release(cfm_self_energy_mo_mo)
6402 CALL cp_cfm_release(cfm_mo_coeff)
6403 CALL cp_fm_release(fm_self_energy_mo_mo)
6405 DEALLOCATE (diag_self_energy)
6407 CALL timestop(handle)
6417 SUBROUTINE dbcsr_to_cfm(dbcsr_re, dbcsr_im, cfm_mat)
6419 TYPE(dbcsr_type),
POINTER :: dbcsr_re, dbcsr_im
6420 TYPE(cp_cfm_type),
INTENT(IN) :: cfm_mat
6422 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbcsr_to_cfm'
6425 TYPE(cp_fm_type) :: fm_mat_im, fm_mat_re
6427 CALL timeset(routinen, handle)
6429 CALL cp_fm_create(fm_mat_re, cfm_mat%matrix_struct)
6430 CALL cp_fm_create(fm_mat_im, cfm_mat%matrix_struct)
6431 CALL cp_fm_set_all(fm_mat_re, 0.0_dp)
6432 CALL cp_fm_set_all(fm_mat_im, 0.0_dp)
6434 CALL copy_dbcsr_to_fm(dbcsr_re, fm_mat_re)
6435 CALL copy_dbcsr_to_fm(dbcsr_im, fm_mat_im)
6437 CALL cp_fm_to_cfm(fm_mat_re, fm_mat_im, cfm_mat)
6439 CALL cp_fm_release(fm_mat_re)
6440 CALL cp_fm_release(fm_mat_im)
6442 CALL timestop(handle)
6444 END SUBROUTINE dbcsr_to_cfm
6453 SUBROUTINE alloc_mat_set(mat_set, mat_size, template, explicitly_no_symmetry)
6454 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_set
6455 INTEGER,
INTENT(IN) :: mat_size
6456 TYPE(dbcsr_type),
TARGET :: template
6457 LOGICAL,
OPTIONAL :: explicitly_no_symmetry
6459 CHARACTER(LEN=*),
PARAMETER :: routinen =
'alloc_mat_set'
6461 INTEGER :: handle, i_size
6462 LOGICAL :: my_explicitly_no_symmetry
6464 CALL timeset(routinen, handle)
6466 my_explicitly_no_symmetry = .false.
6467 IF (
PRESENT(explicitly_no_symmetry)) my_explicitly_no_symmetry = explicitly_no_symmetry
6470 CALL dbcsr_allocate_matrix_set(mat_set, mat_size)
6471 DO i_size = 1, mat_size
6472 ALLOCATE (mat_set(i_size)%matrix)
6473 IF (my_explicitly_no_symmetry)
THEN
6474 CALL dbcsr_create(matrix=mat_set(i_size)%matrix, template=template, &
6475 matrix_type=dbcsr_type_no_symmetry)
6477 CALL dbcsr_create(matrix=mat_set(i_size)%matrix, template=template)
6479 CALL dbcsr_copy(mat_set(i_size)%matrix, template)
6480 CALL dbcsr_set(mat_set(i_size)%matrix, 0.0_dp)
6483 CALL timestop(handle)
6485 END SUBROUTINE alloc_mat_set
6495 SUBROUTINE alloc_mat_set_2d(mat_set, mat_size_1, mat_size_2, template, explicitly_no_symmetry)
6496 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_set
6497 INTEGER,
INTENT(IN) :: mat_size_1, mat_size_2
6498 TYPE(dbcsr_type),
TARGET :: template
6499 LOGICAL,
OPTIONAL :: explicitly_no_symmetry
6501 CHARACTER(LEN=*),
PARAMETER :: routinen =
'alloc_mat_set_2d'
6503 INTEGER :: handle, i_size, j_size
6504 LOGICAL :: my_explicitly_no_symmetry
6506 CALL timeset(routinen, handle)
6508 my_explicitly_no_symmetry = .false.
6509 IF (
PRESENT(explicitly_no_symmetry)) my_explicitly_no_symmetry = explicitly_no_symmetry
6512 CALL dbcsr_allocate_matrix_set(mat_set, mat_size_1, mat_size_2)
6513 DO i_size = 1, mat_size_1
6514 DO j_size = 1, mat_size_2
6515 ALLOCATE (mat_set(i_size, j_size)%matrix)
6516 IF (my_explicitly_no_symmetry)
THEN
6517 CALL dbcsr_create(matrix=mat_set(i_size, j_size)%matrix, template=template, &
6518 matrix_type=dbcsr_type_no_symmetry)
6520 CALL dbcsr_create(matrix=mat_set(i_size, j_size)%matrix, template=template)
6522 CALL dbcsr_copy(mat_set(i_size, j_size)%matrix, template)
6523 CALL dbcsr_set(mat_set(i_size, j_size)%matrix, 0.0_dp)
6527 CALL timestop(handle)
6529 END SUBROUTINE alloc_mat_set_2d
6544 SUBROUTINE contract_to_self_energy(t_3c_O_all, t_greens_fct, t_3c_O_W, &
6545 mat_self_energy_ao_ao, bounds_ao_ao_j, bounds_RI_i, &
6546 unit_nr, eps_filter, do_occ, do_virt)
6548 TYPE(dbt_type) :: t_3c_o_all, t_greens_fct, t_3c_o_w
6549 TYPE(dbcsr_type),
TARGET :: mat_self_energy_ao_ao
6550 INTEGER,
DIMENSION(2, 2) :: bounds_ao_ao_j
6551 INTEGER,
DIMENSION(2, 1) :: bounds_ri_i
6553 REAL(kind=dp) :: eps_filter
6554 LOGICAL :: do_occ, do_virt
6556 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_to_self_energy'
6559 INTEGER,
DIMENSION(2, 1) :: bounds_ao_j
6560 INTEGER,
DIMENSION(2, 2) :: bounds_ao_all_ri_i, bounds_ri_i_ao_j
6561 REAL(kind=dp) :: sign_self_energy
6562 TYPE(dbt_type) :: t_3c_o_g, t_3c_o_g_tmp, t_self_energy, &
6565 CALL timeset(routinen, handle)
6567 cpassert(do_occ .EQV. (.NOT. do_virt))
6569 CALL dbt_create(t_3c_o_all, t_3c_o_g, name=
"M occ (RI AO | AO)")
6570 CALL dbt_create(t_3c_o_all, t_3c_o_g_tmp, name=
"M occ (RI AO | AO)")
6571 CALL dbt_create(t_greens_fct, t_self_energy, name=
"(AO|AO)")
6572 CALL dbt_create(mat_self_energy_ao_ao, t_self_energy_tmp)
6574 bounds_ao_j(:, 1) = bounds_ao_ao_j(:, 1)
6575 bounds_ao_all_ri_i(:, 1) = bounds_ri_i(:, 1)
6576 bounds_ao_all_ri_i(:, 2) = bounds_ao_ao_j(:, 2)
6578 CALL dbt_contract(1.0_dp, t_greens_fct, t_3c_o_all, 0.0_dp, &
6580 contract_1=[2], notcontract_1=[1], &
6581 contract_2=[3], notcontract_2=[1, 2], &
6582 map_1=[3], map_2=[1, 2], &
6583 bounds_2=bounds_ao_j, &
6584 bounds_3=bounds_ao_all_ri_i, &
6585 filter_eps=eps_filter, &
6588 CALL dbt_copy(t_3c_o_g_tmp, t_3c_o_g, order=[1, 3, 2], move_data=.true.)
6590 IF (do_occ) sign_self_energy = -1.0_dp
6591 IF (do_virt) sign_self_energy = 1.0_dp
6593 bounds_ri_i_ao_j(:, 1) = bounds_ri_i(:, 1)
6594 bounds_ri_i_ao_j(:, 2) = bounds_ao_ao_j(:, 1)
6596 CALL dbt_contract(sign_self_energy, t_3c_o_w, t_3c_o_g, 0.0_dp, &
6598 contract_1=[1, 2], notcontract_1=[3], &
6599 contract_2=[1, 2], notcontract_2=[3], &
6600 map_1=[1], map_2=[2], &
6601 bounds_1=bounds_ri_i_ao_j, &
6602 filter_eps=eps_filter, &
6605 CALL dbt_copy(t_self_energy, t_self_energy_tmp)
6606 CALL dbt_clear(t_self_energy)
6608 CALL dbt_copy_tensor_to_matrix(t_self_energy_tmp, mat_self_energy_ao_ao, summation=.true.)
6610 CALL dbt_destroy(t_3c_o_g)
6611 CALL dbt_destroy(t_3c_o_g_tmp)
6612 CALL dbt_destroy(t_self_energy)
6613 CALL dbt_destroy(t_self_energy_tmp)
6615 CALL timestop(handle)
6617 END SUBROUTINE contract_to_self_energy
6632 SUBROUTINE contract_cubic_gw(t_3c_overl_int_gw_AO, t_3c_overl_int_gw_RI, &
6633 t_AO, t_RI, prefac, &
6634 mo_bounds, unit_nr, &
6635 t_3c_ctr_RI, t_3c_ctr_AO, calculate_ctr_RI)
6636 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_overl_int_gw_ao, &
6637 t_3c_overl_int_gw_ri, t_ao, t_ri
6638 REAL(dp),
DIMENSION(2),
INTENT(IN) :: prefac
6639 INTEGER,
DIMENSION(2),
INTENT(IN) :: mo_bounds
6640 INTEGER,
INTENT(IN) :: unit_nr
6641 TYPE(dbt_type),
INTENT(INOUT) :: t_3c_ctr_ri, t_3c_ctr_ao
6642 LOGICAL,
INTENT(IN) :: calculate_ctr_ri
6644 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_cubic_gw'
6647 INTEGER,
DIMENSION(2, 2) :: ctr_bounds_mo
6648 INTEGER,
DIMENSION(3) :: bounds_3c
6650 CALL timeset(routinen, handle)
6652 IF (calculate_ctr_ri)
THEN
6653 CALL dbt_get_info(t_3c_overl_int_gw_ri, nfull_total=bounds_3c)
6654 ctr_bounds_mo(:, 1) = [1, bounds_3c(2)]
6655 ctr_bounds_mo(:, 2) = mo_bounds
6657 CALL dbt_contract(prefac(1), t_ri, t_3c_overl_int_gw_ri, 0.0_dp, &
6659 contract_1=[2], notcontract_1=[1], &
6660 contract_2=[1], notcontract_2=[2, 3], &
6661 map_1=[1], map_2=[2, 3], &
6662 bounds_3=ctr_bounds_mo, &
6667 CALL dbt_get_info(t_3c_overl_int_gw_ao, nfull_total=bounds_3c)
6668 ctr_bounds_mo(:, 1) = [1, bounds_3c(2)]
6669 ctr_bounds_mo(:, 2) = mo_bounds
6671 CALL dbt_contract(prefac(2), t_ao, t_3c_overl_int_gw_ao, 0.0_dp, &
6673 contract_1=[2], notcontract_1=[1], &
6674 contract_2=[1], notcontract_2=[2, 3], &
6675 map_1=[1], map_2=[2, 3], &
6676 bounds_3=ctr_bounds_mo, &
6679 CALL timestop(handle)
6692 SUBROUTINE trace_sigma_gw(t3c_1, t3c_2, vec_sigma, mo_offset, mo_bounds, para_env)
6693 TYPE(dbt_type),
INTENT(INOUT) :: t3c_1, t3c_2
6694 REAL(kind=dp),
DIMENSION(:),
INTENT(INOUT) :: vec_sigma
6695 INTEGER,
INTENT(IN) :: mo_offset
6696 INTEGER,
DIMENSION(2),
INTENT(IN) :: mo_bounds
6697 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
6699 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trace_sigma_gw'
6701 INTEGER :: handle, n, n_end, n_end_block, n_start, &
6703 INTEGER,
DIMENSION(1) :: trace_shape
6704 INTEGER,
DIMENSION(2) :: mo_bounds_off
6705 INTEGER,
DIMENSION(3) :: boff, bsize, ind
6707 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: block_1, block_2
6709 DIMENSION(mo_bounds(2)-mo_bounds(1)+1) :: vec_sigma_prv
6710 TYPE(dbt_iterator_type) :: iter
6711 TYPE(dbt_type) :: t3c_1_redist
6713 CALL timeset(routinen, handle)
6715 CALL dbt_create(t3c_2, t3c_1_redist)
6716 CALL dbt_copy(t3c_1, t3c_1_redist, order=[2, 1, 3], move_data=.true.)
6718 vec_sigma_prv = 0.0_dp
6724 CALL dbt_iterator_start(iter, t3c_1_redist)
6725 DO WHILE (dbt_iterator_blocks_left(iter))
6726 CALL dbt_iterator_next_block(iter, ind, blk_size=bsize, blk_offset=boff)
6727 CALL dbt_get_block(t3c_1_redist, ind, block_1, found)
6729 CALL dbt_get_block(t3c_2, ind, block_2, found)
6730 IF (.NOT. found) cycle
6732 IF (boff(3) < mo_bounds(1))
THEN
6733 n_start_block = mo_bounds(1) - boff(3) + 1
6737 n_start = boff(3) - mo_bounds(1) + 1
6740 IF (boff(3) + bsize(3) - 1 > mo_bounds(2))
THEN
6741 n_end_block = mo_bounds(2) - boff(3) + 1
6742 n_end = mo_bounds(2) - mo_bounds(1) + 1
6744 n_end_block = bsize(3)
6745 n_end = boff(3) + bsize(3) - mo_bounds(1)
6748 trace_shape(1) =
SIZE(block_1, 1)*
SIZE(block_1, 2)
6749 vec_sigma_prv(n_start:n_end) = &
6750 vec_sigma_prv(n_start:n_end) + &
6751 (/(dot_product(reshape(block_1(:, :, n), trace_shape), &
6752 reshape(block_2(:, :, n), trace_shape)), &
6753 n=n_start_block, n_end_block)/)
6754 DEALLOCATE (block_1, block_2)
6756 CALL dbt_iterator_stop(iter)
6759 CALL dbt_destroy(t3c_1_redist)
6761 CALL para_env%sum(vec_sigma_prv)
6763 mo_bounds_off = mo_bounds - mo_offset + 1
6764 vec_sigma(mo_bounds_off(1):mo_bounds_off(2)) = &
6765 vec_sigma(mo_bounds_off(1):mo_bounds_off(2)) + vec_sigma_prv
6767 CALL timestop(handle)
6787 SUBROUTINE compute_greens_function_time(mat_greens_fct_occ, mat_greens_fct_virt, fm_mo_coeff_occ, fm_mo_coeff_virt, &
6788 fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, &
6789 fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, Eigenval, nmo, &
6790 eps_filter, e_fermi, tau, para_env)
6792 TYPE(dbcsr_type),
INTENT(INOUT) :: mat_greens_fct_occ, mat_greens_fct_virt
6793 TYPE(cp_fm_type),
INTENT(IN) :: fm_mo_coeff_occ, fm_mo_coeff_virt, fm_mo_coeff_occ_scaled, &
6794 fm_mo_coeff_virt_scaled, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau
6795 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: eigenval
6796 INTEGER,
INTENT(IN) :: nmo
6797 REAL(kind=dp),
INTENT(IN) :: eps_filter, e_fermi, tau
6798 TYPE(mp_para_env_type),
INTENT(IN) :: para_env
6800 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Greens_function_time'
6802 INTEGER :: handle, i_global, iib, jjb, ncol_local, &
6804 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
6805 REAL(kind=dp) :: stabilize_exp
6807 CALL timeset(routinen, handle)
6809 CALL para_env%sync()
6812 CALL cp_fm_get_info(matrix=fm_mo_coeff_occ, &
6813 nrow_local=nrow_local, &
6814 ncol_local=ncol_local, &
6815 row_indices=row_indices, &
6816 col_indices=col_indices)
6822 stabilize_exp = 70.0_dp
6825 DO jjb = 1, nrow_local
6826 DO iib = 1, ncol_local
6827 i_global = col_indices(iib)
6829 IF (abs(tau*0.5_dp*(eigenval(i_global) - e_fermi)) < stabilize_exp)
THEN
6830 fm_mo_coeff_occ_scaled%local_data(jjb, iib) = &
6831 fm_mo_coeff_occ%local_data(jjb, iib)*exp(tau*0.5_dp*(eigenval(i_global) - e_fermi))
6833 fm_mo_coeff_occ_scaled%local_data(jjb, iib) = 0.0_dp
6840 DO jjb = 1, nrow_local
6841 DO iib = 1, ncol_local
6842 i_global = col_indices(iib)
6844 IF (abs(tau*0.5_dp*(eigenval(i_global) - e_fermi)) < stabilize_exp)
THEN
6845 fm_mo_coeff_virt_scaled%local_data(jjb, iib) = &
6846 fm_mo_coeff_virt%local_data(jjb, iib)*exp(-tau*0.5_dp*(eigenval(i_global) - e_fermi))
6848 fm_mo_coeff_virt_scaled%local_data(jjb, iib) = 0.0_dp
6854 CALL para_env%sync()
6856 CALL parallel_gemm(transa=
"N", transb=
"T", m=nmo, n=nmo, k=nmo, alpha=1.0_dp, &
6857 matrix_a=fm_mo_coeff_occ_scaled, matrix_b=fm_mo_coeff_occ_scaled, beta=0.0_dp, &
6858 matrix_c=fm_scaled_dm_occ_tau)
6860 CALL parallel_gemm(transa=
"N", transb=
"T", m=nmo, n=nmo, k=nmo, alpha=1.0_dp, &
6861 matrix_a=fm_mo_coeff_virt_scaled, matrix_b=fm_mo_coeff_virt_scaled, beta=0.0_dp, &
6862 matrix_c=fm_scaled_dm_virt_tau)
6864 CALL dbcsr_set(mat_greens_fct_occ, 0.0_dp)
6866 CALL copy_fm_to_dbcsr(fm_scaled_dm_occ_tau, &
6867 mat_greens_fct_occ, &
6868 keep_sparsity=.false.)
6870 CALL dbcsr_filter(mat_greens_fct_occ, eps_filter)
6872 CALL dbcsr_set(mat_greens_fct_virt, 0.0_dp)
6874 CALL copy_fm_to_dbcsr(fm_scaled_dm_virt_tau, &
6875 mat_greens_fct_virt, &
6876 keep_sparsity=.false.)
6878 CALL dbcsr_filter(mat_greens_fct_virt, eps_filter)
6880 CALL timestop(handle)
6882 END SUBROUTINE compute_greens_function_time
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, rab, dab, sab, da_max_set, return_derivatives, s, lds, sdab, pab, force_a)
Purpose: Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions...
Define the atomic kind types and their sub types.
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.
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_core_ppnl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index, basis_type, deltaR, matrix_l)
...
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...
used for collecting diagonalization schemes available for cp_cfm_type
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_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
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...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
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.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
basic linear algebra operations for full matrices
subroutine, public cp_fm_upper_to_full(matrix, work)
given an upper triangular matrix computes the corresponding full matrix
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....
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_invert(matrix, n, info_out)
used to replace the cholesky decomposition by the inverse
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_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_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, stride, zero_tails, silent, mpi_io)
...
This is the start of a dbt_api, all publically needed functions are exported here....
Types and set/get functions for HFX.
subroutine, public dealloc_containers(DATA, memory_usage)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Routines needed for kpoint calculation.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_sym_create(kp_sym)
Create a single kpoint symmetry environment.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
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.
real(kind=dp), parameter, public pi
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public fourpi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculation of band structures.
subroutine, public calculate_kp_orbitals(qs_env, kpoint, scheme, nadd, mp_grid, kpgeneral, group_size_ext)
diagonalize KS matrices at a set of kpoints
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
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.
subroutine, public qs_env_release(qs_env)
releases the given qs_env (see doc/ReferenceCounting.html)
Initialize a qs_env for kpoint calculations starting from a gamma point qs_env.
subroutine, public create_kp_from_gamma(qs_env, qs_env_kp, with_xc_terms)
...
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_berry_moment_matrix(qs_env, cosmat, sinmat, kvec, sab_orb_external, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public setup_neighbor_list(ab_list, basis_set_a, basis_set_b, qs_env, mic, symmetric, molecular, operator_type)
Build a neighborlist.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix_simple(ks_env, matrix_s, basis_set_list_a, basis_set_list_b, sab_nl)
Calculation of the overlap matrix over Cartesian Gaussian functions.
module that contains the definitions of the scf types
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Utility methods to build 3-center integral tensors of various types.
subroutine, public create_2c_tensor(t2c, dist_1, dist_2, pgrid, sizes_1, sizes_2, order, name)
...
Utility methods to build 3-center integral tensors of various types.
subroutine, public decompress_tensor(tensor, blk_indices, compressed, eps)
...
Routines to calculate image charge corrections.
subroutine, public apply_ic_corr(Eigenval, Eigenval_scf, ic_corr_list, gw_corr_lev_occ, gw_corr_lev_virt, gw_corr_lev_tot, homo, nmo, unit_nr, do_alpha, do_beta)
...
Utility routines for GW with imaginary time.
subroutine, public get_tensor_3c_overl_int_gw(t_3c_overl_int, t_3c_O_compressed, t_3c_O_ind, t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, starts_array_mc, ends_array_mc, mo_coeff, matrix_s, gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, para_env, do_ic_model, t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, qs_env, unit_nr, do_alpha)
...
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 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 mat_kp_from_mat_gamma(qs_env, mat_kp, mat_gamma, kpoints, ispin, real_mat_real_space)
...
Routines for GW, continuous development [Jan Wilhelm].
subroutine, public get_fermi_level_offset(fermi_level_offset, fermi_level_offset_input, Eigenval, homo)
...
subroutine, public allocate_matrices_gw(vec_Sigma_c_gw, color_rpa_group, dimen_nm_gw, gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, num_integ_group, num_integ_points, unit_nr, gw_corr_lev_tot, num_fit_points, omega_max_fit, do_minimax_quad, do_periodic, do_ri_Sigma_x, my_do_gw, first_cycle_periodic_correction, a_scaling, Eigenval, tj, vec_omega_fit_gw, vec_Sigma_x_gw, delta_corr, Eigenval_last, Eigenval_scf, vec_W_gw, fm_mat_S_gw, fm_mat_S_gw_work, para_env, mp2_env, kpoints, nkp, nkp_self_energy, do_kpoints_cubic_RPA, do_kpoints_from_Gamma)
...
subroutine, public trafo_to_mo_and_kpoints(qs_env, mat_self_energy_ao_ao, vec_Sigma, homo, gw_corr_lev_occ, gw_corr_lev_virt, ispin)
...
subroutine, public allocate_matrices_gw_im_time(gw_corr_lev_occ, gw_corr_lev_virt, homo, nmo, num_integ_points, unit_nr, RI_blk_sizes, do_ic_model, para_env, fm_mat_W, fm_mat_Q, mo_coeff, t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, starts_array_mc, ends_array_mc, t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, matrix_s, mat_W, t_3c_overl_int, t_3c_O_compressed, t_3c_O_ind, qs_env)
...
subroutine, public continuation_pade(vec_gw_energ, vec_omega_fit_gw, z_value, m_value, vec_Sigma_c_gw, vec_Sigma_x_minus_vxc_gw, Eigenval, Eigenval_scf, n_level_gw, gw_corr_lev_occ, nparam_pade, num_fit_points, crossing_search, homo, fermi_level_offset, do_gw_im_time, print_self_energy, count_ev_sc_GW, vec_gw_dos, dos_lower_bound, dos_precision, ndos, min_level_self_energy, max_level_self_energy, dos_eta, dos_min, dos_max)
perform analytic continuation with pade approximation
subroutine, public compute_qp_energies(vec_Sigma_c_gw, count_ev_sc_GW, gw_corr_lev_occ, gw_corr_lev_tot, gw_corr_lev_virt, homo, nmo, num_fit_points, num_integ_points, unit_nr, do_apply_ic_corr_to_gw, do_im_time, do_periodic, do_ri_Sigma_x, first_cycle_periodic_correction, e_fermi, eps_filter, fermi_level_offset, delta_corr, Eigenval, Eigenval_last, Eigenval_scf, iter_sc_GW0, exit_ev_gw, tau_tj, tj, vec_omega_fit_gw, vec_Sigma_x_gw, ic_corr_list, weights_cos_tf_t_to_w, weights_sin_tf_t_to_w, fm_mo_coeff_occ_scaled, fm_mo_coeff_virt_scaled, fm_mo_coeff_occ, fm_mo_coeff_virt, fm_scaled_dm_occ_tau, fm_scaled_dm_virt_tau, mo_coeff, fm_mat_W, para_env, para_env_RPA, mat_dm, mat_MinvVMinv, t_3c_O, t_3c_M, t_3c_overl_int_ao_mo, t_3c_O_compressed, t_3c_O_mo_compressed, t_3c_O_ind, t_3c_O_mo_ind, t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, mat_W, matrix_s, kpoints, mp2_env, qs_env, nkp_self_energy, do_kpoints_cubic_RPA, starts_array_mc, ends_array_mc)
...
subroutine, public compute_w_cubic_gw(fm_mat_W, fm_mat_Q, fm_mat_work, dimen_RI, fm_mat_L, num_integ_points, tj, tau_tj, weights_cos_tf_w_to_t, jquad, omega)
...
subroutine, public compute_gw_self_energy(vec_Sigma_c_gw, dimen_nm_gw, dimen_RI, gw_corr_lev_occ, gw_corr_lev_virt, homo, jquad, nmo, num_fit_points, num_integ_points, do_bse, do_im_time, do_periodic, first_cycle_periodic_correction, fermi_level_offset, omega, Eigenval, delta_corr, vec_omega_fit_gw, vec_W_gw, wj, fm_mat_Q, fm_mat_Q_static_bse, fm_mat_R_gw, fm_mat_S_gw, fm_mat_S_gw_work, mo_coeff, para_env, para_env_RPA, matrix_berry_im_mo_mo, matrix_berry_re_mo_mo, kpoints, qs_env, mp2_env)
...
subroutine, public deallocate_matrices_gw(fm_mat_S_gw_work, vec_W_gw, vec_Sigma_c_gw, vec_omega_fit_gw, vec_Sigma_x_minus_vxc_gw, Eigenval_last, Eigenval_scf, do_periodic, matrix_berry_re_mo_mo, matrix_berry_im_mo_mo, kpoints, vec_Sigma_x_gw, my_do_gw)
...
subroutine, public deallocate_matrices_gw_im_time(weights_cos_tf_w_to_t, weights_sin_tf_t_to_w, do_ic_model, do_kpoints_cubic_RPA, fm_mat_W, t_3c_overl_int_ao_mo, t_3c_O_mo_compressed, t_3c_O_mo_ind, t_3c_overl_int_gw_RI, t_3c_overl_int_gw_AO, t_3c_overl_nnP_ic, t_3c_overl_nnP_ic_reflected, mat_W, qs_env)
...
subroutine, public compute_minus_vxc_kpoints(qs_env)
...
Routines for low-scaling RPA/GW with imaginary time.
subroutine, public compute_periodic_dm(mat_dm_global, qs_env, ispin, num_integ_points, jquad, e_fermi, tau, remove_occ, remove_virt, alloc_dm)
...
parameters that control an scf iteration
All kind of helpful little routines.