83 gmcharge, mcharge, calculate_forces, virial, use_virial)
89 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(inout) :: gmcharge
90 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: mcharge
91 LOGICAL,
INTENT(in) :: calculate_forces
93 LOGICAL,
INTENT(in) :: use_virial
95 CHARACTER(len=*),
PARAMETER :: routinen =
'tb_spme_evaluate'
97 INTEGER :: handle, i, ipart, j, n, npart, o_spline, &
99 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: center
100 INTEGER,
DIMENSION(3) :: npts
101 REAL(kind=
dp) :: alpha, dvols, fat(3), ffa, fint, vgc
102 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: delta
103 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rhos
104 REAL(kind=
dp),
DIMENSION(3, 3) :: f_stress, h_stress
117 DIMENSION(:) :: drpot
119 CALL timeset(routinen, handle)
121 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
123 NULLIFY (green, poisson_env, pw_pool)
124 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
125 poisson_env=poisson_env)
127 green => poisson_env%green_fft
128 grid_spme => pw_pool%pw_grid
132 npart =
SIZE(particle_set)
135 ALLOCATE (rhos(n, n, n))
141 ALLOCATE (center(3, npart), delta(3, npart))
142 CALL get_center(particle_set, box, center, delta, npts, n)
147 CALL set_list(particle_set, npart, center, p1, rden, ipart)
151 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
152 is_shell=.false., unit_charge=.true.)
153 rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
161 CALL pw_pool%create_pw(rhob_r)
168 CALL pw_pool%create_pw(rhob_g)
177 CALL pw_pool%create_pw(dphi_g(i))
181 CALL pw_pool%create_pw(phi_g)
183 CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g, h_stress=h_stress)
191 CALL pw_pool%give_back_pw(rhob_g)
197 CALL pw_pool%give_back_pw(phi_g)
209 f_stress(j, i) = f_stress(i, j)
212 ffa = (1.0_dp/
fourpi)*(0.5_dp/alpha)**2
213 virial%pv_virial = virial%pv_virial - (ffa*f_stress - h_stress)/real(para_env%num_pe,
dp)
218 IF (calculate_forces)
THEN
227 CALL pw_pool%give_back_pw(dphi_g(i))
232 CALL pw_pool%give_back_pw(dphi_g(i))
235 CALL pw_pool%give_back_pw(rhob_r)
243 CALL set_list(particle_set, npart, center, p1, rden, ipart)
247 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
248 is_shell=.false., unit_charge=.true.)
251 gmcharge(p1, 1) = gmcharge(p1, 1) + fint*dvols
253 IF (calculate_forces)
THEN
255 gmcharge(p1, 2) = gmcharge(p1, 2) - fat(1)*dvols
256 gmcharge(p1, 3) = gmcharge(p1, 3) - fat(2)*dvols
257 gmcharge(p1, 4) = gmcharge(p1, 4) - fat(3)*dvols
268 IF (calculate_forces)
THEN
275 DEALLOCATE (center, delta)
277 CALL timestop(handle)
292 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(inout) :: gmcharge
293 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: mcharge
294 REAL(kind=
dp),
INTENT(in) :: alpha
298 LOGICAL,
INTENT(IN) :: use_virial
300 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tb_ewald_overlap'
302 INTEGER :: handle, i, iatom, jatom, nmat
303 REAL(kind=
dp) :: dfr, dr, fr, pfr, rij(3)
305 DIMENSION(:),
POINTER :: nl_iterator
307 CALL timeset(routinen, handle)
309 nmat =
SIZE(gmcharge, 2)
315 dr = sqrt(sum(rij(:)**2))
316 IF (dr > 1.e-10)
THEN
317 fr = erfc(alpha*dr)/dr
318 gmcharge(iatom, 1) = gmcharge(iatom, 1) + mcharge(jatom)*fr
319 gmcharge(jatom, 1) = gmcharge(jatom, 1) + mcharge(iatom)*fr
321 dfr = -2._dp*alpha*exp(-alpha*alpha*dr*dr)*
oorootpi/dr - fr/dr
324 gmcharge(iatom, i) = gmcharge(iatom, i) - rij(i - 1)*mcharge(jatom)*dfr
325 gmcharge(jatom, i) = gmcharge(jatom, i) + rij(i - 1)*mcharge(iatom)*dfr
329 IF (iatom == jatom)
THEN
330 pfr = -0.5_dp*dfr*mcharge(iatom)*mcharge(jatom)
332 pfr = -dfr*mcharge(iatom)*mcharge(jatom)
341 CALL timestop(handle)
354 SUBROUTINE tb_spme_zforce(ewald_env, ewald_pw, particle_set, box, gmcharge, mcharge)
358 TYPE(
particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set
360 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(inout) :: gmcharge
361 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: mcharge
363 CHARACTER(len=*),
PARAMETER :: routinen =
'tb_spme_zforce'
365 INTEGER :: handle, i, ipart, n, npart, o_spline, p1
366 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: center
367 INTEGER,
DIMENSION(3) :: npts
368 REAL(kind=
dp) :: alpha, dvols, fat(3), fint, vgc
369 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: delta
370 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rhos
384 CALL timeset(routinen, handle)
386 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
388 NULLIFY (green, poisson_env, pw_pool)
389 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
390 poisson_env=poisson_env)
392 green => poisson_env%green_fft
393 grid_spme => pw_pool%pw_grid
397 npart =
SIZE(particle_set)
400 ALLOCATE (rhos(n, n, n))
406 ALLOCATE (center(3, npart), delta(3, npart))
407 CALL get_center(particle_set, box, center, delta, npts, n)
412 CALL set_list(particle_set, npart, center, p1, rden, ipart)
416 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
417 is_shell=.false., unit_charge=.true.)
418 rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
426 CALL pw_pool%create_pw(rhob_r)
433 CALL pw_pool%create_pw(rhob_g)
442 CALL pw_pool%create_pw(dphi_g(i))
446 CALL pw_pool%create_pw(phi_g)
452 CALL pw_pool%give_back_pw(rhob_g)
458 CALL pw_pool%give_back_pw(phi_g)
471 CALL pw_pool%give_back_pw(dphi_g(i))
474 CALL pw_pool%give_back_pw(rhob_r)
482 CALL set_list(particle_set, npart, center, p1, rden, ipart)
486 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
487 is_shell=.false., unit_charge=.true.)
490 gmcharge(p1, 1) = gmcharge(p1, 1) + fint*dvols
493 gmcharge(p1, 2) = gmcharge(p1, 2) - fat(1)*dvols
494 gmcharge(p1, 3) = gmcharge(p1, 3) - fat(2)*dvols
495 gmcharge(p1, 4) = gmcharge(p1, 4) - fat(3)*dvols
509 DEALLOCATE (center, delta)
511 CALL timestop(handle)
subroutine, public ewald_env_get(ewald_env, ewald_type, alpha, eps_pol, epsilon, gmax, ns_max, o_spline, group, para_env, poisson_section, precs, rcut, do_multipoles, max_multipole, do_ipol, max_ipol_iter, interaction_cutoffs, cell_hmat)
Purpose: Get the EWALD environment.
Define the data structure for the particle information.
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.