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 lists
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
236 IF ((.NOT. full_nl) .AND. (atom_a == atom_b))
THEN
237 fac_ei = 0.5_dp*fac_ei
238 fac_vdw = 0.5_dp*fac_vdw
241 IF (do_multipoles .OR. (.NOT. fist_nonbond_env%do_electrostatics))
THEN
244 IF (ipair <= neighbor_kind_pair%nscale)
THEN
245 fac_ei = fac_ei*neighbor_kind_pair%ei_scale(ipair)
246 fac_vdw = fac_vdw*neighbor_kind_pair%vdw_scale(ipair)
249 IF (fac_ei > 0.0_dp)
THEN
251 mm_radius_a = mm_radius(kind_a)
252 mm_radius_b = mm_radius(kind_b)
253 IF (
ASSOCIATED(fist_nonbond_env%charges))
THEN
254 qeff_a = fist_nonbond_env%charges(atom_a)
255 qeff_b = fist_nonbond_env%charges(atom_b)
257 qeff_a = qeff(kind_a)
258 qeff_b = qeff(kind_b)
260 IF (is_shell_kind(kind_a))
THEN
261 qcore_a = qcore(kind_a)
262 qshell_a = qshell(kind_a)
263 IF ((qcore_a == 0.0_dp) .AND. (qshell_a == 0.0_dp)) fac_ei = 0.0_dp
266 qshell_a = huge(0.0_dp)
267 IF (qeff_a == 0.0_dp) fac_ei = 0.0_dp
269 IF (is_shell_kind(kind_b))
THEN
270 qcore_b = qcore(kind_b)
271 qshell_b = qshell(kind_b)
272 IF ((qcore_b == 0.0_dp) .AND. (qshell_b == 0.0_dp)) fac_ei = 0.0_dp
275 qshell_b = huge(0.0_dp)
276 IF (qeff_b == 0.0_dp) fac_ei = 0.0_dp
282 IF (mm_radius_a > 0)
THEN
285 IF (mm_radius_b > 0)
THEN
288 IF ((mm_radius_a > 0) .OR. (mm_radius_b > 0))
THEN
289 beta =
sqrthalf/sqrt(mm_radius_a*mm_radius_a + mm_radius_b*mm_radius_b)
295 IF (pot%no_pp .AND. (fac_ei == 0.0)) cycle pairs
299 spline_data => pot%pair_spline_data
300 shell_type = pot%shell_type
302 cpassert(.NOT. do_multipoles)
303 cpassert(shell_present)
305 rab2_max = pot%rcutsq
311 IF (shell_type ==
sh_sh)
THEN
312 shell_a = particle_set(atom_a)%shell_index
313 shell_b = particle_set(atom_b)%shell_index
314 rab_cc = rcore_last_update_pbc(shell_b)%r - rcore_last_update_pbc(shell_a)%r
315 rab_cs = rshell_last_update_pbc(shell_b)%r - rcore_last_update_pbc(shell_a)%r
316 rab_sc = rcore_last_update_pbc(shell_b)%r - rshell_last_update_pbc(shell_a)%r
317 rab_ss = rshell_last_update_pbc(shell_b)%r - rshell_last_update_pbc(shell_a)%r
318 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
319 rab_list(1:3, 2) = rab_cs(1:3) + cell_v(1:3)
320 rab_list(1:3, 3) = rab_sc(1:3) + cell_v(1:3)
321 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
322 ELSE IF ((shell_type ==
nosh_sh) .AND. (particle_set(atom_a)%shell_index /= 0))
THEN
323 shell_a = particle_set(atom_a)%shell_index
325 rab_cc = r_last_update_pbc(atom_b)%r - rcore_last_update_pbc(shell_a)%r
328 rab_ss = r_last_update_pbc(atom_b)%r - rshell_last_update_pbc(shell_a)%r
329 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
330 rab_list(1:3, 2) = 0.0_dp
331 rab_list(1:3, 3) = 0.0_dp
332 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
333 ELSE IF ((shell_type ==
nosh_sh) .AND. (particle_set(atom_b)%shell_index /= 0))
THEN
334 shell_b = particle_set(atom_b)%shell_index
336 rab_cc = rcore_last_update_pbc(shell_b)%r - r_last_update_pbc(atom_a)%r
339 rab_ss = rshell_last_update_pbc(shell_b)%r - r_last_update_pbc(atom_a)%r
340 rab_list(1:3, 1) = rab_cc(1:3) + cell_v(1:3)
341 rab_list(1:3, 2) = 0.0_dp
342 rab_list(1:3, 3) = 0.0_dp
343 rab_list(1:3, 4) = rab_ss(1:3) + cell_v(1:3)
345 rab_list(:, :) = 0.0_dp
348 check_terms:
DO i = 1, 4
349 rab2_list(i) = rab_list(1, i)**2 + rab_list(2, i)**2 + rab_list(3, i)**2
350 IF (rab2_list(i) >= rab2_max)
THEN
355 rab_com = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
358 rab_cc = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
362 rab_list(:, :) = 0.0_dp
364 rab_com = rab_com + cell_v
365 rab2_com = rab_com(1)**2 + rab_com(2)**2 + rab_com(3)**2
375 IF (use_virial) pv(:, :) = 0.0_dp
378 IF ((rab2_com <= rab2_max) .AND. all_terms)
THEN
384 IF (shell_a == 0)
THEN
387 ewald_type, alpha, beta_a, &
388 ei_interaction_cutoffs(2, kind_a, kind_b))
389 CALL add_force_nonbond(fatom_a, fcore_b, pv, fscalar, rab, use_virial)
390 ELSE IF (shell_b == 0)
THEN
393 ewald_type, alpha, beta_b, &
394 ei_interaction_cutoffs(2, kind_b, kind_a))
395 CALL add_force_nonbond(fcore_a, fatom_b, pv, fscalar, rab, use_virial)
399 ewald_type, alpha, 0.0_dp, &
400 ei_interaction_cutoffs(1, kind_a, kind_b))
401 CALL add_force_nonbond(fcore_a, fcore_b, pv, fscalar, rab, use_virial)
406 IF (shell_type ==
sh_sh)
THEN
411 IF (fac_vdw > 0)
THEN
412 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
413 etot = etot + energy*fac_vdw
414 fscalar = fscalar*fac_vdw
419 ewald_type, alpha, beta, &
420 ei_interaction_cutoffs(3, kind_a, kind_b))
423 CALL add_force_nonbond(fshell_a, fshell_b, pv, fscalar, rab, use_virial)
432 ewald_type, alpha, beta_b, &
433 ei_interaction_cutoffs(2, kind_b, kind_a))
435 CALL add_force_nonbond(fcore_a, fshell_b, pv, fscalar, rab, use_virial)
442 ewald_type, alpha, beta_a, &
443 ei_interaction_cutoffs(2, kind_a, kind_b))
445 CALL add_force_nonbond(fshell_a, fcore_b, pv, fscalar, rab, use_virial)
447 ELSE IF ((shell_type ==
nosh_sh) .AND. (shell_a == 0))
THEN
452 IF (fac_vdw > 0)
THEN
453 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
454 etot = etot + energy*fac_vdw
455 fscalar = fscalar*fac_vdw
460 ewald_type, alpha, beta, &
461 ei_interaction_cutoffs(3, kind_a, kind_b))
464 CALL add_force_nonbond(fatom_a, fshell_b, pv, fscalar, rab, use_virial)
465 ELSE IF ((shell_type ==
nosh_sh) .AND. (shell_b == 0))
THEN
470 IF (fac_vdw > 0)
THEN
471 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
472 etot = etot + energy*fac_vdw
473 fscalar = fscalar*fac_vdw
478 ewald_type, alpha, beta, &
479 ei_interaction_cutoffs(3, kind_a, kind_b))
482 CALL add_force_nonbond(fshell_a, fatom_b, pv, fscalar, rab, use_virial)
486 IF (rab2_com <= rab2_max)
THEN
492 IF (fac_vdw > 0)
THEN
493 energy =
potential_s(spline_data, rab2, fscalar, spl_f, logger)
494 etot = etot + energy*fac_vdw
495 fscalar = fscalar*fac_vdw
500 ewald_type, alpha, beta, &
501 ei_interaction_cutoffs(3, kind_a, kind_b))
504 CALL add_force_nonbond(fatom_a, fatom_b, pv, fscalar, rab, use_virial)
509 pot_nonbond = pot_nonbond + etot
510 IF (atprop_env%energy)
THEN
513 atprop_env%atener(atom_a) = atprop_env%atener(atom_a) + 0.5_dp*etot
515 atprop_env%atener(atom_b) = atprop_env%atener(atom_b) + 0.5_dp*etot
520 f_nonbond(i, atom_a) = f_nonbond(i, atom_a) + fatom_a(i)
522 f_nonbond(i, atom_b) = f_nonbond(i, atom_b) + fatom_b(i)
524 IF (shell_a > 0)
THEN
527 fcore_nonbond(i, shell_a) = fcore_nonbond(i, shell_a) + fcore_a(i)
529 fshell_nonbond(i, shell_a) = fshell_nonbond(i, shell_a) + fshell_a(i)
532 IF (shell_b > 0)
THEN
535 fcore_nonbond(i, shell_b) = fcore_nonbond(i, shell_b) + fcore_b(i)
537 fshell_nonbond(i, shell_b) = fshell_nonbond(i, shell_b) + fshell_b(i)
544 pv_thread(j, i) = pv_thread(j, i) + pv(j, i)
554 pv_nonbond(j, i) = pv_nonbond(j, i) + pv_thread(j, i)
559 END DO kind_group_loop
565 DEALLOCATE (mm_radius)
569 DEALLOCATE (is_shell_kind)
571 CALL timestop(handle)
640 local_particles, particle_set, ewald_env, v_bonded_corr, pv_bc, &
641 shell_particle_set, core_particle_set, atprop_env, cell, use_virial)
648 REAL(kind=
dp),
INTENT(OUT) :: v_bonded_corr
649 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: pv_bc
650 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
654 LOGICAL,
INTENT(IN) :: use_virial
656 CHARACTER(LEN=*),
PARAMETER :: routinen =
'bonded_correct_gaussian'
658 INTEGER :: atom_a, atom_b, handle, iatom, iend, igrp, ilist, ipair, istart, kind_a, kind_b, &
659 natoms_per_kind, nkind, npairs, shell_a, shell_b
660 INTEGER,
DIMENSION(:, :),
POINTER ::
list
661 LOGICAL :: a_is_shell, b_is_shell, do_multipoles, &
662 full_nl, shell_adiabatic
663 REAL(kind=
dp) :: alpha, const, fac_cor, fac_ei, qcore_a, &
664 qcore_b, qeff_a, qeff_b, qshell_a, &
666 REAL(kind=
dp),
DIMENSION(3) :: rca, rcb, rsa, rsb
667 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ij_kind_full_fac
676 CALL timeset(routinen, handle)
679 IF (use_virial) pv_bc = 0.0_dp
680 v_bonded_corr = 0.0_dp
683 potparm14=potparm14, potparm=potparm, &
684 ij_kind_full_fac=ij_kind_full_fac)
685 CALL ewald_env_get(ewald_env, alpha=alpha, do_multipoles=do_multipoles, &
691 shell_adiabatic=shell_adiabatic)
693 lists:
DO ilist = 1, nonbonded%nlists
694 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
695 npairs = neighbor_kind_pair%nscale
696 IF (npairs == 0) cycle lists
697 list => neighbor_kind_pair%list
698 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
699 istart = neighbor_kind_pair%grp_kind_start(igrp)
700 IF (istart > npairs)
THEN
703 iend = min(npairs, neighbor_kind_pair%grp_kind_end(igrp))
705 pairs:
DO ipair = istart, iend
706 atom_a =
list(1, ipair)
707 atom_b =
list(2, ipair)
710 kind_a = particle_set(atom_a)%atomic_kind%kind_number
711 kind_b = particle_set(atom_b)%atomic_kind%kind_number
714 pot => potparm%pot(kind_a, kind_b)%pot
715 IF (ipair <= neighbor_kind_pair%nscale)
THEN
716 IF (neighbor_kind_pair%is_onfo(ipair))
THEN
717 pot => potparm14%pot(kind_a, kind_b)%pot
722 fac_ei = ij_kind_full_fac(kind_a, kind_b)
728 IF ((.NOT. full_nl) .AND. (atom_a == atom_b))
THEN
729 fac_ei = fac_ei*0.5_dp
731 IF (ipair <= neighbor_kind_pair%nscale)
THEN
732 fac_ei = fac_ei*neighbor_kind_pair%ei_scale(ipair)
736 fac_cor = 1.0_dp - fac_ei
737 IF (fac_cor <= 0.0_dp) cycle pairs
740 atomic_kind => atomic_kind_set(kind_a)
742 IF (
ASSOCIATED(fist_nonbond_env%charges)) qeff_a = fist_nonbond_env%charges(atom_a)
743 a_is_shell =
ASSOCIATED(shell_kind)
745 CALL get_shell(shell=shell_kind, charge_core=qcore_a, &
746 charge_shell=qshell_a)
747 shell_a = particle_set(atom_a)%shell_index
748 rca = core_particle_set(shell_a)%r
749 rsa = shell_particle_set(shell_a)%r
752 qshell_a = huge(0.0_dp)
754 rca = particle_set(atom_a)%r
759 atomic_kind => atomic_kind_set(kind_b)
761 IF (
ASSOCIATED(fist_nonbond_env%charges)) qeff_b = fist_nonbond_env%charges(atom_b)
762 b_is_shell =
ASSOCIATED(shell_kind)
764 CALL get_shell(shell=shell_kind, charge_core=qcore_b, &
765 charge_shell=qshell_b)
766 shell_b = particle_set(atom_b)%shell_index
767 rcb = core_particle_set(shell_b)%r
768 rsb = shell_particle_set(shell_b)%r
771 qshell_b = huge(0.0_dp)
773 rcb = particle_set(atom_b)%r
778 IF (a_is_shell .AND. b_is_shell)
THEN
780 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
781 v_bonded_corr, core_particle_set, core_particle_set, &
782 shell_a, shell_b, .true., alpha, qcore_a, qcore_b, &
783 const, fac_cor, pv_bc, atprop_env, use_virial)
784 ELSE IF (a_is_shell)
THEN
786 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
787 v_bonded_corr, core_particle_set, particle_set, &
788 shell_a, atom_b, .true., alpha, qcore_a, qcore_b, &
789 const, fac_cor, pv_bc, atprop_env, use_virial)
790 ELSE IF (b_is_shell)
THEN
792 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
793 v_bonded_corr, particle_set, core_particle_set, &
794 atom_a, shell_b, .true., alpha, qcore_a, qcore_b, &
795 const, fac_cor, pv_bc, atprop_env, use_virial)
798 CALL bonded_correct_gaussian_low(rca, rcb, cell, &
799 v_bonded_corr, particle_set, particle_set, &
800 atom_a, atom_b, .true., alpha, qcore_a, qcore_b, &
801 const, fac_cor, pv_bc, atprop_env, use_virial)
806 IF (a_is_shell .AND. b_is_shell)
THEN
808 CALL bonded_correct_gaussian_low(rsa, rsa, cell, &
809 v_bonded_corr, shell_particle_set, shell_particle_set, &
810 shell_a, shell_b, shell_adiabatic, alpha, qshell_a, &
811 qshell_b, const, fac_cor, pv_bc, atprop_env, use_virial)
816 CALL bonded_correct_gaussian_low(rsa, rcb, cell, &
817 v_bonded_corr, shell_particle_set, core_particle_set, &
818 shell_a, shell_b, shell_adiabatic, alpha, qshell_a, qcore_b, &
819 const, fac_cor, pv_bc, atprop_env, use_virial)
822 CALL bonded_correct_gaussian_low(rsa, rcb, cell, &
823 v_bonded_corr, shell_particle_set, particle_set, &
824 shell_a, atom_b, shell_adiabatic, alpha, qshell_a, qcore_b, &
825 const, fac_cor, pv_bc, atprop_env, use_virial)
831 CALL bonded_correct_gaussian_low(rca, rsb, cell, &
832 v_bonded_corr, core_particle_set, shell_particle_set, &
833 shell_a, shell_b, shell_adiabatic, alpha, qcore_a, qshell_b, &
834 const, fac_cor, pv_bc, atprop_env, use_virial)
837 CALL bonded_correct_gaussian_low(rca, rsb, cell, &
838 v_bonded_corr, particle_set, shell_particle_set, &
839 atom_a, shell_b, shell_adiabatic, alpha, qcore_a, qshell_b, &
840 const, fac_cor, pv_bc, atprop_env, use_virial)
844 END DO kind_group_loop
848 nkind =
SIZE(atomic_kind_set)
851 atomic_kind => atomic_kind_set(kind_a)
853 IF (
ASSOCIATED(shell_kind))
THEN
854 CALL get_shell(shell=shell_kind, charge_core=qcore_a, &
855 charge_shell=qshell_a)
857 natoms_per_kind = local_particles%n_el(kind_a)
858 DO iatom = 1, natoms_per_kind
861 atom_a = local_particles%list(kind_a)%array(iatom)
862 shell_a = particle_set(atom_a)%shell_index
863 rca = core_particle_set(shell_a)%r
864 rsa = shell_particle_set(shell_a)%r
866 CALL bonded_correct_gaussian_low_sh(rca, rsa, cell, &
867 v_bonded_corr, core_particle_set, shell_particle_set, &
868 shell_a, shell_adiabatic, alpha, qcore_a, qshell_a, &
869 const, pv_bc, atprop_env, use_virial)
875 CALL group%sum(v_bonded_corr)
877 CALL timestop(handle)