21 USE dgs,
ONLY: dg_sum_patch,&
22 dg_sum_patch_force_1d,&
25 ewald_environment_type
57 #include "./base/base_uses.f90"
61 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'spme'
67 MODULE PROCEDURE get_patch_a, get_patch_b
93 fg_coulomb, vg_coulomb, pv_g, shell_particle_set, core_particle_set, &
94 fgshell_coulomb, fgcore_coulomb, use_virial, charges, atprop)
96 TYPE(ewald_environment_type),
POINTER :: ewald_env
97 TYPE(ewald_pw_type),
POINTER :: ewald_pw
98 TYPE(cell_type),
POINTER :: box
99 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set
100 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: fg_coulomb
101 REAL(kind=
dp),
INTENT(OUT) :: vg_coulomb
102 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: pv_g
103 TYPE(particle_type),
DIMENSION(:),
OPTIONAL, &
104 POINTER :: shell_particle_set, core_particle_set
105 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
106 OPTIONAL :: fgshell_coulomb, fgcore_coulomb
107 LOGICAL,
INTENT(IN) :: use_virial
108 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
109 TYPE(atprop_type),
POINTER :: atprop
111 CHARACTER(len=*),
PARAMETER :: routinen =
'spme_evaluate'
113 INTEGER :: handle, i, ig, ipart, j, n, ncore, &
114 npart, nshell, o_spline, p1, p1_shell
115 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: center, core_center, shell_center
116 INTEGER,
DIMENSION(3) :: nd, npts
118 REAL(kind=
dp) :: alpha, dvols, fat1, ffa, ffb
119 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: core_delta, delta, shell_delta
120 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rhos
121 REAL(kind=
dp),
DIMENSION(3) :: fat
122 REAL(kind=
dp),
DIMENSION(3, 3) :: f_stress, h_stress
123 TYPE(greens_fn_type),
POINTER :: green
124 TYPE(mp_comm_type) :: group
125 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dphi_g
126 TYPE(pw_c1d_gs_type),
POINTER :: phi_g, rhob_g
127 TYPE(pw_grid_type),
POINTER :: grid_spme
128 TYPE(pw_poisson_type),
POINTER :: poisson_env
129 TYPE(pw_pool_type),
POINTER :: pw_pool
130 TYPE(pw_r3d_rs_type),
POINTER :: rhob_r
131 TYPE(realspace_grid_desc_type),
POINTER :: rs_desc
132 TYPE(realspace_grid_type),
DIMENSION(3) :: drpot
133 TYPE(realspace_grid_type),
POINTER :: rden, rpot
135 NULLIFY (grid_spme, green, poisson_env, phi_g, rhob_g, rhob_r, pw_pool, rden, rpot)
136 CALL timeset(routinen, handle)
140 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, &
142 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
143 poisson_env=poisson_env)
144 CALL pw_poisson_rebuild(poisson_env)
145 green => poisson_env%green_fft
146 grid_spme => pw_pool%pw_grid
148 npart =
SIZE(particle_set)
153 ALLOCATE (rhos(n, n, n))
159 ALLOCATE (center(3, npart), delta(3, npart))
160 CALL get_center(particle_set, box, center, delta, npts, n)
162 IF (
PRESENT(shell_particle_set) .AND. (
PRESENT(core_particle_set)))
THEN
163 cpassert(
ASSOCIATED(shell_particle_set))
164 cpassert(
ASSOCIATED(core_particle_set))
165 nshell =
SIZE(shell_particle_set)
166 ncore =
SIZE(core_particle_set)
167 cpassert(nshell == ncore)
168 ALLOCATE (shell_center(3, nshell), shell_delta(3, nshell))
169 CALL get_center(shell_particle_set, box, shell_center, shell_delta, npts, n)
170 ALLOCATE (core_center(3, nshell), core_delta(3, nshell))
171 CALL get_center(core_particle_set, box, core_center, core_delta, npts, n)
178 CALL set_list(particle_set, npart, center, p1, rden, ipart)
181 do_shell = (particle_set(p1)%shell_index /= 0)
184 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
185 is_shell=.false., unit_charge=.false., charges=charges)
188 CALL dg_sum_patch(rden, rhos, center(:, p1))
191 IF (
PRESENT(shell_particle_set) .AND.
PRESENT(core_particle_set))
THEN
195 CALL set_list(shell_particle_set, nshell, shell_center, p1_shell, &
197 IF (p1_shell == 0)
EXIT
198 CALL get_patch(shell_particle_set, shell_delta, green, p1_shell, rhos, &
199 is_core=.false., is_shell=.true., unit_charge=.false.)
202 CALL dg_sum_patch(rden, rhos, shell_center(:, p1_shell))
207 CALL set_list(core_particle_set, nshell, core_center, p1_shell, &
209 IF (p1_shell == 0)
EXIT
210 CALL get_patch(core_particle_set, core_delta, green, p1_shell, rhos, &
211 is_core=.true., is_shell=.false., unit_charge=.false.)
214 CALL dg_sum_patch(rden, rhos, core_center(:, p1_shell))
221 CALL pw_pool%create_pw(rhob_r)
226 CALL pw_pool%create_pw(rhob_g)
227 CALL pw_transfer(rhob_r, rhob_g)
229 CALL pw_multiply_with(rhob_g, green%p3m_charge)
234 CALL pw_pool%create_pw(dphi_g(i))
238 CALL pw_pool%create_pw(phi_g)
239 CALL pw_poisson_solve(poisson_env, rhob_g, vg_coulomb, phi_g, dphi_g, &
244 IF (atprop%energy .OR. atprop%stress)
THEN
248 CALL pw_multiply_with(phi_g, green%p3m_charge)
249 CALL pw_transfer(phi_g, rhob_r)
253 CALL set_list(particle_set, npart, center, p1, rden, ipart)
255 do_shell = (particle_set(p1)%shell_index /= 0)
258 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
259 is_shell=.false., unit_charge=.false., charges=charges)
261 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fat1)
262 IF (atprop%energy)
THEN
263 atprop%atener(p1) = atprop%atener(p1) + 0.5_dp*fat1*dvols
265 IF (atprop%stress)
THEN
266 atprop%atstress(1, 1, p1) = atprop%atstress(1, 1, p1) + 0.5_dp*fat1*dvols
267 atprop%atstress(2, 2, p1) = atprop%atstress(2, 2, p1) + 0.5_dp*fat1*dvols
268 atprop%atstress(3, 3, p1) = atprop%atstress(3, 3, p1) + 0.5_dp*fat1*dvols
272 IF (
PRESENT(shell_particle_set) .AND.
PRESENT(core_particle_set))
THEN
275 CALL set_list(shell_particle_set, nshell, shell_center, p1_shell, rden, ipart)
276 IF (p1_shell == 0)
EXIT
277 CALL get_patch(shell_particle_set, shell_delta, green, p1_shell, rhos, &
278 is_core=.false., is_shell=.true., unit_charge=.false.)
279 CALL dg_sum_patch_force_1d(rpot, rhos, shell_center(:, p1_shell), fat1)
280 p1 = shell_particle_set(p1_shell)%atom_index
281 IF (atprop%energy)
THEN
282 atprop%atener(p1) = atprop%atener(p1) + 0.5_dp*fat1*dvols
287 CALL set_list(core_particle_set, nshell, core_center, p1_shell, rden, ipart)
288 IF (p1_shell == 0)
EXIT
289 CALL get_patch(core_particle_set, core_delta, green, p1_shell, rhos, &
290 is_core=.true., is_shell=.false., unit_charge=.false.)
291 CALL dg_sum_patch_force_1d(rpot, rhos, core_center(:, p1_shell), fat1)
292 p1 = core_particle_set(p1_shell)%atom_index
293 IF (atprop%energy)
THEN
294 atprop%atener(p1) = atprop%atener(p1) + 0.5_dp*fat1*dvols
298 IF (atprop%stress)
THEN
299 ffa = (0.5_dp/alpha)**2
302 DO ig = grid_spme%first_gne0, grid_spme%ngpts_cut_local
303 phi_g%array(ig) = ffb*dphi_g(i)%array(ig)*(ffa*grid_spme%gsq(ig) + 1.0_dp)
304 phi_g%array(ig) = phi_g%array(ig)*poisson_env%green_fft%influence_fn%array(ig)
306 IF (grid_spme%have_g0) phi_g%array(1) = 0.0_dp
310 CALL pw_copy(phi_g, rhob_g)
312 CALL pw_multiply_with(rhob_g, green%p3m_charge)
313 CALL pw_transfer(rhob_g, rhob_r)
318 CALL set_list(particle_set, npart, center, p1, rden, ipart)
321 CALL get_patch(particle_set, delta, green, p1, rhos, &
322 is_core=.false., is_shell=.false., unit_charge=.false., charges=charges)
324 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fat1)
325 atprop%atstress(i, j, p1) = atprop%atstress(i, j, p1) + fat1*dvols
326 IF (i /= j) atprop%atstress(j, i, p1) = atprop%atstress(j, i, p1) + fat1*dvols
336 CALL pw_pool%give_back_pw(phi_g)
337 CALL pw_pool%give_back_pw(rhob_g)
338 DEALLOCATE (phi_g, rhob_g)
344 f_stress(i, j) = pw_integral_a2b(dphi_g(i), dphi_g(j))
345 f_stress(j, i) = f_stress(i, j)
348 ffa = (1.0_dp/
fourpi)*(0.5_dp/alpha)**2
349 f_stress = -ffa*f_stress
350 pv_g = h_stress + f_stress
358 CALL pw_multiply_with(dphi_g(i), green%p3m_charge)
359 CALL pw_transfer(dphi_g(i), rhob_r)
360 CALL pw_pool%give_back_pw(dphi_g(i))
364 CALL pw_pool%give_back_pw(rhob_r)
372 CALL set_list(particle_set, npart, center, p1, rden, ipart)
375 do_shell = (particle_set(p1)%shell_index /= 0)
378 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
379 is_shell=.false., unit_charge=.false., charges=charges)
382 CALL dg_sum_patch_force_3d(drpot, rhos, center(:, p1), fat)
383 fg_coulomb(1, p1) = fg_coulomb(1, p1) - fat(1)*dvols
384 fg_coulomb(2, p1) = fg_coulomb(2, p1) - fat(2)*dvols
385 fg_coulomb(3, p1) = fg_coulomb(3, p1) - fat(3)*dvols
388 IF (
PRESENT(shell_particle_set) .AND. (
PRESENT(core_particle_set)))
THEN
389 IF (
PRESENT(fgshell_coulomb))
THEN
391 fgshell_coulomb = 0.0_dp
394 CALL set_list(shell_particle_set, nshell, shell_center, p1_shell, &
396 IF (p1_shell == 0)
EXIT
398 CALL get_patch(shell_particle_set, shell_delta, green, &
399 p1_shell, rhos, is_core=.false., is_shell=.true., unit_charge=.false.)
402 CALL dg_sum_patch_force_3d(drpot, rhos, shell_center(:, p1_shell), fat)
403 fgshell_coulomb(1, p1_shell) = fgshell_coulomb(1, p1_shell) - fat(1)*dvols
404 fgshell_coulomb(2, p1_shell) = fgshell_coulomb(2, p1_shell) - fat(2)*dvols
405 fgshell_coulomb(3, p1_shell) = fgshell_coulomb(3, p1_shell) - fat(3)*dvols
409 IF (
PRESENT(fgcore_coulomb))
THEN
411 fgcore_coulomb = 0.0_dp
414 CALL set_list(core_particle_set, nshell, core_center, p1_shell, &
416 IF (p1_shell == 0)
EXIT
418 CALL get_patch(core_particle_set, core_delta, green, &
419 p1_shell, rhos, is_core=.true., is_shell=.false., unit_charge=.false.)
422 CALL dg_sum_patch_force_3d(drpot, rhos, core_center(:, p1_shell), fat)
423 fgcore_coulomb(1, p1_shell) = fgcore_coulomb(1, p1_shell) - fat(1)*dvols
424 fgcore_coulomb(2, p1_shell) = fgcore_coulomb(2, p1_shell) - fat(2)*dvols
425 fgcore_coulomb(3, p1_shell) = fgcore_coulomb(3, p1_shell) - fat(3)*dvols
440 DEALLOCATE (center, delta)
441 IF (
ALLOCATED(shell_center))
THEN
442 DEALLOCATE (shell_center, shell_delta)
444 IF (
ALLOCATED(core_center))
THEN
445 DEALLOCATE (core_center, core_delta)
447 CALL timestop(handle)
466 particle_set_b, potential)
468 TYPE(ewald_environment_type),
POINTER :: ewald_env
469 TYPE(ewald_pw_type),
POINTER :: ewald_pw
470 TYPE(cell_type),
POINTER :: box
471 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set_a
472 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges_a
473 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set_b
474 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: potential
476 CHARACTER(len=*),
PARAMETER :: routinen =
'spme_potential'
478 INTEGER :: handle, ipart, n, npart_a, npart_b, &
480 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: center
481 INTEGER,
DIMENSION(3) :: npts
482 REAL(kind=
dp) :: alpha, dvols, fat1
483 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: delta
484 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rhos
485 TYPE(greens_fn_type),
POINTER :: green
486 TYPE(mp_comm_type) :: group
487 TYPE(pw_c1d_gs_type),
POINTER :: phi_g, rhob_g
488 TYPE(pw_grid_type),
POINTER :: grid_spme
489 TYPE(pw_poisson_type),
POINTER :: poisson_env
490 TYPE(pw_pool_type),
POINTER :: pw_pool
491 TYPE(pw_r3d_rs_type),
POINTER :: rhob_r
492 TYPE(realspace_grid_desc_type),
POINTER :: rs_desc
493 TYPE(realspace_grid_type),
POINTER :: rden, rpot
495 NULLIFY (grid_spme, green, poisson_env, phi_g, rhob_g, rhob_r, pw_pool, &
497 CALL timeset(routinen, handle)
501 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group)
502 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, poisson_env=poisson_env)
503 CALL pw_poisson_rebuild(poisson_env)
504 green => poisson_env%green_fft
505 grid_spme => pw_pool%pw_grid
507 npart_a =
SIZE(particle_set_a)
508 npart_b =
SIZE(particle_set_b)
513 ALLOCATE (rhos(n, n, n))
519 ALLOCATE (center(3, npart_a), delta(3, npart_a))
520 CALL get_center(particle_set_a, box, center, delta, npts, n)
526 CALL set_list(particle_set_a, npart_a, center, p1, rden, ipart)
530 CALL get_patch(particle_set_a, delta, green, p1, rhos, charges_a)
533 CALL dg_sum_patch(rden, rhos, center(:, p1))
535 DEALLOCATE (center, delta)
540 CALL pw_pool%create_pw(rhob_r)
545 CALL pw_pool%create_pw(rhob_g)
546 CALL pw_transfer(rhob_r, rhob_g)
548 CALL pw_multiply_with(rhob_g, green%p3m_charge)
554 CALL pw_pool%create_pw(phi_g)
555 CALL pw_poisson_solve(poisson_env, density=rhob_g, vhartree=phi_g)
559 ALLOCATE (center(3, npart_b), delta(3, npart_b))
560 CALL get_center(particle_set_b, box, center, delta, npts, n)
562 CALL pw_multiply_with(phi_g, green%p3m_charge)
563 CALL pw_transfer(phi_g, rhob_r)
567 CALL set_list(particle_set_b, npart_b, center, p1, rden, ipart)
570 CALL get_patch(particle_set_b, delta, green, p1, rhos, &
571 is_core=.false., is_shell=.false., unit_charge=.true.)
573 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fat1)
574 potential(p1) = potential(p1) + fat1*dvols
578 CALL pw_pool%give_back_pw(phi_g)
579 CALL pw_pool%give_back_pw(rhob_g)
580 CALL pw_pool%give_back_pw(rhob_r)
581 DEALLOCATE (phi_g, rhob_g, rhob_r)
586 DEALLOCATE (center, delta)
587 CALL timestop(handle)
606 SUBROUTINE spme_forces(ewald_env, ewald_pw, box, particle_set_a, charges_a, &
607 particle_set_b, charges_b, forces_b)
609 TYPE(ewald_environment_type),
POINTER :: ewald_env
610 TYPE(ewald_pw_type),
POINTER :: ewald_pw
611 TYPE(cell_type),
POINTER :: box
612 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set_a
613 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges_a
614 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set_b
615 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges_b
616 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: forces_b
618 CHARACTER(len=*),
PARAMETER :: routinen =
'spme_forces'
620 INTEGER :: handle, i, ipart, n, npart_a, npart_b, &
622 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: center
623 INTEGER,
DIMENSION(3) :: npts
624 REAL(kind=
dp) :: alpha, dvols
625 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: delta
626 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rhos
627 REAL(kind=
dp),
DIMENSION(3) :: fat
628 TYPE(greens_fn_type),
POINTER :: green
629 TYPE(mp_comm_type) :: group
630 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dphi_g
631 TYPE(pw_c1d_gs_type),
POINTER :: phi_g, rhob_g
632 TYPE(pw_grid_type),
POINTER :: grid_spme
633 TYPE(pw_poisson_type),
POINTER :: poisson_env
634 TYPE(pw_pool_type),
POINTER :: pw_pool
635 TYPE(pw_r3d_rs_type),
POINTER :: rhob_r
636 TYPE(realspace_grid_desc_type),
POINTER :: rs_desc
637 TYPE(realspace_grid_type),
DIMENSION(3) :: drpot
638 TYPE(realspace_grid_type),
POINTER :: rden
640 NULLIFY (grid_spme, green, poisson_env, phi_g, rhob_g, rhob_r, &
642 CALL timeset(routinen, handle)
646 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group)
647 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, poisson_env=poisson_env)
648 CALL pw_poisson_rebuild(poisson_env)
649 green => poisson_env%green_fft
650 grid_spme => pw_pool%pw_grid
652 npart_a =
SIZE(particle_set_a)
653 npart_b =
SIZE(particle_set_b)
658 ALLOCATE (rhos(n, n, n))
664 ALLOCATE (center(3, npart_a), delta(3, npart_a))
665 CALL get_center(particle_set_a, box, center, delta, npts, n)
671 CALL set_list(particle_set_a, npart_a, center, p1, rden, ipart)
675 CALL get_patch(particle_set_a, delta, green, p1, rhos, charges_a)
678 CALL dg_sum_patch(rden, rhos, center(:, p1))
680 DEALLOCATE (center, delta)
685 CALL pw_pool%create_pw(rhob_r)
690 CALL pw_pool%create_pw(rhob_g)
691 CALL pw_transfer(rhob_r, rhob_g)
693 CALL pw_multiply_with(rhob_g, green%p3m_charge)
698 CALL pw_pool%create_pw(dphi_g(i))
702 CALL pw_pool%create_pw(phi_g)
703 CALL pw_poisson_solve(poisson_env, density=rhob_g, vhartree=phi_g, &
711 CALL pw_multiply_with(dphi_g(i), green%p3m_charge)
712 CALL pw_transfer(dphi_g(i), rhob_r)
713 CALL pw_pool%give_back_pw(dphi_g(i))
717 ALLOCATE (center(3, npart_b), delta(3, npart_b))
718 CALL get_center(particle_set_b, box, center, delta, npts, n)
721 CALL set_list(particle_set_b, npart_b, center, p1, rden, ipart)
724 CALL get_patch(particle_set_b, delta, green, p1, rhos, &
725 is_core=.false., is_shell=.false., unit_charge=.false., charges=charges_b)
727 CALL dg_sum_patch_force_3d(drpot, rhos, center(:, p1), fat)
728 forces_b(1, p1) = forces_b(1, p1) - fat(1)*dvols
729 forces_b(2, p1) = forces_b(2, p1) - fat(2)*dvols
730 forces_b(3, p1) = forces_b(3, p1) - fat(3)*dvols
736 CALL pw_pool%give_back_pw(phi_g)
737 CALL pw_pool%give_back_pw(rhob_g)
738 CALL pw_pool%give_back_pw(rhob_r)
739 DEALLOCATE (phi_g, rhob_g, rhob_r)
744 DEALLOCATE (center, delta)
745 CALL timestop(handle)
764 SUBROUTINE get_patch_a(part, delta, green, p, rhos, is_core, is_shell, &
765 unit_charge, charges)
767 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: part
768 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: delta
769 TYPE(greens_fn_type),
INTENT(IN) :: green
770 INTEGER,
INTENT(IN) :: p
771 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT) :: rhos
772 LOGICAL,
INTENT(IN) :: is_core, is_shell, unit_charge
773 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
776 LOGICAL :: use_charge_array
778 REAL(kind=
dp),
DIMENSION(3) :: r
779 TYPE(shell_kind_type),
POINTER :: shell
782 use_charge_array =
PRESENT(charges)
783 IF (use_charge_array) use_charge_array =
ASSOCIATED(charges)
784 IF (is_core .AND. is_shell)
THEN
785 cpabort(
"Shell-model: cannot be core and shell simultaneously")
791 IF (.NOT. unit_charge)
THEN
794 q = shell%charge_core
795 ELSE IF (is_shell)
THEN
797 q = shell%charge_shell
801 IF (use_charge_array) q = charges(p)
803 CALL spme_get_patch(rhos, nbox, delta(:, p), q, green%p3m_coeff)
805 END SUBROUTINE get_patch_a
819 SUBROUTINE get_patch_b(part, delta, green, p, rhos, charges)
821 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: part
822 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: delta
823 TYPE(greens_fn_type),
INTENT(IN) :: green
824 INTEGER,
INTENT(IN) :: p
825 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT) :: rhos
826 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges
830 REAL(kind=
dp),
DIMENSION(3) :: r
835 CALL spme_get_patch(rhos, nbox, delta(:, p), q, green%p3m_coeff)
837 END SUBROUTINE get_patch_b
850 SUBROUTINE spme_get_patch(rhos, n, delta, q, coeff)
852 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT) :: rhos
853 INTEGER,
INTENT(IN) :: n
854 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: delta
855 REAL(kind=
dp),
INTENT(IN) :: q
856 REAL(kind=
dp),
DIMENSION(-(n-1):n-1, 0:n-1), &
859 INTEGER,
PARAMETER :: nmax = 12
861 INTEGER :: i, i1, i2, i3, j, l
862 REAL(kind=
dp) :: r2, r3
863 REAL(kind=
dp),
DIMENSION(3, -nmax:nmax) :: w_assign
864 REAL(kind=
dp),
DIMENSION(3, 0:nmax-1) :: deltal
865 REAL(kind=
dp),
DIMENSION(3, 1:nmax) :: f_assign
868 cpabort(
"nmax value too small")
873 deltal(1, 0) = 1.0_dp
874 deltal(2, 0) = 1.0_dp
875 deltal(3, 0) = 1.0_dp
877 deltal(1, l) = deltal(1, l - 1)*delta(1)
878 deltal(2, l) = deltal(2, l - 1)*delta(2)
879 deltal(3, l) = deltal(3, l - 1)*delta(3)
883 DO j = -(n - 1), n - 1, 2
885 w_assign(1, j) = w_assign(1, j) + coeff(j, l)*deltal(1, l)
886 w_assign(2, j) = w_assign(2, j) + coeff(j, l)*deltal(2, l)
887 w_assign(3, j) = w_assign(3, j) + coeff(j, l)*deltal(3, l)
892 f_assign(1, i) = w_assign(1, j)
893 f_assign(2, i) = w_assign(2, j)
894 f_assign(3, i) = w_assign(3, j)
898 r3 = q*f_assign(3, i3)
900 r2 = r3*f_assign(2, i2)
902 rhos(i1, i2, i3) = r2*f_assign(1, i1)
907 END SUBROUTINE spme_get_patch
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Holds information on atomic properties.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public essmann1995
Handles all functions related to the CELL.
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.
subroutine, public ewald_pw_get(ewald_pw, pw_big_pool, pw_small_pool, rs_desc, poisson_env, dg)
get the ewald_pw environment to the correct program.
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public fourpi
Interface to the message passing library MPI.
Define the data structure for the particle information.
This module defines the grid data type and some basic operations on it.
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.
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
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 rs_grid_create(rs, desc)
...
subroutine, public transfer_pw2rs(rs, pw)
...
subroutine, public rs_grid_set_box(pw_grid, rs)
Set box matrix info for real space grid This is needed for variable cell simulations.
subroutine, public transfer_rs2pw(rs, pw)
...
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
Calculate the electrostatic energy by the Smooth Particle Ewald method.
subroutine, public spme_forces(ewald_env, ewald_pw, box, particle_set_a, charges_a, particle_set_b, charges_b, forces_b)
Calculate the forces on particles B for the electrostatic interaction betrween particles A and B.
subroutine, public spme_potential(ewald_env, ewald_pw, box, particle_set_a, charges_a, particle_set_b, potential)
Calculate the electrostatic potential from particles A (charge A) at positions of particles B.
subroutine, public spme_evaluate(ewald_env, ewald_pw, box, particle_set, fg_coulomb, vg_coulomb, pv_g, shell_particle_set, core_particle_set, fgshell_coulomb, fgcore_coulomb, use_virial, charges, atprop)
...