55 integrate_v_rspace_diagonal,&
56 integrate_v_rspace_one_center
64#include "./base/base_uses.f90"
70 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
71 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_kpp1_env_methods'
87 NULLIFY (kpp1_env%v_ao)
103 SUBROUTINE calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, qs_env, p_env, &
104 calc_forces, calc_virial, virial)
108 LOGICAL,
INTENT(IN) :: lrigpw
111 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_forces, calc_virial
112 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT), &
115 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_kpp1'
117 INTEGER :: handle, ikind, ispin, nkind, ns, nspins
118 LOGICAL :: do_onecenter, gapw, gapw_xc, &
120 REAL(kind=
dp) :: alpha, energy_hartree, energy_hartree_1c
122 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: k1mat, rho_ao
123 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, psmat
135 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: v_rspace_new, v_xc, v_xc_tau
137 TYPE(
qs_rho_type),
POINTER :: rho, rho0_fxc, rho1_fxc
138 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
140 CALL timeset(routinen, handle)
142 cpassert(
ASSOCIATED(p_env%kpp1))
143 cpassert(
ASSOCIATED(p_env%kpp1_env))
144 cpassert(
ASSOCIATED(rho1))
146 my_calc_forces = .false.
147 IF (
PRESENT(calc_forces)) my_calc_forces = calc_forces
151 dft_control=dft_control, &
158 lri_density=lri_density, &
159 atomic_kind_set=atomic_kind_set)
162 gapw = dft_control%qs_control%gapw
163 gapw_xc = dft_control%qs_control%gapw_xc
165 cpassert(
ASSOCIATED(rho1_xc))
167 do_onecenter = gapw .OR. gapw_xc
168 nspins = dft_control%nspins
170 kpp1_env => p_env%kpp1_env
177 cpassert(
ASSOCIATED(pw_env))
178 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
179 poisson_env=poisson_env)
180 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
182 IF (gapw .OR. gapw_xc)
THEN
187 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
190 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
193 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
194 IF (
ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
195 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
201 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
205 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
206 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
209 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
211 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
214 NULLIFY (v_xc, v_xc_tau)
223 NULLIFY (rho_atom_set, rho1_atom_set)
224 IF (do_onecenter)
THEN
225 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
226 rho1_atom_set => p_env%local_rho_set%rho_atom_set
228 CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set, kpp1_env%rho_set, &
229 rho1_fxc, rho_atom_set, xc_section, &
230 do_onecenter, v_xc, v_xc_tau, rho1_atom_set, &
231 compute_virial=calc_virial, virial_xc=virial)
234 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
237 IF (
SIZE(v_xc) /= nspins)
THEN
238 CALL auxbas_pw_pool%give_back_pw(v_xc(2))
241 IF (
ASSOCIATED(v_xc_tau))
THEN
243 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
245 IF (
SIZE(v_xc_tau) /= nspins)
THEN
246 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
251 IF (nspins == 1) alpha = 2.0_dp
257 CALL dbcsr_set(kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
262 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
263 pmat=rho_ao(ispin), &
264 hmat=kpp1_env%v_ao(ispin), &
266 calculate_forces=my_calc_forces, gapw=gapw_xc)
267 IF (
ASSOCIATED(v_xc_tau))
THEN
268 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
269 pmat=rho_ao(ispin), &
270 hmat=kpp1_env%v_ao(ispin), &
272 compute_tau=.true., &
273 calculate_forces=my_calc_forces, gapw=gapw_xc)
276 CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
277 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
278 pmat=rho_ao(ispin), &
279 hmat=kpp1_env%v_ao(ispin), &
281 calculate_forces=my_calc_forces, gapw=gapw)
283 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
285 IF (
ASSOCIATED(v_xc_tau)) cpabort(
"Meta-GGA functionals not supported with LRI!")
287 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
290 lri_v_int(ikind)%v_int = 0.0_dp
292 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
293 lri_v_int, .false.,
"LRI_AUX")
295 CALL para_env%sum(lri_v_int(ikind)%v_int)
298 k1mat(1)%matrix => kpp1_env%v_ao(ispin)%matrix
299 IF (lri_env%exact_1c_terms)
THEN
300 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
301 rho_ao(ispin)%matrix, qs_env, my_calc_forces,
"ORB")
306 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
307 pmat=rho_ao(ispin), &
308 hmat=kpp1_env%v_ao(ispin), &
310 calculate_forces=my_calc_forces, gapw=gapw)
311 IF (
ASSOCIATED(v_xc_tau))
THEN
312 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
313 pmat=rho_ao(ispin), &
314 hmat=kpp1_env%v_ao(ispin), &
316 compute_tau=.true., &
317 calculate_forces=my_calc_forces, gapw=gapw)
322 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
327 p_env%hartree_local%ecoul_1c, &
328 p_env%local_rho_set, &
329 para_env, tddft=.true., core_2nd=.true.)
331 calculate_forces=my_calc_forces, &
332 local_rho_set=p_env%local_rho_set)
335 ns =
SIZE(p_env%kpp1)
336 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
338 psmat(1:ns, 1:1) => rho_ao(1:ns)
339 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
340 rho_atom_external=p_env%local_rho_set%rho_atom_set)
341 ELSE IF (gapw_xc)
THEN
342 ns =
SIZE(p_env%kpp1)
343 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
345 psmat(1:ns, 1:1) => rho_ao(1:ns)
346 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
347 rho_atom_external=p_env%local_rho_set%rho_atom_set)
350 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
351 DO ispin = 1,
SIZE(v_rspace_new)
352 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
354 DEALLOCATE (v_rspace_new)
355 IF (
ASSOCIATED(v_xc_tau))
THEN
356 DO ispin = 1,
SIZE(v_xc_tau)
357 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
359 DEALLOCATE (v_xc_tau)
362 CALL timestop(handle)
377 TYPE(qs_kpp1_env_type) :: kpp1_env
378 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
379 TYPE(section_vals_type),
POINTER :: xc_section
381 INTEGER :: ispin, nspins
382 TYPE(admm_type),
POINTER :: admm_env
383 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
384 TYPE(dft_control_type),
POINTER :: dft_control
385 TYPE(pw_env_type),
POINTER :: pw_env
386 TYPE(qs_rho_type),
POINTER :: rho
387 TYPE(section_vals_type),
POINTER :: admm_xc_section
391 CALL get_qs_env(qs_env, pw_env=pw_env, matrix_s=matrix_s, &
392 admm_env=admm_env, dft_control=dft_control)
394 nspins = dft_control%nspins
396 IF (.NOT.
ASSOCIATED(kpp1_env%v_ao))
THEN
397 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
399 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
400 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
401 name=
"kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
405 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set))
THEN
406 IF (dft_control%qs_control%gapw_xc)
THEN
407 CALL get_qs_env(qs_env, rho_xc=rho)
409 CALL get_qs_env(qs_env, rho=rho)
411 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
412 CALL qs_fxc_prep(qs_env, rho, &
413 kpp1_env%rho_set, kpp1_env%deriv_set, &
414 xc_section, pw_env, is_triplet=.false.)
418 IF (dft_control%do_admm)
THEN
419 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none)
THEN
420 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set_admm))
THEN
421 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
422 admm_xc_section => admm_env%xc_section_aux
423 CALL get_admm_env(admm_env, rho_aux_fit=rho)
424 CALL qs_fxc_prep(qs_env, rho, kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm, &
425 admm_xc_section, pw_env, is_triplet=.false.)
437 SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
439 TYPE(qs_rho_type),
POINTER :: rho1
440 TYPE(pw_c1d_gs_type),
INTENT(IN) :: rho1_tot_gspace
443 REAL(kind=dp) :: total_rho_gspace
444 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho1_r
448 total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
449 IF (out_unit > 0)
THEN
450 CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
451 WRITE (unit=out_unit, fmt=
"(T3,A,T60,F20.10)") &
452 "KPP1 total charge density (r-space):", &
453 accurate_sum(tot_rho1_r), &
454 "KPP1 total charge density (g-space):", &
458 END SUBROUTINE print_densities
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.
Define the atomic kind types and their sub types.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
routines that build the Kohn-Sham matrix for the LRIGPW and xc parts
subroutine, public calculate_lri_ks_matrix(lri_env, lri_v_int, h_matrix, atomic_kind_set, cell_to_index)
update of LRIGPW KS matrix
Interface to the message passing library MPI.
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
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
Setup Routine for Fxc Potentials.
subroutine, public qs_fxc_apply(qs_env, xc_deriv_set, xc_rho_set, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, pw_env_ext, kind_set_external, para_env_external, compute_virial, virial_xc)
...
subroutine, public qs_fxc_prep(qs_env, rho0_struct, xc_rho_set, xc_deriv_set, xc_section, pw_env_ext, is_triplet)
...
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
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 kpp1_check_i_alloc(kpp1_env, qs_env, xc_section)
checks that the intenal storage is allocated, and allocs it if needed
subroutine, public calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, qs_env, p_env, calc_forces, calc_virial, virial)
...
subroutine, public kpp1_create(kpp1_env)
allocates and initializes a kpp1_env
basis types for the calculation of the perturbation of density theory.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
basis types for the calculation of the perturbation of density theory.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
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...
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
environment that keeps the informations and temporary val to build the kpp1 kernel matrix
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...
keeps the density in various representations, keeping track of which ones are valid.