24 USE dbcsr_api,
ONLY: dbcsr_add,&
57 #include "./base/base_uses.f90"
68 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_2nd_kernel_ao'
82 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: c0, c1
83 TYPE(dbcsr_p_type),
DIMENSION(:),
INTENT(INOUT) :: dm
85 INTEGER :: ispin, ncol, nspins
90 CALL dbcsr_set(dm(ispin)%matrix, 0.0_dp)
95 ncol=ncol, alpha=2.0_dp, &
96 keep_sparsity=.true., &
113 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
114 TYPE(qs_p_env_type) :: p_env
115 LOGICAL,
INTENT(IN),
OPTIONAL :: recalc_hfx_integrals, calc_forces, &
117 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT), &
120 CHARACTER(LEN=*),
PARAMETER :: routinen =
'apply_2nd_order_kernel'
122 INTEGER :: handle, ispin
123 LOGICAL :: do_hfx, my_calc_forces, my_calc_virial, &
124 my_recalc_hfx_integrals
125 TYPE(admm_type),
POINTER :: admm_env
126 TYPE(dft_control_type),
POINTER :: dft_control
127 TYPE(linres_control_type),
POINTER :: linres_control
128 TYPE(section_vals_type),
POINTER :: hfx_sections, input, xc_section
130 CALL timeset(routinen, handle)
132 my_recalc_hfx_integrals = .false.
133 IF (
PRESENT(recalc_hfx_integrals)) my_recalc_hfx_integrals = recalc_hfx_integrals
135 my_calc_forces = .false.
136 IF (
PRESENT(calc_forces)) my_calc_forces = calc_forces
138 my_calc_virial = .false.
139 IF (
PRESENT(calc_virial)) my_calc_virial = calc_virial
141 CALL get_qs_env(qs_env, dft_control=dft_control)
143 DO ispin = 1,
SIZE(p_env%kpp1)
144 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
145 IF (dft_control%do_admm)
CALL dbcsr_set(p_env%kpp1_admm(ispin)%matrix, 0.0_dp)
150 linres_control=linres_control)
152 IF (dft_control%do_admm)
THEN
154 xc_section => admm_env%xc_section_primary
159 CALL calc_kpp1(p_env%rho1_xc, p_env%rho1, xc_section, .false., &
160 .false., dft_control%qs_control%lrigpw, .true., linres_control%lr_triplet, &
161 qs_env, p_env, calc_forces=my_calc_forces, calc_virial=my_calc_virial, virial=virial)
164 NULLIFY (hfx_sections)
168 CALL apply_hfx_ao(qs_env, p_env, my_recalc_hfx_integrals)
170 IF (dft_control%do_admm)
THEN
171 CALL apply_xc_admm_ao(qs_env, p_env, my_calc_forces, my_calc_virial, virial)
176 CALL timestop(handle)
187 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
188 TYPE(qs_p_env_type),
INTENT(IN) :: p_env
189 LOGICAL,
INTENT(IN),
OPTIONAL :: recalc_integrals
191 CHARACTER(LEN=*),
PARAMETER :: routinen =
'apply_hfx_ao'
193 INTEGER :: handle, ispin, nspins
194 LOGICAL :: my_recalc_integrals
195 REAL(kind=
dp) :: alpha
196 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: h1_mat, rho1, work_hmat
197 TYPE(dft_control_type),
POINTER :: dft_control
199 CALL timeset(routinen, handle)
201 my_recalc_integrals = .false.
202 IF (
PRESENT(recalc_integrals)) my_recalc_integrals = recalc_integrals
204 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
206 IF (dft_control%do_admm)
THEN
208 cpabort(
"ADMM: Linear Response needs purification_method=none")
211 cpabort(
"ADMM: Linear Response needs scaling_model=none")
214 cpabort(
"ADMM: Linear Response needs admm_method=basis_projection")
219 nspins = dft_control%nspins
221 IF (dft_control%do_admm)
THEN
222 rho1 => p_env%p1_admm
223 h1_mat => p_env%kpp1_admm
230 cpassert(
ASSOCIATED(rho1(ispin)%matrix))
231 cpassert(
ASSOCIATED(h1_mat(ispin)%matrix))
237 ALLOCATE (work_hmat(ispin)%matrix)
238 CALL dbcsr_create(work_hmat(ispin)%matrix, template=rho1(ispin)%matrix)
239 CALL dbcsr_copy(work_hmat(ispin)%matrix, rho1(ispin)%matrix)
240 CALL dbcsr_set(work_hmat(ispin)%matrix, 0.0_dp)
244 CALL tddft_hfx_matrix(work_hmat, rho1, qs_env, .false., my_recalc_integrals)
247 IF (nspins == 2) alpha = 1.0_dp
250 CALL dbcsr_add(h1_mat(ispin)%matrix, work_hmat(ispin)%matrix, 1.0_dp, alpha)
255 CALL timestop(handle)
268 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
269 TYPE(qs_p_env_type) :: p_env
270 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_forces, calc_virial
271 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT), &
274 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_xc_admm_ao'
276 INTEGER :: handle, ispin, nao, nao_aux, nspins
277 LOGICAL :: lsd, my_calc_forces
278 REAL(kind=
dp) :: alpha
279 TYPE(admm_type),
POINTER :: admm_env
280 TYPE(dbcsr_p_type) :: work_hmat
281 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao_aux
282 TYPE(dft_control_type),
POINTER :: dft_control
283 TYPE(linres_control_type),
POINTER :: linres_control
284 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho1_aux_g
285 TYPE(pw_env_type),
POINTER :: pw_env
286 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
287 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho1_aux_r, tau1_aux_r, v_xc, v_xc_tau
288 TYPE(qs_ks_env_type),
POINTER :: ks_env
289 TYPE(qs_rho_type),
POINTER :: rho_aux
290 TYPE(section_vals_type),
POINTER :: xc_section
291 TYPE(task_list_type),
POINTER :: task_list_aux_fit
293 CALL timeset(routinen, handle)
295 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
298 CALL get_qs_env(qs_env=qs_env, linres_control=linres_control)
299 cpassert(.NOT. dft_control%qs_control%gapw)
300 cpassert(.NOT. dft_control%qs_control%gapw_xc)
301 cpassert(.NOT. dft_control%qs_control%lrigpw)
302 cpassert(.NOT. linres_control%lr_triplet)
303 IF (.NOT.
ASSOCIATED(p_env%kpp1_admm)) &
304 cpabort(
"kpp1_admm has to be associated if ADMM kernel calculations are requested")
306 nspins = dft_control%nspins
308 my_calc_forces = .false.
309 IF (
PRESENT(calc_forces)) my_calc_forces = calc_forces
313 cpassert(
ASSOCIATED(pw_env))
314 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
318 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, admm_env=admm_env)
319 CALL get_admm_env(admm_env, task_list_aux_fit=task_list_aux_fit)
321 CALL qs_rho_get(p_env%rho1_admm, rho_r=rho1_aux_r, rho_g=rho1_aux_g, tau_r=tau1_aux_r)
322 xc_section => admm_env%xc_section_aux
325 p_env%kpp1_env%rho_set_admm, &
326 rho1_aux_r, rho1_aux_g, tau1_aux_r, auxbas_pw_pool, xc_section=xc_section, gapw=.false., &
327 compute_virial=calc_virial, virial_xc=virial)
329 NULLIFY (work_hmat%matrix)
330 ALLOCATE (work_hmat%matrix)
331 CALL dbcsr_copy(work_hmat%matrix, p_env%kpp1_admm(1)%matrix)
334 IF (nspins == 1) alpha = 2.0_dp
339 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
341 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
342 CALL dbcsr_set(work_hmat%matrix, 0.0_dp)
343 CALL integrate_v_rspace(v_rspace=v_xc(ispin), hmat=work_hmat, qs_env=qs_env, &
344 calculate_forces=my_calc_forces, basis_type=
"AUX_FIT", &
345 task_list_external=task_list_aux_fit, pmat=rho_ao_aux(ispin))
346 IF (
ASSOCIATED(v_xc_tau))
THEN
347 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
348 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), hmat=work_hmat, qs_env=qs_env, &
349 compute_tau=.true., &
350 calculate_forces=my_calc_forces, basis_type=
"AUX_FIT", &
351 task_list_external=task_list_aux_fit, pmat=rho_ao_aux(ispin))
353 CALL dbcsr_add(p_env%kpp1_admm(ispin)%matrix, work_hmat%matrix, 1.0_dp, alpha)
357 CALL dbcsr_release(work_hmat%matrix)
358 DEALLOCATE (work_hmat%matrix)
361 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
367 CALL timestop(handle)
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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
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
Utilities for hfx and admm methods.
subroutine, public tddft_hfx_matrix(matrix_ks, rho_ao, qs_env, update_energy, recalc_integrals, external_hfx_sections, external_x_data)
Add the hfx contributions to the Hamiltonian.
Defines the basic variable types.
integer, parameter, public dp
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 ...
Routines to calculate 2nd order kernels from a given response density in ao basis linear response scf...
subroutine, public apply_2nd_order_kernel(qs_env, p_env, recalc_hfx_integrals, calc_forces, calc_virial, virial)
Calculate a second order kernel (DFT, HF, ADMM correction) for a given density.
subroutine, public build_dm_response(c0, c1, dm)
This routine builds response density in dbcsr format.
subroutine, public apply_xc_admm_ao(qs_env, p_env, calc_forces, calc_virial, virial)
apply the kernel from the ADMM exchange correction
subroutine, public apply_hfx_ao(qs_env, p_env, recalc_integrals)
This routine applies the Hartree-Fock Exchange kernel to a perturbation density matrix considering AD...
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.
Integrate single or product functions over a potential on a RS grid.
module that builds the second order perturbation kernel kpp1 = delta_rho|_P delta_rho|_P E drho(P1) d...
subroutine, public calc_kpp1(rho1_xc, rho1, xc_section, do_tddft, lsd_singlets, lrigpw, do_excitations, do_triplet, qs_env, p_env, calc_forces, calc_virial, virial)
...
Type definitiona for linear response calculations.
Utility functions for the perturbation calculations.
subroutine, public p_env_finish_kpp1(qs_env, p_env)
...
basis types for the calculation of the perturbation of density theory.
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...
Exchange and Correlation functional calculations.
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, xc_section, gapw, vxg, lsd_singlets, do_excitations, do_triplet, do_tddft, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.