89#include "./base/base_uses.f90"
95 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_gw_sigma_x'
117 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos_mp2
118 REAL(kind=
dp),
INTENT(OUT) :: energy_ex, energy_xc_admm(2), t3
119 INTEGER,
INTENT(IN) :: unit_nr
121 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_vec_Sigma_x_minus_vxc_gw'
123 CHARACTER(4) :: occ_virt
124 CHARACTER(LEN=40) :: line
125 INTEGER :: dimen, gw_corr_lev_occ, gw_corr_lev_tot, gw_corr_lev_virt, handle, homo, &
126 homo_reduced_bse, homo_startindex_bse, i_img, ikp, irep, ispin, iunit, max_corr_lev_occ, &
127 max_corr_lev_virt, myfun, myfun_aux, myfun_prim, n_level_gw, n_level_gw_ref, n_rep_hf, &
128 nkp, nkp_sigma, nmo, nspins, print_exx, virtual_reduced_bse, virtual_startindex_bse
129 LOGICAL :: calc_ints, charge_constrain_tmp, do_admm_rpa, do_hfx, do_kpoints_cubic_rpa, &
130 do_kpoints_from_gamma, do_ri_sigma_x, really_read_line
131 REAL(kind=
dp) :: e_gap_gw, e_homo_gw, e_lumo_gw, eh1, ehfx, eigval_dft, eigval_hf_at_dft, &
132 energy_exc, energy_exc1, energy_exc1_aux_fit, energy_exc_aux_fit, energy_total, &
133 exx_minus_vxc, hfx_fraction, min_direct_hf_at_dft_gap, t1, t2, tmp
134 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: matrix_tmp_2_diag
135 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenval_kp_hf_at_dft, vec_sigma_x
136 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_kp, vec_sigma_x_minus_vxc_gw, &
137 vec_sigma_x_minus_vxc_gw_im
138 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
141 TYPE(
dbcsr_p_type),
ALLOCATABLE,
DIMENSION(:) :: mat_exchange_for_kp_from_gamma
142 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
143 matrix_ks_aux_fit_hfx, rho_ao, &
145 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_2d, matrix_ks_kp_im, &
146 matrix_ks_kp_re, matrix_ks_transl, matrix_sigma_x_minus_vxc, matrix_sigma_x_minus_vxc_im, &
148 TYPE(
dbcsr_type) :: matrix_tmp, matrix_tmp_2, mo_coeff_b
150 TYPE(
kpoint_type),
POINTER :: kpoints, kpoints_sigma
156 xc_section_admm_aux, &
159 NULLIFY (admm_env, matrix_ks, matrix_ks_aux_fit, rho_ao, matrix_sigma_x_minus_vxc, input, &
160 xc_section, xc_section_admm_aux, xc_section_admm_prim, hfx_sections, rho, &
161 dft_control, para_env, ks_env, mo_coeff, matrix_sigma_x_minus_vxc_im, matrix_ks_aux_fit_hfx, &
162 rho_aux_fit, rho_ao_aux_fit)
164 CALL timeset(routinen, handle)
168 do_admm_rpa = mp2_env%ri_rpa%do_admm
169 do_ri_sigma_x = mp2_env%ri_g0w0%do_ri_Sigma_x
170 do_kpoints_cubic_rpa = qs_env%mp2_env%ri_rpa_im_time%do_im_time_kpoints
171 do_kpoints_from_gamma = qs_env%mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma
172 print_exx = mp2_env%ri_g0w0%print_exx
174 IF (do_kpoints_cubic_rpa)
THEN
175 cpassert(do_ri_sigma_x)
178 IF (do_kpoints_cubic_rpa)
THEN
182 matrix_ks_kp=matrix_ks_transl, &
185 dft_control=dft_control, &
196 matrix_ks=matrix_ks, &
199 dft_control=dft_control, &
206 IF (do_admm_rpa)
THEN
207 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, rho_aux_fit=rho_aux_fit, &
208 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx)
209 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux_fit)
220 nspins = dft_control%nspins
224 IF (do_kpoints_from_gamma)
THEN
226 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks(nspins))
228 NULLIFY (qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
229 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
230 CALL dbcsr_create(qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix, &
231 template=matrix_ks(ispin)%matrix)
233 qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
238 IF (do_kpoints_cubic_rpa)
THEN
240 CALL allocate_matrix_ks_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
241 CALL transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
244 DO i_img = 1,
SIZE(matrix_ks_transl, 2)
245 CALL dbcsr_set(matrix_ks_transl(ispin, i_img)%matrix, 0.0_dp)
252 NULLIFY (matrix_sigma_x_minus_vxc)
254 IF (do_kpoints_cubic_rpa)
THEN
255 NULLIFY (matrix_sigma_x_minus_vxc_im)
262 IF (do_kpoints_cubic_rpa)
THEN
264 ALLOCATE (matrix_sigma_x_minus_vxc(ispin, ikp)%matrix)
265 CALL dbcsr_create(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, &
266 template=matrix_ks_kp_re(1, 1)%matrix, &
267 matrix_type=dbcsr_type_symmetric)
269 CALL dbcsr_copy(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks_kp_re(ispin, ikp)%matrix)
270 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
272 ALLOCATE (matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix)
273 CALL dbcsr_create(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, &
274 template=matrix_ks_kp_im(1, 1)%matrix, &
275 matrix_type=dbcsr_type_antisymmetric)
277 CALL dbcsr_copy(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, matrix_ks_kp_im(ispin, ikp)%matrix)
278 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
282 ALLOCATE (matrix_sigma_x_minus_vxc(ispin, ikp)%matrix)
283 CALL dbcsr_create(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, &
284 template=matrix_ks(1)%matrix)
286 CALL dbcsr_copy(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks(ispin)%matrix)
287 CALL dbcsr_set(matrix_ks(ispin)%matrix, 0.0_dp)
299 hfx_fraction = qs_env%x_data(1, 1)%general_parameter%fraction
300 qs_env%x_data(:, :)%general_parameter%fraction = 0.0_dp
310 IF (dft_control%do_admm)
THEN
327 charge_constrain_tmp = .false.
328 IF (admm_env%charge_constrain)
THEN
329 admm_env%charge_constrain = .false.
330 charge_constrain_tmp = .true.
337 IF (do_admm_rpa)
THEN
339 CALL dbcsr_set(matrix_ks_aux_fit(ispin)%matrix, 0.0_dp)
343 IF (.NOT. mp2_env%ri_g0w0%update_xc_energy)
THEN
344 energy_total = energy%total
345 energy_exc = energy%exc
346 energy_exc1 = energy%exc1
347 energy_exc_aux_fit = energy%ex
348 energy_exc1_aux_fit = energy%exc_aux_fit
349 energy_ex = energy%exc1_aux_fit
353 energy%total = energy%total - (energy%exc + energy%exc1 + energy%ex + &
354 energy%exc_aux_fit + energy%exc1_aux_fit)
360 IF (.NOT. mp2_env%ri_g0w0%update_xc_energy)
THEN
361 energy%exc = energy_exc
362 energy%exc1 = energy_exc1
363 energy%exc_aux_fit = energy_ex
364 energy%exc1_aux_fit = energy_exc_aux_fit
365 energy%ex = energy_exc1_aux_fit
366 energy%total = energy_total
373 qs_env%x_data(:, :)%general_parameter%fraction = hfx_fraction
376 IF (dft_control%do_admm)
THEN
386 IF (charge_constrain_tmp)
THEN
387 admm_env%charge_constrain = .true.
391 IF (do_kpoints_cubic_rpa)
THEN
392 CALL transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
397 IF (do_kpoints_cubic_rpa)
THEN
399 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks_kp_re(ispin, ikp)%matrix, -1.0_dp, 1.0_dp)
400 CALL dbcsr_add(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, matrix_ks_kp_im(ispin, ikp)%matrix, -1.0_dp, 1.0_dp)
403 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, 1)%matrix, matrix_ks(ispin)%matrix, -1.0_dp, 1.0_dp)
407 IF (do_kpoints_cubic_rpa)
THEN
409 CALL transform_sigma_x_minus_vxc_to_mo_basis(kpoints, matrix_sigma_x_minus_vxc, &
410 matrix_sigma_x_minus_vxc_im, &
411 vec_sigma_x_minus_vxc_gw, &
412 vec_sigma_x_minus_vxc_gw_im, &
413 para_env, nmo, mp2_env)
418 CALL dbcsr_set(matrix_ks(ispin)%matrix, 0.0_dp)
419 IF (do_admm_rpa)
THEN
420 CALL dbcsr_set(matrix_ks_aux_fit(ispin)%matrix, 0.0_dp)
431 IF (.NOT. do_ri_sigma_x)
THEN
433 CALL exx_pre_hfx(hfx_sections, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
434 calc_ints = .NOT. qs_env%mp2_env%ri_rpa%reuse_hfx
437 DO irep = 1, n_rep_hf
438 IF (do_admm_rpa)
THEN
439 matrix_ks_2d(1:nspins, 1:1) => matrix_ks_aux_fit(1:nspins)
440 rho_ao_2d(1:nspins, 1:1) => rho_ao_aux_fit(1:nspins)
442 matrix_ks_2d(1:nspins, 1:1) => matrix_ks(1:nspins)
443 rho_ao_2d(1:nspins, 1:1) => rho_ao(1:nspins)
446 IF (qs_env%mp2_env%ri_rpa%x_data(irep, 1)%do_hfx_ri)
THEN
447 CALL hfx_ri_update_ks(qs_env, qs_env%mp2_env%ri_rpa%x_data(irep, 1)%ri_data, matrix_ks_2d, ehfx, &
448 rho_ao=rho_ao_2d, geometry_did_change=calc_ints, nspins=nspins, &
449 hf_fraction=qs_env%mp2_env%ri_rpa%x_data(irep, 1)%general_parameter%fraction)
451 IF (do_admm_rpa)
THEN
454 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(ispin)%matrix, matrix_ks_2d(ispin, 1)%matrix, &
455 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
460 rho_ao_2d, hfx_sections, &
461 para_env, calc_ints, irep, .true., &
468 IF (do_admm_rpa)
THEN
470 matrix_prim=matrix_ks, &
471 matrix_aux=matrix_ks_aux_fit, &
472 x_data=qs_env%mp2_env%ri_rpa%x_data, &
473 exc=energy_xc_admm(1), &
474 exc_aux_fit=energy_xc_admm(2), &
475 calc_forces=.false., &
479 IF (do_kpoints_from_gamma .AND. print_exx ==
gw_print_exx)
THEN
480 ALLOCATE (mat_exchange_for_kp_from_gamma(1))
483 NULLIFY (mat_exchange_for_kp_from_gamma(ispin)%matrix)
484 ALLOCATE (mat_exchange_for_kp_from_gamma(ispin)%matrix)
485 CALL dbcsr_create(mat_exchange_for_kp_from_gamma(ispin)%matrix, template=matrix_ks(ispin)%matrix)
486 CALL dbcsr_desymmetrize(matrix_ks(ispin)%matrix, mat_exchange_for_kp_from_gamma(ispin)%matrix)
491 CALL exx_post_hfx(qs_env, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
498 IF (do_admm_rpa)
THEN
503 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, 1)%matrix, matrix_ks(ispin)%matrix, 1.0_dp, 1.0_dp)
508 IF (do_kpoints_from_gamma)
THEN
510 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(nspins))
512 NULLIFY (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
513 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
514 CALL dbcsr_create(qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix, &
515 template=matrix_ks(ispin)%matrix)
518 qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
531 eigenvalues=mo_eigenvalues, &
538 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp))
539 vec_sigma_x_minus_vxc_gw = 0.0_dp
541 ALLOCATE (matrix_tmp_2_diag(dimen))
558 gw_corr_lev_occ = mp2_env%ri_g0w0%corr_mos_occ
559 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_virt
564 max_corr_lev_occ = homo
565 max_corr_lev_virt = nmo - homo
568 IF (mp2_env%bse%do_bse)
THEN
573 IF (mp2_env%bse%bse_cutoff_occ < 0)
THEN
576 IF (gw_corr_lev_occ > 0)
THEN
581 IF (mp2_env%bse%bse_cutoff_empty < 0)
THEN
582 gw_corr_lev_virt = -1
584 IF (gw_corr_lev_virt > 0)
THEN
585 gw_corr_lev_virt = -2
591 homo, max_corr_lev_virt, &
592 homo_reduced_bse, virtual_reduced_bse, &
593 homo_startindex_bse, virtual_startindex_bse, &
595 IF (gw_corr_lev_occ == -2)
THEN
596 cpwarn(
"BSE cutoff overwrites user input for CORR_MOS_OCC")
597 gw_corr_lev_occ = homo_reduced_bse
599 IF (gw_corr_lev_virt == -2)
THEN
600 cpwarn(
"BSE cutoff overwrites user input for CORR_MOS_VIRT")
601 gw_corr_lev_virt = virtual_reduced_bse
608 IF (gw_corr_lev_occ > homo .OR. gw_corr_lev_occ < 0) gw_corr_lev_occ = max_corr_lev_occ
609 IF (gw_corr_lev_virt > max_corr_lev_virt .OR. gw_corr_lev_virt < 0) gw_corr_lev_virt = max_corr_lev_virt
611 mp2_env%ri_g0w0%corr_mos_occ = gw_corr_lev_occ
612 mp2_env%ri_g0w0%corr_mos_virt = gw_corr_lev_virt
613 ELSE IF (ispin == 2)
THEN
616 IF (mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt /= &
617 gw_corr_lev_occ + gw_corr_lev_virt)
THEN
618 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt - gw_corr_lev_occ
620 mp2_env%ri_g0w0%corr_mos_occ_beta = gw_corr_lev_occ
621 mp2_env%ri_g0w0%corr_mos_virt_beta = gw_corr_lev_virt
625 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_sigma_x_minus_vxc(ispin, 1)%matrix, &
626 mo_coeff_b, 0.0_dp, matrix_tmp, first_column=homo + 1 - gw_corr_lev_occ, &
627 last_column=homo + gw_corr_lev_virt)
630 matrix_tmp, 0.0_dp, matrix_tmp_2, first_row=homo + 1 - gw_corr_lev_occ, &
631 last_row=homo + gw_corr_lev_virt)
634 vec_sigma_x_minus_vxc_gw(1:nmo, ispin, 1) = matrix_tmp_2_diag(1:nmo)
641 CALL para_env%sum(vec_sigma_x_minus_vxc_gw)
648 IF (do_kpoints_cubic_rpa)
THEN
656 IF (do_kpoints_cubic_rpa)
THEN
662 ALLOCATE (mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(nmo, nspins, nkp))
666 IF (do_kpoints_from_gamma)
THEN
668 gw_corr_lev_tot = gw_corr_lev_occ + gw_corr_lev_virt
677 ALLOCATE (eigenval_kp(nmo, 1, nspins))
683 nkp_sigma =
SIZE(eigenval_kp, 2)
685 ALLOCATE (vec_sigma_x(nmo, nkp_sigma))
686 vec_sigma_x(:, :) = 0.0_dp
689 mat_exchange_for_kp_from_gamma(1)%matrix, &
690 vec_sigma_x(homo - gw_corr_lev_occ + 1:homo + gw_corr_lev_virt, :), &
691 homo, gw_corr_lev_occ, gw_corr_lev_virt, 1)
694 DEALLOCATE (mat_exchange_for_kp_from_gamma(1)%matrix)
695 DEALLOCATE (mat_exchange_for_kp_from_gamma)
697 DEALLOCATE (vec_sigma_x_minus_vxc_gw)
699 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp_sigma))
701 vec_sigma_x_minus_vxc_gw(:, 1, :) = vec_sigma_x(:, :) + &
702 qs_env%mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, :)
704 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
712 IF (unit_nr > 0)
THEN
714 ALLOCATE (eigenval_kp_hf_at_dft(nmo, nkp_sigma))
715 eigenval_kp_hf_at_dft(:, :) = eigenval_kp(:, :, 1) + vec_sigma_x_minus_vxc_gw(:, 1, :)
717 min_direct_hf_at_dft_gap = 100.0_dp
719 WRITE (unit_nr,
'(T3,A)')
''
720 WRITE (unit_nr,
'(T3,A)')
'Exchange energies'
721 WRITE (unit_nr,
'(T3,A)')
'-----------------'
722 WRITE (unit_nr,
'(T3,A)')
''
723 WRITE (unit_nr,
'(T6,2A)')
'MO e_n^DFT Sigma_x-vxc e_n^HF@DFT'
724 DO ikp = 1, nkp_sigma
725 IF (nkp_sigma > 1)
THEN
726 WRITE (unit_nr,
'(T3,A)')
''
727 WRITE (unit_nr,
'(T3,A7,I3,A3,I3,A8,3F7.3,A12,3F7.3)')
'Kpoint ', ikp,
' /', nkp_sigma, &
728 ' xkp =', kpoints_sigma%xkp(1, ikp), kpoints_sigma%xkp(2, ikp), &
729 kpoints_sigma%xkp(3, ikp),
' and xkp =', -kpoints_sigma%xkp(1, ikp), &
730 -kpoints_sigma%xkp(2, ikp), -kpoints_sigma%xkp(3, ikp)
731 WRITE (unit_nr,
'(T3,A)')
''
733 DO n_level_gw = 1, gw_corr_lev_occ + gw_corr_lev_virt
735 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
736 IF (n_level_gw <= gw_corr_lev_occ)
THEN
742 eigval_dft = eigenval_kp(n_level_gw_ref, ikp, 1)*
evolt
743 exx_minus_vxc = real(vec_sigma_x_minus_vxc_gw(n_level_gw_ref, 1, ikp)*
evolt, kind=
dp)
744 eigval_hf_at_dft = eigenval_kp_hf_at_dft(n_level_gw_ref, ikp)*
evolt
746 WRITE (unit_nr,
'(T4,I4,3A,3F21.3,3F21.3,3F21.3)') &
747 n_level_gw_ref,
' ( ', occ_virt,
') ', eigval_dft, exx_minus_vxc, eigval_hf_at_dft
750 e_homo_gw = maxval(eigenval_kp_hf_at_dft(homo - gw_corr_lev_occ + 1:homo, ikp))
751 e_lumo_gw = minval(eigenval_kp_hf_at_dft(homo + 1:homo + gw_corr_lev_virt, ikp))
752 e_gap_gw = e_lumo_gw - e_homo_gw
753 IF (e_gap_gw < min_direct_hf_at_dft_gap) min_direct_hf_at_dft_gap = e_gap_gw
754 WRITE (unit_nr,
'(T3,A)')
''
755 WRITE (unit_nr,
'(T3,A,F53.2)')
'HF@DFT HOMO-LUMO gap (eV)', e_gap_gw*
evolt
756 WRITE (unit_nr,
'(T3,A)')
''
759 WRITE (unit_nr,
'(T3,A)')
''
760 WRITE (unit_nr,
'(T3,A)')
''
761 WRITE (unit_nr,
'(T3,A,F63.3)')
'HF@DFT direct bandgap (eV)', min_direct_hf_at_dft_gap*
evolt
763 WRITE (unit_nr,
'(T3,A)')
''
764 WRITE (unit_nr,
'(T3,A)')
'End of exchange energies'
765 WRITE (unit_nr,
'(T3,A)')
'------------------------'
766 WRITE (unit_nr,
'(T3,A)')
''
768 cpabort(
'Stop after printing exchange energies.')
778 CALL open_file(unit_number=iunit, file_name=
"exx.out")
780 really_read_line = .false.
784 READ (iunit,
'(A)') line
786 IF (line ==
" End of exchange energies ")
EXIT
788 IF (really_read_line)
THEN
790 READ (line(1:7), *) n_level_gw_ref
791 READ (line(17:40), *) tmp
793 DO ikp = 1,
SIZE(vec_sigma_x_minus_vxc_gw, 3)
794 vec_sigma_x_minus_vxc_gw(n_level_gw_ref, 1, ikp) = tmp/
evolt
799 IF (line ==
" MO Sigma_x-vxc ") really_read_line = .true.
808 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, :, :) = vec_sigma_x_minus_vxc_gw(:, :, :)
811 DEALLOCATE (matrix_sigma_x_minus_vxc, vec_sigma_x_minus_vxc_gw)
812 IF (do_kpoints_cubic_rpa)
THEN
813 DEALLOCATE (matrix_sigma_x_minus_vxc_im)
820 CALL timestop(handle)
835 SUBROUTINE transform_sigma_x_minus_vxc_to_mo_basis(kpoints, matrix_sigma_x_minus_vxc, &
836 matrix_sigma_x_minus_vxc_im, vec_Sigma_x_minus_vxc_gw, &
837 vec_Sigma_x_minus_vxc_gw_im, para_env, nmo, mp2_env)
840 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_sigma_x_minus_vxc, &
841 matrix_sigma_x_minus_vxc_im
842 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: vec_sigma_x_minus_vxc_gw, &
843 vec_sigma_x_minus_vxc_gw_im
848 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_sigma_x_minus_vxc_to_MO_basis'
850 INTEGER :: dimen, gw_corr_lev_occ, gw_corr_lev_virt, handle, homo, i_global, iib, ikp, &
851 ispin, j_global, jjb, max_corr_lev_occ, max_corr_lev_virt, ncol_local, nkp, nrow_local, &
853 INTEGER,
DIMENSION(2) :: kp_range
854 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
855 REAL(kind=
dp) :: imval, reval
856 TYPE(
cp_cfm_type) :: cfm_mos, cfm_sigma_x_minus_vxc, &
857 cfm_sigma_x_minus_vxc_mo_basis, cfm_tmp
861 TYPE(
mo_set_type),
POINTER :: mo_set, mo_set_im, mo_set_re
863 CALL timeset(routinen, handle)
865 mo_set => kpoints%kp_env(1)%kpoint_env%mos(1, 1)
868 nspins =
SIZE(matrix_sigma_x_minus_vxc, 1)
873 cpassert(kp_range(1) == 1 .AND. kp_range(2) == nkp)
875 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp))
876 vec_sigma_x_minus_vxc_gw = 0.0_dp
878 ALLOCATE (vec_sigma_x_minus_vxc_gw_im(nmo, nspins, nkp))
879 vec_sigma_x_minus_vxc_gw_im = 0.0_dp
886 CALL cp_cfm_create(cfm_sigma_x_minus_vxc_mo_basis, matrix_struct)
890 nrow_local=nrow_local, &
891 ncol_local=ncol_local, &
892 row_indices=row_indices, &
893 col_indices=col_indices)
898 kp => kpoints%kp_env(ikp)%kpoint_env
903 CALL copy_dbcsr_to_fm(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, fwork_re)
904 CALL copy_dbcsr_to_fm(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, fwork_im)
910 mo_set_re => kp%mos(1, ispin)
911 mo_set_im => kp%mos(2, ispin)
922 z_zero, cfm_sigma_x_minus_vxc_mo_basis)
924 DO jjb = 1, ncol_local
926 j_global = col_indices(jjb)
928 DO iib = 1, nrow_local
930 i_global = row_indices(iib)
932 IF (j_global == i_global .AND. i_global <= nmo)
THEN
934 reval = real(cfm_sigma_x_minus_vxc_mo_basis%local_data(iib, jjb), kind=
dp)
935 imval = aimag(cfm_sigma_x_minus_vxc_mo_basis%local_data(iib, jjb))
937 vec_sigma_x_minus_vxc_gw(i_global, ispin, ikp) = reval
938 vec_sigma_x_minus_vxc_gw_im(i_global, ispin, ikp) = imval
950 CALL para_env%sum(vec_sigma_x_minus_vxc_gw)
951 CALL para_env%sum(vec_sigma_x_minus_vxc_gw_im)
954 CALL get_mo_set(mo_set=kpoints%kp_env(1)%kpoint_env%mos(ispin, 1), &
955 homo=homo, nao=dimen)
959 max_corr_lev_occ = homo
960 max_corr_lev_virt = nmo - homo
962 gw_corr_lev_occ = mp2_env%ri_g0w0%corr_mos_occ
963 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_virt
966 IF (gw_corr_lev_occ > homo .OR. gw_corr_lev_occ < 0) gw_corr_lev_occ = max_corr_lev_occ
967 IF (gw_corr_lev_virt > max_corr_lev_virt .OR. gw_corr_lev_virt < 0) gw_corr_lev_virt = max_corr_lev_virt
969 mp2_env%ri_g0w0%corr_mos_occ = gw_corr_lev_occ
970 mp2_env%ri_g0w0%corr_mos_virt = gw_corr_lev_virt
971 ELSE IF (ispin == 2)
THEN
974 IF (mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt /= &
975 gw_corr_lev_occ + gw_corr_lev_virt)
THEN
976 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt - gw_corr_lev_occ
978 mp2_env%ri_g0w0%corr_mos_occ_beta = gw_corr_lev_occ
979 mp2_env%ri_g0w0%corr_mos_virt_beta = gw_corr_lev_virt
990 CALL timestop(handle)
1001 SUBROUTINE transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
1003 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_transl, matrix_ks_kp_re, &
1007 CHARACTER(len=*),
PARAMETER :: routinen =
'transform_matrix_ks_to_kp'
1009 INTEGER :: handle, ikp, ispin, nkp, nspin
1010 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1011 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1015 CALL timeset(routinen, handle)
1018 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, sab_nl=sab_nl, cell_to_index=cell_to_index)
1020 cpassert(
ASSOCIATED(sab_nl))
1022 nspin =
SIZE(matrix_ks_transl, 1)
1027 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
1028 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
1029 CALL rskp_transform(rmatrix=matrix_ks_kp_re(ispin, ikp)%matrix, &
1030 cmatrix=matrix_ks_kp_im(ispin, ikp)%matrix, &
1031 rsmat=matrix_ks_transl, ispin=ispin, &
1032 xkp=xkp(1:3, ikp), cell_to_index=cell_to_index, sab_nl=sab_nl)
1037 CALL timestop(handle)
1048 SUBROUTINE allocate_matrix_ks_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
1050 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_transl, matrix_ks_kp_re, &
1054 CHARACTER(len=*),
PARAMETER :: routinen =
'allocate_matrix_ks_kp'
1056 INTEGER :: handle, ikp, ispin, nkp, nspin
1057 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1058 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1062 CALL timeset(routinen, handle)
1065 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, sab_nl=sab_nl, cell_to_index=cell_to_index)
1067 cpassert(
ASSOCIATED(sab_nl))
1069 nspin =
SIZE(matrix_ks_transl, 1)
1071 NULLIFY (matrix_ks_kp_re, matrix_ks_kp_im)
1078 ALLOCATE (matrix_ks_kp_re(ispin, ikp)%matrix)
1079 ALLOCATE (matrix_ks_kp_im(ispin, ikp)%matrix)
1081 CALL dbcsr_create(matrix_ks_kp_re(ispin, ikp)%matrix, &
1082 template=matrix_ks_transl(1, 1)%matrix, &
1083 matrix_type=dbcsr_type_symmetric)
1084 CALL dbcsr_create(matrix_ks_kp_im(ispin, ikp)%matrix, &
1085 template=matrix_ks_transl(1, 1)%matrix, &
1086 matrix_type=dbcsr_type_antisymmetric)
1091 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
1092 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
1097 CALL timestop(handle)
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_mo_merge_ks_matrix(qs_env)
...
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Auxiliary routines for GW + Bethe-Salpeter for computing electronic excitations.
subroutine, public determine_cutoff_indices(eigenval, homo, virtual, homo_red, virt_red, homo_incl, virt_incl, mp2_env)
Reads cutoffs for BSE from mp2_env and compares to energies in Eigenval to extract reduced homo/virtu...
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_release_p(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_get_diag(matrix, diag)
Copies the diagonal elements from the given matrix into the given array.
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.
represent the structure of a full matrix
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Routines to calculate HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
Routines to calculate EXX in RPA and energy correction methods.
subroutine, public calc_exx_admm_xc_contributions(qs_env, matrix_prim, matrix_aux, x_data, exc, exc_aux_fit, calc_forces, use_virial)
Calculate the RI_RPAHF / EC_ENVHF ADMM XC contributions to the KS matrices and the respective energie...
subroutine, public exx_pre_hfx(ext_hfx_section, x_data, reuse_hfx)
Prepare the external x_data for integration. Simply change the HFX fraction in case the qs_envx_data ...
subroutine, public exx_post_hfx(qs_env, x_data, reuse_hfx)
Revert back to the proper HFX fraction in case qs_envx_data is reused.
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Defines the basic variable types.
integer, parameter, public dp
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
Routines to calculate and distribute 2c- and 3c- integrals for RI.
subroutine, public compute_kpoints(qs_env, kpoints, unit_nr)
...
Framework for 2c-integrals for RI.
subroutine, public trunc_coulomb_for_exchange(qs_env, trunc_coulomb, rel_cutoff_trunc_coulomb_ri_x, cell_grid, do_bvk_cell)
...
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
Definition of physical constants:
real(kind=dp), parameter, public evolt
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, print_active, ext_ks_matrix)
routine where the real calculations are made: the KS matrix is calculated
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.
Define the neighbor list data types and the corresponding functionality.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Routines treating GW and RPA calculations with kpoints.
subroutine, public get_bandstruc_and_k_dependent_mos(qs_env, eigenval_kp)
...
Routines to calculate EXX within GW.
subroutine, public compute_vec_sigma_x_minus_vxc_gw(qs_env, mp2_env, mos_mp2, energy_ex, energy_xc_admm, t3, unit_nr)
...
Routines for GW, continuous development [Jan Wilhelm].
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 compute_minus_vxc_kpoints(qs_env)
...
stores some data used in wavefunction fitting
Represent a complex full matrix.
keeps the information about the structure of a full matrix
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.