42#include "./base/base_uses.f90"
47 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_ddapc_forces'
75 factor, multipole_section, cell, particle_set, radii, dq, charges)
78 LOGICAL,
INTENT(IN) :: apply_qmmm_periodic
79 REAL(kind=
dp),
INTENT(IN) :: factor
83 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
84 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
86 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
88 CHARACTER(len=*),
PARAMETER :: routinen =
'ewald_ddapc_force'
90 INTEGER :: handle, ip1, ip2, iparticle1, &
91 iparticle2, k1, k2, k3, n_rep, nmax1, &
92 nmax2, nmax3, r1, r2, r3, rmax1, &
95 REAL(kind=
dp) :: alpha, eps,
fac, fac3, fs, galpha, gsq, &
96 gsqi, ij_fac, q1t, q2t, r, r2tmp, &
97 rcut, rcut2, t1, t2, tol, tol1
98 REAL(kind=
dp),
DIMENSION(3) :: drvec, fvec, gvec, ra, rvec
99 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: d_el, m
102 NULLIFY (d_el, m, para_env)
103 CALL timeset(routinen, handle)
105 cpassert(
PRESENT(charges))
106 cpassert(
ASSOCIATED(radii))
107 cpassert(cell%orthorhombic)
108 rcut = min(cell%hmat(1, 1), cell%hmat(2, 2), cell%hmat(3, 3))/2.0_dp
117 eps = min(abs(eps), 0.5_dp)
118 tol = sqrt(abs(log(eps*rcut)))
119 alpha = sqrt(abs(log(eps*rcut*tol)))/rcut
120 galpha = 1.0_dp/(4.0_dp*alpha*alpha)
121 tol1 = sqrt(-log(eps*rcut*(2.0_dp*tol*alpha)**2))
122 nmax1 = nint(0.25_dp + cell%hmat(1, 1)*alpha*tol1/
pi)
123 nmax2 = nint(0.25_dp + cell%hmat(2, 2)*alpha*tol1/
pi)
124 nmax3 = nint(0.25_dp + cell%hmat(3, 3)*alpha*tol1/
pi)
126 rmax1 = ceiling(rcut/cell%hmat(1, 1))
127 rmax2 = ceiling(rcut/cell%hmat(2, 2))
128 rmax3 = ceiling(rcut/cell%hmat(3, 3))
130 ALLOCATE (d_el(3,
SIZE(particle_set)))
132 fac = 1.e0_dp/cell%deth
134 fvec =
twopi/(/cell%hmat(1, 1), cell%hmat(2, 2), cell%hmat(3, 3)/)
136 DO iparticle1 = 1,
SIZE(particle_set)
138 IF (mod(iparticle1, para_env%num_pe) /= para_env%mepos) cycle
139 ip1 = (iparticle1 - 1)*
SIZE(radii)
140 q1t = sum(charges(ip1 + 1:ip1 +
SIZE(radii)))
141 DO iparticle2 = 1, iparticle1
143 IF (iparticle1 == iparticle2) ij_fac = 0.5_dp
145 ip2 = (iparticle2 - 1)*
SIZE(radii)
146 q2t = sum(charges(ip2 + 1:ip2 +
SIZE(radii)))
150 rvec = particle_set(iparticle1)%r - particle_set(iparticle2)%r
151 IF (iparticle1 /= iparticle2)
THEN
153 r2tmp = dot_product(ra, ra)
154 IF (r2tmp <= rcut2)
THEN
157 drvec = ra/r*q1t*q2t*factor
158 t2 = -2.0_dp*alpha*exp(-alpha*alpha*r*r)/(r*
rootpi) - t1/r
159 d_el(1:3, iparticle1) = d_el(1:3, iparticle1) - t2*drvec
160 d_el(1:3, iparticle2) = d_el(1:3, iparticle2) + t2*drvec
163 DO r1 = -rmax1, rmax1
164 DO r2 = -rmax2, rmax2
165 DO r3 = -rmax3, rmax3
166 IF ((r1 == 0) .AND. (r2 == 0) .AND. (r3 == 0)) cycle
167 ra(1) = rvec(1) + cell%hmat(1, 1)*r1
168 ra(2) = rvec(2) + cell%hmat(2, 2)*r2
169 ra(3) = rvec(3) + cell%hmat(3, 3)*r3
170 r2tmp = dot_product(ra, ra)
171 IF (r2tmp <= rcut2)
THEN
174 drvec = ra/r*q1t*q2t*factor*ij_fac
175 t2 = -2.0_dp*alpha*exp(-alpha*alpha*r*r)/(r*
rootpi) - t1/r
176 d_el(1, iparticle1) = d_el(1, iparticle1) - t2*drvec(1)
177 d_el(2, iparticle1) = d_el(2, iparticle1) - t2*drvec(2)
178 d_el(3, iparticle1) = d_el(3, iparticle1) - t2*drvec(3)
179 d_el(1, iparticle2) = d_el(1, iparticle2) + t2*drvec(1)
180 d_el(2, iparticle2) = d_el(2, iparticle2) + t2*drvec(2)
181 d_el(3, iparticle2) = d_el(3, iparticle2) + t2*drvec(3)
191 DO k2 = -nmax2, nmax2
192 DO k3 = -nmax3, nmax3
193 IF (k1 == 0 .AND. k2 == 0 .AND. k3 == 0) cycle
194 fs = 2.0_dp;
IF (k1 == 0) fs = 1.0_dp
195 gvec = fvec*(/real(k1, kind=
dp), real(k2, kind=
dp), real(k3, kind=
dp)/)
196 gsq = dot_product(gvec, gvec)
198 t1 =
fac*gsqi*exp(-galpha*gsq)
199 t2 = -sin(dot_product(gvec, rvec))*t1*q1t*q2t*factor*
fourpi
200 d_el(1:3, iparticle1) = d_el(1:3, iparticle1) - t2*gvec
201 d_el(1:3, iparticle2) = d_el(1:3, iparticle2) + t2*gvec
207 d_el(1:3, iparticle1) = d_el(1:3, iparticle1) - gvec
208 d_el(1:3, iparticle2) = d_el(1:3, iparticle2) + gvec
210 IF (iparticle1 /= iparticle2)
THEN
212 r = sqrt(dot_product(ra, ra))
213 t2 = -1.0_dp/(r*r)*factor
215 d_el(1:3, iparticle1) = d_el(1:3, iparticle1) + t2*drvec
216 d_el(1:3, iparticle2) = d_el(1:3, iparticle2) - t2*drvec
221 CALL para_env%sum(d_el)
222 m => qs_env%cp_ddapc_env%Md
223 IF (apply_qmmm_periodic) m => qs_env%cp_ddapc_env%Mr
224 CALL cp_decpl_ddapc_forces(qs_env, m, charges, dq, d_el, particle_set)
226 CALL timestop(handle)
241 SUBROUTINE cp_decpl_ddapc_forces(qs_env, M, charges, dq, d_el, particle_set)
243 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: m
244 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges
245 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: dq
246 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: d_el
249 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_decpl_ddapc_forces'
251 INTEGER :: handle, i, iatom, ikind, j, k, natom
252 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
253 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: uv
254 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: chf
260 CALL timeset(routinen, handle)
261 natom =
SIZE(particle_set)
263 atomic_kind_set=atomic_kind_set, &
266 ALLOCATE (chf(3, natom))
268 atom_of_kind=atom_of_kind, &
271 ALLOCATE (uv(
SIZE(m, 1)))
272 uv(:) = matmul(m, charges)
275 chf(j, k) = dot_product(uv, dq(:, k, j))
279 CALL para_env%sum(chf)
281 ikind = kind_of(iatom)
282 i = atom_of_kind(iatom)
283 force(ikind)%ch_pulay(1:3, i) = force(ikind)%ch_pulay(1:3, i) + chf(1:3, iatom) + d_el(1:3, iatom)
287 CALL timestop(handle)
288 END SUBROUTINE cp_decpl_ddapc_forces
300 CHARACTER(len=*),
PARAMETER :: routinen =
'reset_ch_pulay'
302 INTEGER :: handle, ind
305 CALL timeset(routinen, handle)
308 DO ind = 1,
SIZE(force)
309 force(ind)%ch_pulay = 0.0_dp
311 CALL timestop(handle)
331 INTEGER,
INTENT(in) :: n_gauss
332 REAL(kind=
dp),
DIMENSION(:) :: uv
333 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges
334 REAL(kind=
dp),
INTENT(INOUT) :: energy_res
337 REAL(kind=
dp) :: de, order_p
342 DO i = 1, ddapc_restraint_control%natoms
343 ind = (ddapc_restraint_control%atoms(i) - 1)*n_gauss
344 order_p = order_p + ddapc_restraint_control%coeff(i)*sum(charges(ind + 1:ind + n_gauss))
346 ddapc_restraint_control%ddapc_order_p = order_p
348 SELECT CASE (ddapc_restraint_control%functional_form)
351 energy_res = ddapc_restraint_control%strength*(order_p - ddapc_restraint_control%target)**2.0_dp
354 de = 2.0_dp*ddapc_restraint_control%strength*(order_p - ddapc_restraint_control%target)
355 DO i = 1, ddapc_restraint_control%natoms
356 ind = (ddapc_restraint_control%atoms(i) - 1)*n_gauss
357 uv(ind + 1:ind + n_gauss) = de*ddapc_restraint_control%coeff(i)
360 energy_res = ddapc_restraint_control%strength*(order_p - ddapc_restraint_control%target)
363 DO i = 1, ddapc_restraint_control%natoms
364 ind = (ddapc_restraint_control%atoms(i) - 1)*n_gauss
365 uv(ind + 1:ind + n_gauss) = ddapc_restraint_control%strength*ddapc_restraint_control%coeff(i)
389 n_gauss, particle_set)
393 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: dq
394 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges
395 INTEGER,
INTENT(in) :: n_gauss
398 CHARACTER(len=*),
PARAMETER :: routinen =
'restraint_functional_force'
400 INTEGER :: handle, i, iatom, ikind, j, k, natom
401 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
403 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: uv
404 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: chf
410 CALL timeset(routinen, handle)
411 natom =
SIZE(particle_set)
413 atomic_kind_set=atomic_kind_set, &
416 ALLOCATE (chf(3, natom))
418 atom_of_kind=atom_of_kind, &
421 ALLOCATE (uv(
SIZE(dq, 1)))
427 chf(j, k) = dot_product(uv, dq(:, k, j))
431 CALL para_env%sum(chf)
433 ikind = kind_of(iatom)
434 i = atom_of_kind(iatom)
435 force(ikind)%ch_pulay(1:3, i) = force(ikind)%ch_pulay(1:3, i) + chf(1:3, iatom)
439 CALL timestop(handle)
461 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
462 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
464 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
466 INTEGER :: i, ip1, ip2, iparticle1, iparticle2, l, &
467 lmax, n_rep1, n_rep2, weight
468 INTEGER,
DIMENSION(:),
POINTER ::
list
469 LOGICAL :: fixed_center
470 REAL(kind=
dp) :: center(3), dcos1(3), dcos2(3), dpos1(3), dpos2(3), eps_in, eps_out, &
471 factor1(3), factor2(3), lr, mass, mycos, pos1, pos1i, pos2, pos2i, ptcos, q1t, q2t, &
472 r1(3), r1s, r2(3), r2s, rs, rvec(3)
473 REAL(kind=
dp),
DIMENSION(:),
POINTER :: pos, r0
474 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: d_el, locp, m
476 fixed_center = .false.
483 IF (n_rep1 /= 0)
THEN
489 IF (n_rep2 /= 0)
THEN
492 ALLOCATE (r0(
SIZE(
list)))
497 r0 = r0 + particle_set(
list(i))%r
499 r0 = r0/real(
SIZE(
list), kind=
dp)
504 r0 = r0 + particle_set(
list(i))%r*particle_set(
list(i))%atomic_kind%mass
505 mass = mass + particle_set(
list(i))%atomic_kind%mass
513 cpassert(n_rep1 /= 0 .OR. n_rep2 /= 0)
515 ALLOCATE (locp(0:lmax,
SIZE(particle_set)))
516 ALLOCATE (pos(
SIZE(particle_set)))
517 ALLOCATE (d_el(3,
SIZE(particle_set)))
520 DO i = 1,
SIZE(particle_set)
521 rvec = particle_set(i)%r - center
522 r2s = dot_product(rvec, rvec)
525 IF (r1s /= 0.0_dp)
THEN
527 locp(l, i) = (r1s**l*real(l + 1, kind=
dp)*(eps_in - eps_out))/ &
528 (rs**(2*l + 1)*eps_in*(real(l, kind=
dp)*eps_in + real(l + 1, kind=
dp)*eps_out))
534 DO iparticle1 = 1,
SIZE(particle_set)
535 ip1 = (iparticle1 - 1)*
SIZE(radii)
536 q1t = sum(charges(ip1 + 1:ip1 +
SIZE(radii)))
537 DO iparticle2 = 1, iparticle1
538 ip2 = (iparticle2 - 1)*
SIZE(radii)
539 q2t = sum(charges(ip2 + 1:ip2 +
SIZE(radii)))
541 r1 = particle_set(iparticle1)%r - center
542 r2 = particle_set(iparticle2)%r - center
543 pos1 = pos(iparticle1)
544 pos2 = pos(iparticle2)
547 IF (pos1*pos2 /= 0.0_dp)
THEN
552 ptcos = dot_product(r1, r2)
553 mycos = ptcos/(pos1*pos2)
554 IF (abs(mycos) > 1.0_dp) mycos = sign(1.0_dp, mycos)
555 dcos1 = (r2*(pos1*pos2) - pos2*dpos1*ptcos)/(pos1*pos2)**2
556 dcos2 = (r1*(pos1*pos2) - pos1*dpos2*ptcos)/(pos1*pos2)**2
559 lr = real(l, kind=
dp)
560 factor1 = factor1 + lr*locp(l, iparticle2)*pos1**(l - 1)*
legendre(mycos, l, 0)*dpos1 &
561 + locp(l, iparticle2)*pos1**l*
dlegendre(mycos, l, 0)*dcos1
562 factor2 = factor2 + lr*locp(l, iparticle1)*pos2**(l - 1)*
legendre(mycos, l, 0)*dpos2 &
563 + locp(l, iparticle1)*pos2**l*
dlegendre(mycos, l, 0)*dcos2
566 factor1 = factor1*q1t*q2t
567 factor2 = factor2*q1t*q2t
568 d_el(1:3, iparticle1) = d_el(1:3, iparticle1) + 0.5_dp*factor1
569 d_el(1:3, iparticle2) = d_el(1:3, iparticle2) + 0.5_dp*factor2
574 m => qs_env%cp_ddapc_env%Ms
575 CALL cp_decpl_ddapc_forces(qs_env, m, charges, dq, d_el, particle_set)
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Density Derived atomic point charges from a QM calculation (see J. Chem. Phys. Vol....
subroutine, public solvation_ddapc_force(qs_env, solvation_section, particle_set, radii, dq, charges)
Evaluates the electrostatic potential due to a simple solvation model Spherical cavity in a dieletric...
recursive subroutine, public ewald_ddapc_force(qs_env, coeff, apply_qmmm_periodic, factor, multipole_section, cell, particle_set, radii, dq, charges)
Evaluates the Ewald term E2 and E3 energy term for the decoupling/coupling of periodic images.
subroutine, public restraint_functional_force(qs_env, ddapc_restraint_control, dq, charges, n_gauss, particle_set)
computes derivatives for DDAPC restraint
subroutine, public evaluate_restraint_functional(ddapc_restraint_control, n_gauss, uv, charges, energy_res)
computes energy and derivatives given a set of charges
subroutine, public reset_ch_pulay(qs_env)
Evaluation of the pulay forces due to the fitted charge density.
Defines the basic variable types.
integer, parameter, public dp
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public rootpi
real(kind=dp), parameter, public fourpi
real(kind=dp), parameter, public twopi
real(kind=dp), dimension(0:maxfac), parameter, public fac
Interface to the message passing library MPI.
Define the data structure for the particle information.
different utils that are useful to manipulate splines on the regular grid of a pw
real(kind=dp) function, dimension(3), public eval_d_interp_spl3_pbc(vec, pw)
Evaluates the derivatives of the PBC interpolated Spline (pw) function on the generic input vector (v...
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.
Calculate spherical harmonics.
real(kind=dp) function, public legendre(x, l, m)
...
real(kind=dp) function, public dlegendre(x, l, m)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
stores all the informations relevant to an mpi environment