diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 98b32fc30..d9be0df4d 100644 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb index d0d223ce7..cd1a5aab8 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -622,7 +622,7 @@ " 1.17040422e-11])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 2c1c7d294..f1f15c4cb 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -106,6 +106,536 @@ "swiftdiff['px'].plot.line(x=\"time (y)\")" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    +       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "...\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    +       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    +       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    +       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    +       "        3.88578059e-15,  4.10782519e-15,  1.02750769e-03,  1.03179676e-03,\n",
    +       "        1.03606675e-03,  1.04031758e-03,  1.04454916e-03,  1.04876143e-03,\n",
    +       "        1.05295429e-03,  1.05712769e-03,  1.06128153e-03,  1.06541574e-03,\n",
    +       "        1.06953025e-03,  1.07362498e-03,  1.07769985e-03])\n",
    +       "Coordinates:\n",
    +       "    id        int64 2\n",
    +       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
    " + ], + "text/plain": [ + "\n", + "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "...\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", + " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", + " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", + " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", + " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", + " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", + " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", + " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", + " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", + " 3.88578059e-15, 4.10782519e-15, 1.02750769e-03, 1.03179676e-03,\n", + " 1.03606675e-03, 1.04031758e-03, 1.04454916e-03, 1.04876143e-03,\n", + " 1.05295429e-03, 1.05712769e-03, 1.06128153e-03, 1.06541574e-03,\n", + " 1.06953025e-03, 1.07362498e-03, 1.07769985e-03])\n", + "Coordinates:\n", + " id int64 2\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['px'].sel(id=2)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index 7d794bf2b..cf13d90d2 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -1,7 +1,7 @@ submodule(swiftest_classes) s_gr use swiftest contains - module pure subroutine gr_getaccb_ns_body(self, system, param) + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) !! author: David A. Minton !! !! Add relativistic correction acceleration for non-symplectic integrators. @@ -11,7 +11,7 @@ module pure subroutine gr_getaccb_ns_body(self, system, param) !! Quinn, T.R., Tremaine, S., Duncan, M., 1991. A three million year integration of the earth’s orbit. !! AJ 101, 2287–2305. https://doi.org/10.1086/115850 !! - !! Adapted from David A. Minton's Swifter routine routine gr_getaccb_ns.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_kick_getaccb_ns.f90 implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -41,7 +41,7 @@ module pure subroutine gr_getaccb_ns_body(self, system, param) return - end subroutine gr_getaccb_ns_body + end subroutine gr_kick_getaccb_ns_body module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 0c146eea5..b1fb311ce 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -71,7 +71,7 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) return end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) !! author: David A. Minton !! !! Perform linear drift of massive bodies due to barycentric momentum of Sun @@ -80,21 +80,24 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) !! Adapted from Hal Levison's Swift routine helio_lindrift.f implicit none ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(helio_cb), intent(inout) :: cb !! Helio central bod - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(helio_cb), intent(inout) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals - real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + integer(I4B) :: i associate(pl => self, npl => self%nbody) - pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl)) - pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl)) - pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl)) + if (npl == 0) return + pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), mask) + pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), mask) + pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), mask) pt(:) = pt(:) / cb%Gmass - pl%xh(1,1:npl) = pl%xh(1,1:npl) + pt(1) * dt - pl%xh(2,1:npl) = pl%xh(2,1:npl) + pt(2) * dt - pl%xh(3,1:npl) = pl%xh(3,1:npl) + pt(3) * dt + do concurrent(i = 1:npl, mask(i)) + pl%xh(:,i) = pl%xh(:,i) + pt(:) * dt + end do if (lbeg) then cb%ptbeg = pt(:) @@ -106,7 +109,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) return end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) !! author: David A. Minton !! !! Perform linear drift of test particles due to barycentric momentum of Sun @@ -116,20 +119,22 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) !! Adapted from Hal Levison's Swift routine helio_lindrift_tp.f implicit none ! Arguments - class(helio_tp), intent(inout) :: self !! Helio test particleb object - class(helio_cb), intent(in) :: cb !! Helio central body - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_tp), intent(inout) :: self !! Helio test particleb object + class(helio_cb), intent(in) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body associate(tp => self, ntp => self%nbody) + if (ntp == 0) return if (lbeg) then pt(:) = cb%ptbeg else pt(:) = cb%ptend end if - where (tp%status(1:ntp) == ACTIVE) + where (mask(1:ntp)) tp%xh(1, 1:ntp) = tp%xh(1, 1:ntp) + pt(1) * dt tp%xh(2, 1:ntp) = tp%xh(2, 1:ntp) + pt(2) * dt tp%xh(3, 1:ntp) = tp%xh(3, 1:ntp) + pt(3) * dt diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 deleted file mode 100644 index 098549eff..000000000 --- a/src/helio/helio_getacch.f90 +++ /dev/null @@ -1,69 +0,0 @@ -submodule (helio_classes) s_helio_getacch - use swiftest -contains - module subroutine helio_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch.f90 - !! Adapted from Hal Levison's Swift routine helio_getacch.f - implicit none - ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - - associate(cb => system%cb, pl => self, npl => self%nbody) - pl%ah(:,:) = 0.0_DP - call pl%accel_int() - if (param%loblatecb) then - cb%aoblbeg = cb%aobl - call pl%accel_obl(system) - cb%aoblend = cb%aobl - if (param%ltides) then - cb%atidebeg = cb%atide - call pl%accel_tides(system) - cb%atideend = cb%atide - end if - end if - if (param%lextra_force) call pl%accel_user(system, param, t) - !if (param%lgr) call pl%gr_accel(param) - end associate - - return - end subroutine helio_getacch_pl - - module subroutine helio_getacch_tp(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of test particles - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch_tp.f90 - !! Adapted from Hal Levison's Swift routine helio_getacch_tp.f - implicit none - ! Arguments - class(helio_tp), intent(inout) :: self !! WHM test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - - associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) - tp%ah(:,:) = 0.0_DP - if (present(lbeg)) system%lbeg = lbeg - if (system%lbeg) then - call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) - else - call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) - end if - if (param%loblatecb) call tp%accel_obl(system) - if (param%lextra_force) call tp%accel_user(system, param, t) - !if (param%lgr) call tp%gr_accel(param) - end associate - return - end subroutine helio_getacch_tp - -end submodule s_helio_getacch diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 9d5cea3a6..fa601b7f7 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -1,53 +1,141 @@ submodule(helio_classes) s_helio_kick use swiftest contains - module subroutine helio_kickvb_pl(self, dt) +module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + + associate(cb => system%cb, pl => self, npl => self%nbody) + call pl%accel_int() + if (param%loblatecb) then + call pl%accel_obl(system) + if (lbeg) then + cb%aoblbeg = cb%aobl + else + cb%aoblend = cb%aobl + end if + if (param%ltides) then + call pl%accel_tides(system) + if (lbeg) then + cb%atidebeg = cb%atide + else + cb%atideend = cb%atide + end if + end if + end if + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) + !if (param%lgr) call pl%gr_accel(param) + end associate + + return + end subroutine helio_kick_getacch_pl + + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch_tp.f + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Helio test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + + associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) + system%lbeg = lbeg + if (system%lbeg) then + call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) + else + call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) + end if + if (param%loblatecb) call tp%accel_obl(system) + if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) + !if (param%lgr) call tp%gr_accel(param) + end associate + return + end subroutine helio_kick_getacch_tp + + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies !! !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f - !! Adapted from David E. Kaufmann's Swifter routine helio_kickvb.f90 + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb.f90 implicit none ! Arguments - class(helio_pl), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize + class(helio_pl), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i associate(pl => self, npl => self%nbody) if (npl ==0) return - do concurrent(i = 1:npl, pl%status(i) == ACTIVE) + pl%ah(:,:) = 0.0_DP + call pl%accel(system, param, t, lbeg) + if (lbeg) then + call pl%set_beg_end(xbeg = pl%xh) + else + call pl%set_beg_end(xend = pl%xh) + end if + do concurrent(i = 1:npl, mask(i)) pl%vb(:, i) = pl%vb(:, i) + pl%ah(:, i) * dt end do end associate return - end subroutine helio_kickvb_pl + end subroutine helio_kick_vb_pl - module subroutine helio_kickvb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies !! !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh_tp.f - !! Adapted from David E. Kaufmann's Swifter routine helio_kickvb_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb_tp.f90 implicit none ! Arguments - class(helio_tp), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize + class(helio_tp), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i associate(tp => self, ntp => self%nbody) if (ntp ==0) return - do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) + tp%ah(:,:) = 0.0_DP + call tp%accel(system, param, t, lbeg) + do concurrent(i = 1:ntp, mask(i)) tp%vb(:, i) = tp%vb(:, i) + tp%ah(:, i) * dt end do end associate return - end subroutine helio_kickvb_tp + end subroutine helio_kick_vb_tp end submodule s_helio_kick \ No newline at end of file diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 511ffacb6..d0c4dde83 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -37,8 +37,7 @@ module subroutine helio_step_pl(self, system, param, t, dt) real(DP), intent(in) :: t !! Current simulation time real(DP), intent(in) :: dt !! Stepsize ! Internals - integer(I4B) :: i - real(DP) :: dth, msys + real(DP) :: dth !! Half step size if (self%nbody == 0) return associate(pl => self) @@ -49,15 +48,11 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%vh2vb(cb) pl%lfirst = .false. end if - call pl%lindrift(cb, dth, lbeg=.true.) - call pl%accel(system, param, t) - call pl%kick(dth) - call pl%set_beg_end(xbeg = pl%xh) - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) - call pl%set_beg_end(xend = pl%xh) - call pl%accel(system, param, t + dt) - call pl%kick(dth) - call pl%lindrift(cb, dth, lbeg=.false.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE)) + call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) end select end associate @@ -80,9 +75,9 @@ module subroutine helio_step_tp(self, system, param, t, dt) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nboody system class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - real(DP), intent(in) :: dt !! Stepsiz + real(DP), intent(in) :: dt !! Stepsize ! Internals - real(DP) :: dth !! Half step size + real(DP) :: dth !! Half step size if (self%nbody == 0) return @@ -94,13 +89,11 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%vh2vb(vbcb = -cb%ptbeg) tp%lfirst = .false. end if - call tp%lindrift(cb, dth, lbeg=.true.) - call tp%accel(system, param, t, lbeg=.true.) - call tp%kick(dth) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - call tp%accel(system, param, t + dt, lbeg=.false.) - call tp%kick(dth) - call tp%lindrift(cb, dth, lbeg=.false.) + call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) end select end associate diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index efad4702a..c10d47dbc 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -7,7 +7,7 @@ module pure subroutine kick_getacch_int_pl(self) !! Compute direct cross (third) term heliocentric accelerations of massive bodies !! !! Adapted from Hal Levison's Swift routine getacch_ah3.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah3.f90 and helio_kick_getacch_int.f90 implicit none ! Arguments class(swiftest_pl), intent(inout) :: self @@ -39,7 +39,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies !! !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah3.f90 and helio_kick_getacch_int_tp.f90 implicit none ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest test particle @@ -49,50 +49,19 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) ! Internals integer(I4B) :: i, j real(DP) :: rji2, irij3, fac, r2 - real(DP), dimension(NDIM) :: dx, acc + real(DP), dimension(NDIM) :: dx associate(tp => self, ntp => self%nbody) do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) - acc(:) = 0.0_DP do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) - !rji2 = dot_product(dx(:), dx(:)) - !irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - !fac = GMpl(j) * irij3 r2 = dot_product(dx(:), dx(:)) fac = GMpl(j) / (r2 * sqrt(r2)) - acc(:) = acc(:) - fac * dx(:) + tp%ah(:, i) = tp%ah(:, i) - fac * dx(:) end do - tp%ah(:, i) = tp%ah(:, i) + acc(:) end do end associate return end subroutine kick_getacch_int_tp - module subroutine kick_vh_body(self, dt) - !! author: David A. Minton - !! - !! Kick heliocentric velocities of bodies - !! - !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f and kickvh_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh.f90 and whm_kickvh_tp.f90 - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize - ! Internals - integer(I4B) :: i - - associate(n => self%nbody, vh => self%vh, ah => self%ah, status => self%status) - if (n == 0) return - do i = 1, n - if (status(i) == ACTIVE) vh(:, i) = vh(:, i) + ah(:, i) * dt - end do - end associate - - return - end subroutine kick_vh_body - - - end submodule s_kick diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 17366e88f..2f8a52808 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -38,8 +38,8 @@ module helio_classes procedure, public :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) procedure, public :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates procedure, public :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: accel => helio_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_pl !! Kicks the barycentric velocities + procedure, public :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl @@ -54,8 +54,8 @@ module helio_classes procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities + procedure, public :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp @@ -116,53 +116,67 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) implicit none - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(helio_cb), intent(inout) :: cb !! Helio central body object - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(helio_cb), intent(inout) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) implicit none - class(helio_tp), intent(inout) :: self !! Helio test particle object - class(helio_cb), intent(in) :: cb !! Helio nbody system object - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_tp), intent(inout) :: self !! Helio test particle object + class(helio_cb), intent(in) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp - module subroutine helio_getacch_pl(self, system, param, t, lbeg) + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine helio_getacch_pl + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine helio_kick_getacch_pl - module subroutine helio_getacch_tp(self, system, param, t, lbeg) - use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine helio_getacch_tp + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine helio_kick_getacch_tp - module subroutine helio_kickvb_pl(self, dt) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none - class(helio_pl), intent(inout) :: self !! Helio massive body object - real(DP), intent(in) :: dt !! Stepsize - end subroutine helio_kickvb_pl + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine helio_kick_vb_pl - module subroutine helio_kickvb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none - class(helio_tp), intent(inout) :: self !! Helio test particle object - real(DP), intent(in) :: dt !! Stepsize - end subroutine helio_kickvb_tp + class(helio_tp), intent(inout) :: self !! Helio test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine helio_kick_vb_tp module subroutine helio_step_pl(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 8d0fb1f18..8b0ad2c2f 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -71,7 +71,7 @@ module rmvs_classes procedure, public :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered procedure, public :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure, public :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => rmvs_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + procedure, public :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles procedure, public :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) @@ -136,15 +136,15 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine rmvs_util_fill_tp - module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structuree class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine rmvs_getacch_tp + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine rmvs_kick_getacch_tp module subroutine rmvs_setup_pl(self,n) implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 5c6b83bdc..417138122 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -9,16 +9,16 @@ module swiftest_classes public :: discard_pl, discard_system, discard_tp public :: drift_all, drift_body, drift_one public :: eucl_dist_index_plpl - public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel + public :: gr_kick_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_getacch_int_pl, kick_vh_body + public :: kick_getacch_int_pl public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp - public :: tides_getacch_pl, tides_step_spin_system - public :: user_getacch_body + public :: tides_kick_getacch_pl, tides_step_spin_system + public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version @@ -167,6 +167,7 @@ module swiftest_classes contains private procedure(abstract_discard_body), public, deferred :: discard + procedure(abstract_kick_body), public, deferred :: kick procedure(abstract_set_mu), public, deferred :: set_mu procedure(abstract_step_body), public, deferred :: step procedure(abstract_accel), public, deferred :: accel @@ -177,13 +178,12 @@ module swiftest_classes procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: kick => kick_vh_body !! Kicks the heliocentric velocities procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays - procedure, public :: accel_user => user_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure @@ -216,19 +216,19 @@ module swiftest_classes private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass + procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body + procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** @@ -310,7 +310,7 @@ subroutine abstract_accel(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine abstract_accel subroutine abstract_initialize(self, param) @@ -319,6 +319,18 @@ subroutine abstract_initialize(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine abstract_initialize + subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) + import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system objec + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine abstract_kick_body + subroutine abstract_read_frame(self, iu, param, form, ierr) import DP, I4B, swiftest_base, swiftest_parameters class(swiftest_base), intent(inout) :: self !! Swiftest base object @@ -415,12 +427,12 @@ module subroutine eucl_dist_index_plpl(self) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object end subroutine - module pure subroutine gr_getaccb_ns_body(self, system, param) + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine gr_getaccb_ns_body + end subroutine gr_kick_getaccb_ns_body module pure subroutine gr_p4_pos_kick(param, x, v, dt) implicit none @@ -617,12 +629,6 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) integer(I4B), intent(in) :: npl !! Number of active massive bodies end subroutine kick_getacch_int_tp - module subroutine kick_vh_body(self, dt) - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - real(DP), intent(in) :: dt !! Stepsize - end subroutine kick_vh_body - module subroutine obl_acc_body(self, system) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object @@ -703,11 +709,11 @@ module subroutine setup_tp(self, n) integer, intent(in) :: n !! Number of bodies to allocate space for end subroutine setup_tp - module subroutine tides_getacch_pl(self, system) + module subroutine tides_kick_getacch_pl(self, system) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - end subroutine tides_getacch_pl + end subroutine tides_kick_getacch_pl module subroutine tides_step_spin_system(self, param, t, dt) implicit none @@ -717,14 +723,14 @@ module subroutine tides_step_spin_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine tides_step_spin_system - module subroutine user_getacch_body(self, system, param, t, lbeg) + module subroutine user_kick_getacch_body(self, system, param, t, lbeg) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine user_getacch_body + logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + end subroutine user_kick_getacch_body module subroutine util_coord_b2h_pl(self, cb) implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 4edad0767..72fb06ae7 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -91,6 +91,7 @@ module symba_classes private procedure, public :: discard => symba_discard_pl !! Process massive body discards procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle end type symba_pl @@ -106,6 +107,7 @@ module symba_classes private procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle end type symba_tp @@ -121,9 +123,11 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains - procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another - procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small + procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other + procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion + procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** @@ -136,8 +140,8 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another + procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** @@ -175,6 +179,14 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) + implicit none + real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr + real(DP), intent(in) :: rhill1, rhill2, dt + integer(I4B), intent(in) :: irec + logical, intent(out) :: lencounter, lvdotr + end subroutine symba_encounter_check_one + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) implicit none class(symba_pl), intent(inout) :: self !! SyMBA test particle object @@ -184,15 +196,51 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_pl + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp + module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine symba_kick_getacch_pl + + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine symba_kick_getacch_tp + + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + implicit none + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + end subroutine symba_kick_pltpenc + module subroutine symba_io_dump_particle_info(self, param, msg) use swiftest_classes, only : swiftest_parameters implicit none @@ -297,12 +345,10 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) + module recursive subroutine symba_step_recur_system(self, param, ireci) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level end subroutine symba_step_recur_system diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index ef2487aa6..46a4e3743 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -30,19 +30,20 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_pl and whm_util_spill_pl contains - procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates - procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates - procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => whm_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: accel_gr => whm_gr_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates + procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates + procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates + procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates + procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. procedure, public :: set_ir3 => whm_setup_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) - procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize - procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize + procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -55,11 +56,12 @@ module whm_classes !! component list, such as whm_setup_tp and whm_util_spill_tp contains private - procedure, public :: accel => whm_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: accel_gr => whm_gr_getacch_tp !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations - procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize + procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles + procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations + procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp !******************************************************************************************************************************** @@ -115,40 +117,64 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end subroutine whm_util_fill_pl !> Get heliocentric accelration of massive bodies - module subroutine whm_getacch_pl(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine whm_getacch_pl + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine whm_kick_getacch_pl !> Get heliocentric accelration of the test particle - module subroutine whm_getacch_tp(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine whm_getacch_tp + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine whm_kick_getacch_tp - module subroutine whm_gr_getacch_pl(self, param) + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine whm_kick_vh_pl + + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(whm_tp), intent(inout) :: self !! WHM test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine whm_kick_vh_tp + + module subroutine whm_gr_kick_getacch_pl(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine whm_gr_getacch_pl + end subroutine whm_gr_kick_getacch_pl - module subroutine whm_gr_getacch_tp(self, param) + module subroutine whm_gr_kick_getacch_tp(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine whm_gr_getacch_tp + end subroutine whm_gr_kick_getacch_tp module pure subroutine whm_gr_p4_pl(self, param, dt) use swiftest_classes, only : swiftest_parameters diff --git a/src/rmvs/rmvs_getacch.f90 b/src/rmvs/rmvs_kick.f90 similarity index 86% rename from src/rmvs/rmvs_getacch.f90 rename to src/rmvs/rmvs_kick.f90 index 0ede99ab5..6cba4caef 100644 --- a/src/rmvs/rmvs_getacch.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -1,13 +1,13 @@ -submodule(rmvs_classes) s_rmvs_getacch +submodule(rmvs_classes) s_rmvs_kick use swiftest contains - module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute the oblateness acceleration in the inner encounter region with planets !! - !! Performs a similar task as David E. Kaufmann's Swifter routine rmvs_getacch_tp.f90, but + !! Performs a similar task as David E. Kaufmann's Swifter routine rmvs_kick_getacch_tp.f90, but !! uses object polymorphism, and so is not directly adapted. implicit none ! Arguments @@ -15,7 +15,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structuree class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals type(swiftest_parameters) :: param_planetocen real(DP), dimension(:, :), allocatable :: xh_original @@ -34,7 +34,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) class is (rmvs_cb) associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) - if (present(lbeg)) system_planetocen%lbeg = lbeg + system_planetocen%lbeg = lbeg if (system_planetocen%lbeg) then allocate(xhp, source=pl%xbeg) @@ -49,7 +49,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) param_planetocen%lextra_force = .false. param_planetocen%lgr = .false. ! Now compute the planetocentric values of acceleration - call whm_getacch_tp(tp, system_planetocen, param_planetocen, t) + call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t, lbeg) ! Now compute any heliocentric values of acceleration if (tp%lfirst) then @@ -66,7 +66,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) GMcb_original = cb%Gmass cb%Gmass = tp%cb_heliocentric%Gmass if (param%loblatecb) call tp%accel_obl(system_planetocen) - if (param%lextra_force) call tp%accel_user(system_planetocen, param, t) + if (param%lextra_force) call tp%accel_user(system_planetocen, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) tp%xh(:,:) = xh_original(:,:) cb%Gmass = GMcb_original @@ -74,7 +74,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) end select end select else ! Not a close encounter, so just proceded with the standard WHM method - call whm_getacch_tp(tp, system, param, t, lbeg) + call whm_kick_getacch_tp(tp, system, param, t, lbeg) end if end select @@ -82,6 +82,6 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) return - end subroutine rmvs_getacch_tp + end subroutine rmvs_kick_getacch_tp -end submodule s_rmvs_getacch \ No newline at end of file +end submodule s_rmvs_kick \ No newline at end of file diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index e188e57ac..17383f9c0 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -2,6 +2,10 @@ use swiftest contains module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between massive bodies. + !! implicit none ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA test particle object @@ -11,7 +15,6 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc ! Result logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 integer(I4B) :: nenc_old integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr @@ -21,34 +24,11 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc allocate(lencounter(nplpl), loc_lvdotr(nplpl)) lencounter(:) = .false. - term2 = RHSCALE * (RSHELL**irec) - do k = 1, nplpl associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) xr(:) = pl%xh(:, j) - pl%xh(:, i) - r2 = dot_product(xr(:), xr(:)) - r2crit = ((pl%rhill(i) + pl%rhill(i)) * term2)**2 vr(:) = pl%vh(:, j) - pl%vh(:, i) - vdotr = dot_product(vr(:), xr(:)) - if (r2 < r2crit) then - lencounter(k) = .true. - loc_lvdotr(k) = (vdotr < 0.0_DP) - else - if (vdotr < 0.0_DP) then - v2 = dot_product(vr(:), vr(:)) - tmin = -vdotr / v2 - if (tmin < dt) then - r2min = r2 - vdotr * vdotr / v2 - else - r2min = r2 + 2 * vdotr * dt + v2 * dt * dt - end if - r2min = min(r2min, r2) - if (r2min <= r2crit) then - lencounter(k) = .true. - loc_lvdotr(k) = (vdotr < 0.0_DP) - end if - end if - end if + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(i), pl%rhill(j), dt, irec, lencounter(k), loc_lvdotr(k)) end associate end do @@ -70,7 +50,81 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between test particles and massive bodies in the pltpenc list. + !! Note: This method works for the polymorphic symba_pltpenc and symba_plplenc types. + !! + !! Adapted from portions of David E. Kaufmann's Swifter routine: symba_step_recur.f90 + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: xr, vr + logical :: lencounter, isplpl + real(DP) :: rlim2, rji2 + + lany_encounter = .false. + if (self%nenc == 0) return + select type(self) + class is (symba_plplenc) + isplpl = .true. + class is (symba_pltpenc) + isplpl = .false. + end select + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + do i = 1, self%nenc + associate(index_i => self%index1(i), index_j => self%index2(i)) + if (isplpl) then + xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dt, irec, lencounter, self%lvdotr(i)) + else + xr(:) = tp%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = tp%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), 0.0_DP, dt, irec, lencounter, self%lvdotr(i)) + end if + if (lencounter) then + if (isplpl) then + rlim2 = (pl%radius(index_i) + pl%radius(index_j))**2 + else + rlim2 = (pl%radius(index_i))**2 + end if + rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore + if (rji2 > rlim2) then + lany_encounter = .true. + pl%levelg(index_i) = irec + pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + if (isplpl) then + pl%levelg(index_j) = irec + pl%levelm(index_j) = MAX(irec, pl%levelm(index_j)) + else + tp%levelg(index_j) = irec + tp%levelm(index_j) = MAX(irec, tp%levelm(index_j)) + end if + self%level(i) = irec + end if + end if + end associate + end do + end select + end select + end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between test particles and massive bodies. + !! implicit none ! Arguments class(symba_tp), intent(inout) :: self !! SyMBA test particle object @@ -89,34 +143,11 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc allocate(lencounter(npl, ntp), loc_lvdotr(npl, ntp)) lencounter(:,:) = .false. - term2 = RHSCALE * (RSHELL**irec) - do j = 1, ntp do i = 1, npl xr(:) = tp%xh(:, j) - pl%xh(:, i) - r2 = dot_product(xr(:), xr(:)) - r2crit = (pl%rhill(i) * term2)**2 vr(:) = tp%vh(:, j) - pl%vh(:, i) - vdotr = dot_product(vr(:), xr(:)) - if (r2 < r2crit) then - lencounter(i,j) = .true. - loc_lvdotr(i,j) = (vdotr < 0.0_DP) - else - if (vdotr < 0.0_DP) then - v2 = dot_product(vr(:), vr(:)) - tmin = -vdotr / v2 - if (tmin < dt) then - r2min = r2 - vdotr * vdotr / v2 - else - r2min = r2 + 2 * vdotr * dt + v2 * dt * dt - end if - r2min = min(r2min, r2) - if (r2min <= r2crit) then - lencounter(i,j) = .true. - loc_lvdotr(i,j) = (vdotr < 0.0_DP) - end if - end if - end if + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(i), 0.0_DP, dt, irec, lencounter(i,j), loc_lvdotr(i,j)) end do end do @@ -128,11 +159,8 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc pltpenc_list%status(nenc_old+1:nenc) = ACTIVE pltpenc_list%level(nenc_old+1:nenc) = irec pltpenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) - !********************************************************************************************************* - ! This needs to be tested pltpenc_list%index1(nenc_old+1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) pltpenc_list%index2(nenc_old+1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) - !********************************************************************************************************* select type(pl) class is (symba_pl) pl%lencounter(pltpenc_list%index1(nenc_old+1:nenc)) = .true. @@ -143,4 +171,35 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) + !! author: David A. Minton + !! + !! Check for an encounter. + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_chk.f90 + !! Adapted from Hal Levison's Swift routine symba5_chk.f + implicit none + ! Arguments + real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr + real(DP), intent(in) :: rhill1, rhill2, dt + integer(I4B), intent(in) :: irec + logical, intent(out) :: lencounter, lvdotr + ! Internals + integer(I4B) :: iflag + real(DP) :: r2, v2, rcrit, r2crit, vdotr + + lencounter = .false. + rcrit = (rhill1 + rhill2)*RHSCALE*(RSHELL**(irec)) + r2crit = rcrit**2 + r2 = xr**2 + yr**2 + zr**2 + v2 = vxr**2 + vyr**2 + vzr**2 + vdotr = xr * vxr + yr * vyr + zr * vzr + iflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) + if (iflag /= 0) lencounter = .true. + lvdotr = (vdotr < 0.0_DP) + + return + end subroutine symba_encounter_check_one + + end submodule s_symba_encounter_check \ No newline at end of file diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 new file mode 100644 index 000000000..4da46f5a6 --- /dev/null +++ b/src/symba/symba_kick.f90 @@ -0,0 +1,196 @@ +submodule(symba_classes) s_symba_kick + use swiftest +contains + +module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: irij3, rji2, rlim2, faci, facj + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + ! Remove accelerations from encountering pairs + do k = 1, nplplenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i) + pl%radius(j))**2 + if (rji2 > rlim2) then + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) + end if + end associate + end do + call helio_kick_getacch_pl(pl, system, param, t, lbeg) + end associate + end select + + return + end subroutine symba_kick_getacch_pl + + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: rji2, fac, rlim2 + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) + ! Remove accelerations from encountering pairs + do k = 1, npltpenc + associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) + if (tp%status(j) == ACTIVE) THEN + dx(:) = tp%xh(:,j) - pl%xh(:,i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i))**2 + if (rji2 > rlim2) then + fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) + end if + end IF + end associate + end do + call helio_kick_getacch_tp(tp, system, param, t, lbeg) + end associate + end select + return + end subroutine symba_kick_getacch_tp + + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + !! author: David A. Minton + !! + !! Kick barycentric velocities of massive bodies and ACTIVE test particles within SyMBA recursion. + !! Note: This method works for the polymorphic symba_pltpenc and symba_plplenc types + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_kick.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick.f + implicit none + ! Arguments + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + ! Internals + integer(I4B) :: k, irm1, irecl + real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj + real(DP), dimension(NDIM) :: dx + logical :: isplpl, lgoodlevel + + select type(self) + class is (symba_plplenc) + isplpl = .true. + class is (symba_pltpenc) + isplpl = .false. + end select + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + irm1 = irec - 1 + if (sgn < 0) then + irecl = irec - 1 + else + irecl = irec + end if + do k = 1, self%nenc + associate(i => self%index1(k), j => self%index2(k)) + if (isplpl) then + pl%ah(:,i) = 0.0_DP + pl%ah(:,j) = 0.0_DP + else + tp%ah(:,j) = 0.0_DP + end if + if (isplpl) then + lgoodlevel = (pl%levelg(i) >= irm1) .and. (pl%levelg(j) >= irm1) + else + lgoodlevel = (pl%levelg(i) >= irm1) .and. (tp%levelg(j) >= irm1) + end if + if ((self%status(i) == ACTIVE) .and. lgoodlevel) then + if (isplpl) then + ri = ((pl%rhill(i) + pl%rhill(j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = pl%xh(:,j) - pl%xh(:,i) + else + ri = ((pl%rhill(i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = tp%xh(:,j) - pl%xh(:,i) + end if + r2 = dot_product(dx(:), dx(:)) + if (r2 < rim1) then + fac = 0.0_DP + else if (r2 < ri) then + ris = sqrt(ri) + r = sqrt(r2) + rr = (ris - r) / (ris * (1.0_DP - RSHELL)) + fac = (r2**(-1.5_DP)) * (1.0_DP - 3 * (rr**2) + 2 * (rr**3)) + else + ir3 = 1.0_DP / (r2 * sqrt(r2)) + fac = ir3 + end if + faci = fac * pl%mass(i) + if (isplpl) then + facj = fac * pl%mass(j) + pl%ah(:,i) = pl%ah(:,i) + facj*dx(:) + pl%ah(:,j) = pl%ah(:,j) - faci*dx(:) + else + tp%ah(:,j) = tp%ah(:,j) - faci*dx(:) + end if + end if + end associate + end do + if (isplpl) then + do k = 1, self%nenc + associate(i => self%index1(k), j => self%index2(k)) + pl%vb(:,i) = pl%vb(:,i) + sgn * dt * pl%ah(:,i) + pl%vb(:,j) = pl%vb(:,j) + sgn * dt * pl%ah(:,j) + pl%ah(:,i) = 0.0_DP + pl%ah(:,j) = 0.0_DP + end associate + end do + else + where(tp%status(self%index2(1:self%nenc)) == ACTIVE) + tp%vb(1,self%index2(:)) = tp%vb(1,self%index2(:)) + sgn * dt * tp%ah(1,self%index2(:)) + tp%vb(2,self%index2(:)) = tp%vb(2,self%index2(:)) + sgn * dt * tp%ah(2,self%index2(:)) + tp%vb(3,self%index2(:)) = tp%vb(3,self%index2(:)) + sgn * dt * tp%ah(3,self%index2(:)) + end where + tp%ah(:,self%index2(1:self%nenc)) = 0.0_DP + end if + end select + end select + return + end subroutine symba_kick_pltpenc + +end submodule s_symba_kick \ No newline at end of file diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 3f042fbd6..896af6ab4 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -52,7 +52,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth !! Half step size - integer(I4B) :: irec !! Recursion level + integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) @@ -62,34 +62,27 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) + irec = -1 call pl%vh2vb(cb) - call pl%lindrift(cb, dth, lbeg=.true.) - call tp%vh2vb(vbcb = -cb%ptbeg) - call tp%lindrift(cb, dth, lbeg=.true.) - - call pl%set_beg_end(xbeg = pl%xh) - call pl%accel(system, param, t) - call tp%accel(system, param, t, lbeg=.true.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == irec)) - call pl%kick(dth) - call tp%kick(dth) + call tp%vh2vb(vbcb = -cb%ptbeg) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == irec)) - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) irec = 0 - call system%recursive_step(param, t, dt, irec) - - call pl%set_beg_end(xend = pl%xh) - call pl%accel(system, param, t + dt) - call tp%accel(system, param, t + dt, lbeg=.false.) + call system%recursive_step(param, irec) - call pl%kick(dth) - call tp%kick(dth) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%vb2vh(cb) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call pl%vh2vb(cb) - call pl%lindrift(cb, dth, lbeg=.false.) - call tp%vh2vb(vbcb = -cb%ptend) - call tp%lindrift(cb, dth, lbeg=.false.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%vb2vh(vbcb = -cb%ptend) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end select end select end select @@ -97,7 +90,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) return end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) + module recursive subroutine symba_step_recur_system(self, param, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -109,26 +102,60 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, icflg, index_i, index_j, index_pl, index_tp - real(DP) :: dtl, dth,sgn - - associate(plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) - dtl = param%dt / (NTENC**ireci) - dth = 0.5_DP * dtl - IF (dtl / param%dt < VSMALL) THEN - write(*, *) "SWIFTEST Warning:" - write(*, *) " In symba_step_recur_system, local time step is too small" - write(*, *) " Roundoff error will be important!" - call util_exit(FAILURE) - END IF - irecp = ireci + 1 - if (ireci == 0) then - icflg = 0 - end if + integer(I4B) :: i, j, irecp, nloops, sgn + real(DP) :: dtl, dth + real(DP), dimension(NDIM) :: xr, vr + logical :: lencounter + + associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + select type(pl => self%pl) + class is (symba_pl) + select type(tp => self%tp) + class is (symba_tp) + dtl = param%dt / (NTENC**ireci) + dth = 0.5_DP * dtl + IF (dtl / param%dt < VSMALL) THEN + write(*, *) "SWIFTEST Warning:" + write(*, *) " In symba_step_recur_system, local time step is too small" + write(*, *) " Roundoff error will be important!" + call util_exit(FAILURE) + END IF + irecp = ireci + 1 + if (ireci == 0) then + nloops = 1 + else + nloops = NTENC + end if + do j = 1, nloops + lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) + sgn = 1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + if (ireci /= 0) then + sgn = -1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + end if + + call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) + call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) + + if (lencounter) call system%recursive_step(param, irecp) + + sgn = 1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + if (ireci /= 0) then + sgn = -1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + end if + + end do + end select + end select end associate end subroutine symba_step_recur_system diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 81b351e65..031ae4ae5 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -55,11 +55,13 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B) :: nold nold = size(self%status) - if (nrequested <= nold) return - allocate(enc_temp, source=self) - call self%setup(2 * nrequested) - call self%copy(enc_temp) - deallocate(enc_temp) + if (nrequested > nold) then + allocate(enc_temp, source=self) + call self%setup(2 * nrequested) + call self%copy(enc_temp) + deallocate(enc_temp) + end if + self%nenc = nrequested return end subroutine symba_util_resize_pltpenc diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index ff9d554ef..ae503e082 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -1,7 +1,7 @@ -submodule(swiftest_classes) s_tides_getacch +submodule(swiftest_classes) s_tides_kick_getacch use swiftest contains - module subroutine tides_getacch_pl(self, system) + module subroutine tides_kick_getacch_pl(self, system) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! !! Calculated tidal torques from central body to any planet and from any planet to central body @@ -60,5 +60,5 @@ module subroutine tides_getacch_pl(self, system) return - end subroutine tides_getacch_pl -end submodule s_tides_getacch \ No newline at end of file + end subroutine tides_kick_getacch_pl +end submodule s_tides_kick_getacch \ No newline at end of file diff --git a/src/user/user_getacch.f90 b/src/user/user_getacch.f90 index 16a2f0916..2775de3dd 100644 --- a/src/user/user_getacch.f90 +++ b/src/user/user_getacch.f90 @@ -1,21 +1,21 @@ -submodule(swiftest_classes) s_user_getacch +submodule(swiftest_classes) s_user_kick_getacch use swiftest contains - module subroutine user_getacch_body(self, system, param, t, lbeg) + module subroutine user_kick_getacch_body(self, system, param, t, lbeg) !! author: David A. Minton !! !! Add user-supplied heliocentric accelerations to planets. !! - !! Adapted from David E. Kaufmann's Swifter routine whm_user_getacch.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_user_kick_getacch.f90 implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters user parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the ste + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the ste return - end subroutine user_getacch_body + end subroutine user_kick_getacch_body -end submodule s_user_getacch +end submodule s_user_kick_getacch diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 deleted file mode 100644 index e950d855c..000000000 --- a/src/whm/whm_getacch.f90 +++ /dev/null @@ -1,182 +0,0 @@ -submodule(whm_classes) s_whm_getacch - use swiftest -contains - module subroutine whm_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of planets - !! - !! Adapted from Hal Levison's Swift routine getacch.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch.f90 - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: i - real(DP), dimension(NDIM) :: ah0 - - associate(cb => system%cb, pl => self, npl => self%nbody) - if (npl == 0) return - call pl%set_ir3() - - ah0 = whm_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) - do i = 1, npl - pl%ah(:, i) = ah0(:) - end do - - call whm_getacch_ah1(cb, pl) - call whm_getacch_ah2(cb, pl) - call pl%accel_int() - - if (param%loblatecb) then - cb%aoblbeg = cb%aobl - call pl%accel_obl(system) - cb%aoblend = cb%aobl - if (param%ltides) then - cb%atidebeg = cb%aobl - call pl%accel_tides(system) - cb%atideend = cb%atide - end if - end if - - if (param%lgr) call pl%accel_gr(param) - - if (param%lextra_force) call pl%accel_user(system, param, t) - end associate - return - end subroutine whm_getacch_pl - - module subroutine whm_getacch_tp(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of test particles - !! - !! Adapted from Hal Levison's Swift routine getacch_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_tp.f90 - implicit none - ! Arguments - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: i - real(DP), dimension(NDIM) :: ah0 - - associate(tp => self, ntp => self%nbody, pl => system%pl, cb => system%cb, npl => system%pl%nbody) - if (ntp == 0 .or. npl == 0) return - if (present(lbeg)) system%lbeg = lbeg - - if (system%lbeg) then - ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) - do i = 1, ntp - tp%ah(:, i) = ah0(:) - end do - call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) - else - ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) - do i = 1, ntp - tp%ah(:, i) = ah0(:) - end do - call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) - end if - - if (param%loblatecb) call tp%accel_obl(system) - if (param%lextra_force) call tp%accel_user(system, param, t) - if (param%lgr) call tp%accel_gr(param) - end associate - return - end subroutine whm_getacch_tp - - function whm_getacch_ah0(mu, xhp, n) result(ah0) - !! author: David A. Minton - !! - !! Compute zeroth term heliocentric accelerations of planets - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: mu - real(DP), dimension(:,:), intent(in) :: xhp - integer(I4B), intent(in) :: n - ! Result - real(DP), dimension(NDIM) :: ah0 - ! Internals - real(DP) :: fac, r2, ir3h, irh - integer(I4B) :: i - - ah0(:) = 0.0_DP - do i = 1, n - r2 = dot_product(xhp(:, i), xhp(:, i)) - irh = 1.0_DP / sqrt(r2) - ir3h = irh / r2 - fac = mu(i) * ir3h - ah0(:) = ah0(:) - fac * xhp(:, i) - end do - - return - end function whm_getacch_ah0 - - pure subroutine whm_getacch_ah1(cb, pl) - !! author: David A. Minton - !! - !! Compute first term heliocentric accelerations of planets - !! - !! Adapted from Hal Levison's Swift routine getacch_ah1.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah1.f90 - implicit none - ! Arguments - class(swiftest_cb), intent(in) :: cb !! WHM central body object - class(whm_pl), intent(inout) :: pl !! WHM massive body object - ! Internals - integer(I4B) :: i - real(DP), dimension(NDIM) :: ah1h, ah1j - - associate(npl => pl%nbody) - do i = 2, npl - ah1j(:) = pl%xj(:, i) * pl%ir3j(i) - ah1h(:) = pl%xh(:, i) * pl%ir3h(i) - pl%ah(:, i) = pl%ah(:, i) + cb%Gmass * (ah1j(:) - ah1h(:)) - end do - end associate - - return - - end subroutine whm_getacch_ah1 - - pure subroutine whm_getacch_ah2(cb, pl) - !! author: David A. Minton - !! - !! Compute second term heliocentric accelerations of planets - !! - !! Adapted from Hal Levison's Swift routine getacch_ah2.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah2.f90 - implicit none - ! Arguments - class(swiftest_cb), intent(in) :: cb !! Swiftest central body object - class(whm_pl), intent(inout) :: pl !! WHM massive body object - ! Internals - integer(I4B) :: i - real(DP) :: etaj, fac - real(DP), dimension(NDIM) :: ah2, ah2o - - associate(npl => pl%nbody) - ah2(:) = 0.0_DP - ah2o(:) = 0.0_DP - etaj = cb%Gmass - do i = 2, npl - etaj = etaj + pl%Gmass(i - 1) - fac = pl%Gmass(i) * cb%Gmass * pl%ir3j(i) / etaj - ah2(:) = ah2o + fac * pl%xj(:, i) - pl%ah(:,i) = pl%ah(:, i) + ah2(:) - ah2o(:) = ah2(:) - end do - end associate - - return - end subroutine whm_getacch_ah2 - -end submodule s_whm_getacch diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index 62c7fb2b5..c6d0b1723 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -1,12 +1,12 @@ submodule(whm_classes) s_whm_gr use swiftest contains - module subroutine whm_gr_getacch_pl(self, param) !! author: David A. Minton + module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies !! Based on Saha & Tremaine (1994) Eq. 28 !! - !! Adapted from David A. Minton's Swifter routine routine gr_whm_getacch.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 implicit none ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure @@ -33,15 +33,15 @@ module subroutine whm_gr_getacch_pl(self, param) !! author: David A. Minton end do end associate return - end subroutine whm_gr_getacch_pl + end subroutine whm_gr_kick_getacch_pl - module subroutine whm_gr_getacch_tp(self, param) + module subroutine whm_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of test particles !! Based on Saha & Tremaine (1994) Eq. 28 !! - !! Adapted from David A. Minton's Swifter routine routine gr_whm_getacch.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 implicit none ! Arguments class(whm_tp), intent(inout) :: self !! WHM massive body particle data structure @@ -59,7 +59,7 @@ module subroutine whm_gr_getacch_tp(self, param) end do end associate return - end subroutine whm_gr_getacch_tp + end subroutine whm_gr_kick_getacch_tp module pure subroutine whm_gr_p4_pl(self, param, dt) !! author: David A. Minton diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 new file mode 100644 index 000000000..4a8b68330 --- /dev/null +++ b/src/whm/whm_kick.f90 @@ -0,0 +1,267 @@ +submodule(whm_classes) s_whm_kick + use swiftest +contains + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of planets + !! + !! Adapted from Hal Levison's Swift routine getacch.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: ah0 + + associate(cb => system%cb, pl => self, npl => self%nbody) + if (npl == 0) return + call pl%set_ir3() + + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) + do i = 1, npl + pl%ah(:, i) = pl%ah(:, i) + ah0(:) + end do + + call whm_kick_getacch_ah1(cb, pl) + call whm_kick_getacch_ah2(cb, pl) + call pl%accel_int() + + if (param%loblatecb) then + call pl%accel_obl(system) + if (lbeg) then + cb%aoblbeg = cb%aobl + else + cb%aoblend = cb%aobl + end if + if (param%ltides) then + cb%atidebeg = cb%aobl + call pl%accel_tides(system) + cb%atideend = cb%atide + end if + end if + + if (param%lgr) call pl%accel_gr(param) + + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) + end associate + return + end subroutine whm_kick_getacch_pl + + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from Hal Levison's Swift routine getacch_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_tp.f90 + implicit none + ! Arguments + class(whm_tp), intent(inout) :: self !! WHM test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: ah0 + + associate(tp => self, ntp => self%nbody, pl => system%pl, cb => system%cb, npl => system%pl%nbody) + if (ntp == 0 .or. npl == 0) return + system%lbeg = lbeg + + if (lbeg) then + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) + do i = 1, ntp + tp%ah(:, i) = tp%ah(:, i) + ah0(:) + end do + call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) + else + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) + do i = 1, ntp + tp%ah(:, i) = tp%ah(:, i) + ah0(:) + end do + call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) + end if + + if (param%loblatecb) call tp%accel_obl(system) + if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) + if (param%lgr) call tp%accel_gr(param) + end associate + return + end subroutine whm_kick_getacch_tp + + function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) + !! author: David A. Minton + !! + !! Compute zeroth term heliocentric accelerations of planets + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: mu + real(DP), dimension(:,:), intent(in) :: xhp + integer(I4B), intent(in) :: n + ! Result + real(DP), dimension(NDIM) :: ah0 + ! Internals + real(DP) :: fac, r2, ir3h, irh + integer(I4B) :: i + + ah0(:) = 0.0_DP + do i = 1, n + r2 = dot_product(xhp(:, i), xhp(:, i)) + irh = 1.0_DP / sqrt(r2) + ir3h = irh / r2 + fac = mu(i) * ir3h + ah0(:) = ah0(:) - fac * xhp(:, i) + end do + + return + end function whm_kick_getacch_ah0 + + pure subroutine whm_kick_getacch_ah1(cb, pl) + !! author: David A. Minton + !! + !! Compute first term heliocentric accelerations of planets + !! + !! Adapted from Hal Levison's Swift routine getacch_ah1.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah1.f90 + implicit none + ! Arguments + class(swiftest_cb), intent(in) :: cb !! WHM central body object + class(whm_pl), intent(inout) :: pl !! WHM massive body object + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: ah1h, ah1j + + associate(npl => pl%nbody) + do i = 2, npl + ah1j(:) = pl%xj(:, i) * pl%ir3j(i) + ah1h(:) = pl%xh(:, i) * pl%ir3h(i) + pl%ah(:, i) = pl%ah(:, i) + cb%Gmass * (ah1j(:) - ah1h(:)) + end do + end associate + + return + + end subroutine whm_kick_getacch_ah1 + + pure subroutine whm_kick_getacch_ah2(cb, pl) + !! author: David A. Minton + !! + !! Compute second term heliocentric accelerations of planets + !! + !! Adapted from Hal Levison's Swift routine getacch_ah2.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah2.f90 + implicit none + ! Arguments + class(swiftest_cb), intent(in) :: cb !! Swiftest central body object + class(whm_pl), intent(inout) :: pl !! WHM massive body object + ! Internals + integer(I4B) :: i + real(DP) :: etaj, fac + real(DP), dimension(NDIM) :: ah2, ah2o + + associate(npl => pl%nbody) + ah2(:) = 0.0_DP + ah2o(:) = 0.0_DP + etaj = cb%Gmass + do i = 2, npl + etaj = etaj + pl%Gmass(i - 1) + fac = pl%Gmass(i) * cb%Gmass * pl%ir3j(i) / etaj + ah2(:) = ah2o + fac * pl%xj(:, i) + pl%ah(:,i) = pl%ah(:, i) + ah2(:) + ah2o(:) = ah2(:) + end do + end associate + + return + end subroutine whm_kick_getacch_ah2 + + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + !! author: David A. Minton + !! + !! Kick heliocentric velocities of massive bodies + !! + !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + ! Internals + integer(I4B) :: i + + associate(pl => self, npl => self%nbody, cb => system%cb) + if (npl == 0) return + if (lbeg) then + if (pl%lfirst) then + call pl%h2j(cb) + pl%ah(:,:) = 0.0_DP + call pl%accel(system, param, t, lbeg) + pl%lfirst = .false. + end if + call pl%set_beg_end(xbeg = pl%xh) + else + pl%ah(:,:) = 0.0_DP + call pl%accel(system, param, t, lbeg) + call pl%set_beg_end(xend = pl%xh) + end if + do concurrent(i = 1:npl, mask(i)) + pl%vh(:, i) = pl%vh(:, i) + pl%ah(:, i) * dt + end do + end associate + + return + end subroutine whm_kick_vh_pl + + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + !! author: David A. Minton + !! + !! Kick heliocentric velocities of test particles + !! + !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh_tp.f90 + implicit none + ! Arguments + class(whm_tp), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + ! Internals + integer(I4B) :: i + + associate(tp => self, ntp => self%nbody) + if (ntp == 0) return + if (tp%lfirst) then + tp%ah(:,:) = 0.0_DP + call tp%accel(system, param, t, lbeg=.true.) + tp%lfirst = .false. + end if + if (.not.lbeg) then + tp%ah(:,:) = 0.0_DP + call tp%accel(system, param, t, lbeg) + end if + do concurrent(i = 1:ntp, mask(i)) + tp%vh(:, i) = tp%vh(:, i) + tp%ah(:, i) * dt + end do + end associate + + return + end subroutine whm_kick_vh_tp + + + +end submodule s_whm_kick diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 64415f15d..ebcb94e27 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -47,21 +47,13 @@ module subroutine whm_step_pl(self, system, param, t, dt) associate(pl => self, cb => system%cb) dth = 0.5_DP * dt - if (pl%lfirst) then - call pl%h2j(cb) - call pl%accel(system, param, t) - pl%lfirst = .false. - end if - call pl%set_beg_end(xbeg = pl%xh) - call pl%kick(dth) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%drift(system, param, dt, pl%status(:) == ACTIVE) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) - call pl%accel(system, param, t + dt) - call pl%kick(dth) - call pl%set_beg_end(xend = pl%xh) + call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) end associate return end subroutine whm_step_pl @@ -89,16 +81,11 @@ module subroutine whm_step_tp(self, system, param, t, dt) class is (whm_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl) dth = 0.5_DP * dt - if (tp%lfirst) then - call tp%accel(system, param, t, lbeg=.true.) - tp%lfirst = .false. - end if - call tp%kick(dth) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE)) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%accel(system, param, t + dt, lbeg=.false.) - call tp%kick(dth) + call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end associate end select return