56 integrate_v_rspace_diagonal,&
57 integrate_v_rspace_one_center
65#include "./base/base_uses.f90"
71 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
72 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_kpp1_env_methods'
88 NULLIFY (kpp1_env%v_ao)
104 SUBROUTINE calc_kpp1(rho1_xc, rho1, xc_section, lrigpw, qs_env, p_env, &
105 calc_forces, calc_virial, virial)
109 LOGICAL,
INTENT(IN) :: lrigpw
112 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_forces, calc_virial
113 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(INOUT), &
116 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_kpp1'
118 INTEGER :: handle, ikind, ispin, nkind, ns, nspins
119 LOGICAL :: do_onecenter, gapw, gapw_xc, &
121 REAL(kind=
dp) :: alpha, energy_hartree, energy_hartree_1c
123 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: k1mat, rho_ao
124 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, psmat
136 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho0_r, rho1_r, v_rspace_new, v_xc, &
139 TYPE(
qs_rho_type),
POINTER :: rho, rho0_fxc, rho1_fxc
140 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
142 CALL timeset(routinen, handle)
144 cpassert(
ASSOCIATED(p_env%kpp1))
145 cpassert(
ASSOCIATED(p_env%kpp1_env))
146 cpassert(
ASSOCIATED(rho1))
148 my_calc_forces = .false.
149 IF (
PRESENT(calc_forces)) my_calc_forces = calc_forces
153 dft_control=dft_control, &
160 lri_density=lri_density, &
161 atomic_kind_set=atomic_kind_set)
164 gapw = dft_control%qs_control%gapw
165 gapw_xc = dft_control%qs_control%gapw_xc
167 cpassert(
ASSOCIATED(rho1_xc))
169 do_onecenter = gapw .OR. gapw_xc
170 nspins = dft_control%nspins
172 kpp1_env => p_env%kpp1_env
179 cpassert(
ASSOCIATED(pw_env))
180 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
181 poisson_env=poisson_env)
182 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
184 IF (gapw .OR. gapw_xc)
THEN
189 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
192 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
195 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
196 IF (
ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
197 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
203 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
207 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
208 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
211 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
213 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
216 NULLIFY (v_xc, v_xc_tau)
225 NULLIFY (rho_atom_set, rho1_atom_set)
226 IF (do_onecenter)
THEN
227 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
228 rho1_atom_set => p_env%local_rho_set%rho_atom_set
230 CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set, kpp1_env%rho_set, &
231 rho1_fxc, rho_atom_set, xc_section, &
232 do_onecenter, v_xc, v_xc_tau, rho1_atom_set, &
233 compute_virial=calc_virial, virial_xc=virial)
238 rho0_r, rho1_r, v_xc)
241 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
244 IF (
SIZE(v_xc) /= nspins)
THEN
245 CALL auxbas_pw_pool%give_back_pw(v_xc(2))
248 IF (
ASSOCIATED(v_xc_tau))
THEN
250 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
252 IF (
SIZE(v_xc_tau) /= nspins)
THEN
253 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(2))
258 IF (nspins == 1) alpha = 2.0_dp
264 CALL dbcsr_set(kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
269 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
270 pmat=rho_ao(ispin), &
271 hmat=kpp1_env%v_ao(ispin), &
273 calculate_forces=my_calc_forces, gapw=gapw_xc)
274 IF (
ASSOCIATED(v_xc_tau))
THEN
275 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
276 pmat=rho_ao(ispin), &
277 hmat=kpp1_env%v_ao(ispin), &
279 compute_tau=.true., &
280 calculate_forces=my_calc_forces, gapw=gapw_xc)
283 CALL pw_copy(v_hartree_rspace, v_rspace_new(1))
284 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
285 pmat=rho_ao(ispin), &
286 hmat=kpp1_env%v_ao(ispin), &
288 calculate_forces=my_calc_forces, gapw=gapw)
290 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin))
292 IF (
ASSOCIATED(v_xc_tau)) cpabort(
"Meta-GGA functionals not supported with LRI!")
294 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
297 lri_v_int(ikind)%v_int = 0.0_dp
299 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
300 lri_v_int, .false.,
"LRI_AUX")
302 CALL para_env%sum(lri_v_int(ikind)%v_int)
305 k1mat(1)%matrix => kpp1_env%v_ao(ispin)%matrix
306 IF (lri_env%exact_1c_terms)
THEN
307 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
308 rho_ao(ispin)%matrix, qs_env, my_calc_forces,
"ORB")
313 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
314 pmat=rho_ao(ispin), &
315 hmat=kpp1_env%v_ao(ispin), &
317 calculate_forces=my_calc_forces, gapw=gapw)
318 IF (
ASSOCIATED(v_xc_tau))
THEN
319 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
320 pmat=rho_ao(ispin), &
321 hmat=kpp1_env%v_ao(ispin), &
323 compute_tau=.true., &
324 calculate_forces=my_calc_forces, gapw=gapw)
329 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, kpp1_env%v_ao(ispin)%matrix, 1.0_dp, alpha)
334 p_env%hartree_local%ecoul_1c, &
335 p_env%local_rho_set, &
336 para_env, tddft=.true., core_2nd=.true.)
338 calculate_forces=my_calc_forces, &
339 local_rho_set=p_env%local_rho_set)
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)
348 ELSE IF (gapw_xc)
THEN
349 ns =
SIZE(p_env%kpp1)
350 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
352 psmat(1:ns, 1:1) => rho_ao(1:ns)
353 CALL update_ks_atom(qs_env, ksmat, psmat, forces=my_calc_forces, tddft=.true., &
354 rho_atom_external=p_env%local_rho_set%rho_atom_set)
357 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
358 DO ispin = 1,
SIZE(v_rspace_new)
359 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
361 DEALLOCATE (v_rspace_new)
362 IF (
ASSOCIATED(v_xc_tau))
THEN
363 DO ispin = 1,
SIZE(v_xc_tau)
364 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
366 DEALLOCATE (v_xc_tau)
369 CALL timestop(handle)
384 TYPE(qs_kpp1_env_type) :: kpp1_env
385 TYPE(qs_environment_type),
INTENT(IN),
POINTER :: qs_env
386 TYPE(section_vals_type),
POINTER :: xc_section
388 INTEGER :: ispin, nspins
389 TYPE(admm_type),
POINTER :: admm_env
390 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
391 TYPE(dft_control_type),
POINTER :: dft_control
392 TYPE(pw_env_type),
POINTER :: pw_env
393 TYPE(qs_rho_type),
POINTER :: rho
394 TYPE(section_vals_type),
POINTER :: admm_xc_section
398 CALL get_qs_env(qs_env, pw_env=pw_env, matrix_s=matrix_s, &
399 admm_env=admm_env, dft_control=dft_control)
401 nspins = dft_control%nspins
403 IF (.NOT.
ASSOCIATED(kpp1_env%v_ao))
THEN
404 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
406 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
407 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
408 name=
"kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
412 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set))
THEN
413 IF (dft_control%qs_control%gapw_xc)
THEN
414 CALL get_qs_env(qs_env, rho_xc=rho)
416 CALL get_qs_env(qs_env, rho=rho)
418 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
419 CALL qs_fxc_prep(qs_env, rho, &
420 kpp1_env%rho_set, kpp1_env%deriv_set, &
421 xc_section, pw_env, is_triplet=.false.)
425 IF (dft_control%do_admm)
THEN
426 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none)
THEN
427 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set_admm))
THEN
428 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
429 admm_xc_section => admm_env%xc_section_aux
430 CALL get_admm_env(admm_env, rho_aux_fit=rho)
431 CALL qs_fxc_prep(qs_env, rho, kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm, &
432 admm_xc_section, pw_env, is_triplet=.false.)
444 SUBROUTINE print_densities(rho1, rho1_tot_gspace, out_unit)
446 TYPE(qs_rho_type),
POINTER :: rho1
447 TYPE(pw_c1d_gs_type),
INTENT(IN) :: rho1_tot_gspace
450 REAL(kind=dp) :: total_rho_gspace
451 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho1_r
455 total_rho_gspace = pw_integrate_function(rho1_tot_gspace, isign=-1)
456 IF (out_unit > 0)
THEN
457 CALL qs_rho_get(rho1, tot_rho_r=tot_rho1_r)
458 WRITE (unit=out_unit, fmt=
"(T3,A,T60,F20.10)") &
459 "KPP1 total charge density (r-space):", &
460 accurate_sum(tot_rho1_r), &
461 "KPP1 total charge density (g-space):", &
465 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 ...
Calculation of non local dispersion functionals Some routines adapted from: Copyright (C) 2001-2009 Q...
subroutine, public qs_fxc_nlvdw_apply(qs_env, xc_section, dispersion_env, rho0_r, rho1_r, fxc_rho)
Second derivative of nl-vdW potential.
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.