67#include "./base/base_uses.f90"
73 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rpa_rse'
91 SUBROUTINE rse_energy(qs_env, mp2_env, para_env, dft_control, &
92 mo_coeff, nmo, homo, Eigenval)
94 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
97 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
98 INTEGER,
INTENT(IN) :: nmo
99 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
100 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
102 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rse_energy'
104 INTEGER :: dimen, handle, i_global, iib, ispin, &
105 j_global, jjb, n_rep_hf, ncol_local, &
107 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
108 LOGICAL :: do_hfx, hfx_treat_lsd_in_core
109 REAL(kind=
dp) :: coeff, corr, rse_corr
110 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: diag_diff
114 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_p_mu_nu, fm_x_mo, fm_xc_mo
115 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_mu_nu, matrix_s, rho_ao
122 CALL timeset(routinen, handle)
124 nspins = dft_control%nspins
128 nrow_local=nrow_local, &
129 ncol_local=ncol_local, &
130 row_indices=row_indices, &
131 col_indices=col_indices)
135 NULLIFY (input, matrix_s, blacs_env, rho, energy, sab_orb)
139 blacs_env=blacs_env, &
147 NULLIFY (hfx_sections)
159 ALLOCATE (mat_mu_nu(ispin)%matrix)
160 CALL dbcsr_create(matrix=mat_mu_nu(ispin)%matrix, template=matrix_s(1)%matrix, name=
"T_mu_nu", &
161 matrix_type=dbcsr_type_symmetric)
163 CALL dbcsr_set(mat_mu_nu(ispin)%matrix, 0.0_dp)
167 ALLOCATE (fm_p_mu_nu(nspins))
168 NULLIFY (fm_struct_tmp)
170 nrow_global=dimen, ncol_global=dimen)
172 CALL cp_fm_create(fm_p_mu_nu(ispin), fm_struct_tmp, name=
"P_mu_nu")
177 NULLIFY (fm_struct_tmp)
179 nrow_global=dimen, ncol_global=dimen)
180 ALLOCATE (fm_x_mo(nspins), fm_xc_mo(nspins))
182 CALL cp_fm_create(fm_x_mo(ispin), fm_struct_tmp, name=
"f_X_mo")
183 CALL cp_fm_create(fm_xc_mo(ispin), fm_struct_tmp, name=
"f_XC_mo")
190 nrow_global=dimen, ncol_global=dimen)
195 nrow_global=dimen, ncol_global=dimen)
196 CALL cp_fm_create(fm_ao_mo, fm_struct_tmp, name=
"f_ao_mo")
207 IF (nspins == 1) coeff = 2.0_dp
209 CALL parallel_gemm(transa=
'N', transb=
'T', m=dimen, n=dimen, k=homo(ispin), alpha=coeff, &
210 matrix_a=mo_coeff(ispin), matrix_b=mo_coeff(ispin), &
211 beta=0.0_dp, matrix_c=fm_p_mu_nu(ispin))
215 CALL exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
216 hfx_sections, n_rep_hf, &
217 rho, mat_mu_nu, fm_p_mu_nu, &
218 fm_ao, fm_x_mo, fm_ao_mo)
221 CALL xc_contribution(qs_env, fm_ao, fm_ao_mo, fm_xc_mo, mo_coeff, dimen)
223 ALLOCATE (diag_diff(dimen))
235 nrow_local=nrow_local, &
236 ncol_local=ncol_local, &
237 row_indices=row_indices, &
238 col_indices=col_indices)
245 DO jjb = 1, ncol_local
246 j_global = col_indices(jjb)
247 DO iib = 1, nrow_local
248 i_global = row_indices(iib)
249 IF ((i_global .LE. homo(ispin)) .AND. (j_global .GT. homo(ispin)))
THEN
250 corr = corr + fm_x_mo(ispin)%local_data(iib, jjb)**2.0_dp/ &
251 (eigenval(i_global, ispin) - eigenval(j_global, ispin) - diag_diff(i_global) + diag_diff(j_global))
257 rse_corr = rse_corr + corr
260 CALL para_env%sum(rse_corr)
262 IF (nspins == 1) rse_corr = rse_corr*2.0_dp
264 mp2_env%ri_rpa%rse_corr_diag = rse_corr
266 CALL non_diag_rse(fm_x_mo, eigenval, dimen, homo, para_env, blacs_env, rse_corr)
268 IF (nspins == 1) rse_corr = rse_corr*2.0_dp
270 mp2_env%ri_rpa%rse_corr = rse_corr
273 DEALLOCATE (diag_diff)
281 DEALLOCATE (mat_mu_nu(ispin)%matrix)
283 DEALLOCATE (mat_mu_nu)
285 CALL timestop(handle)
304 SUBROUTINE exchange_contribution(qs_env, para_env, dimen, mo_coeff, &
305 hfx_sections, n_rep_hf, &
306 rho_work, mat_mu_nu, fm_P_mu_nu, &
307 fm_X_ao, fm_X_mo, fm_X_ao_mo)
310 INTEGER,
INTENT(IN) :: dimen
311 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
313 INTEGER,
INTENT(IN) :: n_rep_hf
317 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_p_mu_nu
319 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_x_mo
322 CHARACTER(LEN=*),
PARAMETER :: routinen =
'exchange_contribution'
324 INTEGER :: handle, irep, is, ns
325 LOGICAL :: my_recalc_hfx_integrals
326 REAL(kind=
dp) :: ehfx
327 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: p_mu_nu, rho_work_ao
328 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_2d, rho_ao_2d
330 CALL timeset(routinen, handle)
333 ns =
SIZE(rho_work_ao)
338 CALL dbcsr_create(p_mu_nu(is)%matrix, template=rho_work_ao(1)%matrix)
339 CALL dbcsr_copy(p_mu_nu(is)%matrix, rho_work_ao(1)%matrix)
340 CALL dbcsr_set(p_mu_nu(is)%matrix, 0.0_dp)
343 my_recalc_hfx_integrals = .true.
345 CALL exx_pre_hfx(hfx_sections, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
347 CALL copy_fm_to_dbcsr(fm_p_mu_nu(is), p_mu_nu(1)%matrix, keep_sparsity=.true.)
349 CALL dbcsr_set(mat_mu_nu(1)%matrix, 0.0_dp)
351 IF (qs_env%mp2_env%ri_rpa%x_data(1, 1)%do_hfx_ri)
THEN
353 DO irep = 1, n_rep_hf
354 rho_ao_2d(1:ns, 1:1) => p_mu_nu(1:ns)
355 mat_2d(1:ns, 1:1) => mat_mu_nu(1:ns)
356 CALL hfx_ri_update_ks(qs_env, qs_env%mp2_env%ri_rpa%x_data(irep, 1)%ri_data, mat_2d, ehfx, &
357 rho_ao=rho_ao_2d, geometry_did_change=my_recalc_hfx_integrals, nspins=1, &
358 hf_fraction=qs_env%mp2_env%ri_rpa%x_data(irep, 1)%general_parameter%fraction)
360 IF (ns == 2)
CALL dbcsr_scale(mat_mu_nu(1)%matrix, 2.0_dp)
361 my_recalc_hfx_integrals = .false.
366 DO irep = 1, n_rep_hf
367 rho_ao_2d(1:ns, 1:1) => p_mu_nu(1:ns)
368 mat_2d(1:ns, 1:1) => mat_mu_nu(1:ns)
369 CALL integrate_four_center(qs_env, qs_env%mp2_env%ri_rpa%x_data, mat_2d, ehfx, rho_ao_2d, hfx_sections, &
370 para_env, my_recalc_hfx_integrals, irep, .true., &
373 my_recalc_hfx_integrals = .false.
384 mo_coeff(is), fm_x_ao, 0.0_dp, fm_x_ao_mo)
388 fm_x_ao_mo, mo_coeff(is), 1.0_dp, fm_x_mo(is))
391 CALL exx_post_hfx(qs_env, qs_env%mp2_env%ri_rpa%x_data, qs_env%mp2_env%ri_rpa%reuse_hfx)
394 DO is = 1,
SIZE(p_mu_nu)
396 DEALLOCATE (p_mu_nu(is)%matrix)
400 CALL timestop(handle)
402 END SUBROUTINE exchange_contribution
413 SUBROUTINE xc_contribution(qs_env, fm_XC_ao, fm_XC_ao_mo, fm_XC_mo, mo_coeff, dimen)
417 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_xc_mo, mo_coeff
418 INTEGER,
INTENT(IN) :: dimen
420 CHARACTER(LEN=*),
PARAMETER :: routinen =
'xc_contribution'
425 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: tau_rspace, v_rspace
430 CALL timeset(routinen, handle)
432 NULLIFY (matrix_vxc, v_rspace, tau_rspace, input, xc_section, ks_env, &
434 CALL get_qs_env(qs_env, matrix_vxc=matrix_vxc, input=input, ks_env=ks_env, rho=rho)
438 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=xc_section, &
439 vxc_rho=v_rspace, vxc_tau=tau_rspace, exc=exc)
441 IF (
ASSOCIATED(v_rspace))
THEN
444 DO i = 1,
SIZE(v_rspace)
445 CALL v_rspace(i)%release()
447 DEALLOCATE (v_rspace)
449 DO i = 1,
SIZE(matrix_vxc)
456 mo_coeff(i), fm_xc_ao, 0.0_dp, fm_xc_ao_mo)
460 fm_xc_ao_mo, mo_coeff(i), 1.0_dp, fm_xc_mo(i))
464 DO i = 1,
SIZE(matrix_vxc)
466 DEALLOCATE (matrix_vxc(i)%matrix)
468 DEALLOCATE (matrix_vxc)
471 CALL timestop(handle)
473 END SUBROUTINE xc_contribution
485 SUBROUTINE non_diag_rse(fm_F_mo, eigenval, dimen, homo, para_env, &
487 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_f_mo
488 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval
489 INTEGER,
INTENT(IN) :: dimen
490 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo
493 REAL(kind=
dp),
INTENT(OUT) :: rse_corr
495 CHARACTER(LEN=*),
PARAMETER :: routinen =
'non_diag_rse'
497 INTEGER :: handle, i_global, iib, ispin, j_global, &
498 jjb, ncol_local, nrow_local, nspins, &
500 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
501 REAL(kind=
dp) :: corr
502 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_o, eig_semi_can, eig_v
504 TYPE(
cp_fm_type) :: fm_f_oo, fm_f_ov, fm_f_vv, fm_o, fm_tmp, &
507 CALL timeset(routinen, handle)
509 nspins =
SIZE(fm_f_mo)
514 nrow_local=nrow_local, &
515 ncol_local=ncol_local, &
516 row_indices=row_indices, &
517 col_indices=col_indices)
521 DO jjb = 1, ncol_local
522 j_global = col_indices(jjb)
523 DO iib = 1, nrow_local
524 i_global = row_indices(iib)
525 IF (i_global .EQ. j_global) fm_f_mo(ispin)%local_data(iib, jjb) = &
526 fm_f_mo(ispin)%local_data(iib, jjb) + eigenval(i_global, ispin)
535 IF (homo(ispin) <= 0 .OR. homo(ispin) >= dimen) cycle
537 NULLIFY (fm_struct_tmp)
539 nrow_global=homo(ispin), ncol_global=homo(ispin))
547 nrow=homo(ispin), ncol=homo(ispin), &
548 s_firstrow=1, s_firstcol=1, &
549 t_firstrow=1, t_firstcol=1)
550 virtual = dimen - homo(ispin)
551 NULLIFY (fm_struct_tmp)
553 nrow_global=virtual, ncol_global=virtual)
561 nrow=virtual, ncol=virtual, &
562 s_firstrow=homo(ispin) + 1, s_firstcol=homo(ispin) + 1, &
563 t_firstrow=1, t_firstcol=1)
566 ALLOCATE (eig_o(homo(ispin)))
567 ALLOCATE (eig_v(virtual))
574 ALLOCATE (eig_semi_can(dimen))
575 eig_semi_can = 0.0_dp
576 eig_semi_can(1:homo(ispin)) = eig_o(:)
577 eig_semi_can(homo(ispin) + 1:dimen) = eig_v(:)
580 NULLIFY (fm_struct_tmp)
582 nrow_global=homo(ispin), ncol_global=virtual)
590 nrow=homo(ispin), ncol=virtual, &
591 s_firstrow=1, s_firstcol=homo(ispin) + 1, &
592 t_firstrow=1, t_firstcol=1)
594 CALL parallel_gemm(transa=
'T', transb=
'N', m=homo(ispin), n=virtual, k=homo(ispin), alpha=1.0_dp, &
595 matrix_a=fm_o, matrix_b=fm_f_ov, beta=0.0_dp, matrix_c=fm_tmp)
597 CALL parallel_gemm(transa=
'N', transb=
'N', m=homo(ispin), n=virtual, k=virtual, alpha=1.0_dp, &
598 matrix_a=fm_tmp, matrix_b=fm_u, beta=0.0_dp, matrix_c=fm_f_ov)
602 nrow_local=nrow_local, &
603 ncol_local=ncol_local, &
604 row_indices=row_indices, &
605 col_indices=col_indices)
610 DO jjb = 1, ncol_local
611 j_global = col_indices(jjb)
612 DO iib = 1, nrow_local
613 i_global = row_indices(iib)
614 corr = corr + fm_f_ov%local_data(iib, jjb)**2.0_dp/ &
615 (eig_semi_can(i_global) - eig_semi_can(j_global + homo(ispin)))
620 rse_corr = rse_corr + corr
623 DEALLOCATE (eig_semi_can)
636 CALL para_env%sum(rse_corr)
638 CALL timestop(handle)
640 END SUBROUTINE non_diag_rse
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
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.
basic linear algebra operations for full matrices
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
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_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
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 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
Interface to the message passing library MPI.
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
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 compute_matrix_vxc(qs_env, v_rspace, matrix_vxc)
compute matrix_vxc, defined via the potential created by qs_vxc_create ignores things like tau functi...
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...
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Routines to compute singles correction to RPA (RSE)
subroutine, public rse_energy(qs_env, mp2_env, para_env, dft_control, mo_coeff, nmo, homo, eigenval)
Single excitations energy corrections for RPA.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
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.