90#include "./base/base_uses.f90"
96 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_gw_sigma_x'
118 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos_mp2
119 REAL(kind=
dp),
INTENT(OUT) :: energy_ex, energy_xc_admm(2), t3
120 INTEGER,
INTENT(IN) :: unit_nr
122 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_vec_Sigma_x_minus_vxc_gw'
124 CHARACTER(4) :: occ_virt
125 CHARACTER(LEN=40) :: line
126 INTEGER :: dimen, gw_corr_lev_occ, gw_corr_lev_tot, gw_corr_lev_virt, handle, homo, &
127 homo_reduced_bse, i_img, ikp, irep, ispin, iunit, max_corr_lev_occ, max_corr_lev_virt, &
128 myfun, myfun_aux, myfun_prim, n_level_gw, n_level_gw_ref, n_rep_hf, nkp, nkp_sigma, nmo, &
129 nspins, print_exx, virtual_reduced_bse
130 LOGICAL :: calc_ints, charge_constrain_tmp, do_admm_rpa, do_hfx, do_kpoints_cubic_rpa, &
131 do_kpoints_from_gamma, do_ri_sigma_x, really_read_line
132 REAL(kind=
dp) :: e_gap_gw, e_homo_gw, e_lumo_gw, eh1, ehfx, eigval_dft, eigval_hf_at_dft, &
133 energy_exc, energy_exc1, energy_exc1_aux_fit, energy_exc_aux_fit, energy_total, &
134 exx_minus_vxc, hfx_fraction, min_direct_hf_at_dft_gap, t1, t2, tmp
135 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: matrix_tmp_2_diag
136 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenval_kp_hf_at_dft, vec_sigma_x
137 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: eigenval_kp, vec_sigma_x_minus_vxc_gw, &
138 vec_sigma_x_minus_vxc_gw_im
139 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
142 TYPE(
dbcsr_p_type),
ALLOCATABLE,
DIMENSION(:) :: mat_exchange_for_kp_from_gamma
143 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
144 matrix_ks_aux_fit_hfx, rho_ao, &
146 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_2d, matrix_ks_kp_im, &
147 matrix_ks_kp_re, matrix_ks_transl, matrix_sigma_x_minus_vxc, matrix_sigma_x_minus_vxc_im, &
149 TYPE(
dbcsr_type) :: matrix_tmp, matrix_tmp_2, mo_coeff_b
151 TYPE(
kpoint_type),
POINTER :: kpoints, kpoints_sigma
158 xc_section_admm_aux, &
161 NULLIFY (admm_env, matrix_ks, matrix_ks_aux_fit, rho_ao, matrix_sigma_x_minus_vxc, input, &
162 xc_section, xc_section_admm_aux, xc_section_admm_prim, hfx_sections, rho, &
163 dft_control, para_env, ks_env, mo_coeff, matrix_sigma_x_minus_vxc_im, matrix_ks_aux_fit_hfx, &
164 rho_aux_fit, rho_ao_aux_fit)
166 CALL timeset(routinen, handle)
170 do_admm_rpa = mp2_env%ri_rpa%do_admm
171 do_ri_sigma_x = mp2_env%ri_g0w0%do_ri_Sigma_x
172 do_kpoints_cubic_rpa = qs_env%mp2_env%ri_rpa_im_time%do_im_time_kpoints
173 do_kpoints_from_gamma = qs_env%mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma
174 print_exx = mp2_env%ri_g0w0%print_exx
176 IF (do_kpoints_cubic_rpa)
THEN
177 cpassert(do_ri_sigma_x)
180 IF (do_kpoints_cubic_rpa)
THEN
184 matrix_ks_kp=matrix_ks_transl, &
187 dft_control=dft_control, &
198 matrix_ks=matrix_ks, &
201 dft_control=dft_control, &
208 IF (do_admm_rpa)
THEN
209 CALL get_admm_env(admm_env, matrix_ks_aux_fit=matrix_ks_aux_fit, rho_aux_fit=rho_aux_fit, &
210 matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx)
211 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux_fit)
222 nspins = dft_control%nspins
226 IF (do_kpoints_from_gamma)
THEN
228 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks(nspins))
230 NULLIFY (qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
231 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
232 CALL dbcsr_create(qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix, &
233 template=matrix_ks(ispin)%matrix)
235 qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix)
240 IF (do_kpoints_cubic_rpa)
THEN
242 CALL allocate_matrix_ks_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
243 CALL transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
246 DO i_img = 1,
SIZE(matrix_ks_transl, 2)
247 CALL dbcsr_set(matrix_ks_transl(ispin, i_img)%matrix, 0.0_dp)
254 NULLIFY (matrix_sigma_x_minus_vxc)
256 IF (do_kpoints_cubic_rpa)
THEN
257 NULLIFY (matrix_sigma_x_minus_vxc_im)
264 IF (do_kpoints_cubic_rpa)
THEN
266 ALLOCATE (matrix_sigma_x_minus_vxc(ispin, ikp)%matrix)
267 CALL dbcsr_create(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, &
268 template=matrix_ks_kp_re(1, 1)%matrix, &
269 matrix_type=dbcsr_type_symmetric)
271 CALL dbcsr_copy(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks_kp_re(ispin, ikp)%matrix)
272 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
274 ALLOCATE (matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix)
275 CALL dbcsr_create(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, &
276 template=matrix_ks_kp_im(1, 1)%matrix, &
277 matrix_type=dbcsr_type_antisymmetric)
279 CALL dbcsr_copy(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, matrix_ks_kp_im(ispin, ikp)%matrix)
280 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
284 ALLOCATE (matrix_sigma_x_minus_vxc(ispin, ikp)%matrix)
285 CALL dbcsr_create(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, &
286 template=matrix_ks(1)%matrix)
288 CALL dbcsr_copy(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks(ispin)%matrix)
289 CALL dbcsr_set(matrix_ks(ispin)%matrix, 0.0_dp)
301 hfx_fraction = qs_env%x_data(1, 1)%general_parameter%fraction
302 qs_env%x_data(:, :)%general_parameter%fraction = 0.0_dp
312 IF (dft_control%do_admm)
THEN
329 charge_constrain_tmp = .false.
330 IF (admm_env%charge_constrain)
THEN
331 admm_env%charge_constrain = .false.
332 charge_constrain_tmp = .true.
339 IF (do_admm_rpa)
THEN
341 CALL dbcsr_set(matrix_ks_aux_fit(ispin)%matrix, 0.0_dp)
345 IF (.NOT. mp2_env%ri_g0w0%update_xc_energy)
THEN
346 energy_total = energy%total
347 energy_exc = energy%exc
348 energy_exc1 = energy%exc1
349 energy_exc_aux_fit = energy%ex
350 energy_exc1_aux_fit = energy%exc_aux_fit
351 energy_ex = energy%exc1_aux_fit
355 energy%total = energy%total - (energy%exc + energy%exc1 + energy%ex + &
356 energy%exc_aux_fit + energy%exc1_aux_fit)
362 IF (.NOT. mp2_env%ri_g0w0%update_xc_energy)
THEN
363 energy%exc = energy_exc
364 energy%exc1 = energy_exc1
365 energy%exc_aux_fit = energy_ex
366 energy%exc1_aux_fit = energy_exc_aux_fit
367 energy%ex = energy_exc1_aux_fit
368 energy%total = energy_total
375 qs_env%x_data(:, :)%general_parameter%fraction = hfx_fraction
378 IF (dft_control%do_admm)
THEN
388 IF (charge_constrain_tmp)
THEN
389 admm_env%charge_constrain = .true.
393 IF (do_kpoints_cubic_rpa)
THEN
394 CALL transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
399 IF (do_kpoints_cubic_rpa)
THEN
401 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, matrix_ks_kp_re(ispin, ikp)%matrix, -1.0_dp, 1.0_dp)
402 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)
405 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, 1)%matrix, matrix_ks(ispin)%matrix, -1.0_dp, 1.0_dp)
409 IF (do_kpoints_cubic_rpa)
THEN
411 CALL transform_sigma_x_minus_vxc_to_mo_basis(kpoints, matrix_sigma_x_minus_vxc, &
412 matrix_sigma_x_minus_vxc_im, &
413 vec_sigma_x_minus_vxc_gw, &
414 vec_sigma_x_minus_vxc_gw_im, &
415 para_env, nmo, mp2_env)
420 CALL dbcsr_set(matrix_ks(ispin)%matrix, 0.0_dp)
421 IF (do_admm_rpa)
THEN
422 CALL dbcsr_set(matrix_ks_aux_fit(ispin)%matrix, 0.0_dp)
433 IF (.NOT. do_ri_sigma_x)
THEN
435 CALL exx_pre_hfx(hfx_sections, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
436 calc_ints = .NOT. qs_env%mp2_env%ri_rpa%reuse_hfx
439 DO irep = 1, n_rep_hf
440 IF (do_admm_rpa)
THEN
441 matrix_ks_2d(1:nspins, 1:1) => matrix_ks_aux_fit(1:nspins)
442 rho_ao_2d(1:nspins, 1:1) => rho_ao_aux_fit(1:nspins)
444 matrix_ks_2d(1:nspins, 1:1) => matrix_ks(1:nspins)
445 rho_ao_2d(1:nspins, 1:1) => rho_ao(1:nspins)
448 IF (qs_env%mp2_env%ri_rpa%x_data(irep, 1)%do_hfx_ri)
THEN
449 CALL hfx_ri_update_ks(qs_env, qs_env%mp2_env%ri_rpa%x_data(irep, 1)%ri_data, matrix_ks_2d, ehfx, &
450 rho_ao=rho_ao_2d, geometry_did_change=calc_ints, nspins=nspins, &
451 hf_fraction=qs_env%mp2_env%ri_rpa%x_data(irep, 1)%general_parameter%fraction)
453 IF (do_admm_rpa)
THEN
456 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(ispin)%matrix, matrix_ks_2d(ispin, 1)%matrix, &
457 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
462 rho_ao_2d, hfx_sections, &
463 para_env, calc_ints, irep, .true., &
470 IF (do_admm_rpa)
THEN
472 matrix_prim=matrix_ks, &
473 matrix_aux=matrix_ks_aux_fit, &
474 x_data=qs_env%mp2_env%ri_rpa%x_data, &
475 exc=energy_xc_admm(1), &
476 exc_aux_fit=energy_xc_admm(2), &
477 calc_forces=.false., &
481 IF (do_kpoints_from_gamma .AND. print_exx ==
gw_print_exx)
THEN
482 ALLOCATE (mat_exchange_for_kp_from_gamma(1))
485 NULLIFY (mat_exchange_for_kp_from_gamma(ispin)%matrix)
486 ALLOCATE (mat_exchange_for_kp_from_gamma(ispin)%matrix)
487 CALL dbcsr_create(mat_exchange_for_kp_from_gamma(ispin)%matrix, template=matrix_ks(ispin)%matrix)
488 CALL dbcsr_desymmetrize(matrix_ks(ispin)%matrix, mat_exchange_for_kp_from_gamma(ispin)%matrix)
493 CALL exx_post_hfx(qs_env, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
500 IF (do_admm_rpa)
THEN
505 CALL dbcsr_add(matrix_sigma_x_minus_vxc(ispin, 1)%matrix, matrix_ks(ispin)%matrix, 1.0_dp, 1.0_dp)
510 IF (do_kpoints_from_gamma)
THEN
512 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(nspins))
514 NULLIFY (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
515 ALLOCATE (qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
516 CALL dbcsr_create(qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix, &
517 template=matrix_ks(ispin)%matrix)
520 qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix)
533 eigenvalues=mo_eigenvalues, &
540 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp))
541 vec_sigma_x_minus_vxc_gw = 0.0_dp
543 ALLOCATE (matrix_tmp_2_diag(dimen))
560 gw_corr_lev_occ = mp2_env%ri_g0w0%corr_mos_occ
561 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_virt
566 max_corr_lev_occ = homo
567 max_corr_lev_virt = nmo - homo
570 IF (mp2_env%bse%do_bse)
THEN
575 IF (mp2_env%bse%bse_cutoff_occ < 0)
THEN
578 IF (gw_corr_lev_occ > 0)
THEN
583 IF (mp2_env%bse%bse_cutoff_empty < 0)
THEN
584 gw_corr_lev_virt = -1
586 IF (gw_corr_lev_virt > 0)
THEN
587 gw_corr_lev_virt = -2
593 mp2_env%bse%bse_cutoff_occ, mp2_env%bse%bse_cutoff_empty, bse_window)
594 homo_reduced_bse = homo - bse_window%first_mo + 1
595 virtual_reduced_bse = bse_window%last_mo - homo
596 IF (gw_corr_lev_occ == -2)
THEN
597 cpwarn(
"BSE cutoff overwrites user input for CORR_MOS_OCC")
598 gw_corr_lev_occ = homo_reduced_bse
600 IF (gw_corr_lev_virt == -2)
THEN
601 cpwarn(
"BSE cutoff overwrites user input for CORR_MOS_VIRT")
602 gw_corr_lev_virt = virtual_reduced_bse
609 IF (gw_corr_lev_occ > homo .OR. gw_corr_lev_occ < 0) gw_corr_lev_occ = max_corr_lev_occ
610 IF (gw_corr_lev_virt > max_corr_lev_virt .OR. gw_corr_lev_virt < 0) gw_corr_lev_virt = max_corr_lev_virt
612 mp2_env%ri_g0w0%corr_mos_occ = gw_corr_lev_occ
613 mp2_env%ri_g0w0%corr_mos_virt = gw_corr_lev_virt
614 ELSE IF (ispin == 2)
THEN
617 IF (mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt /= &
618 gw_corr_lev_occ + gw_corr_lev_virt)
THEN
619 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt - gw_corr_lev_occ
621 mp2_env%ri_g0w0%corr_mos_occ_beta = gw_corr_lev_occ
622 mp2_env%ri_g0w0%corr_mos_virt_beta = gw_corr_lev_virt
626 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_sigma_x_minus_vxc(ispin, 1)%matrix, &
627 mo_coeff_b, 0.0_dp, matrix_tmp, first_column=homo + 1 - gw_corr_lev_occ, &
628 last_column=homo + gw_corr_lev_virt)
631 matrix_tmp, 0.0_dp, matrix_tmp_2, first_row=homo + 1 - gw_corr_lev_occ, &
632 last_row=homo + gw_corr_lev_virt)
635 vec_sigma_x_minus_vxc_gw(1:nmo, ispin, 1) = matrix_tmp_2_diag(1:nmo)
642 CALL para_env%sum(vec_sigma_x_minus_vxc_gw)
649 IF (do_kpoints_cubic_rpa)
THEN
657 IF (do_kpoints_cubic_rpa)
THEN
663 ALLOCATE (mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(nmo, nspins, nkp))
667 IF (do_kpoints_from_gamma)
THEN
669 gw_corr_lev_tot = gw_corr_lev_occ + gw_corr_lev_virt
678 ALLOCATE (eigenval_kp(nmo, 1, nspins))
684 nkp_sigma =
SIZE(eigenval_kp, 2)
686 ALLOCATE (vec_sigma_x(nmo, nkp_sigma))
687 vec_sigma_x(:, :) = 0.0_dp
690 mat_exchange_for_kp_from_gamma(1)%matrix, &
691 vec_sigma_x(homo - gw_corr_lev_occ + 1:homo + gw_corr_lev_virt, :), &
692 homo, gw_corr_lev_occ, gw_corr_lev_virt, 1)
695 DEALLOCATE (mat_exchange_for_kp_from_gamma(1)%matrix)
696 DEALLOCATE (mat_exchange_for_kp_from_gamma)
698 DEALLOCATE (vec_sigma_x_minus_vxc_gw)
700 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp_sigma))
702 vec_sigma_x_minus_vxc_gw(:, 1, :) = vec_sigma_x(:, :) + &
703 qs_env%mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, 1, :)
705 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
713 IF (unit_nr > 0)
THEN
715 ALLOCATE (eigenval_kp_hf_at_dft(nmo, nkp_sigma))
716 eigenval_kp_hf_at_dft(:, :) = eigenval_kp(:, :, 1) + vec_sigma_x_minus_vxc_gw(:, 1, :)
718 min_direct_hf_at_dft_gap = 100.0_dp
720 WRITE (unit_nr,
'(T3,A)')
''
721 WRITE (unit_nr,
'(T3,A)')
'Exchange energies'
722 WRITE (unit_nr,
'(T3,A)')
'-----------------'
723 WRITE (unit_nr,
'(T3,A)')
''
724 WRITE (unit_nr,
'(T6,2A)')
'MO e_n^DFT Sigma_x-vxc e_n^HF@DFT'
725 DO ikp = 1, nkp_sigma
726 IF (nkp_sigma > 1)
THEN
727 WRITE (unit_nr,
'(T3,A)')
''
728 WRITE (unit_nr,
'(T3,A7,I3,A3,I3,A8,3F7.3,A12,3F7.3)')
'Kpoint ', ikp,
' /', nkp_sigma, &
729 ' xkp =', kpoints_sigma%xkp(1, ikp), kpoints_sigma%xkp(2, ikp), &
730 kpoints_sigma%xkp(3, ikp),
' and xkp =', -kpoints_sigma%xkp(1, ikp), &
731 -kpoints_sigma%xkp(2, ikp), -kpoints_sigma%xkp(3, ikp)
732 WRITE (unit_nr,
'(T3,A)')
''
734 DO n_level_gw = 1, gw_corr_lev_occ + gw_corr_lev_virt
736 n_level_gw_ref = n_level_gw + homo - gw_corr_lev_occ
737 IF (n_level_gw <= gw_corr_lev_occ)
THEN
743 eigval_dft = eigenval_kp(n_level_gw_ref, ikp, 1)*
evolt
744 exx_minus_vxc = real(vec_sigma_x_minus_vxc_gw(n_level_gw_ref, 1, ikp)*
evolt, kind=
dp)
745 eigval_hf_at_dft = eigenval_kp_hf_at_dft(n_level_gw_ref, ikp)*
evolt
747 WRITE (unit_nr,
'(T4,I4,3A,3F21.3,3F21.3,3F21.3)') &
748 n_level_gw_ref,
' ( ', occ_virt,
') ', eigval_dft, exx_minus_vxc, eigval_hf_at_dft
751 e_homo_gw = maxval(eigenval_kp_hf_at_dft(homo - gw_corr_lev_occ + 1:homo, ikp))
752 e_lumo_gw = minval(eigenval_kp_hf_at_dft(homo + 1:homo + gw_corr_lev_virt, ikp))
753 e_gap_gw = e_lumo_gw - e_homo_gw
754 IF (e_gap_gw < min_direct_hf_at_dft_gap) min_direct_hf_at_dft_gap = e_gap_gw
755 WRITE (unit_nr,
'(T3,A)')
''
756 WRITE (unit_nr,
'(T3,A,F53.2)')
'HF@DFT HOMO-LUMO gap (eV)', e_gap_gw*
evolt
757 WRITE (unit_nr,
'(T3,A)')
''
760 WRITE (unit_nr,
'(T3,A)')
''
761 WRITE (unit_nr,
'(T3,A)')
''
762 WRITE (unit_nr,
'(T3,A,F63.3)')
'HF@DFT direct bandgap (eV)', min_direct_hf_at_dft_gap*
evolt
764 WRITE (unit_nr,
'(T3,A)')
''
765 WRITE (unit_nr,
'(T3,A)')
'End of exchange energies'
766 WRITE (unit_nr,
'(T3,A)')
'------------------------'
767 WRITE (unit_nr,
'(T3,A)')
''
769 cpabort(
'Stop after printing exchange energies.')
779 CALL open_file(unit_number=iunit, file_name=
"exx.out")
781 really_read_line = .false.
785 READ (iunit,
'(A)') line
787 IF (line ==
" End of exchange energies ")
EXIT
789 IF (really_read_line)
THEN
791 READ (line(1:7), *) n_level_gw_ref
792 READ (line(17:40), *) tmp
794 DO ikp = 1,
SIZE(vec_sigma_x_minus_vxc_gw, 3)
795 vec_sigma_x_minus_vxc_gw(n_level_gw_ref, 1, ikp) = tmp/
evolt
800 IF (line ==
" MO Sigma_x-vxc ") really_read_line = .true.
809 mp2_env%ri_g0w0%vec_Sigma_x_minus_vxc_gw(:, :, :) = vec_sigma_x_minus_vxc_gw(:, :, :)
812 DEALLOCATE (matrix_sigma_x_minus_vxc, vec_sigma_x_minus_vxc_gw)
813 IF (do_kpoints_cubic_rpa)
THEN
814 DEALLOCATE (matrix_sigma_x_minus_vxc_im)
821 CALL timestop(handle)
836 SUBROUTINE transform_sigma_x_minus_vxc_to_mo_basis(kpoints, matrix_sigma_x_minus_vxc, &
837 matrix_sigma_x_minus_vxc_im, vec_Sigma_x_minus_vxc_gw, &
838 vec_Sigma_x_minus_vxc_gw_im, para_env, nmo, mp2_env)
841 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_sigma_x_minus_vxc, &
842 matrix_sigma_x_minus_vxc_im
843 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: vec_sigma_x_minus_vxc_gw, &
844 vec_sigma_x_minus_vxc_gw_im
849 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_sigma_x_minus_vxc_to_MO_basis'
851 INTEGER :: dimen, gw_corr_lev_occ, gw_corr_lev_virt, handle, homo, i_global, iib, ikp, &
852 ispin, j_global, jjb, max_corr_lev_occ, max_corr_lev_virt, ncol_local, nkp, nrow_local, &
854 INTEGER,
DIMENSION(2) :: kp_range
855 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
856 REAL(kind=
dp) :: imval, reval
857 TYPE(
cp_cfm_type) :: cfm_mos, cfm_sigma_x_minus_vxc, &
858 cfm_sigma_x_minus_vxc_mo_basis, cfm_tmp
862 TYPE(
mo_set_type),
POINTER :: mo_set, mo_set_im, mo_set_re
864 CALL timeset(routinen, handle)
866 mo_set => kpoints%kp_env(1)%kpoint_env%mos(1, 1)
869 nspins =
SIZE(matrix_sigma_x_minus_vxc, 1)
874 cpassert(kp_range(1) == 1 .AND. kp_range(2) == nkp)
876 ALLOCATE (vec_sigma_x_minus_vxc_gw(nmo, nspins, nkp))
877 vec_sigma_x_minus_vxc_gw = 0.0_dp
879 ALLOCATE (vec_sigma_x_minus_vxc_gw_im(nmo, nspins, nkp))
880 vec_sigma_x_minus_vxc_gw_im = 0.0_dp
887 CALL cp_cfm_create(cfm_sigma_x_minus_vxc_mo_basis, matrix_struct)
891 nrow_local=nrow_local, &
892 ncol_local=ncol_local, &
893 row_indices=row_indices, &
894 col_indices=col_indices)
899 kp => kpoints%kp_env(ikp)%kpoint_env
904 CALL copy_dbcsr_to_fm(matrix_sigma_x_minus_vxc(ispin, ikp)%matrix, fwork_re)
905 CALL copy_dbcsr_to_fm(matrix_sigma_x_minus_vxc_im(ispin, ikp)%matrix, fwork_im)
911 mo_set_re => kp%mos(1, ispin)
912 mo_set_im => kp%mos(2, ispin)
923 z_zero, cfm_sigma_x_minus_vxc_mo_basis)
925 DO jjb = 1, ncol_local
927 j_global = col_indices(jjb)
929 DO iib = 1, nrow_local
931 i_global = row_indices(iib)
933 IF (j_global == i_global .AND. i_global <= nmo)
THEN
935 reval = real(cfm_sigma_x_minus_vxc_mo_basis%local_data(iib, jjb), kind=
dp)
936 imval = aimag(cfm_sigma_x_minus_vxc_mo_basis%local_data(iib, jjb))
938 vec_sigma_x_minus_vxc_gw(i_global, ispin, ikp) = reval
939 vec_sigma_x_minus_vxc_gw_im(i_global, ispin, ikp) = imval
951 CALL para_env%sum(vec_sigma_x_minus_vxc_gw)
952 CALL para_env%sum(vec_sigma_x_minus_vxc_gw_im)
955 CALL get_mo_set(mo_set=kpoints%kp_env(1)%kpoint_env%mos(ispin, 1), &
956 homo=homo, nao=dimen)
960 max_corr_lev_occ = homo
961 max_corr_lev_virt = nmo - homo
963 gw_corr_lev_occ = mp2_env%ri_g0w0%corr_mos_occ
964 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_virt
967 IF (gw_corr_lev_occ > homo .OR. gw_corr_lev_occ < 0) gw_corr_lev_occ = max_corr_lev_occ
968 IF (gw_corr_lev_virt > max_corr_lev_virt .OR. gw_corr_lev_virt < 0) gw_corr_lev_virt = max_corr_lev_virt
970 mp2_env%ri_g0w0%corr_mos_occ = gw_corr_lev_occ
971 mp2_env%ri_g0w0%corr_mos_virt = gw_corr_lev_virt
972 ELSE IF (ispin == 2)
THEN
975 IF (mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt /= &
976 gw_corr_lev_occ + gw_corr_lev_virt)
THEN
977 gw_corr_lev_virt = mp2_env%ri_g0w0%corr_mos_occ + mp2_env%ri_g0w0%corr_mos_virt - gw_corr_lev_occ
979 mp2_env%ri_g0w0%corr_mos_occ_beta = gw_corr_lev_occ
980 mp2_env%ri_g0w0%corr_mos_virt_beta = gw_corr_lev_virt
991 CALL timestop(handle)
993 END SUBROUTINE transform_sigma_x_minus_vxc_to_mo_basis
1002 SUBROUTINE transform_matrix_ks_to_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
1004 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_transl, matrix_ks_kp_re, &
1008 CHARACTER(len=*),
PARAMETER :: routinen =
'transform_matrix_ks_to_kp'
1010 INTEGER :: handle, ikp, ispin, nkp, nspin
1011 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1012 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1016 CALL timeset(routinen, handle)
1019 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, sab_nl=sab_nl, cell_to_index=cell_to_index)
1021 cpassert(
ASSOCIATED(sab_nl))
1023 nspin =
SIZE(matrix_ks_transl, 1)
1028 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
1029 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
1030 CALL rskp_transform(rmatrix=matrix_ks_kp_re(ispin, ikp)%matrix, &
1031 cmatrix=matrix_ks_kp_im(ispin, ikp)%matrix, &
1032 rsmat=matrix_ks_transl, ispin=ispin, &
1033 xkp=xkp(1:3, ikp), cell_to_index=cell_to_index, sab_nl=sab_nl)
1038 CALL timestop(handle)
1040 END SUBROUTINE transform_matrix_ks_to_kp
1049 SUBROUTINE allocate_matrix_ks_kp(matrix_ks_transl, matrix_ks_kp_re, matrix_ks_kp_im, kpoints)
1051 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_transl, matrix_ks_kp_re, &
1055 CHARACTER(len=*),
PARAMETER :: routinen =
'allocate_matrix_ks_kp'
1057 INTEGER :: handle, ikp, ispin, nkp, nspin
1058 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1059 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1063 CALL timeset(routinen, handle)
1066 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, sab_nl=sab_nl, cell_to_index=cell_to_index)
1068 cpassert(
ASSOCIATED(sab_nl))
1070 nspin =
SIZE(matrix_ks_transl, 1)
1072 NULLIFY (matrix_ks_kp_re, matrix_ks_kp_im)
1079 ALLOCATE (matrix_ks_kp_re(ispin, ikp)%matrix)
1080 ALLOCATE (matrix_ks_kp_im(ispin, ikp)%matrix)
1082 CALL dbcsr_create(matrix_ks_kp_re(ispin, ikp)%matrix, &
1083 template=matrix_ks_transl(1, 1)%matrix, &
1084 matrix_type=dbcsr_type_symmetric)
1085 CALL dbcsr_create(matrix_ks_kp_im(ispin, ikp)%matrix, &
1086 template=matrix_ks_transl(1, 1)%matrix, &
1087 matrix_type=dbcsr_type_antisymmetric)
1092 CALL dbcsr_set(matrix_ks_kp_re(ispin, ikp)%matrix, 0.0_dp)
1093 CALL dbcsr_set(matrix_ks_kp_im(ispin, ikp)%matrix, 0.0_dp)
1098 CALL timestop(handle)
1100 END SUBROUTINE allocate_matrix_ks_kp
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.
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_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
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, plan)
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, nrow, ncol, set_zero)
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, nspins)
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, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
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.
Common selection and union operations for contiguous molecular-orbital windows.
subroutine, public determine_mo_window(eigenvalues, n_mo, n_occ, cutoff_occ, cutoff_empty, window)
Selects one contiguous MO window from an ordered reference spectrum.
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, 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, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
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, ext_xc_section)
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.