80 SUBROUTINE force_nonbond(fist_nonbond_env, ewald_env, particle_set, cell, &
81 pot_nonbond, f_nonbond, pv_nonbond, fshell_nonbond, fcore_nonbond, &
82 atprop_env, atomic_kind_set, use_virial)
88 REAL(kind=
dp),
INTENT(OUT) :: pot_nonbond
89 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: f_nonbond, pv_nonbond
90 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
91 OPTIONAL :: fshell_nonbond, fcore_nonbond
94 LOGICAL,
INTENT(IN) :: use_virial
96 CHARACTER(LEN=*),
PARAMETER :: routinen =
'force_nonbond'
98 INTEGER :: atom_a, atom_b, ewald_type, handle, i, iend, igrp, ikind, ilist, ipair, istart, &
99 j, kind_a, kind_b, nkind, npairs, shell_a, shell_b, shell_type
100 INTEGER,
DIMENSION(:, :),
POINTER ::
list
101 LOGICAL :: all_terms, do_multipoles, full_nl, &
103 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_shell_kind
104 REAL(kind=
dp) :: alpha, beta, beta_a, beta_b, energy, etot, fac_ei, fac_kind, fac_vdw, &
105 fscalar, mm_radius_a, mm_radius_b, qcore_a, qcore_b, qeff_a, qeff_b, qshell_a, qshell_b, &
106 rab2, rab2_com, rab2_max
107 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mm_radius, qcore, qeff, qshell
108 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi, fatom_a, fatom_b, fcore_a, &
109 fcore_b, fshell_a, fshell_b, rab, &
110 rab_cc, rab_com, rab_cs, rab_sc, rab_ss
111 REAL(kind=
dp),
DIMENSION(3, 3) :: pv, pv_thread
112 REAL(kind=
dp),
DIMENSION(3, 4) :: rab_list
113 REAL(kind=
dp),
DIMENSION(4) :: rab2_list
114 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ij_kind_full_fac
115 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: ei_interaction_cutoffs
122 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update, r_last_update_pbc, &
123 rcore_last_update_pbc, &
124 rshell_last_update_pbc
129 CALL timeset(routinen, handle)
132 NULLIFY (pot, rshell_last_update_pbc, spl_f, ij_kind_full_fac)
134 potparm14=potparm14, potparm=potparm, r_last_update=r_last_update, &
135 r_last_update_pbc=r_last_update_pbc, natom_types=nkind, &
136 rshell_last_update_pbc=rshell_last_update_pbc, &
137 rcore_last_update_pbc=rcore_last_update_pbc, &
138 ij_kind_full_fac=ij_kind_full_fac)
139 CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type, &
140 do_multipoles=do_multipoles, &
141 interaction_cutoffs=ei_interaction_cutoffs)
145 f_nonbond(:, :) = 0.0_dp
148 pv_nonbond(:, :) = 0.0_dp
150 shell_present = .false.
151 IF (
PRESENT(fshell_nonbond))
THEN
152 cpassert(
PRESENT(fcore_nonbond))
153 fshell_nonbond = 0.0_dp
154 fcore_nonbond = 0.0_dp
155 shell_present = .true.
158 ALLOCATE (mm_radius(nkind))
159 ALLOCATE (qeff(nkind))
160 ALLOCATE (qcore(nkind))
161 ALLOCATE (qshell(nkind))
162 ALLOCATE (is_shell_kind(nkind))
164 atomic_kind => atomic_kind_set(ikind)
167 mm_radius=mm_radius(ikind), &
169 is_shell_kind(ikind) =
ASSOCIATED(shell_kind)
170 IF (
ASSOCIATED(shell_kind))
THEN
172 charge_core=qcore(ikind), &
173 charge_shell=qshell(ikind))
175 qcore(ikind) = 0.0_dp
176 qshell(ikind) = 0.0_dp
180 lists:
DO ilist = 1, nonbonded%nlists
181 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
182 npairs = neighbor_kind_pair%npairs
183 IF (npairs == 0) cycle
184 list => neighbor_kind_pair%list
185 cvi = neighbor_kind_pair%cell_vector
186 cell_v = matmul(cell%hmat, cvi)
187 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
188 istart = neighbor_kind_pair%grp_kind_start(igrp)
189 iend = neighbor_kind_pair%grp_kind_end(igrp)
209 IF (use_virial) pv_thread(:, :) = 0.0_dp
211 pairs:
DO ipair = istart, iend
212 atom_a =
list(1, ipair)
213 atom_b =
list(2, ipair)
216 kind_a = particle_set(atom_a)%atomic_kind%kind_number
217 kind_b = particle_set(atom_b)%atomic_kind%kind_number
219 fac_kind = ij_kind_full_fac(kind_a, kind_b)
221 pot => potparm%pot(kind_a, kind_b)%pot
222 IF (ipair <= neighbor_kind_pair%nscale)
THEN
223 IF (neighbor_kind_pair%is_onfo(ipair))
THEN
224 pot => potparm14%pot(kind_a, kind_b)%pot
235 IF ((.NOT. full_nl) .AND. (atom_a == atom_b))
THEN
236 fac_ei = 0.5_dp*fac_ei
237 fac_vdw = 0.5_dp*fac_vdw
240 IF (do_multipoles .OR. (.NOT. fist_nonbond_env%do_electrostatics))
THEN
243 IF (ipair <= neighbor_kind_pair%nscale)
THEN
244 fac_ei = fac_ei*neighbor_kind_pair%ei_scale(ipair)
245 fac_vdw = fac_vdw*neighbor_kind_pair%vdw_scale(ipair)
248 IF (fac_ei > 0.0_dp)
THEN
250 mm_radius_a = mm_radius(kind_a)
251 mm_radius_b = mm_radius(kind_b)
252 IF (
ASSOCIATED(fist_nonbond_env%charges))
THEN
253 qeff_a = fist_nonbond_env%charges(atom_a)
254 qeff_b = fist_nonbond_env%charges(atom_b)
256 qeff_a = qeff(kind_a)
257 qeff_b = qeff(kind_b)
259 IF (is_shell_kind(kind_a))
THEN
260 qcore_a = qcore(kind_a)
261 qshell_a = qshell(kind_a)
262 IF ((qcore_a == 0.0_dp) .AND. (qshell_a == 0.0_dp)) fac_ei = 0.0_dp
265 qshell_a = huge(0.0_dp)
266 IF (qeff_a == 0.0_dp) fac_ei = 0.0_dp
268 IF (is_shell_kind(kind_b))
THEN
269 qcore_b = qcore(kind_b)
270 qshell_b = qshell(kind_b)
271 IF ((qcore_b == 0.0_dp) .AND. (qshell_b == 0.0_dp)) fac_ei = 0.0_dp
274 qshell_b = huge(0.0_dp)
275 IF (qeff_b == 0.0_dp) fac_ei = 0.0_dp
281 IF (mm_radius_a > 0)
THEN
284 IF (mm_radius_b > 0)
THEN
287 IF ((mm_radius_a > 0) .OR. (mm_radius_b > 0))
THEN
288 beta =
sqrthalf/sqrt(mm_radius_a*mm_radius_a + mm_radius_b*mm_radius_b)
294 IF (pot%no_pp .AND. (fac_ei == 0.0)) cycle
298 spline_data => pot%pair_spline_data
299 shell_type = pot%shell_type
301 cpassert(.NOT. do_multipoles)
302 cpassert(shell_present)
304 rab2_max = pot%rcutsq
310 IF (shell_type ==
sh_sh)
THEN
311 shell_a = particle_set(atom_a)%shell_index
312 shell_b = particle_set(atom_b)%shell_index
313 rab_cc = rcore_last_update_pbc(shell_b)%r - rcore_last_update_pbc(shell_a)%r
314 rab_cs = rshell_last_update_pbc(shell_b)%r - rcore_last_update_pbc(shell_a)%r
315 rab_sc = rcore_last_update_pbc(shell_b)%r - rshell_last_update_pbc(shell_a)%r
316 rab_ss = rshell_last_update_pbc(shell_b)%r - rshell_last_update_pbc(shell_a)%r
317 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
318 rab_list(1:3, 2) = rab_cs(1:3) + cell_v(1:3)
319 rab_list(1:3, 3) = rab_sc(1:3) + cell_v(1:3)
320 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
321 ELSE IF ((shell_type ==
nosh_sh) .AND. (particle_set(atom_a)%shell_index /= 0))
THEN
322 shell_a = particle_set(atom_a)%shell_index
324 rab_cc = r_last_update_pbc(atom_b)%r - rcore_last_update_pbc(shell_a)%r
327 rab_ss = r_last_update_pbc(atom_b)%r - rshell_last_update_pbc(shell_a)%r
328 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
329 rab_list(1:3, 2) = 0.0_dp
330 rab_list(1:3, 3) = 0.0_dp
331 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
332 ELSE IF ((shell_type ==
nosh_sh) .AND. (particle_set(atom_b)%shell_index /= 0))
THEN
333 shell_b = particle_set(atom_b)%shell_index
335 rab_cc = rcore_last_update_pbc(shell_b)%r - r_last_update_pbc(atom_a)%r
338 rab_ss = rshell_last_update_pbc(shell_b)%r - r_last_update_pbc(atom_a)%r
339 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
340 rab_list(1:3, 2) = 0.0_dp
341 rab_list(1:3, 3) = 0.0_dp
342 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
344 rab_list(:, :) = 0.0_dp
347 check_terms:
DO i = 1, 4
348 rab2_list(i) = rab_list(1, i)**2 + rab_list(2, i)**2 + rab_list(3, i)**2
349 IF (rab2_list(i) >= rab2_max)
THEN
354 rab_com = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
357 rab_cc = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
361 rab_list(:, :) = 0.0_dp
363 rab_com = rab_com + cell_v
364 rab2_com = rab_com(1)**2 + rab_com(2)**2 + rab_com(3)**2
374 IF (use_virial) pv(:, :) = 0.0_dp
377 IF ((rab2_com <= rab2_max) .AND. all_terms)
THEN
383 IF (shell_a == 0)
THEN
386 ewald_type, alpha, beta_a, &
387 ei_interaction_cutoffs(2, kind_a, kind_b))
388 CALL add_force_nonbond(fatom_a, fcore_b, pv, fscalar, rab, use_virial)
389 ELSE IF (shell_b == 0)
THEN
392 ewald_type, alpha, beta_b, &
393 ei_interaction_cutoffs(2, kind_b, kind_a))
394 CALL add_force_nonbond(fcore_a, fatom_b, pv, fscalar, rab, use_virial)
398 ewald_type, alpha, 0.0_dp, &
399 ei_interaction_cutoffs(1, kind_a, kind_b))
400 CALL add_force_nonbond(fcore_a, fcore_b, pv, fscalar, rab, use_virial)
405 IF (shell_type ==
sh_sh)
THEN
410 IF (fac_vdw > 0)
THEN
411 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
412 etot = etot + energy*fac_vdw
413 fscalar = fscalar*fac_vdw
418 ewald_type, alpha, beta, &
419 ei_interaction_cutoffs(3, kind_a, kind_b))
422 CALL add_force_nonbond(fshell_a, fshell_b, pv, fscalar, rab, use_virial)
431 ewald_type, alpha, beta_b, &
432 ei_interaction_cutoffs(2, kind_b, kind_a))
434 CALL add_force_nonbond(fcore_a, fshell_b, pv, fscalar, rab, use_virial)
441 ewald_type, alpha, beta_a, &
442 ei_interaction_cutoffs(2, kind_a, kind_b))
444 CALL add_force_nonbond(fshell_a, fcore_b, pv, fscalar, rab, use_virial)
446 ELSE IF ((shell_type ==
nosh_sh) .AND. (shell_a == 0))
THEN
451 IF (fac_vdw > 0)
THEN
452 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
453 etot = etot + energy*fac_vdw
454 fscalar = fscalar*fac_vdw
459 ewald_type, alpha, beta, &
460 ei_interaction_cutoffs(3, kind_a, kind_b))
463 CALL add_force_nonbond(fatom_a, fshell_b, pv, fscalar, rab, use_virial)
464 ELSE IF ((shell_type ==
nosh_sh) .AND. (shell_b == 0))
THEN
469 IF (fac_vdw > 0)
THEN
470 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
471 etot = etot + energy*fac_vdw
472 fscalar = fscalar*fac_vdw
477 ewald_type, alpha, beta, &
478 ei_interaction_cutoffs(3, kind_a, kind_b))
481 CALL add_force_nonbond(fshell_a, fatom_b, pv, fscalar, rab, use_virial)
485 IF (rab2_com <= rab2_max)
THEN
491 IF (fac_vdw > 0)
THEN
492 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
493 etot = etot + energy*fac_vdw
494 fscalar = fscalar*fac_vdw
499 ewald_type, alpha, beta, &
500 ei_interaction_cutoffs(3, kind_a, kind_b))
503 CALL add_force_nonbond(fatom_a, fatom_b, pv, fscalar, rab, use_virial)
508 pot_nonbond = pot_nonbond + etot
509 IF (atprop_env%energy)
THEN
512 atprop_env%atener(atom_a) = atprop_env%atener(atom_a) + 0.5_dp*etot
514 atprop_env%atener(atom_b) = atprop_env%atener(atom_b) + 0.5_dp*etot
519 f_nonbond(i, atom_a) = f_nonbond(i, atom_a) + fatom_a(i)
521 f_nonbond(i, atom_b) = f_nonbond(i, atom_b) + fatom_b(i)
523 IF (shell_a > 0)
THEN
526 fcore_nonbond(i, shell_a) = fcore_nonbond(i, shell_a) + fcore_a(i)
528 fshell_nonbond(i, shell_a) = fshell_nonbond(i, shell_a) + fshell_a(i)
531 IF (shell_b > 0)
THEN
534 fcore_nonbond(i, shell_b) = fcore_nonbond(i, shell_b) + fcore_b(i)
536 fshell_nonbond(i, shell_b) = fshell_nonbond(i, shell_b) + fshell_b(i)
543 pv_thread(j, i) = pv_thread(j, i) + pv(j, i)
553 pv_nonbond(j, i) = pv_nonbond(j, i) + pv_thread(j, i)
558 END DO kind_group_loop
564 DEALLOCATE (mm_radius)
568 DEALLOCATE (is_shell_kind)
570 CALL timestop(handle)
639 local_particles, particle_set, ewald_env, v_bonded_corr, pv_bc, &
640 shell_particle_set, core_particle_set, atprop_env, cell, use_virial)
647 REAL(kind=
dp),
INTENT(OUT) :: v_bonded_corr
648 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: pv_bc
649 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
653 LOGICAL,
INTENT(IN) :: use_virial
655 CHARACTER(LEN=*),
PARAMETER :: routinen =
'bonded_correct_gaussian'
657 INTEGER :: atom_a, atom_b, handle, iatom, iend, igrp, ilist, ipair, istart, kind_a, kind_b, &
658 natoms_per_kind, nkind, npairs, shell_a, shell_b
659 INTEGER,
DIMENSION(:, :),
POINTER ::
list
660 LOGICAL :: a_is_shell, b_is_shell, do_multipoles, &
661 full_nl, shell_adiabatic
662 REAL(kind=
dp) :: alpha, const, fac_cor, fac_ei, qcore_a, &
663 qcore_b, qeff_a, qeff_b, qshell_a, &
665 REAL(kind=
dp),
DIMENSION(3) :: rca, rcb, rsa, rsb
666 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ij_kind_full_fac
675 CALL timeset(routinen, handle)
678 IF (use_virial) pv_bc = 0.0_dp
679 v_bonded_corr = 0.0_dp
682 potparm14=potparm14, potparm=potparm, &
683 ij_kind_full_fac=ij_kind_full_fac)
684 CALL ewald_env_get(ewald_env, alpha=alpha, do_multipoles=do_multipoles, &
690 shell_adiabatic=shell_adiabatic)
692 lists:
DO ilist = 1, nonbonded%nlists
693 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
694 npairs = neighbor_kind_pair%nscale
695 IF (npairs == 0) cycle
696 list => neighbor_kind_pair%list
697 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
698 istart = neighbor_kind_pair%grp_kind_start(igrp)
699 IF (istart > npairs)
THEN
702 iend = min(npairs, neighbor_kind_pair%grp_kind_end(igrp))
704 pairs:
DO ipair = istart, iend
705 atom_a =
list(1, ipair)
706 atom_b =
list(2, ipair)
709 kind_a = particle_set(atom_a)%atomic_kind%kind_number
710 kind_b = particle_set(atom_b)%atomic_kind%kind_number
713 pot => potparm%pot(kind_a, kind_b)%pot
714 IF (ipair <= neighbor_kind_pair%nscale)
THEN
715 IF (neighbor_kind_pair%is_onfo(ipair))
THEN
716 pot => potparm14%pot(kind_a, kind_b)%pot
721 fac_ei = ij_kind_full_fac(kind_a, kind_b)
726 IF ((.NOT. full_nl) .AND. (atom_a == atom_b))
THEN
727 fac_ei = fac_ei*0.5_dp
729 IF (ipair <= neighbor_kind_pair%nscale)
THEN
730 fac_ei = fac_ei*neighbor_kind_pair%ei_scale(ipair)
734 fac_cor = 1.0_dp - fac_ei
735 IF (fac_cor <= 0.0_dp) cycle
738 atomic_kind => atomic_kind_set(kind_a)
740 IF (
ASSOCIATED(fist_nonbond_env%charges)) qeff_a = fist_nonbond_env%charges(atom_a)
741 a_is_shell =
ASSOCIATED(shell_kind)
743 CALL get_shell(shell=shell_kind, charge_core=qcore_a, &
744 charge_shell=qshell_a)
745 shell_a = particle_set(atom_a)%shell_index
746 rca = core_particle_set(shell_a)%r
747 rsa = shell_particle_set(shell_a)%r
750 qshell_a = huge(0.0_dp)
752 rca = particle_set(atom_a)%r
757 atomic_kind => atomic_kind_set(kind_b)
759 IF (
ASSOCIATED(fist_nonbond_env%charges)) qeff_b = fist_nonbond_env%charges(atom_b)
760 b_is_shell =
ASSOCIATED(shell_kind)
762 CALL get_shell(shell=shell_kind, charge_core=qcore_b, &
763 charge_shell=qshell_b)
764 shell_b = particle_set(atom_b)%shell_index
765 rcb = core_particle_set(shell_b)%r
766 rsb = shell_particle_set(shell_b)%r
769 qshell_b = huge(0.0_dp)
771 rcb = particle_set(atom_b)%r
776 IF (a_is_shell .AND. b_is_shell)
THEN
778 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
779 v_bonded_corr, core_particle_set, core_particle_set, &
780 shell_a, shell_b, .true., alpha, qcore_a, qcore_b, &
781 const, fac_cor, pv_bc, atprop_env, use_virial)
782 ELSE IF (a_is_shell)
THEN
784 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
785 v_bonded_corr, core_particle_set, particle_set, &
786 shell_a, atom_b, .true., alpha, qcore_a, qcore_b, &
787 const, fac_cor, pv_bc, atprop_env, use_virial)
788 ELSE IF (b_is_shell)
THEN
790 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
791 v_bonded_corr, particle_set, core_particle_set, &
792 atom_a, shell_b, .true., alpha, qcore_a, qcore_b, &
793 const, fac_cor, pv_bc, atprop_env, use_virial)
796 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
797 v_bonded_corr, particle_set, particle_set, &
798 atom_a, atom_b, .true., alpha, qcore_a, qcore_b, &
799 const, fac_cor, pv_bc, atprop_env, use_virial)
804 IF (a_is_shell .AND. b_is_shell)
THEN
806 CALL bonded_correct_gaussian_low(rsa, rsa, cell, &
807 v_bonded_corr, shell_particle_set, shell_particle_set, &
808 shell_a, shell_b, shell_adiabatic, alpha, qshell_a, &
809 qshell_b, const, fac_cor, pv_bc, atprop_env, use_virial)
814 CALL bonded_correct_gaussian_low(rsa, rcb, cell, &
815 v_bonded_corr, shell_particle_set, core_particle_set, &
816 shell_a, shell_b, shell_adiabatic, alpha, qshell_a, qcore_b, &
817 const, fac_cor, pv_bc, atprop_env, use_virial)
820 CALL bonded_correct_gaussian_low(rsa, rcb, cell, &
821 v_bonded_corr, shell_particle_set, particle_set, &
822 shell_a, atom_b, shell_adiabatic, alpha, qshell_a, qcore_b, &
823 const, fac_cor, pv_bc, atprop_env, use_virial)
829 CALL bonded_correct_gaussian_low(rca, rsb, cell, &
830 v_bonded_corr, core_particle_set, shell_particle_set, &
831 shell_a, shell_b, shell_adiabatic, alpha, qcore_a, qshell_b, &
832 const, fac_cor, pv_bc, atprop_env, use_virial)
835 CALL bonded_correct_gaussian_low(rca, rsb, cell, &
836 v_bonded_corr, particle_set, shell_particle_set, &
837 atom_a, shell_b, shell_adiabatic, alpha, qcore_a, qshell_b, &
838 const, fac_cor, pv_bc, atprop_env, use_virial)
842 END DO kind_group_loop
846 nkind =
SIZE(atomic_kind_set)
849 atomic_kind => atomic_kind_set(kind_a)
851 IF (
ASSOCIATED(shell_kind))
THEN
852 CALL get_shell(shell=shell_kind, charge_core=qcore_a, &
853 charge_shell=qshell_a)
855 natoms_per_kind = local_particles%n_el(kind_a)
856 DO iatom = 1, natoms_per_kind
859 atom_a = local_particles%list(kind_a)%array(iatom)
860 shell_a = particle_set(atom_a)%shell_index
861 rca = core_particle_set(shell_a)%r
862 rsa = shell_particle_set(shell_a)%r
864 CALL bonded_correct_gaussian_low_sh(rca, rsa, cell, &
865 v_bonded_corr, core_particle_set, shell_particle_set, &
866 shell_a, shell_adiabatic, alpha, qcore_a, qshell_a, &
867 const, pv_bc, atprop_env, use_virial)
873 CALL group%sum(v_bonded_corr)
875 CALL timestop(handle)