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 0a95cb75e..5e13697d5 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 @@ -482,7 +482,7 @@ " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", " id int64 4\n", - " * time (d) (time (d)) float64 0.0 1.0 2.0 3.0 4.0 ... 363.0 364.0 365.0 366.0
  • " ], "text/plain": [ "\n", @@ -550,7 +550,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAqV0lEQVR4nO3de7xUdb3/8ddbLqKCkooXBAQN5aYikFqZt9LQ7JCXStRMw8jKLqfjTz16TmH9SqtHJh01j5aal59UHi+oeL8cPahHUTFBxFBMtqAgSoBI3D6/P9baOHucvdl7Zvastfe8n4/HPPaadfmuz6yZPZ/5fr9rfZciAjMzs0abZR2AmZnlixODmZk14cRgZmZNODGYmVkTTgxmZtaEE4OZmTXhxGAlSZok6YZ0eoCklZK6ZB1XSyR9StLcrOOATcdSy2Mq6RFJp6fTJ0m6r2DZJyX9NY3lC5J2lPSopBWSftXesVk+OTF0UpJek/SZonmnSvqftpYVEa9HRM+IWF+9CNtGUkj6aEvrRMRjEbFnrWJqSXEsxe9HVsc0Im6MiCMKZv0YuDSN5TZgIvA2sHVE/EstY7P8cGKwTkFS16xj6KB2BWYXPX8xyrjy1e9B5+HEUMck9ZX0X5KWSJov6bvNrDcw/cXetWC7qZLekTRP0tcL1u0i6TxJr6TNEc9I6p8uGyLp/nS7uZK+VLDdtZIuk3RXut3/Sto9XfZoutrzaZPHlyUdIqlB0jmS3gSuaZxXUGZ/Sbekr2+ppEubeX2TJN0s6Y/pvp+VtE/B8qFpc8wySbMl/VPBsqMkvZhu94aks9L5G2ORdD0wALgjjf/sNh7TSZL+JOm6dD+zJY1p4X09XNJLkv6evmYVLNtYa5T0CrBbQVw3AV8Fzk6ff0bSZpLOTd/PpWkc2xZ9LiZIeh14KJ3/NUlzJL0r6V5JuxbsPySdkTZfvZu+54XxfT3ddkV6XEcVHJ+Sn1VJ+0maIWm5pLckXdzcsbFWigg/OuEDeA34TNG8U4H/Sac3A54Bfgh0J/mCeBX4bLp8EnBDOj0QCKBr+vy/gcuBHsBIYAnw6XTZ/wFeAPYk+ULaB9gO2ApYAJwGdAVGkTRZDE+3uxZ4B9gvXX4jMKUg9gA+WvD8EGAd8HNgc2CLdF5DurwL8Dzw63TfPYADmzlWk4C1wPFAN+AsYH463Q2YB5yXHqfDgBXAnum2i4BPpdMfAUYVxNfQ3PvRxmM6CVgNHJW+rguBJ5t5LdsDywteyz+nx+n04s9AM3FdC/zfguffB54E+qXH+T+Bm4pew3XpMd4C+EJ6vIam7+O/AY8XvY93Ar1JkuUSYGy67IvAG8DHSD47HyWpwWzqs/oE8JV0uidwQNb/fx39kXkAfrTTG5v8w68ElhU8VvFBYtgfeL1om38FrkmnJ1EiMQD9gfVAr4LtLgSuTafnAuNKxPNl4LGief8J/Cidvhb4XcGyo4CXCp6XSgxrgB5F8xoTw8fTL52urThWkyj4ok2/iBYBn0ofbwKbFSy/CZiUTr8OfIOkTZ5SsRS8HyUTQyuO6STggYJlw4D3m3ktpxS9FgENlJ8Y5pAmqPT5ziRJtGvBa9itYPndwISiY7kK2LXgfTywYPmfgHPT6XuB75V4TZv6rD4KXABsn/X/XWd5uCmpc/tCRPRufADfKli2K9A3bR5ZJmkZya/iHTdRZl/gnYhYUTDvb8Au6XR/4JUS2+0K7F+0v5OAnQrWebNgehXJr7+WLImI1c0s6w/8LSLWbaKMRgsaJyJiA8mXad/0sSCd16jw9R5HksT+Jum/JX28lfsrtKljCh8+Nj1Uuk2/b9FricLnZdgVuLXgPZtDksQKPycLitafXLD+OyTJqaXX0vg+t/TZaemzOgHYA3hJ0tOSjm7zq7Qm3FlUvxYA8yNicBu3WwhsK6lXwRfZAJImgMZydwdmldjff0fE4eUGXEJLHaQLgAGSurYyOfRvnJC0GUnTycLGZZI2K0gOA4CXASLiaWCcpG7AmSS/gDeW1cpYN3VM22JR0WtRM/G01gLgaxExvXiBpIHpZBSt/9OIuLHMfe3ezPxmP6sR8VdgfPq+HQvcLGm7iHivjBgMdz7Xs6eA5Wnn7RZKOo1HSPpYSxtFxALgceBCST0k7U3yi63xi+B3wE8kDVZib0nbkbQr7yHpK5K6pY+PSRraynjfImlbbsvrWwRcJGmrNNZPtrD+aEnHpr/Cvw/8g6Rt/X+B90g6ZLtJOgT4PDBFUncl1wVsExFrSdr2mzv9tNn4W3FM2+IuYHjBa/kuTWtlbXUF8NPGDmRJfSSN28T6/yppeLr+NpK+2Mp9/Q44S9Lo9LPz0XS/LX5WJZ0sqU+auJelZWV2anVn4MRQpyI5f/7zJB2d80k6gn8HbNOKzceTtC8vBG4l6Se4P112Mcmv5vtIvih/D2yR/hI+Ajgh3e5NPug4bo1JwB/SpoQvbWrlgtf3UZJ+gAaSfo7m3J4ufxf4CnBsRKyNiDXAPwFHkhyjy4FTIuKldLuvAK9JWg6cAZzcTPkXAv+Wxn9WieUtHdNWi4i3STpxLwKWAoOBD/3ab4PJwFTgPkkrSJLl/i3s/1aS93VKekxmkRy71sT+Z+CnwP8j6eC/Ddi2FZ/VscBsSSvTeE9ooYnRWkFp541Z3ZI0iaRju7kvdbO64hqDmZk14cRgZmZNuCnJzMyacI3BzMyacGKwuqMSI892Fioag8msHE4M1imlX47vKRkM7g1JF6vG95NQK4YKN8sjJwbrzPaJiJ7Ap4ETga9vYn0zw4nB6kB6MdpjwIjiZemQzU+kF54tknSppO4Fyzc1THTJIaZVeqjw7SXdme7rHUmPpcM4fIikT6Tj/vw9/fuJgmWPSPqJpOlKhqe+T9L2Jcr4oqRniub9i6Tb2nYErd44MVinJ2kYySipz5VYvJ5kaOrtSUZk/TRNBxsEOJpkKOh9gC8Bn03L/QLJYG7HAn1Iks9NABFxULrtPpHcHe2PwL+QXIHdh2QAuPMoMYaSkvsd3AX8hmTI8ouBu9KhRRqdSDKE+Q4kQ1GXupp6KjCoaNiRk4HrS6xrtlGnSAySrpa0WFLxwG3llDUy/QU5W9JfJH25YNmNSm4wMyvdZ7dK92ft6llJ7wJ3kAyhcE3xChHxTEQ8GRHrIuI1kqHADy5a7aKIWBYRrwMPkwzNAMlw2xdGxJx0oL6fASNVcGOaImtJhq3eNR1u47Eofb7454C/RsT1aVw3AS+RDAvR6JqIeDki3icZgmRkcSER8Q/gj6TDdKTjFw0kGbfKrFmdIjGQjCE/tkplrSIZC2d4WuYlknqny24EhgB7kdyU5PQq7dPax6iI+EhE7B4R/1Y0dDYAkvZIm3feTMf2+RlJ7aFQc8NEt2aI6UK/JLmJzX2SXpV0bjPr9SUZdrvQpobhbm6I8j8AJ6bNX18B/pQmDLNmdYrEEBGPkvxTbiRpd0n3KLm15GOShrSyrJfTYXyJiIXAYpKqPxExLVIkIz72q+oLsSz8luTX+OCI2JqkeUctb7LRAuAbhfe8iIgtIuLxUitHxIqI+JeI2I3k1/8PJH26xKoLSZJOobKG4Y6IJ0luaPQpkuYnNyPZJnWKxNCMK4HvRMRokvbXy9tagKT9SNpvXyma343k19c9VYjTstWLZBTYlemPh2+2YdtNDTHdZKhtSUenQ0mLD4boLjU89DSSIcpPlNQ1bc4cRvlNQNcBlwLrIuJ/yizD6kinvAhGUk/gE8CfC04g2Txddizw4xKbvRERny0oY2eSX1dfLdEEcTnwaEQ8Vu3YrebOIvkRcTZJ5/QfSe7rvEkRcWv6WZuS9iv8Hbgf+HO6yiSSocK3ACaSNAVdSlIDfRe4PCIeKVHuUiV3IZtMUqOZBxydDqldjuuBn6QPs03qNGMlKbmb1J0RMULS1sDciNi5zLK2Bh4h6Vj8c9GyHwH7kozX/6E2a7O8SRPTYpI+l79mHY/lX6dsSoqI5cD8xmq9Evu0Ztv0HPZbgetKJIXTSU5VHO+kYB3IN4GnnRSstTpFjUHSTcAhJGeTvAX8CHiIpBq+M9ANmBIRpZqQiss6meS0xtkFs0+NiJmS1pGcHdJ4X95bWlOmWVYkvUbSmf6FiCh1HYfZh3SKxGBmZtXTKZuSzMysfB3+rKTtt98+Bg4cmHUYZmYdyjPPPPN2RPQptazDJ4aBAwcyY8aMrMMwM+tQJBVfXb+Rm5LMzKwJJwYzM2vCicHMzJro8H0MZmZZWbt2LQ0NDaxevTrrUJrVo0cP+vXrR7durb9LgBODmVmZGhoa6NWrFwMHDqRgXLbciAiWLl1KQ0MDgwYNavV2bkoyMyvT6tWr2W677XKZFAAksd1227W5RuPEYGZWgbwmhUblxOfEYGaZWrN+DbfNuw0Pz5MfTgxmlqknFz3Jv0//d15+9+WsQ8nEJz7xiZLzTz31VG6++eYaR5NwYjCzTK3dsBaAdbEu40iy8fjjJe8EmymflWRm2Yqiv3WmZ8+erFy5kojgO9/5Dg899BCDBg3KtGnNNQYzy1SkGSHqNTOkbr31VubOncsLL7zAVVddlWlNwonBzDK1Ib0Z4oY6vynio48+yvjx4+nSpQt9+/blsMNadevxduHEYGaZco3hA3k59dWJwcwytTEx1PnpqgcddBBTpkxh/fr1LFq0iIcffjizWNz5bGbZqu98sNExxxzDQw89xF577cUee+zBwQcfnFksNUsMkq4GjgYWR8SIEssFTAaOAlYBp0bEs7WKz8yyUe9NSStXrgSSZqRLL70042gStWxKuhYY28LyI4HB6WMi8NsaxGRmGWtsQqr3pqQ8qVliiIhHgXdaWGUccF0kngR6S9q5NtGZWVbqvcaQR3nqfN4FWFDwvCGd9yGSJkqaIWnGkiVLahKcmbUPdz7nT54SQ6nztEp+UiLiyogYExFj+vTp085hmVl72tiU5BpDbuQpMTQA/Que9wMWZhSLmVndylNimAqcosQBwN8jYlHWQZlZ+3JTUv7ULDFIugl4AthTUoOkCZLOkHRGuso04FVgHnAV8K1axWZm2XFTUmW+9rWvscMOOzBixIeuAihbza5jiIjxm1gewLdrFI6Z5UTjGElODOU59dRTOfPMMznllFOqVmaempLMrI7V+yB65TrooIPYdtttq1qmh8Qws0xtrCl08ArDBXfM5sWFy6ta5rC+W/Ojzw+vapmt4RqDmWXKfQz54xqDmWWqs1z5nMUv+/biGoOZZcqnq+aPE4OZZcpNSZUZP348H//4x5k7dy79+vXj97//fcVluinJzKwDu+mmm6pepmsMZpYpD7udP04MZpapztL53Jk4MZhZptz5nD9ODGaWKXc+548Tg5llyk1J+ePEYGaZ2tiE5LyQG04MZpapxprCBjyIXlstWLCAQw89lKFDhzJ8+HAmT55clXJ9HYOZZcqnq5ava9eu/OpXv2LUqFGsWLGC0aNHc/jhhzNs2LCKynWNwcwy5T6G8u28886MGjUKgF69ejF06FDeeOONist1jcHMcqHDJ4a7z4U3X6humTvtBUde1KpVX3vtNZ577jn233//infrGoOZZcqdz5VbuXIlxx13HJdccglbb711xeW5xmBmmeo0TUmt/GVfbWvXruW4447jpJNO4thjj61Kma4xmFmmfOVz+SKCCRMmMHToUH7wgx9UrVwnBjPLlK98Lt/06dO5/vrreeihhxg5ciQjR45k2rRpFZfrpiQzy1SnaUrKwIEHHtguNS3XGMwsF9yUlB9ODGaWqQ3hK57zxonBzDLlPob8cWIws0z5rKT8cWIws0xtHETPTUq54cRgZtlyRSF3apoYJI2VNFfSPEnnlli+jaQ7JD0vabak02oZn5nVnk9XLd/q1avZb7/92GeffRg+fDg/+tGPqlJuza5jkNQFuAw4HGgAnpY0NSJeLFjt28CLEfF5SX2AuZJujIg1tYrTzGrLfQzl23zzzXnooYfo2bMna9eu5cADD+TI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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -609,7 +609,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -644,7 +644,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index 42b1fc918..21ae7aafe 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -1,7 +1,7 @@ submodule (helio_classes) s_helio_getacch use swiftest contains - module subroutine helio_getacch_pl(self, system, param, t) + module subroutine helio_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of massive bodies @@ -14,20 +14,19 @@ module subroutine helio_getacch_pl(self, system, param, t) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of real(DP), intent(in) :: t !! Current simulation time - ! Internals + 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) call helio_getacch_int_pl(pl, t) - pl%ah(:,:) = pl%ahi(:,:) - if (param%loblatecb) call pl%obl_acc(cb) - if (param%lextra_force) call pl%user_getacch(system, param, t) - !if (param%lgr) call pl%gr_get_accel(param) + if (param%loblatecb) call pl%accel_obl(system) + 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, xhp) + module subroutine helio_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of test particles @@ -40,22 +39,19 @@ module subroutine helio_getacch_tp(self, system, param, t, xhp) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of real(DP), intent(in) :: t !! Current time - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at the current substep + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step ! Internals - logical, save :: lmalloc = .true. - integer(I4B) :: i - real(DP) :: r2, mu - real(DP), dimension(:), allocatable, save :: irh, irht + logical, save :: lmalloc = .true. + integer(I4B) :: i + real(DP) :: r2, mu + real(DP), dimension(:), allocatable, save :: irh, irht - associate(tp => self, ntp => self%nbody, cb => system%cb, npl => system%pl%nbody) - select type(pl => system%pl) - class is (helio_pl) - call helio_getacch_int_tp(tp, pl, t, xhp) - tp%ah(:,:) = tp%ahi(:,:) - if (param%loblatecb) call tp%obl_acc(cb) - if (param%lextra_force) call tp%user_getacch(system, param, t) - !if (param%lgr) call tp%gr_get_accel(param) - end select + associate(tp => self, ntp => self%nbody, cb => system%cb, npl => system%pl%nbody) + if (present(lbeg)) system%lbeg = lbeg + call helio_getacch_int_tp(tp, system, param, t) + 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 @@ -77,7 +73,7 @@ subroutine helio_getacch_int_pl(pl, t) real(DP), dimension(NDIM) :: dx associate(npl => pl%nbody) - pl%ahi(:,:) = 0.0_DP + pl%ah(:,:) = 0.0_DP do i = 1, npl - 1 do j = i + 1, npl dx(:) = pl%xh(:,j) - pl%xh(:,i) @@ -85,8 +81,8 @@ subroutine helio_getacch_int_pl(pl, t) irij3 = 1.0_DP / (rji2 * sqrt(rji2)) faci = pl%Gmass(i) * irij3 facj = pl%Gmass(j) * irij3 - pl%ahi(:,i) = pl%ahi(:,i) + facj * dx(:) - pl%ahi(:,j) = pl%ahi(:,j) - faci * dx(:) + pl%ah(:,i) = pl%ah(:,i) + facj * dx(:) + pl%ah(:,j) = pl%ah(:,j) - faci * dx(:) end do end do end associate @@ -94,7 +90,7 @@ subroutine helio_getacch_int_pl(pl, t) return end subroutine helio_getacch_int_pl - subroutine helio_getacch_int_tp(tp, pl, t, xhp) + subroutine helio_getacch_int_tp(tp, system, param, t) !! author: David A. Minton !! !! Compute direct cross term heliocentric accelerations of test particles @@ -103,24 +99,31 @@ subroutine helio_getacch_int_tp(tp, pl, t, xhp) !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f implicit none ! Arguments - class(helio_tp), intent(inout) :: tp !! Helio test particle data structure - class(swiftest_pl), intent(inout) :: pl !! Helio massive body particle data structure - real(DP), intent(in) :: t !! Current time - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets + class(helio_tp), intent(inout) :: tp !! 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 of + real(DP), intent(in) :: t !! Current times ! Internals - integer(I4B) :: i, j - real(DP) :: r2, fac - real(DP), dimension(NDIM) :: dx + integer(I4B) :: i, j + real(DP) :: r2, fac + real(DP), dimension(NDIM) :: dx + real(DP), dimension(:, :), allocatable :: xhp + + associate(ntp => tp%nbody, pl => system%pl, npl => system%pl%nbody) + if (system%lbeg) then + allocate(xhp, source=pl%xbeg) + else + allocate(xhp, source=pl%xend) + end if - associate(ntp => tp%nbody, npl => pl%nbody) - tp%ahi(:,:) = 0.0_DP + tp%ah(:,:) = 0.0_DP do i = 1, ntp if (tp%status(i) == ACTIVE) then do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:,j) r2 = dot_product(dx(:), dx(:)) fac = pl%Gmass(j) / (r2 * sqrt(r2)) - tp%ahi(:,i) = tp%ahi(:,i) - fac * dx(:) + tp%ah(:,i) = tp%ah(:,i) - fac * dx(:) end do end if end do diff --git a/src/helio/helio_setup.f90 b/src/helio/helio_setup.f90 index 6a1f99f2a..b97287314 100644 --- a/src/helio/helio_setup.f90 +++ b/src/helio/helio_setup.f90 @@ -27,8 +27,8 @@ end subroutine helio_setup_system call setup_pl(self, n) if (n <= 0) return - allocate(self%ahi(NDIM, n)) - self%ahi(:,:) = 0.0_DP + allocate(self%ah(NDIM, n)) + self%ah(:,:) = 0.0_DP return end procedure helio_setup_pl @@ -44,8 +44,8 @@ end subroutine helio_setup_system call setup_tp(self, n) if (n <= 0) return - allocate(self%ahi(NDIM, n)) - self%ahi(:,:) = 0.0_DP + allocate(self%ah(NDIM, n)) + self%ah(:,:) = 0.0_DP return end procedure helio_setup_tp diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 59997afeb..1c4367228 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -16,8 +16,8 @@ module subroutine helio_step_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize associate(system => self, cb => self%cb, pl => self%pl, tp => self%tp) - call pl%set_rhill(cb) tp%lfirst = pl%lfirst + call pl%set_rhill(cb) call pl%step(system, param, t, dt) call tp%step(system, param, t, dt) end associate @@ -41,7 +41,8 @@ module subroutine helio_step_pl(self, system, param, t, dt) ! Internals integer(I4B) :: i real(DP) :: dth, msys - + + if (self%nbody == 0) return select type(system) class is (helio_nbody_system) associate(pl => self, cb => system%cb, ptb => system%ptb, pte => system%pte) @@ -51,12 +52,12 @@ module subroutine helio_step_pl(self, system, param, t, dt) pl%lfirst = .false. end if call pl%lindrift(system, dth, ptb) - call pl%get_accel(system, param, t) + call pl%accel(system, param, t) call pl%kick(dth) call pl%set_beg_end(xbeg = pl%xh) call pl%drift(system, param, dt) call pl%set_beg_end(xend = pl%xh) - call pl%get_accel(system, param, t + dt) + call pl%accel(system, param, t + dt) call pl%kick(dth) call pl%lindrift(system, dth, pte) call pl%vb2vh(cb) @@ -85,6 +86,8 @@ module subroutine helio_step_tp(self, system, param, t, dt) ! Internals real(DP) :: dth !! Half step size + if (self%nbody == 0) return + select type(system) class is (helio_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl, ptb => system%ptb, pte => system%pte) @@ -94,10 +97,10 @@ module subroutine helio_step_tp(self, system, param, t, dt) tp%lfirst = .false. end if call tp%lindrift(system, dth, ptb) - call tp%get_accel(system, param, t, pl%xbeg) + call tp%accel(system, param, t, lbeg=.true.) call tp%kick(dth) call tp%drift(system, param, dt) - call tp%get_accel(system, param, t + dt, pl%xend) + call tp%accel(system, param, t + dt, lbeg=.false.) call tp%kick(dth) call tp%lindrift(system, dth, pte) call tp%vb2vh(vbcb = -pte) diff --git a/src/io/io.f90 b/src/io/io.f90 index c1440bf2d..55789417b 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1080,7 +1080,7 @@ module subroutine io_write_discard(self, param) if (param%lgr) then select type(discards) class is (whm_tp) - call discards%gr_pv2vh(param) + call discards%pv2vh(param) end select end if write(LUN, HDRFMT) t, nsp, param%lbig_discard @@ -1097,7 +1097,7 @@ module subroutine io_write_discard(self, param) allocate(pltemp, source = pl) select type(pltemp) class is (whm_pl) - call pltemp%gr_pv2vh(param) + call pltemp%pv2vh(param) allocate(vh, source = pltemp%vh) end select deallocate(pltemp) @@ -1316,11 +1316,11 @@ module subroutine io_write_frame_system(self, iu, param) associate(vh => pl%vh, vht => tp%vh) select type(pl) class is (whm_pl) - call pl%gr_pv2vh(param) + call pl%pv2vh(param) end select select type(tp) class is (whm_tp) - call tp%gr_pv2vh(param) + call tp%pv2vh(param) end select end associate end if diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 7fc1749c8..9b88db48d 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -37,14 +37,14 @@ module helio_classes type, public, extends(swiftest_pl) :: helio_pl real(DP), dimension(:,:), allocatable :: ahi !! heliocentric acceleration due to interactions contains - procedure, public :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) - 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 :: get_accel => helio_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_pl !! Kicks the barycentric velocities - procedure, public :: setup => helio_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize + procedure, public :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) + 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 :: setup => helio_setup_pl !! Constructor method - Allocates space for number of particles + procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl !******************************************************************************************************************************** @@ -53,18 +53,17 @@ module helio_classes !! Helio test particle class type, public, extends(swiftest_tp) :: helio_tp - real(DP), dimension(:,:), allocatable :: ahi !! heliocentric acceleration due to interactions real(DP), dimension(NDIM) :: ptbeg !! negative barycentric velocity of the Sun at beginning of time step real(DP), dimension(NDIM) :: ptend !! negative barycentric velocity of the Sun at beginning of time step contains - procedure, public :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) - procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) - procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: get_accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities - procedure, public :: setup => helio_setup_tp !! Constructor method - Allocates space for number of particles - procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize + procedure, public :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) + procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) + procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates + procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure, public :: accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities + procedure, public :: setup => helio_setup_tp !! Constructor method - Allocates space for number of particles + procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp interface @@ -128,23 +127,24 @@ module subroutine helio_drift_linear_tp(self, system, dt, pt) real(DP), dimension(:), intent(in) :: pt !! negative barycentric velocity of the Sun end subroutine helio_drift_linear_tp - module subroutine helio_getacch_pl(self, system, param, t) + module subroutine helio_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 !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of 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 - module subroutine helio_getacch_tp(self, system, param, t, xhp) + module subroutine helio_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object 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 - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets + 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 module subroutine helio_kickvb_pl(self, dt) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 905092892..2baad04eb 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -8,7 +8,6 @@ module rmvs_classes implicit none public - integer(I4B), parameter :: NTENC = 10 integer(I4B), parameter :: NTPHENC = 3 integer(I4B), parameter :: NTPENC = NTENC * NTPHENC @@ -67,13 +66,13 @@ module rmvs_classes integer(I4B) :: ipleP !! index value of encountering planet logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - 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_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_accel => rmvs_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + 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_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 !! 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_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure, public :: spill => rmvs_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -82,11 +81,11 @@ module rmvs_classes !> RMVS massive body particle class type, private, extends(whm_pl) :: rmvs_pl - integer(I4B), dimension(:), allocatable :: nenc !! number of test particles encountering planet this full rmvs time step - integer(I4B), dimension(:), allocatable :: tpenc1P !! index of first test particle encountering planet - integer(I4B), dimension(:), allocatable :: plind ! Connects the planetocentric indices back to the heliocentric planet list - type(rmvs_interp), dimension(:), allocatable :: outer !! interpolated heliocentric central body position for outer encounters - type(rmvs_interp), dimension(:), allocatable :: inner !! interpolated heliocentric central body position for inner encounters + integer(I4B), dimension(:), allocatable :: nenc !! number of test particles encountering planet this full rmvs time step + integer(I4B), dimension(:), allocatable :: tpenc1P !! index of first test particle encountering planet + integer(I4B), dimension(:), allocatable :: plind ! Connects the planetocentric indices back to the heliocentric planet list + type(rmvs_interp), dimension(:), allocatable :: outer !! interpolated heliocentric central body position for outer encounters + type(rmvs_interp), dimension(:), allocatable :: inner !! interpolated heliocentric central body position for inner encounters class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains @@ -128,14 +127,14 @@ module subroutine rmvs_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine rmvs_fill_tp - module subroutine rmvs_getacch_tp(self, system, param, t, xhp) + module subroutine rmvs_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 - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at current substep + 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 module subroutine rmvs_setup_pl(self,n) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 6bd9a442b..3d1cba23d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -13,12 +13,13 @@ module swiftest_classes io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, io_read_initialize_system, & io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system public :: kickvh_body - public :: obl_acc_body + 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_pl, setup_set_ir3h, setup_set_msys, setup_set_mu_pl, setup_set_mu_tp, & - setup_set_rhill, setup_tp + public :: setup_body, setup_construct_system, setup_pl, setup_tp + public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_copy_body, util_copy_cb, util_copy_pl, & - util_copy_tp, util_copy_system, util_fill_body, util_fill_pl, util_fill_tp, util_reverse_status, util_set_beg_end, & + util_copy_tp, util_copy_system, util_fill_body, util_fill_pl, util_fill_tp, util_reverse_status, util_set_beg_end_cb, & + util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, util_set_mu_tp, util_set_rhill, & util_spill_body, util_spill_pl, util_spill_tp !******************************************************************************************************************************** @@ -114,6 +115,8 @@ module swiftest_classes real(DP) :: j2rp2 = 0.0_DP !! J2*R^2 term for central body real(DP) :: j4rp4 = 0.0_DP !! J4*R^2 term for central body real(DP), dimension(NDIM) :: aobl = 0.0_DP !! Barycentric acceleration due to central body oblatenes + real(DP), dimension(NDIM) :: aoblbeg = 0.0_DP !! Barycentric acceleration due to central body oblatenes at beginning of step + real(DP), dimension(NDIM) :: aoblend = 0.0_DP !! Barycentric acceleration due to central body oblatenes at end of step real(DP), dimension(NDIM) :: xb = 0.0_DP !! Barycentric position (units DU) real(DP), dimension(NDIM) :: vb = 0.0_DP !! Barycentric velocity (units DU / TU) real(DP), dimension(NDIM) :: Ip = 0.0_DP !! Unitless principal moments of inertia (I1, I2, I3) / (MR**2). Principal axis rotation assumed. @@ -122,10 +125,11 @@ module swiftest_classes real(DP) :: Q = 0.0_DP !! Tidal quality factor contains private - procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data - procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body - procedure, public :: copy => util_copy_cb !! Copies elements of one object to another. + procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data + procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body + procedure, public :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body + procedure, public :: copy => util_copy_cb !! Copies elements of one object to another. + procedure, public :: set_beg_end => util_set_beg_end_cb !! Sets the beginning and ending oblateness acceleration term end type swiftest_cb !******************************************************************************************************************************** @@ -160,17 +164,18 @@ module swiftest_classes procedure(abstract_discard_body), public, deferred :: discard procedure(abstract_set_mu), public, deferred :: set_mu procedure(abstract_step_body), public, deferred :: step - procedure(abstract_get_accel), public, deferred :: get_accel + procedure(abstract_accel), public, deferred :: accel ! These are concrete because the implementation is the same for all types of particles 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 => kickvh_body !! Kicks the heliocentric velocities - procedure, public :: obl_acc => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + 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 => setup_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + 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 :: copy => util_copy_body !! Copies elements of one object to another. 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) @@ -206,18 +211,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 :: eucl_irij3 => eucl_irij3_plpl !! Parallelized single loop blocking for Euclidean distance matrix calcualtion - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: set_mu => setup_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => setup_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 :: copy => util_copy_pl !! Copies elements of one object to another. - 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 !! Sets the beginning and ending positions 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 :: eucl_irij3 => eucl_irij3_plpl !! Parallelized single loop blocking for Euclidean distance matrix calcualtion + 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 :: 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 :: copy => util_copy_pl !! Copies elements of one object to another. + 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 !******************************************************************************************************************************** @@ -236,15 +242,16 @@ module swiftest_classes private ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and - procedure, public :: set_mu => setup_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: copy => util_copy_tp !! Copies elements of one object to another. - procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: copy => util_copy_tp !! Copies elements of one object to another. + procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -262,6 +269,9 @@ module swiftest_classes real(DP) :: pe = 0.0_DP !! System potential energy real(DP) :: te = 0.0_DP !! System total energy real(DP), dimension(NDIM) :: htot = 0.0_DP !! System angular momentum vector + logical :: lbeg !! True if this is the beginning of a step. This is used so that test particle steps can be calculated + !! separately from massive bodies. Massive body variables are saved at half steps, and passed to + !! the test particles contains private !> Each integrator will have its own version of the step @@ -272,7 +282,7 @@ module swiftest_classes procedure, public :: dump => io_dump_system !! Dump the state of the system to a file procedure, public :: initialize => io_read_initialize_system !! Initialize the system from an input file procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file - procedure, public :: set_msys => setup_set_msys !! Sets the value of msys from the masses of system bodies. + procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file procedure, public :: copy => util_copy_system !! Copies elements of one object to another. @@ -293,14 +303,14 @@ subroutine abstract_discard_body(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine abstract_discard_body - subroutine abstract_get_accel(self, system, param, t) - use swiftest_classes, only : swiftest_body, swifest_nbody_system, swiftest_parameters - implicit none + subroutine abstract_accel(self, system, param, t, lbeg) + import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP class(swiftest_body), intent(inout) :: self !! Swiftest body data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of real(DP), intent(in) :: t !! Current simulation time - end subroutine abstract_get_accel + logical, optional, 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) import swiftest_base, swiftest_parameters @@ -537,14 +547,24 @@ module subroutine kickvh_body(self, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine kickvh_body - module subroutine obl_acc_body(self, system, param, t) + module subroutine obl_acc_body(self, system) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest massive body data structure + class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of - real(DP), intent(in) :: t !! Current simulation time end subroutine obl_acc_body + module subroutine obl_acc_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 obl_acc_pl + + module subroutine obl_acc_tp(self, system) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + end subroutine obl_acc_tp + module subroutine orbel_el2xv_vec(self, cb) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object @@ -595,33 +615,33 @@ module subroutine setup_pl(self,n) integer, intent(in) :: n !! Number of massive bodies to allocate space for end subroutine setup_pl - module subroutine setup_set_ir3h(self) + module subroutine util_set_ir3h(self) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object - end subroutine setup_set_ir3h + end subroutine util_set_ir3h - module subroutine setup_set_msys(self) + module subroutine util_set_msys(self) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - end subroutine setup_set_msys + end subroutine util_set_msys - module subroutine setup_set_mu_pl(self, cb) + module subroutine util_set_mu_pl(self, cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - end subroutine setup_set_mu_pl + end subroutine util_set_mu_pl - module subroutine setup_set_mu_tp(self, cb) + module subroutine util_set_mu_tp(self, cb) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - end subroutine setup_set_mu_tp + end subroutine util_set_mu_tp - module subroutine setup_set_rhill(self,cb) + module subroutine util_set_rhill(self,cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(inout) :: cb !! Swiftest massive body object - end subroutine setup_set_rhill + end subroutine util_set_rhill module subroutine setup_tp(self, n) implicit none @@ -629,6 +649,15 @@ module subroutine setup_tp(self, n) integer, intent(in) :: n !! Number of bodies to allocate space for end subroutine setup_tp + module subroutine user_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 of 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 step + end subroutine user_getacch_body + module subroutine util_coord_b2h_pl(self, cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object @@ -714,12 +743,20 @@ module subroutine util_reverse_status(self) class(swiftest_body), intent(inout) :: self !! Swiftest body object end subroutine util_reverse_status - module subroutine util_set_beg_end(self, xbeg, xend, vbeg) + module subroutine util_set_beg_end_cb(self, aoblbeg, aoblend) + implicit none + class(swiftest_cb), intent(inout) :: self !! Swiftest central body object + real(DP), dimension(:), intent(in), optional :: aoblbeg !! Oblateness acceleration term at beginning of step + real(DP), dimension(:), intent(in), optional :: aoblend !! Oblateness acceleration term at end of step + end subroutine util_set_beg_end_cb + + module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - real(DP), dimension(:,:), intent(in), optional :: xbeg, xend !! Positions at beginning and end of step - real(DP), dimension(:,:), intent(in), optional :: vbeg !! vbeg is an unused variable to keep this method forward compatible with RMVS - end subroutine util_set_beg_end + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + real(DP), dimension(:,:), intent(in), optional :: xbeg !! Position vectors at beginning of step + real(DP), dimension(:,:), intent(in), optional :: xend !! Positions vectors at end of step + real(DP), dimension(:,:), intent(in), optional :: vbeg !! vbeg is an unused variable to keep this method forward compatible with RMVS + end subroutine util_set_beg_end_pl module subroutine util_spill_body(self, discards, lspill_list) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index e15e6d9c7..b0f176a0a 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -30,21 +30,21 @@ 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_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 - procedure, public :: fill => whm_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_accel => whm_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: gr_get_accel => whm_gr_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_p4 => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: gr_vh2pv => whm_gr_vh2pv_pl !! Converts from heliocentric velocity to psudeovelocity for GR calculations - procedure, public :: gr_pv2vh => whm_gr_pv2vh_pl !! Converts from psudeovelocity to heliocentric velocity for GR calculations - procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: set_mu => whm_setup_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_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + 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 + procedure, public :: fill => whm_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 :: p4 => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: vh2pv => whm_gr_vh2pv_pl !! Converts from heliocentric velocity to psudeovelocity for GR calculations + procedure, public :: pv2vh => whm_gr_pv2vh_pl !! Converts from psudeovelocity to heliocentric velocity for GR calculations + 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_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -57,14 +57,14 @@ module whm_classes !! component list, such as whm_setup_tp and whm_spill_tp contains private - procedure, public :: drift => whm_drift_tp !! Loop through test particles and call Danby drift routine - procedure, public :: get_accel => whm_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: gr_get_accel => whm_gr_getacch_tp !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_p4 => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: gr_vh2pv => whm_gr_vh2pv_tp !! Converts from heliocentric velocity to psudeovelocity for GR calculations - procedure, public :: gr_pv2vh => whm_gr_pv2vh_tp !! Converts from psudeovelocity to heliocentric velocity for GR calculations - 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 :: drift => whm_drift_tp !! Loop through test particles and call Danby drift routine + 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 :: p4 => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: vh2pv => whm_gr_vh2pv_tp !! Converts from heliocentric velocity to psudeovelocity for GR calculations + procedure, public :: pv2vh => whm_gr_pv2vh_tp !! Converts from psudeovelocity to heliocentric velocity for GR calculations + 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 !******************************************************************************************************************************** @@ -128,24 +128,25 @@ module subroutine whm_fill_pl(self, inserts, lfill_list) end subroutine whm_fill_pl !> Get heliocentric accelration of massive bodies - module subroutine whm_getacch_pl(self, system, param, t) + module subroutine whm_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 of 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 !> Get heliocentric accelration of the test particle - module subroutine whm_getacch_tp(self, system, param, t, xhp) + module subroutine whm_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 of real(DP), intent(in) :: t !! Current time - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at the current substep + 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 module subroutine whm_gr_getacch_pl(self, param) @@ -218,12 +219,12 @@ module subroutine whm_setup_set_ir3j(self) class(whm_pl), intent(inout) :: self !! WHM massive body object end subroutine whm_setup_set_ir3j - module subroutine whm_setup_set_mu_eta_pl(self, cb) + module subroutine whm_util_set_mu_eta_pl(self, cb) use swiftest_classes, only : swiftest_cb implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - end subroutine whm_setup_set_mu_eta_pl + end subroutine whm_util_set_mu_eta_pl module subroutine whm_setup_system(self, param) use swiftest_classes, only : swiftest_parameters diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 1192189df..ec34110ee 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -1,23 +1,23 @@ submodule (swiftest_classes) s_obl use swiftest contains - module subroutine obl_acc_body(self, cb) + module subroutine obl_acc_body(self, system) !! author: David A. Minton !! !! Compute the barycentric accelerations of bodies due to the oblateness of the central body !! Returned values do not include monopole term or terms higher than J4 - + !! !! Adapted from David E. Kaufmann's Swifter routine: obl_acc.f90 and obl_acc_tp.f90 !! Adapted from Hal Levison's Swift routine obl_acc.f and obl_acc_tp.f implicit none ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object ! Internals integer(I4B) :: i real(DP) :: r2, irh, rinv2, t0, t1, t2, t3, fac1, fac2 - associate(n => self%nbody, xh => self%xh, vh => self%vh, ah => self%ah) + associate(n => self%nbody, cb => system%cb) do i = 1, n r2 = dot_product(self%xh(:, i), self%xh(:, i)) irh = 1.0_DP / sqrt(r2) @@ -31,19 +31,71 @@ module subroutine obl_acc_body(self, cb) self%aobl(:, i) = fac1 * self%xh(:, i) self%aobl(3, i) = fac2 * self%xh(3, i) + self%aobl(3, i) end do - select type(self) - class is (swiftest_pl) - do i = 1, NDIM - cb%aobl(i) = -sum(self%Gmass(1:n) * self%aobl(i, 1:n)) / cb%Gmass - end do - end select + end associate + return + + end subroutine obl_acc_body + + module subroutine obl_acc_pl(self, system) + !! author: David A. Minton + !! + !! Compute the barycentric accelerations of massive bodies due to the oblateness of the central body + !! + !! Adapted from David E. Kaufmann's Swifter routine: obl_acc.f90 and obl_acc_tp.f90 + !! Adapted from Hal Levison's Swift routine obl_acc.f and obl_acc_tp.f + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + ! Internals + integer(I4B) :: i + + associate(pl => self, npl => self%nbody, cb => system%cb) + call obl_acc_body(pl, system) + do i = 1, NDIM + cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl)) / cb%Gmass + end do + + do i = 1, NDIM + pl%ah(i, 1:npl) = pl%ah(i, 1:npl) + pl%aobl(i, 1:npl) - cb%aobl(i) + end do + end associate + + return + + end subroutine obl_acc_pl + + module subroutine obl_acc_tp(self, system) + !! author: David A. Minton + !! + !! Compute the barycentric accelerations of massive bodies due to the oblateness of the central body + !! + !! Adapted from David E. Kaufmann's Swifter routine: obl_acc.f90 and obl_acc_tp.f90 + !! Adapted from Hal Levison's Swift routine obl_acc.f and obl_acc_tp.f + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + ! Internals + real(DP), dimension(NDIM) :: aoblcb + integer(I4B) :: i + + associate(tp => self, ntp => self%nbody, cb => system%cb) + call obl_acc_body(tp, system) + if (system%lbeg) then + aoblcb = cb%aoblbeg + else + aoblcb = cb%aoblend + end if do i = 1, NDIM - self%ah(i, 1:n) = self%ah(i, 1:n) + self%aobl(i, 1:n) - cb%aobl(i) + tp%ah(i, 1:ntp) = tp%ah(i, 1:ntp) + tp%aobl(i, 1:ntp) - aoblcb(i) end do + end associate return - end subroutine obl_acc_body + end subroutine obl_acc_tp + end submodule s_obl diff --git a/src/rmvs/rmvs_getacch.f90 b/src/rmvs/rmvs_getacch.f90 index 58cccbf3e..b750e1ced 100644 --- a/src/rmvs/rmvs_getacch.f90 +++ b/src/rmvs/rmvs_getacch.f90 @@ -1,7 +1,7 @@ submodule(rmvs_classes) s_rmvs_getacch use swiftest contains - module subroutine rmvs_getacch_tp(self, system, param, t, xhp) + module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -15,63 +15,62 @@ module subroutine rmvs_getacch_tp(self, system, param, t, xhp) 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 - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at current substep + logical, optional, intent(in) :: lbeg !! Optional argument 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 - integer(I4B) :: i + real(DP), dimension(:, :), allocatable :: xh_original + integer(I4B) :: i + real(DP), dimension(:, :), allocatable :: xhp - - associate(tp => self, ntp => self%nbody, ipleP => self%ipleP, inner_index => self%index, cb_heliocentric => self%cb_heliocentric) + associate(tp => self, ntp => self%nbody, ipleP => self%ipleP, inner_index => self%index) select type(system) class is (rmvs_nbody_system) if (system%lplanetocentric) then ! This is a close encounter step, so any accelerations requiring heliocentric position values - ! must be handeled outside the normal WHM method call + ! must be handeled outside the normal WHM method call select type(pl => system%pl) class is (rmvs_pl) - select type (cb => system%cb) - class is (rmvs_cb) - associate(xpc => pl%xh, xpct => self%xh, apct => self%ah) - allocate(xh_original, source=tp%xh) - param_planetocen = param - ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter - param_planetocen%loblatecb = .false. - param_planetocen%lextra_force = .false. - param_planetocen%lgr = .false. - ! Now compute the planetocentric values of acceleration - call whm_getacch_tp(tp, system, param_planetocen, t, xhp) + select type (cb => system%cb) + class is (rmvs_cb) + associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) - ! Now compute any heliocentric values of acceleration - if (tp%lfirst) then - do i = 1, ntp - tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index - 1)%x(:,1) - end do - else - do i = 1, ntp - tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index )%x(:,1) - end do - end if - ! Swap the planetocentric and heliocentric position vectors - tp%xh(:,:) = tp%xheliocentric(:,:) - if (param%loblatecb) then - ! Put in the current encountering planet's oblateness acceleration as the central body's - if (tp%lfirst) then - cb_heliocentric%aobl(:) = cb%inner(inner_index - 1)%aobl(:,1) + if (present(lbeg)) system_planetocen%lbeg = lbeg + + if (system_planetocen%lbeg) then + allocate(xhp, source=pl%xbeg) else - cb_heliocentric%aobl(:) = cb%inner(inner_index )%aobl(:,1) + allocate(xhp, source=pl%xend) end if - call tp%obl_acc(cb_heliocentric) - end if + + allocate(xh_original, source=tp%xh) + param_planetocen = param + ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter + param_planetocen%loblatecb = .false. + 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) - if (param%lextra_force) call tp%user_getacch(system, param, t) - if (param%lgr) call tp%gr_get_accel(param) - - tp%xh(:,:) = xh_original(:,:) - end associate - end select + ! Now compute any heliocentric values of acceleration + if (tp%lfirst) then + do i = 1, ntp + tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index - 1)%x(:,1) + end do + else + do i = 1, ntp + tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index )%x(:,1) + end do + end if + ! Swap the planetocentric and heliocentric position vectors + tp%xh(:,:) = tp%xheliocentric(:,:) + if (param%loblatecb) call tp%accel_obl(system_planetocen) + if (param%lextra_force) call tp%accel_user(system_planetocen, param, t) + if (param%lgr) call tp%accel_gr(param) + tp%xh(:,:) = xh_original(:,:) + end associate + 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, xhp) + call whm_getacch_tp(tp, system, param, t, lbeg) end if end select diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 6fe920863..71091f6dd 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -42,9 +42,8 @@ module subroutine rmvs_step_system(self, param, t, dt) call pl%step(system, param, t, dt) pl%outer(NTENC)%x(:,:) = pl%xh(:,:) pl%outer(NTENC)%v(:,:) = pl%vh(:,:) - call pl%set_beg_end(xend = pl%xh) - call rmvs_interp_out(system, param, dt) - call rmvs_step_out(system, param, t, dt) + call rmvs_interp_out(cb, pl, dt) + call rmvs_step_out(cb, pl, tp, system, param, t, dt) call tp%reverse_status() call pl%set_beg_end(xbeg = xbeg, xend = xend) tp%lfirst = .true. @@ -53,7 +52,7 @@ module subroutine rmvs_step_system(self, param, t, dt) pl%lfirst = lfirstpl tp%lfirst = lfirsttp else - call whm_step_system(self, param, t, dt) + call whm_step_system(system, param, t, dt) end if end associate end select @@ -63,133 +62,144 @@ module subroutine rmvs_step_system(self, param, t, dt) end subroutine rmvs_step_system - subroutine rmvs_step_out(system, param, t, dt) + subroutine rmvs_interp_out(cb, pl, dt) !! author: David A. Minton !! - !! Step ACTIVE test particles ahead in the outer encounter region, setting up and calling the inner region - !! integration if necessar - !! - !! Adapted from Hal Levison's Swift routines rmvs3_step_out.f and rmvs3_step_out2.f - !! Adapted from David E. Kaufmann's Swifter routines rmvs_step_out.f90 and rmvs_step_out2.f90 + !! Interpolate planet positions between two Keplerian orbits in outer encounter region + !! + !! Adapted from David E. Kaufmann's Swifter routine rmvs_interp_out.f90 + !! + !! Adapted from Hal Levison's Swift routine rmvs3_interp.f implicit none ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - real(DP), intent(in) :: dt !! Current stepsiz + class(rmvs_cb), intent(inout) :: cb !! RMVS central body object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + real(DP), intent(in) :: dt !! Step size ! Internals - integer(I4B) :: outer_index, j, k - real(DP) :: dto, outer_time, rts - logical :: lencounter, lfirsttp + integer(I4B) :: i, outer_index + real(DP) :: frac, dntenc + real(DP), dimension(:,:), allocatable :: xtmp, vtmp + real(DP), dimension(:), allocatable :: GMcb, dto + integer(I4B), dimension(:), allocatable :: iflag - select type(pl => system%pl) - class is (rmvs_pl) - select type(tp => system%tp) - class is (rmvs_tp) - associate(cb => system%cb, npl => pl%nbody, ntp => tp%nbody) - dto = dt / NTENC - where(tp%plencP(:) == 0) - tp%status(:) = INACTIVE - elsewhere - tp%lperi(:) = .false. - end where - do outer_index = 1, NTENC - outer_time = t + (outer_index - 1) * dto - call pl%set_beg_end(xbeg = pl%outer(outer_index - 1)%x(:, :), & - vbeg = pl%outer(outer_index - 1)%v(:, :), & - xend = pl%outer(outer_index )%x(:, :)) - system%rts = RHPSCALE - lencounter = tp%encounter_check(system, dt) - if (lencounter) then - ! Interpolate planets in inner encounter region - call rmvs_interp_in(system, param, dto, outer_index) - ! Step through the inner region - call rmvs_step_in(system, param, outer_time, dto) - lfirsttp = tp%lfirst - tp%lfirst = .true. - call tp%step(system, param, outer_time, dto) - tp%lfirst = lfirsttp - else - call tp%step(system, param, outer_time, dto) + dntenc = real(NTENC, kind=DP) + associate (npl => pl%nbody) + allocate(xtmp, mold = pl%xh) + allocate(vtmp, mold = pl%vh) + allocate(GMcb(npl)) + allocate(dto(npl)) + allocate(iflag(npl)) + dto(:) = dt / dntenc + GMcb(:) = cb%Gmass + xtmp(:,:) = pl%outer(0)%x(:, :) + vtmp(:,:) = pl%outer(0)%v(:, :) + do outer_index = 1, NTENC - 1 + call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + dto(1:npl), iflag(1:npl)) + if (any(iflag(1:npl) /= 0)) then + do i = 1, npl + if (iflag(i) /= 0) then + write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" + write(*, *) GMcb(i), dto(i) + write(*, *) xtmp(:,i) + write(*, *) vtmp(:,i) + write(*, *) " STOPPING " + call util_exit(FAILURE) end if - do j = 1, npl - if (pl%nenc(j) == 0) cycle - where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) tp%status(:) = ACTIVE - end do end do - end associate - end select - end select + end if + frac = 1.0_DP - outer_index / dntenc + pl%outer(outer_index)%x(:, :) = frac * xtmp(:,:) + pl%outer(outer_index)%v(:, :) = frac * vtmp(:,:) + end do + xtmp(:,:) = pl%outer(NTENC)%x(:, :) + vtmp(:,:) = pl%outer(NTENC)%v(:, :) + do outer_index = NTENC - 1, 1, -1 + call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + -dto(1:npl), iflag(1:npl)) + if (any(iflag(1:npl) /= 0)) then + do i = 1, npl + if (iflag(i) /= 0) then + write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" + write(*, *) GMcb(i), -dto(i) + write(*, *) xtmp(:,i) + write(*, *) vtmp(:,i) + write(*, *) " STOPPING " + call util_exit(FAILURE) + end if + end do + end if + frac = outer_index / dntenc + pl%outer(outer_index)%x(:, :) = pl%outer(outer_index)%x(:, :) + frac * xtmp(:,:) + pl%outer(outer_index)%v(:, :) = pl%outer(outer_index)%v(:, :) + frac * vtmp(:,:) + end do + end associate + return - end subroutine rmvs_step_out + end subroutine rmvs_interp_out - subroutine rmvs_step_in(system, param, outer_time, dto) + subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) !! author: David A. Minton !! - !! Step active test particles ahead in the inner encounter region + !! Step ACTIVE test particles ahead in the outer encounter region, setting up and calling the inner region + !! integration if necessar !! - !! Adapted from Hal Levison's Swift routine rmvs3_step_in.f - !! Adapted from David E. Kaufmann's Swifter routine rmvs_step_in.f90 + !! Adapted from Hal Levison's Swift routines rmvs3_step_out.f and rmvs3_step_out2.f + !! Adapted from David E. Kaufmann's Swifter routines rmvs_step_out.f90 and rmvs_step_out2.f90 implicit none ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: outer_time !! Current time - real(DP), intent(in) :: dto !! Outer step size + class(rmvs_cb), intent(inout) :: cb !! RMVS central body object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object + class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + real(DP), intent(in) :: dt !! Current stepsiz ! Internals - logical :: lfirsttp - integer(I4B) :: i, j, ipleP - real(DP) :: dti, inner_time + integer(I4B) :: outer_index, j, k + real(DP) :: dto, outer_time, rts + logical :: lencounter, lfirsttp - select type(pl => system%pl) - class is (rmvs_pl) - select type (tp => system%tp) - class is (rmvs_tp) - associate(npl => pl%nbody, cb => system%cb) - dti = dto / NTPHENC - if (param%loblatecb) call pl%obl_acc(cb) - call rmvs_make_planetocentric(system, param) - do i = 1, npl - if (pl%nenc(i) == 0) cycle - select type(planetocen_system => pl%planetocentric(i)) - class is (rmvs_nbody_system) - select type(plenci => planetocen_system%pl) - class is (rmvs_pl) - select type(tpenci => planetocen_system%tp) - class is (rmvs_tp) - associate(inner_index => tpenci%index) - ! There are inner encounters with this planet...switch to planetocentric coordinates to proceed - tpenci%lfirst = .true. - inner_time = outer_time - call rmvs_peri_tp(tpenci, pl, inner_time, dti, .true., 0, i, param) - ! now step the encountering test particles fully through the inner encounter - lfirsttp = .true. - do inner_index = 1, NTPHENC ! Integrate over the encounter region, using the "substitute" planetocentric systems at each level - plenci%xh(:,:) = plenci%inner(inner_index - 1)%x(:,:) - call plenci%set_beg_end(xbeg = plenci%inner(inner_index - 1)%x, & - xend = plenci%inner(inner_index)%x) - call tpenci%step(planetocen_system, param, inner_time, dti) - do j = 1, pl%nenc(i) - tpenci%xheliocentric(:, j) = tpenci%xh(:, j) + pl%inner(inner_index)%x(:,i) - end do - inner_time = outer_time + j * dti - call rmvs_peri_tp(tpenci, pl, inner_time, dti, .false., inner_index, i, param) - end do - where(tpenci%status(:) == ACTIVE) tpenci%status(:) = INACTIVE - end associate - end select - end select - end select - end do - call rmvs_end_planetocentric(system) - end associate - end select - end select + associate(npl => pl%nbody, ntp => tp%nbody) + dto = dt / NTENC + where(tp%plencP(:) == 0) + tp%status(:) = INACTIVE + elsewhere + tp%lperi(:) = .false. + end where + do outer_index = 1, NTENC + outer_time = t + (outer_index - 1) * dto + call pl%set_beg_end(xbeg = pl%outer(outer_index - 1)%x(:, :), & + vbeg = pl%outer(outer_index - 1)%v(:, :), & + xend = pl%outer(outer_index )%x(:, :)) + system%rts = RHPSCALE + lencounter = tp%encounter_check(system, dt) + if (lencounter) then + ! Interpolate planets in inner encounter region + call rmvs_interp_in(cb, pl, system, param, dto, outer_index) + ! Step through the inner region + call rmvs_step_in(cb, pl, tp, param, outer_time, dto) + lfirsttp = tp%lfirst + tp%lfirst = .true. + call tp%step(system, param, outer_time, dto) + tp%lfirst = lfirsttp + else + call tp%step(system, param, outer_time, dto) + end if + do j = 1, npl + if (pl%nenc(j) == 0) cycle + where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) tp%status(:) = ACTIVE + end do + end do + end associate return - end subroutine rmvs_step_in - subroutine rmvs_interp_in(system, param, dt, outer_index) + end subroutine rmvs_step_out + + subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) !! author: David A. Minton !! !! Interpolate planet positions between two Keplerian orbits in inner encounter regio @@ -199,7 +209,9 @@ subroutine rmvs_interp_in(system, param, dt, outer_index) !! Adapted from Hal Levison's Swift routine rmvs3_interp.f implicit none ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! RMVS test particle object + class(rmvs_cb), intent(inout) :: cb !! RMVS cenral body object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object class(swiftest_parameters), intent(in) :: param !! Swiftest parameters file real(DP), intent(in) :: dt !! Step size integer(I4B), intent(in) :: outer_index !! Outer substep number within current set @@ -210,179 +222,234 @@ subroutine rmvs_interp_in(system, param, dt, outer_index) real(DP), dimension(:), allocatable :: GMcb, dti integer(I4B), dimension(:), allocatable :: iflag - associate (cb => system%cb, npl => system%pl%nbody) - select type(pl => system%pl) - class is (rmvs_pl) - dntphenc = real(NTPHENC, kind=DP) + associate (npl => system%pl%nbody) + dntphenc = real(NTPHENC, kind=DP) - ! Set the endpoints of the inner region from the outer region values in the current outer step index - pl%inner(0)%x(:,:) = pl%outer(outer_index - 1)%x(:, :) - pl%inner(0)%v(:,:) = pl%outer(outer_index - 1)%v(:, :) - pl%inner(NTPHENC)%x(:,:) = pl%outer(outer_index)%x(:, :) - pl%inner(NTPHENC)%v(:,:) = pl%outer(outer_index)%v(:, :) - - allocate(xtmp,mold=pl%xh) - allocate(vtmp,mold=pl%vh) - allocate(GMcb(npl)) - allocate(dti(npl)) - allocate(iflag(npl)) - dti(:) = dt / dntphenc - GMcb(:) = cb%Gmass - xtmp(:, :) = pl%inner(0)%x(:, :) - vtmp(:, :) = pl%inner(0)%v(:, :) - if (param%loblatecb) then - allocate(xh_original,source=pl%xh) - pl%xh(:, :) = xtmp(:, :) ! Temporarily replace heliocentric position with inner substep values to calculate the oblateness terms - call pl%obl_acc(cb) - pl%inner(0)%aobl(:, :) = pl%aobl(:, :) ! Save the oblateness acceleration on the planet for this substep + ! Set the endpoints of the inner region from the outer region values in the current outer step index + pl%inner(0)%x(:,:) = pl%outer(outer_index - 1)%x(:, :) + pl%inner(0)%v(:,:) = pl%outer(outer_index - 1)%v(:, :) + pl%inner(NTPHENC)%x(:,:) = pl%outer(outer_index)%x(:, :) + pl%inner(NTPHENC)%v(:,:) = pl%outer(outer_index)%v(:, :) + + allocate(xtmp,mold=pl%xh) + allocate(vtmp,mold=pl%vh) + allocate(GMcb(npl)) + allocate(dti(npl)) + allocate(iflag(npl)) + dti(:) = dt / dntphenc + GMcb(:) = cb%Gmass + xtmp(:, :) = pl%inner(0)%x(:, :) + vtmp(:, :) = pl%inner(0)%v(:, :) + if (param%loblatecb) then + allocate(xh_original,source=pl%xh) + pl%xh(:, :) = xtmp(:, :) ! Temporarily replace heliocentric position with inner substep values to calculate the oblateness terms + call pl%accel_obl(system) + pl%inner(0)%aobl(:, :) = pl%aobl(:, :) ! Save the oblateness acceleration on the planet for this substep + end if + + do inner_index = 1, NTPHENC - 1 + call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + dti(1:npl), iflag(1:npl)) + if (any(iflag(1:npl) /= 0)) then + do i = 1, npl + if (iflag(i) /=0) then + write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" + write(*, *) GMcb(i), dti(i) + write(*, *) xtmp(:,i) + write(*, *) vtmp(:,i) + write(*, *) " STOPPING " + call util_exit(failure) + end if + end do end if - - do inner_index = 1, NTPHENC - 1 - call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - dti(1:npl), iflag(1:npl)) - if (any(iflag(1:npl) /= 0)) then - do i = 1, npl - if (iflag(i) /=0) then - write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" - write(*, *) GMcb(i), dti(i) - write(*, *) xtmp(:,i) - write(*, *) vtmp(:,i) - write(*, *) " STOPPING " - call util_exit(failure) - end if - end do - end if - frac = 1.0_DP - inner_index / dntphenc - pl%inner(inner_index)%x(:, :) = frac * xtmp(:,:) - pl%inner(inner_index)%v(:, :) = frac * vtmp(:,:) - end do - - xtmp(:,:) = pl%inner(NTPHENC)%x(:, :) - vtmp(:,:) = pl%inner(NTPHENC)%v(:, :) - - do inner_index = NTPHENC - 1, 1, -1 - call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - -dti(1:npl), iflag(1:npl)) - if (any(iflag(1:npl) /= 0)) then - do i = 1, npl - if (iflag(i) /=0) then - write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" - write(*, *) GMcb(i), -dti(i) - write(*, *) xtmp(:,i) - write(*, *) vtmp(:,i) - write(*, *) " STOPPING " - call util_exit(failure) - end if - end do - end if - frac = inner_index / dntphenc - pl%inner(inner_index)%x(:, :) = pl%inner(inner_index)%x(:, :) + frac * xtmp(:, :) - pl%inner(inner_index)%v(:, :) = pl%inner(inner_index)%v(:, :) + frac * vtmp(:, :) - - if (param%loblatecb) then - pl%xh(:,:) = pl%inner(inner_index)%x(:, :) - call pl%obl_acc(cb) - pl%inner(inner_index)%aobl(:, :) = pl%aobl(:, :) - end if - end do + frac = 1.0_DP - inner_index / dntphenc + pl%inner(inner_index)%x(:, :) = frac * xtmp(:,:) + pl%inner(inner_index)%v(:, :) = frac * vtmp(:,:) + end do + + xtmp(:,:) = pl%inner(NTPHENC)%x(:, :) + vtmp(:,:) = pl%inner(NTPHENC)%v(:, :) + + do inner_index = NTPHENC - 1, 1, -1 + call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + -dti(1:npl), iflag(1:npl)) + if (any(iflag(1:npl) /= 0)) then + do i = 1, npl + if (iflag(i) /=0) then + write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" + write(*, *) GMcb(i), -dti(i) + write(*, *) xtmp(:,i) + write(*, *) vtmp(:,i) + write(*, *) " STOPPING " + call util_exit(failure) + end if + end do + end if + frac = inner_index / dntphenc + pl%inner(inner_index)%x(:, :) = pl%inner(inner_index)%x(:, :) + frac * xtmp(:, :) + pl%inner(inner_index)%v(:, :) = pl%inner(inner_index)%v(:, :) + frac * vtmp(:, :) + if (param%loblatecb) then - ! Calculate the final value of oblateness accelerations at the final inner substep - pl%xh(:,:) = pl%inner(NTPHENC)%x(:, :) - call pl%obl_acc(cb) - pl%inner(NTPHENC)%aobl(:, :) = pl%aobl(:, :) - ! Put the planet positions back into place - call move_alloc(xh_original, pl%xh) + pl%xh(:,:) = pl%inner(inner_index)%x(:, :) + call pl%accel_obl(system) + pl%inner(inner_index)%aobl(:, :) = pl%aobl(:, :) end if - end select + end do + if (param%loblatecb) then + ! Calculate the final value of oblateness accelerations at the final inner substep + pl%xh(:,:) = pl%inner(NTPHENC)%x(:, :) + call pl%accel_obl(system) + pl%inner(NTPHENC)%aobl(:, :) = pl%aobl(:, :) + ! Put the planet positions back into place + call move_alloc(xh_original, pl%xh) + end if end associate return end subroutine rmvs_interp_in - subroutine rmvs_interp_out(system, param, dt) + subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) !! author: David A. Minton !! - !! Interpolate planet positions between two Keplerian orbits in outer encounter region + !! Step active test particles ahead in the inner encounter region + !! + !! Adapted from Hal Levison's Swift routine rmvs3_step_in.f + !! Adapted from David E. Kaufmann's Swifter routine rmvs_step_in.f90 + implicit none + ! Arguments + class(rmvs_cb), intent(inout) :: cb !! RMVS central body object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: outer_time !! Current time + real(DP), intent(in) :: dto !! Outer step size + ! Internals + logical :: lfirsttp + integer(I4B) :: i, j, ipleP + real(DP) :: dti, inner_time + + associate(npl => pl%nbody) + dti = dto / NTPHENC + call rmvs_make_planetocentric(cb, pl, tp) + do i = 1, npl + if (pl%nenc(i) == 0) cycle + select type(planetocen_system => pl%planetocentric(i)) + class is (rmvs_nbody_system) + select type(cbenci => planetocen_system%cb) + class is (rmvs_cb) + select type(plenci => planetocen_system%pl) + class is (rmvs_pl) + select type(tpenci => planetocen_system%tp) + class is (rmvs_tp) + associate(inner_index => tpenci%index) + ! There are inner encounters with this planet...switch to planetocentric coordinates to proceed + tpenci%lfirst = .true. + inner_time = outer_time + call rmvs_peri_tp(tpenci, pl, inner_time, dti, .true., 0, i, param) + ! now step the encountering test particles fully through the inner encounter + lfirsttp = .true. + do inner_index = 1, NTPHENC ! Integrate over the encounter region, using the "substitute" planetocentric systems at each level + plenci%xh(:,:) = plenci%inner(inner_index - 1)%x(:,:) + call plenci%set_beg_end(xbeg = plenci%inner(inner_index - 1)%x, & + xend = plenci%inner(inner_index)%x) + call cbenci%set_beg_end(aoblbeg = cbenci%inner(inner_index - 1)%aobl(:, 1), & + aoblend = cbenci%inner(inner_index )%aobl(:, 1)) + call tpenci%step(planetocen_system, param, inner_time, dti) + do j = 1, pl%nenc(i) + tpenci%xheliocentric(:, j) = tpenci%xh(:, j) + pl%inner(inner_index)%x(:,i) + end do + inner_time = outer_time + j * dti + call rmvs_peri_tp(tpenci, pl, inner_time, dti, .false., inner_index, i, param) + end do + where(tpenci%status(:) == ACTIVE) tpenci%status(:) = INACTIVE + end associate + end select + end select + end select + end select + end do + call rmvs_end_planetocentric(pl, tp) + end associate + return + end subroutine rmvs_step_in + + subroutine rmvs_make_planetocentric(cb, pl, tp) + !! author: David A. Minton !! - !! Adapted from David E. Kaufmann's Swifter routine rmvs_interp_out.f90 + !! When encounters are detected, this method will call the interpolation methods for the planets and + !! creates a Swiftest test particle structure for each planet's encountering test particles to simplify the + !! planetocentric calculations. This subroutine is not based on an existing one from Swift and Swifter !! - !! Adapted from Hal Levison's Swift routine rmvs3_interp.f implicit none ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object - class(swiftest_parameters), intent(in) :: param !! Swiftest parameters file - real(DP), intent(in) :: dt !! Step size - ! Internals - integer(I4B) :: i, outer_index - real(DP) :: frac, dntenc - real(DP), dimension(:,:), allocatable :: xtmp, vtmp - real(DP), dimension(:), allocatable :: GMcb, dto - integer(I4B), dimension(:), allocatable :: iflag + class(rmvs_cb), intent(inout) :: cb !! RMVS central body object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object - dntenc = real(NTENC, kind=DP) - associate (cb => system%cb, pl => system%pl, npl => system%pl%nbody) - select type(pl => system%pl) - class is (rmvs_pl) - allocate(xtmp, mold = pl%xh) - allocate(vtmp, mold = pl%vh) - allocate(GMcb(npl)) - allocate(dto(npl)) - allocate(iflag(npl)) - dto(:) = dt / dntenc - GMcb(:) = cb%Gmass - xtmp(:,:) = pl%outer(0)%x(:, :) - vtmp(:,:) = pl%outer(0)%v(:, :) - do outer_index = 1, NTENC - 1 - call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - dto(1:npl), iflag(1:npl)) + ! Internals + integer(I4B) :: i, j, inner_index, ipc2hc + logical, dimension(:), allocatable :: encmask - if (any(iflag(1:npl) /= 0)) then - do i = 1, npl - if (iflag(i) /= 0) then - write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" - write(*, *) GMcb(i), dto(i) - write(*, *) xtmp(:,i) - write(*, *) vtmp(:,i) - write(*, *) " STOPPING " - call util_exit(FAILURE) - end if - end do - end if - frac = 1.0_DP - outer_index / dntenc - pl%outer(outer_index)%x(:, :) = frac * xtmp(:,:) - pl%outer(outer_index)%v(:, :) = frac * vtmp(:,:) - end do - xtmp(:,:) = pl%outer(NTENC)%x(:, :) - vtmp(:,:) = pl%outer(NTENC)%v(:, :) - do outer_index = NTENC - 1, 1, -1 - call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - -dto(1:npl), iflag(1:npl)) - if (any(iflag(1:npl) /= 0)) then - do i = 1, npl - if (iflag(i) /= 0) then - write(*, *) " Planet ", pl%name(i), " is lost!!!!!!!!!!" - write(*, *) GMcb(i), -dto(i) - write(*, *) xtmp(:,i) - write(*, *) vtmp(:,i) - write(*, *) " STOPPING " - call util_exit(FAILURE) - end if - end do - end if - frac = outer_index / dntenc - pl%outer(outer_index)%x(:, :) = pl%outer(outer_index)%x(:, :) + frac * xtmp(:,:) - pl%outer(outer_index)%v(:, :) = pl%outer(outer_index)%v(:, :) + frac * vtmp(:,:) - end do - end select + associate (npl => pl%nbody, ntp => tp%nbody) + do i = 1, npl + if (pl%nenc(i) == 0) cycle + ! There are inner encounters with this planet + if (allocated(encmask)) deallocate(encmask) + allocate(encmask(ntp)) + encmask(:) = tp%plencP(:) == i + allocate(rmvs_tp :: pl%planetocentric(i)%tp) + ! Create encountering test particle structure + select type(cbenci => pl%planetocentric(i)%cb) + class is (rmvs_cb) + select type(plenci => pl%planetocentric(i)%pl) + class is (rmvs_pl) + select type(tpenci => pl%planetocentric(i)%tp) + class is (rmvs_tp) + tpenci%lplanetocentric = .true. + call tpenci%setup(pl%nenc(i)) + tpenci%cb_heliocentric = cb + tpenci%ipleP = i + tpenci%status(:) = ACTIVE + ! Grab all the encountering test particles and convert them to a planetocentric frame + tpenci%name(:) = pack(tp%name(:), encmask(:)) + do j = 1, NDIM + tpenci%xheliocentric(j, :) = pack(tp%xh(j,:), encmask(:)) + tpenci%xh(j, :) = tpenci%xheliocentric(j, :) - pl%inner(0)%x(j, i) + tpenci%vh(j, :) = pack(tp%vh(j,:), encmask(:)) - pl%inner(0)%v(j, i) + end do + tpenci%lperi(:) = pack(tp%lperi(:), encmask(:)) + tpenci%plperP(:) = pack(tp%plperP(:), encmask(:)) + ! Make sure that the test particles get the planetocentric value of mu + allocate(cbenci%inner(0:NTPHENC)) + do inner_index = 0, NTPHENC + allocate(plenci%inner(inner_index)%x, mold=pl%inner(inner_index)%x) + allocate(plenci%inner(inner_index)%v, mold=pl%inner(inner_index)%x) + allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) + allocate(cbenci%inner(inner_index)%x(NDIM,1)) + allocate(cbenci%inner(inner_index)%v(NDIM,1)) + allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) + cbenci%inner(inner_index)%x(:,1) = pl%inner(inner_index)%x(:, i) + cbenci%inner(inner_index)%v(:,1) = pl%inner(inner_index)%v(:, i) + cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) + plenci%inner(inner_index)%x(:,1) = -cbenci%inner(inner_index)%x(:,1) + plenci%inner(inner_index)%v(:,1) = -cbenci%inner(inner_index)%v(:,1) + do j = 2, npl + ipc2hc = plenci%plind(j) + plenci%inner(inner_index)%x(:,j) = pl%inner(inner_index)%x(:, ipc2hc) - cbenci%inner(inner_index)%x(:,1) + plenci%inner(inner_index)%v(:,j) = pl%inner(inner_index)%v(:, ipc2hc) - cbenci%inner(inner_index)%v(:,1) + end do + end do + call tpenci%set_mu(cbenci) + end select + end select + end select + end do end associate - return + end subroutine rmvs_make_planetocentric - end subroutine rmvs_interp_out subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) !! author: David A. Minton @@ -467,148 +534,57 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) end subroutine rmvs_peri_tp - subroutine rmvs_make_planetocentric(system, param) - !! author: David A. Minton - !! - !! When encounters are detected, this method will call the interpolation methods for the planets and - !! creates a Swiftest test particle structure for each planet's encountering test particles to simplify the - !! planetocentric calculations. This subroutine is not based on an existing one from Swift and Swifter - !! - implicit none - ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - ! Internals - integer(I4B) :: i, j, inner_index, ipc2hc - logical, dimension(:), allocatable :: encmask - - select type(cb => system%cb) - class is (rmvs_cb) - select type(pl => system%pl) - class is (rmvs_pl) - select type (tp => system%tp) - class is (rmvs_tp) - associate (npl => pl%nbody, ntp => tp%nbody) - do i = 1, npl - if (pl%nenc(i) == 0) cycle - ! There are inner encounters with this planet - if (allocated(encmask)) deallocate(encmask) - allocate(encmask(ntp)) - encmask(:) = tp%plencP(:) == i - allocate(rmvs_tp :: pl%planetocentric(i)%tp) - ! Create encountering test particle structure - select type(cbenci => pl%planetocentric(i)%cb) - class is (rmvs_cb) - select type(plenci => pl%planetocentric(i)%pl) - class is (rmvs_pl) - select type(tpenci => pl%planetocentric(i)%tp) - class is (rmvs_tp) - tpenci%lplanetocentric = .true. - call tpenci%setup(pl%nenc(i)) - tpenci%cb_heliocentric = cb - tpenci%ipleP = i - tpenci%status(:) = ACTIVE - ! Grab all the encountering test particles and convert them to a planetocentric frame - tpenci%name(:) = pack(tp%name(:), encmask(:)) - do j = 1, NDIM - tpenci%xheliocentric(j, :) = pack(tp%xh(j,:), encmask(:)) - tpenci%xh(j, :) = tpenci%xheliocentric(j, :) - pl%inner(0)%x(j, i) - tpenci%vh(j, :) = pack(tp%vh(j,:), encmask(:)) - pl%inner(0)%v(j, i) - end do - tpenci%lperi(:) = pack(tp%lperi(:), encmask(:)) - tpenci%plperP(:) = pack(tp%plperP(:), encmask(:)) - ! Make sure that the test particles get the planetocentric value of mu - allocate(cbenci%inner(0:NTPHENC)) - do inner_index = 0, NTPHENC - allocate(plenci%inner(inner_index)%x, mold=pl%inner(inner_index)%x) - allocate(plenci%inner(inner_index)%v, mold=pl%inner(inner_index)%x) - allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) - allocate(cbenci%inner(inner_index)%x(NDIM,1)) - allocate(cbenci%inner(inner_index)%v(NDIM,1)) - allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) - cbenci%inner(inner_index)%x(:,1) = pl%inner(inner_index)%x(:, i) - cbenci%inner(inner_index)%v(:,1) = pl%inner(inner_index)%v(:, i) - cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) - plenci%inner(inner_index)%x(:,1) = -cbenci%inner(inner_index)%x(:,1) - plenci%inner(inner_index)%v(:,1) = -cbenci%inner(inner_index)%v(:,1) - do j = 2, npl - ipc2hc = plenci%plind(j) - plenci%inner(inner_index)%x(:,j) = pl%inner(inner_index)%x(:, ipc2hc) - cbenci%inner(inner_index)%x(:,1) - plenci%inner(inner_index)%v(:,j) = pl%inner(inner_index)%v(:, ipc2hc) - cbenci%inner(inner_index)%v(:,1) - end do - end do - call tpenci%set_mu(cbenci) - end select - end select - end select - end do - end associate - end select - end select - end select - return - end subroutine rmvs_make_planetocentric - - subroutine rmvs_end_planetocentric(system) + subroutine rmvs_end_planetocentric(pl, tp) !! author: David A. Minton !! !! Deallocates all of the encountering particle data structures for next time !! implicit none ! Arguments - class(rmvs_nbody_system), intent(inout) :: system !! RMVS nbody system object + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle objec ! Internals integer(I4B) :: i, j, inner_index integer(I4B), dimension(:), allocatable :: tpind logical, dimension(:), allocatable :: encmask - select type(cb => system%cb) - class is (rmvs_cb) - select type(pl => system%pl) - class is (rmvs_pl) - select type (tp => system%tp) - class is (rmvs_tp) - associate (npl => pl%nbody, ntp => tp%nbody) - do i = 1, npl - if (pl%nenc(i) == 0) cycle - select type(cbenci => pl%planetocentric(i)%cb) - class is (rmvs_cb) - select type(plenci => pl%planetocentric(i)%pl) - class is (rmvs_pl) - select type(tpenci => pl%planetocentric(i)%tp) - class is (rmvs_tp) - if (allocated(tpind)) deallocate(tpind) - allocate(tpind(pl%nenc(i))) - ! Index array of encountering test particles - if (allocated(encmask)) deallocate(encmask) - allocate(encmask(ntp)) - encmask(:) = tp%plencP(:) == i - tpind(:) = pack([(j,j=1,ntp)], encmask(:)) - - ! Copy the results of the integration back over and shift back to heliocentric reference - tp%status(tpind(1:pl%nenc(i))) = tpenci%status(1:pl%nenc(i)) - do j = 1, NDIM - tp%xh(j, tpind(1:pl%nenc(i))) = tpenci%xh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%x(j, i) - tp%vh(j, tpind(1:pl%nenc(i))) = tpenci%vh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%v(j, i) - end do - tp%lperi(tpind(1:pl%nenc(i))) = tpenci%lperi(1:pl%nenc(i)) - tp%plperP(tpind(1:pl%nenc(i))) = tpenci%plperP(1:pl%nenc(i)) - deallocate(pl%planetocentric(i)%tp) - deallocate(cbenci%inner) - do inner_index = 0, NTPHENC - deallocate(plenci%inner(inner_index)%x) - deallocate(plenci%inner(inner_index)%v) - deallocate(plenci%inner(inner_index)%aobl) - end do - end select - end select - end select - end do - end associate + associate (npl => pl%nbody, ntp => tp%nbody) + do i = 1, npl + if (pl%nenc(i) == 0) cycle + select type(cbenci => pl%planetocentric(i)%cb) + class is (rmvs_cb) + select type(plenci => pl%planetocentric(i)%pl) + class is (rmvs_pl) + select type(tpenci => pl%planetocentric(i)%tp) + class is (rmvs_tp) + if (allocated(tpind)) deallocate(tpind) + allocate(tpind(pl%nenc(i))) + ! Index array of encountering test particles + if (allocated(encmask)) deallocate(encmask) + allocate(encmask(ntp)) + encmask(:) = tp%plencP(:) == i + tpind(:) = pack([(j,j=1,ntp)], encmask(:)) + + ! Copy the results of the integration back over and shift back to heliocentric reference + tp%status(tpind(1:pl%nenc(i))) = tpenci%status(1:pl%nenc(i)) + do j = 1, NDIM + tp%xh(j, tpind(1:pl%nenc(i))) = tpenci%xh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%x(j, i) + tp%vh(j, tpind(1:pl%nenc(i))) = tpenci%vh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%v(j, i) + end do + tp%lperi(tpind(1:pl%nenc(i))) = tpenci%lperi(1:pl%nenc(i)) + tp%plperP(tpind(1:pl%nenc(i))) = tpenci%plperP(1:pl%nenc(i)) + deallocate(pl%planetocentric(i)%tp) + deallocate(cbenci%inner) + do inner_index = 0, NTPHENC + deallocate(plenci%inner(inner_index)%x) + deallocate(plenci%inner(inner_index)%v) + deallocate(plenci%inner(inner_index)%aobl) + end do + end select + end select end select - end select - end select + end do + end associate return end subroutine rmvs_end_planetocentric diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index a50f57254..0f16e7c5b 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -174,79 +174,4 @@ module subroutine setup_tp(self, n) return end subroutine setup_tp - module subroutine setup_set_msys(self) - !! author: David A. Minton - !! - !! Sets the value of msys and the vector mass quantities based on the total mass of the system - implicit none - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system objec - self%msys = self%cb%mass + sum(self%pl%mass(1:self%pl%nbody)) - - return - end subroutine setup_set_msys - - module subroutine setup_set_mu_pl(self, cb) - !! author: David A. Minton - !! - !! Computes G * (M + m) for each massive body - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - - if (self%nbody > 0) self%mu(:) = cb%Gmass + self%Gmass(:) - - return - end subroutine setup_set_mu_pl - - module subroutine setup_set_mu_tp(self, cb) - !! author: David A. Minton - !! - !! Converts certain scalar values to arrays so that they can be used in elemental functions - implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - - if (self%nbody > 0) self%mu(:) = cb%Gmass - - return - end subroutine setup_set_mu_tp - - module subroutine setup_set_rhill(self,cb) - !! author: David A. Minton - !! - !! Sets the value of the Hill's radius - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest massive body object - - if (self%nbody > 0) then - call self%xv2el(cb) - self%rhill(:) = self%a(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD - end if - - return - end subroutine setup_set_rhill - - module subroutine setup_set_ir3h(self) - !! author: David A. Minton - !! - !! Sets the inverse heliocentric radius term (1/rh**3) for all bodies in a structure - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - - integer(I4B) :: i - real(DP) :: r2, irh - - if (self%nbody > 0) then - - do i = 1, self%nbody - r2 = dot_product(self%xh(:, i), self%xh(:, i)) - irh = 1.0_DP / sqrt(r2) - self%ir3h(i) = irh / r2 - end do - end if - - return - end subroutine setup_set_ir3h - end submodule s_setup diff --git a/src/symba/symba_helio_getacch.f90 b/src/symba/symba_helio_getacch.f90 index 65d2171f8..6d69de2b9 100644 --- a/src/symba/symba_helio_getacch.f90 +++ b/src/symba/symba_helio_getacch.f90 @@ -19,7 +19,7 @@ ! executable code if (lflag) then do i = 2, npl - helio_plA%ahi(:,i) = (/ 0.0_DP, 0.0_DP, 0.0_DP /) + helio_plA%ah(:,i) = (/ 0.0_DP, 0.0_DP, 0.0_DP /) end do call symba_helio_getacch_int(npl, nplm, helio_plA) end if @@ -35,11 +35,11 @@ end do call obl_acc(helio_plA, param%j2rp2, param%j4rp4, xh, irh, aobl) do i = 2, npl - helio_plA%ah(:,i) = helio_plA%ahi(:,i) + aobl(:, i) - aobl(:, 1) + helio_plA%ah(:,i) = helio_plA%ah(:,i) + aobl(:, i) - aobl(:, 1) end do else do i = 2, npl - helio_plA%ah(:,i) = helio_plA%ahi(:,i) + helio_plA%ah(:,i) = helio_plA%ah(:,i) end do end if if (lextra_force) call helio_user_getacch(t, npl, helio_plA) diff --git a/src/symba/symba_helio_getacch_int.f90 b/src/symba/symba_helio_getacch_int.f90 index 718f4b189..8093c48d7 100644 --- a/src/symba/symba_helio_getacch_int.f90 +++ b/src/symba/symba_helio_getacch_int.f90 @@ -21,8 +21,8 @@ irij3 = 1.0_DP/(rji2*sqrt(rji2)) faci = helio_plA%swiftest%mass(i)*irij3 facj = helio_plA%swiftest%mass(j)*irij3 - helio_plA%ahi(:,i) = helio_plA%ahi(:,i) + facj*dx(:) - helio_plA%ahi(:,j) = helio_plA%ahi(:,j) - faci*dx(:) + helio_plA%ah(:,i) = helio_plA%ah(:,i) + facj*dx(:) + helio_plA%ah(:,j) = helio_plA%ah(:,j) - faci*dx(:) end do end do return diff --git a/src/user/user_getacch.f90 b/src/user/user_getacch.f90 index da3d00578..c54c21693 100644 --- a/src/user/user_getacch.f90 +++ b/src/user/user_getacch.f90 @@ -1,10 +1,10 @@ submodule(swiftest_classes) s_user_getacch use swiftest contains - module subroutine user_getacch_body(self, system, param, t) + module subroutine user_getacch_body(self, system, param, t, lbeg) !! author: David A. Minton !! - !! Add user-supplied heliocentric accelerations to planets + !! Add user-supplied heliocentric accelerations to planets. !! !! Adapted from David E. Kaufmann's Swifter routine whm_user_getacch.f90 implicit none @@ -13,6 +13,7 @@ module subroutine user_getacch_body(self, system, param, t) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of 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 return end subroutine user_getacch_body diff --git a/src/util/util_get_energy_and_momentum.f90 b/src/util/util_get.f90 similarity index 100% rename from src/util/util_get_energy_and_momentum.f90 rename to src/util/util_get.f90 diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 new file mode 100644 index 000000000..b77579de1 --- /dev/null +++ b/src/util/util_set.f90 @@ -0,0 +1,123 @@ +submodule(swiftest_classes) s_util_set + !! author: David A. Minton + !! This submodule contains a collection of setter method implementations + use swiftest +contains + + module subroutine util_set_beg_end_cb(self, aoblbeg, aoblend) + !! author: David A. Minton + !! + !! Sets one or more of the values of aoblbeg and aoblend + implicit none + ! Arguments + class(swiftest_cb), intent(inout) :: self !! Swiftest central body object + real(DP), dimension(:), intent(in), optional :: aoblbeg !! Oblateness acceleration term at beginning of step + real(DP), dimension(:), intent(in), optional :: aoblend !! Oblateness acceleration term at end of step + + if (present(aoblbeg)) self%aoblbeg = aoblbeg + if (present(aoblend)) self%aoblend = aoblend + return + + end subroutine util_set_beg_end_cb + + module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) + !! author: David A. Minton + !! + !! Sets one or more of the values of xbeg, xend, and vbeg + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + real(DP), dimension(:,:), intent(in), optional :: xbeg, xend, vbeg + + if (present(xbeg)) then + if (allocated(self%xbeg)) deallocate(self%xbeg) + allocate(self%xbeg, source=xbeg) + end if + if (present(xend)) then + if (allocated(self%xend)) deallocate(self%xend) + allocate(self%xend, source=xend) + end if + if (present(vbeg)) then + if (allocated(self%vbeg)) deallocate(self%vbeg) + allocate(self%vbeg, source=vbeg) + end if + + return + + end subroutine util_set_beg_end_pl + + module subroutine util_set_msys(self) + !! author: David A. Minton + !! + !! Sets the value of msys and the vector mass quantities based on the total mass of the system + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system objec + self%msys = self%cb%mass + sum(self%pl%mass(1:self%pl%nbody)) + + return + end subroutine util_set_msys + + module subroutine util_set_mu_pl(self, cb) + !! author: David A. Minton + !! + !! Computes G * (M + m) for each massive body + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + + if (self%nbody > 0) self%mu(:) = cb%Gmass + self%Gmass(:) + + return + end subroutine util_set_mu_pl + + module subroutine util_set_mu_tp(self, cb) + !! author: David A. Minton + !! + !! Converts certain scalar values to arrays so that they can be used in elemental functions + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + + if (self%nbody > 0) self%mu(:) = cb%Gmass + + return + end subroutine util_set_mu_tp + + module subroutine util_set_rhill(self,cb) + !! author: David A. Minton + !! + !! Sets the value of the Hill's radius + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest massive body object + + if (self%nbody > 0) then + call self%xv2el(cb) + self%rhill(:) = self%a(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD + end if + + return + end subroutine util_set_rhill + + module subroutine util_set_ir3h(self) + !! author: David A. Minton + !! + !! Sets the inverse heliocentric radius term (1/rh**3) for all bodies in a structure + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + + integer(I4B) :: i + real(DP) :: r2, irh + + if (self%nbody > 0) then + + do i = 1, self%nbody + r2 = dot_product(self%xh(:, i), self%xh(:, i)) + irh = 1.0_DP / sqrt(r2) + self%ir3h(i) = irh / r2 + end do + end if + + return + end subroutine util_set_ir3h +end submodule s_util_set \ No newline at end of file diff --git a/src/util/util_set_beg_end.f90 b/src/util/util_set_beg_end.f90 deleted file mode 100644 index 67edfb549..000000000 --- a/src/util/util_set_beg_end.f90 +++ /dev/null @@ -1,30 +0,0 @@ -submodule(swiftest_classes) s_util_set_beg_end - use swiftest -contains - - module subroutine util_set_beg_end(self, xbeg, xend, vbeg) - !! author: David A. Minton - !! - !! Sets one or more of the values of xbeg, xend, and vbeg - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - real(DP), dimension(:,:), intent(in), optional :: xbeg, xend, vbeg - - if (present(xbeg)) then - if (allocated(self%xbeg)) deallocate(self%xbeg) - allocate(self%xbeg, source=xbeg) - end if - if (present(xend)) then - if (allocated(self%xend)) deallocate(self%xend) - allocate(self%xend, source=xend) - end if - if (present(vbeg)) then - if (allocated(self%vbeg)) deallocate(self%vbeg) - allocate(self%vbeg, source=vbeg) - end if - - return - - end subroutine util_set_beg_end -end submodule s_util_set_beg_end \ No newline at end of file diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index 595c4546b..182b385b9 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -1,7 +1,7 @@ submodule(whm_classes) s_whm_getacch use swiftest contains - module subroutine whm_getacch_pl(self, system, param, t) + module subroutine whm_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of planets @@ -14,6 +14,7 @@ module subroutine whm_getacch_pl(self, system, param, t) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of 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 @@ -31,15 +32,19 @@ module subroutine whm_getacch_pl(self, system, param, t) call whm_getacch_ah2(cb, pl) call whm_getacch_ah3(pl) - if (param%loblatecb) call pl%obl_acc(cb) - if (param%lextra_force) call pl%user_getacch(system, param, t) - if (param%lgr) call pl%gr_get_accel(param) + if (param%loblatecb) then + call cb%set_beg_end(aoblbeg = cb%aobl) + call pl%accel_obl(system) + call cb%set_beg_end(aoblend = cb%aobl) + end if + if (param%lextra_force) call pl%accel_user(system, param, t) + if (param%lgr) call pl%accel_gr(param) end associate return end subroutine whm_getacch_pl - module subroutine whm_getacch_tp(self, system, param, t, xhp) + module subroutine whm_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of test particles @@ -52,22 +57,30 @@ module subroutine whm_getacch_tp(self, system, param, t, xhp) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of real(DP), intent(in) :: t !! Current time - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at the current substep + 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 + real(DP), dimension(:,:), allocatable :: xhp 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 + allocate(xhp, source=pl%xbeg) + else + allocate(xhp, source=pl%xend) + end if ah0(:) = whm_getacch_ah0(pl%Gmass(:), xhp(:,:), npl) do i = 1, ntp tp%ah(:, i) = ah0(:) end do call whm_getacch_ah3_tp(system, xhp) - if (param%loblatecb) call tp%obl_acc(cb) - if (param%lextra_force) call tp%user_getacch(system, param, t) - if (param%lgr) call tp%gr_get_accel(param) + 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 diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index feba7cc51..9598b61ea 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -47,7 +47,7 @@ module subroutine whm_setup_tp(self,n) return end subroutine whm_setup_tp - module subroutine whm_setup_set_mu_eta_pl(self, cb) + module subroutine whm_util_set_mu_eta_pl(self, cb) !! author: David A. Minton !! !! Sets the Jacobi mass value eta for all massive bodies @@ -61,7 +61,7 @@ module subroutine whm_setup_set_mu_eta_pl(self, cb) associate(pl => self, npl => self%nbody, GMpl => self%Gmass, muj => self%muj, & eta => self%eta, GMcb => cb%Gmass) if (npl == 0) return - call setup_set_mu_pl(pl, cb) + call util_set_mu_pl(pl, cb) eta(1) = GMcb + GMpl(1) muj(1) = eta(1) do i = 2, npl @@ -70,7 +70,7 @@ module subroutine whm_setup_set_mu_eta_pl(self, cb) end do end associate - end subroutine whm_setup_set_mu_eta_pl + end subroutine whm_util_set_mu_eta_pl module subroutine whm_setup_system(self, param) !! author: David A. Minton @@ -89,7 +89,7 @@ module subroutine whm_setup_system(self, param) select type(pl => self%pl) class is (whm_pl) call pl%set_mu(self%cb) - if (param%lgr) call pl%gr_vh2pv(param) + if (param%lgr) call pl%vh2pv(param) !call pl%eucl_index() end select end if @@ -98,7 +98,7 @@ module subroutine whm_setup_system(self, param) select type(tp => self%tp) class is (whm_tp) call tp%set_mu(self%cb) - if (param%lgr) call tp%gr_vh2pv(param) + if (param%lgr) call tp%vh2pv(param) end select end if diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 74c0a9290..8aa8cfd2a 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -18,12 +18,8 @@ module subroutine whm_step_system(self, param, t, dt) associate(system => self, cb => self%cb, pl => self%pl, tp => self%tp, ntp => self%tp%nbody) call pl%set_rhill(cb) - call pl%set_beg_end(xbeg = pl%xh) call pl%step(system, param, t, dt) - if (ntp > 0) then - call pl%set_beg_end(xend = pl%xh) - call tp%step(system, param, t, dt) - end if + call tp%step(system, param, t, dt) end associate return end subroutine whm_step_system @@ -46,22 +42,26 @@ module subroutine whm_step_pl(self, system, param, t, dt) ! Internals real(DP) :: dth + if (self%nbody == 0) return + associate(pl => self, cb => system%cb) dth = 0.5_DP * dt if (pl%lfirst) then call pl%h2j(cb) - call pl%get_accel(system, param, t) + 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%vh2vj(cb) !If GR enabled, calculate the p4 term before and after each drift - if (param%lgr) call pl%gr_p4(param, dth) + if (param%lgr) call pl%p4(param, dth) call pl%drift(system, param, dt) - if (param%lgr) call pl%gr_p4(param, dth) + if (param%lgr) call pl%p4(param, dth) call pl%j2h(cb) - call pl%get_accel(system, param, t + dt) + call pl%accel(system, param, t + dt) call pl%kick(dth) + call pl%set_beg_end(xend = pl%xh) end associate return end subroutine whm_step_pl @@ -83,19 +83,21 @@ module subroutine whm_step_tp(self, system, param, t, dt) ! Internals real(DP) :: dth + if (self%nbody == 0) return + select type(system) 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%get_accel(system, param, t, pl%xbeg) + call tp%accel(system, param, t, lbeg=.true.) tp%lfirst = .false. end if call tp%kick(dth) - if (param%lgr) call tp%gr_p4(param, dth) + if (param%lgr) call tp%p4(param, dth) call tp%drift(system, param, dt) - if (param%lgr) call tp%gr_p4(param, dth) - call tp%get_accel(system, param, t + dt, pl%xend) + if (param%lgr) call tp%p4(param, dth) + call tp%accel(system, param, t + dt, lbeg=.false.) call tp%kick(dth) end associate end select