From 0d8ad93f9cd665773641da1c0d6d4bd3efda6096 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 10:46:22 -0400 Subject: [PATCH] Cleaned up formatting and restyled for consistency. --- .../swiftest_symba_vs_swifter_symba.ipynb | 14 +- src/discard/discard.f90 | 15 +- src/drift/drift.f90 | 12 + src/eucl/eucl.f90 | 3 +- src/gr/gr.f90 | 12 +- src/helio/helio_coord.f90 | 5 + src/helio/helio_drift.f90 | 7 + src/helio/helio_kick.f90 | 72 ++--- src/helio/helio_step.f90 | 6 +- src/io/io.f90 | 33 ++- src/kick/kick.f90 | 3 + src/main/swiftest_driver.f90 | 1 - src/obl/obl.f90 | 2 + src/orbel/orbel.f90 | 14 + src/rmvs/rmvs_encounter_check.f90 | 4 +- src/rmvs/rmvs_kick.f90 | 3 +- src/rmvs/rmvs_setup.f90 | 5 +- src/rmvs/rmvs_step.f90 | 13 +- src/rmvs/rmvs_util.f90 | 8 + src/setup/setup.f90 | 5 + src/symba/symba_collision.f90 | 6 +- src/symba/symba_encounter_check.f90 | 10 +- src/symba/symba_io.f90 | 7 +- src/symba/symba_kick.f90 | 77 +++-- src/symba/symba_setup.f90 | 6 + src/symba/symba_step.f90 | 11 +- src/symba/symba_util.f90 | 15 +- src/tides/tides_spin_step.f90 | 7 + src/util/util_coord.f90 | 5 + src/util/util_exit.f90 | 2 + src/util/util_peri.f90 | 4 +- src/util/util_reverse_status.f90 | 4 + src/util/util_set.f90 | 8 +- src/util/util_solve.f90 | 1 + src/util/util_sort.f90 | 22 ++ src/util/util_spill_and_fill.f90 | 78 +++--- src/util/util_valid.f90 | 3 +- src/util/util_version.f90 | 1 + src/whm/whm_coord.f90 | 4 + src/whm/whm_drift.f90 | 2 +- src/whm/whm_gr.f90 | 5 + src/whm/whm_kick.f90 | 12 +- src/whm/whm_setup.f90 | 6 + src/whm/whm_step.f90 | 4 + src/whm/whm_util.f90 | 262 +++++++++--------- 45 files changed, 519 insertions(+), 280 deletions(-) diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index 9f2d0d0d5..c76e792f3 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -588,17 +588,17 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'px' ()>\n",
-       "array(9.70681868e-14)\n",
+       "array(0.)\n",
        "Coordinates:\n",
        "    id       int64 101\n",
-       "    time     float64 352.0
" + " time float64 22.0" ], "text/plain": [ "\n", - "array(9.70681868e-14)\n", + "array(0.)\n", "Coordinates:\n", " id int64 101\n", - " time float64 352.0" + " time float64 22.0" ] }, "execution_count": 13, @@ -607,7 +607,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=101).isel(time=32)" + "swiftdiff['px'].sel(id=101).isel(time=2)" ] }, { diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index f82826fac..e35d6cad7 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_discard use swiftest contains + module subroutine discard_system(self, param) !! author: David A. Minton !! @@ -15,9 +16,11 @@ module subroutine discard_system(self, param) call pl%discard(system, param) if (any(tp%ldiscard(:) .or. any(pl%ldiscard(:)))) call system%write_discard(param) end associate + return end subroutine discard_system + module subroutine discard_pl(self, system, param) !! author: David A. Minton !! @@ -29,9 +32,11 @@ module subroutine discard_pl(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter self%ldiscard(:) = .false. + return end subroutine discard_pl + module subroutine discard_tp(self, system, param) !! author: David A. Minton !! @@ -59,9 +64,11 @@ module subroutine discard_tp(self, system, param) if (param%lclose .and. ntp > 0) call discard_pl_tp(tp, system, param) if (any(tp%ldiscard)) call tp%spill(system%tp_discards, tp%ldiscard) end associate + return end subroutine discard_tp + subroutine discard_sun_tp(tp, system, param) !! author: David A. Minton !! @@ -111,6 +118,7 @@ subroutine discard_sun_tp(tp, system, param) return end subroutine discard_sun_tp + subroutine discard_peri_tp(tp, system, param) !! author: David A. Minton !! @@ -153,10 +161,11 @@ subroutine discard_peri_tp(tp, system, param) end if end do end associate + return - end subroutine discard_peri_tp + subroutine discard_pl_tp(tp, system, param) !! author: David A. Minton !! @@ -192,11 +201,11 @@ subroutine discard_pl_tp(tp, system, param) end do end if end do - end associate + return - end subroutine discard_pl_tp + subroutine discard_pl_close(dx, dv, dt, r2crit, iflag, r2min) !! author: David A. Minton diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 4d9988f93..638ee9da4 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -43,6 +43,7 @@ module subroutine drift_body(self, system, param, dt, mask) return end subroutine drift_body + module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) !! author: David A. Minton !! @@ -84,6 +85,7 @@ module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) return end subroutine drift_all + module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -119,6 +121,7 @@ module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag return end subroutine drift_one + pure subroutine drift_dan(mu, x0, v0, dt0, iflag) !! author: David A. Minton !! @@ -185,9 +188,11 @@ pure subroutine drift_dan(mu, x0, v0, dt0, iflag) x0(:) = x(:) v0(:) = v(:) end if + return end subroutine drift_dan + pure subroutine drift_kepmd(dm, es, ec, x, s, c) !! author: David A. Minton !! @@ -226,6 +231,7 @@ pure subroutine drift_kepmd(dm, es, ec, x, s, c) return end subroutine drift_kepmd + pure subroutine drift_kepu(dt,r0,mu,alpha,u,fp,c1,c2,c3,iflag) !! author: David A. Minton !! @@ -253,6 +259,7 @@ pure subroutine drift_kepu(dt,r0,mu,alpha,u,fp,c1,c2,c3,iflag) return end subroutine drift_kepu + pure subroutine drift_kepu_fchk(dt, r0, mu, alpha, u, s, f) !! author: David A. Minton !! @@ -275,6 +282,7 @@ pure subroutine drift_kepu_fchk(dt, r0, mu, alpha, u, s, f) return end subroutine drift_kepu_fchk + pure subroutine drift_kepu_guess(dt, r0, mu, alpha, u, s) !! author: David A. Minton !! @@ -312,6 +320,7 @@ pure subroutine drift_kepu_guess(dt, r0, mu, alpha, u, s) return end subroutine drift_kepu_guess + pure subroutine drift_kepu_lag(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) !! author: David A. Minton !! @@ -356,6 +365,7 @@ pure subroutine drift_kepu_lag(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) return end subroutine drift_kepu_lag + pure subroutine drift_kepu_new(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) !! author: David A. Minton !! @@ -397,6 +407,7 @@ pure subroutine drift_kepu_new(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) return end subroutine drift_kepu_new + pure subroutine drift_kepu_p3solve(dt, r0, mu, alpha, u, s, iflag) !! author: David A. Minton !! @@ -439,6 +450,7 @@ pure subroutine drift_kepu_p3solve(dt, r0, mu, alpha, u, s, iflag) return end subroutine drift_kepu_p3solve + pure subroutine drift_kepu_stumpff(x, c0, c1, c2, c3) !! author: David A. Minton diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index 24af7fd6e..af1646e4c 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_eucl use swiftest contains + module subroutine eucl_dist_index_plpl(self) !! author: Jacob R. Elliott and David A. Minton !! @@ -30,8 +31,8 @@ module subroutine eucl_dist_index_plpl(self) end do end do end associate - return + return end subroutine eucl_dist_index_plpl end submodule s_eucl diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index cf13d90d2..cd8bc2a23 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_gr use swiftest contains + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) !! author: David A. Minton !! @@ -36,13 +37,12 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) cb%agr(i) = -sum(self%Gmass(1:n) * self%agr(1:n, i) / cb%Gmass) end do end select - end associate return - end subroutine gr_kick_getaccb_ns_body + module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton !! @@ -71,6 +71,7 @@ module pure subroutine gr_p4_pos_kick(param, x, v, dt) return end subroutine gr_p4_pos_kick + module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) !! author: David A. Minton !! @@ -98,9 +99,11 @@ module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) grterm = 1.0_DP - inv_c2 * (0.5_DP * vmag2 + 3 * mu / rmag) vh(:) = pv(:) * grterm end associate + return end subroutine gr_pseudovel2vel + module pure subroutine gr_pv2vh_body(self, param) !! author: David A. Minton !! @@ -121,9 +124,11 @@ module pure subroutine gr_pv2vh_body(self, param) end do call move_alloc(vh, self%vh) end associate + return end subroutine gr_pv2vh_body + module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) !! author: David A. Minton !! @@ -200,6 +205,7 @@ module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) return end subroutine gr_vel2pseudovel + module pure subroutine gr_vh2pv_body(self, param) !! author: David A. Minton !! @@ -220,8 +226,8 @@ module pure subroutine gr_vh2pv_body(self, param) end do call move_alloc(pv, self%vh) end associate + return end subroutine gr_vh2pv_body - end submodule s_gr \ No newline at end of file diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index e14ea4612..c5b86ee26 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -1,6 +1,7 @@ submodule (helio_classes) s_helio_coord use swiftest contains + module subroutine helio_coord_vb2vh_pl(self, cb) !! author: David A. Minton !! @@ -26,6 +27,7 @@ module subroutine helio_coord_vb2vh_pl(self, cb) return end subroutine helio_coord_vb2vh_pl + module subroutine helio_coord_vb2vh_tp(self, vbcb) !! author: David A. Minton !! @@ -49,6 +51,7 @@ module subroutine helio_coord_vb2vh_tp(self, vbcb) return end subroutine helio_coord_vb2vh_tp + module subroutine helio_coord_vh2vb_pl(self, cb) !! author: David A. Minton !! @@ -76,6 +79,7 @@ module subroutine helio_coord_vh2vb_pl(self, cb) return end subroutine helio_coord_vh2vb_pl + module subroutine helio_coord_vh2vb_tp(self, vbcb) !! author: David A. Minton !! @@ -98,5 +102,6 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) return end subroutine helio_coord_vh2vb_tp + end submodule s_helio_coord diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index b1fb311ce..30e17849e 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -1,6 +1,7 @@ submodule (helio_classes) s_helio_drift use swiftest contains + module subroutine helio_drift_body(self, system, param, dt, mask) !! author: David A. Minton @@ -39,6 +40,7 @@ module subroutine helio_drift_body(self, system, param, dt, mask) return end subroutine helio_drift_body + module subroutine helio_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! @@ -52,9 +54,11 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. call helio_drift_body(self, system, param, dt, mask) + return end subroutine helio_drift_pl + module subroutine helio_drift_tp(self, system, param, dt, mask) !! author: David A. Minton !! @@ -68,8 +72,10 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. call helio_drift_body(self, system, param, dt, mask) + return end subroutine helio_drift_tp + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) !! author: David A. Minton @@ -108,6 +114,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) return end subroutine helio_drift_linear_pl + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) !! author: David A. Minton diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index fa601b7f7..2325c23ba 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -1,46 +1,48 @@ submodule(helio_classes) s_helio_kick use swiftest contains -module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 - !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f - implicit none - ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - associate(cb => system%cb, pl => self, npl => self%nbody) - call pl%accel_int() - if (param%loblatecb) then - call pl%accel_obl(system) - if (lbeg) then - cb%aoblbeg = cb%aobl - else - cb%aoblend = cb%aobl - end if - if (param%ltides) then - call pl%accel_tides(system) + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + + associate(cb => system%cb, pl => self, npl => self%nbody) + call pl%accel_int() + if (param%loblatecb) then + call pl%accel_obl(system) if (lbeg) then - cb%atidebeg = cb%atide + cb%aoblbeg = cb%aobl else - cb%atideend = cb%atide + cb%aoblend = cb%aobl + end if + if (param%ltides) then + call pl%accel_tides(system) + if (lbeg) then + cb%atidebeg = cb%atide + else + cb%atideend = cb%atide + end if end if end if - end if - if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) - !if (param%lgr) call pl%gr_accel(param) - end associate + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) + !if (param%lgr) call pl%gr_accel(param) + end associate - return + return end subroutine helio_kick_getacch_pl + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -67,9 +69,11 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) !if (param%lgr) call tp%gr_accel(param) end associate + return end subroutine helio_kick_getacch_tp + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -104,9 +108,9 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) end associate return - end subroutine helio_kick_vb_pl + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -136,6 +140,6 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) end associate return - end subroutine helio_kick_vb_tp + end submodule s_helio_kick \ No newline at end of file diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index d0c4dde83..c6031b272 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -18,10 +18,13 @@ module subroutine helio_step_system(self, param, t, dt) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + call whm_step_system(self, param, t, dt) + return end subroutine helio_step_system + module subroutine helio_step_pl(self, system, param, t, dt) !! author: David A. Minton !! @@ -58,9 +61,9 @@ module subroutine helio_step_pl(self, system, param, t, dt) end associate return - end subroutine helio_step_pl + module subroutine helio_step_tp(self, system, param, t, dt) !! author: David A. Minton @@ -99,7 +102,6 @@ module subroutine helio_step_tp(self, system, param, t, dt) end associate return - end subroutine helio_step_tp end submodule s_helio_step diff --git a/src/io/io.f90 b/src/io/io.f90 index 7c50242cb..8bd47c9a7 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_io use swiftest contains + module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -271,6 +272,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) return end subroutine io_param_reader + module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! @@ -347,6 +349,7 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) return end subroutine io_param_writer + module subroutine io_dump_param(self, param_file_name) !! author: David A. Minton !! @@ -383,6 +386,7 @@ module subroutine io_dump_param(self, param_file_name) return end subroutine io_dump_param + module subroutine io_dump_swiftest(self, param, msg) !! author: David A. Minton !! @@ -421,6 +425,7 @@ module subroutine io_dump_swiftest(self, param, msg) return end subroutine io_dump_swiftest + module subroutine io_dump_system(self, param, msg) !! author: David A. Minton !! @@ -464,6 +469,7 @@ module subroutine io_dump_system(self, param, msg) return end subroutine io_dump_system + module function io_get_args(integrator, param_file_name) result(ierr) !! author: David A. Minton !! @@ -522,8 +528,11 @@ module function io_get_args(integrator, param_file_name) result(ierr) end if end if if (ierr /= 0) call util_exit(USAGE) + + return end function io_get_args + module function io_get_token(buffer, ifirst, ilast, ierr) result(token) !! author: David A. Minton !! @@ -568,9 +577,11 @@ module function io_get_token(buffer, ifirst, ilast, ierr) result(token) ierr = 0 token = buffer(ifirst:ilast) + return end function io_get_token + module subroutine io_read_body_in(self, param) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -658,6 +669,7 @@ module subroutine io_read_body_in(self, param) return end subroutine io_read_body_in + module subroutine io_read_cb_in(self, param) !! author: David A. Minton !! @@ -702,6 +714,7 @@ module subroutine io_read_cb_in(self, param) return end subroutine io_read_cb_in + module subroutine io_read_param_in(self, param_file_name) !! author: David A. Minton !! @@ -743,6 +756,7 @@ module subroutine io_read_param_in(self, param_file_name) return end subroutine io_read_param_in + function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & xh1, xh2, vh1, vh2, encounter_file, out_type) result(ierr) !! author: David A. Minton @@ -793,6 +807,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & return end function io_read_encounter + module subroutine io_read_frame_body(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -856,6 +871,7 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) return end subroutine io_read_frame_body + module subroutine io_read_frame_cb(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -893,6 +909,7 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) return end subroutine io_read_frame_cb + module subroutine io_read_frame_system(self, iu, param, form, ierr) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott @@ -929,9 +946,11 @@ module subroutine io_read_frame_system(self, iu, param, form, ierr) call self%pl%read_frame(iu, param, form, ierr) if (ierr /= 0) return call self%tp%read_frame(iu, param, form, ierr) + return end subroutine io_read_frame_system + function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) !! author: David A. Minton !! @@ -969,6 +988,7 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr + module subroutine io_toupper(string) !! author: David A. Minton !! @@ -991,9 +1011,9 @@ module subroutine io_toupper(string) end do return - end subroutine io_toupper + module subroutine io_write_discard(self, param) !! author: David A. Minton !! @@ -1062,10 +1082,11 @@ module subroutine io_write_discard(self, param) end if close(LUN) end associate + return - end subroutine io_write_discard + module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & xh1, xh2, vh1, vh2, encounter_file, out_type) !! author: David A. Minton @@ -1113,9 +1134,9 @@ module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, rad end if return - end subroutine io_write_encounter + module subroutine io_write_frame_body(self, iu, param) !! author: David A. Minton !! @@ -1173,6 +1194,7 @@ module subroutine io_write_frame_body(self, iu, param) return end subroutine io_write_frame_body + module subroutine io_write_frame_cb(self, iu, param) !! author: David A. Minton !! @@ -1206,9 +1228,11 @@ module subroutine io_write_frame_cb(self, iu, param) write(iu) cb%Q end if end associate + return end subroutine io_write_frame_cb + module subroutine io_write_frame_system(self, iu, param) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1284,6 +1308,7 @@ module subroutine io_write_frame_system(self, iu, param) return end subroutine io_write_frame_system + subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1323,8 +1348,6 @@ subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) write(iu, iostat = ierr) out_form return - end subroutine io_write_hdr - end submodule s_io diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index c10d47dbc..d686a4665 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_kick use swiftest contains + module pure subroutine kick_getacch_int_pl(self) !! author: David A. Minton !! @@ -33,6 +34,7 @@ module pure subroutine kick_getacch_int_pl(self) return end subroutine kick_getacch_int_pl + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) !! author: David A. Minton !! @@ -61,6 +63,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) end do end do end associate + return end subroutine kick_getacch_int_tp diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 4c6bccc72..78d6c7d46 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -96,5 +96,4 @@ program swiftest_driver call util_exit(SUCCESS) stop - end program swiftest_driver diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index f027908f9..26b527680 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -37,6 +37,7 @@ module subroutine obl_acc_body(self, system) end subroutine obl_acc_body + module subroutine obl_acc_pl(self, system) !! author: David A. Minton !! @@ -66,6 +67,7 @@ module subroutine obl_acc_pl(self, system) end subroutine obl_acc_pl + module subroutine obl_acc_tp(self, system) !! author: David A. Minton !! diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index 850b643f1..aaf94a233 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_orbel use swiftest contains + module subroutine orbel_el2xv_vec(self, cb) !! author: David A. Minton !! @@ -21,6 +22,7 @@ module subroutine orbel_el2xv_vec(self, cb) end do end subroutine orbel_el2xv_vec + pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) !! author: David A. Minton !! @@ -122,6 +124,7 @@ pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) return end subroutine orbel_el2xv + module pure subroutine orbel_scget(angle, sx, cx) !! author: David A. Minton !! @@ -149,6 +152,7 @@ module pure subroutine orbel_scget(angle, sx, cx) end subroutine orbel_scget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -184,6 +188,7 @@ pure subroutine orbel_schget(angle,shx,chx) return end subroutine orbel_schget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -285,6 +290,7 @@ real(DP) pure function orbel_flon(e,icapn) return end function orbel_flon + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -354,6 +360,7 @@ real(DP) pure function orbel_fget(e,capn) return end function orbel_fget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -406,6 +413,7 @@ real(DP) pure function orbel_zget(iq) return end function orbel_zget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -459,6 +467,7 @@ real(DP) pure function orbel_esolmd(e,m) return end function orbel_esolmd + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -531,6 +540,7 @@ real(DP) pure function orbel_ehie(e,im) return end function orbel_ehie + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -608,6 +618,7 @@ real(DP) pure function orbel_eget(e,m) return end function orbel_eget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -685,6 +696,7 @@ real(DP) pure function orbel_fhybrid(e,n) return end function orbel_fhybrid + module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) !! author: David A. Minton @@ -744,6 +756,7 @@ module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) end subroutine orbel_xv2aeq + module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) !! author: David A. Minton !! @@ -993,4 +1006,5 @@ pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) return end subroutine orbel_xv2el + end submodule s_orbel diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 64b5b59d9..1e26107bb 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -1,6 +1,7 @@ submodule (rmvs_classes) s_rmvs_chk use swiftest contains + module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) !! author: David A. Minton !! @@ -46,6 +47,7 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) return end function rmvs_encounter_check_tp + module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) !! author: David A. Minton !! @@ -77,6 +79,6 @@ module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) end if return - end function rmvs_chk_ind + end submodule s_rmvs_chk diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 6cba4caef..545258ddb 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_kick use swiftest contains + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton @@ -77,11 +78,9 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) call whm_kick_getacch_tp(tp, system, param, t, lbeg) end if end select - end associate return - end subroutine rmvs_kick_getacch_tp end submodule s_rmvs_kick \ No newline at end of file diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 58002401e..916109e39 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_setup use swiftest contains + module subroutine rmvs_setup_pl(self,n) !! author: David A. Minton !! @@ -46,6 +47,7 @@ module subroutine rmvs_setup_pl(self,n) return end subroutine rmvs_setup_pl + module subroutine rmvs_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -115,9 +117,10 @@ module subroutine rmvs_setup_initialize_system(self, param) end select end select end select - + return end subroutine rmvs_setup_initialize_system + module subroutine rmvs_setup_tp(self,n) !! author: David A. Minton !! diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index fce9a2927..be8ca0c2a 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_step use swiftest contains + module subroutine rmvs_step_system(self, param, t, dt) !! author: David A. Minton !! @@ -59,9 +60,9 @@ module subroutine rmvs_step_system(self, param, t, dt) end select end select return - end subroutine rmvs_step_system + subroutine rmvs_interp_out(cb, pl, dt) !! author: David A. Minton !! @@ -138,9 +139,9 @@ subroutine rmvs_interp_out(cb, pl, dt) end associate return - end subroutine rmvs_interp_out + subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) !! author: David A. Minton !! @@ -195,10 +196,11 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) end do end do end associate - return + return end subroutine rmvs_step_out + subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) !! author: David A. Minton !! @@ -322,6 +324,7 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) end subroutine rmvs_interp_in + subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) !! author: David A. Minton !! @@ -395,6 +398,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) return end subroutine rmvs_step_in + subroutine rmvs_make_planetocentric(cb, pl, tp) !! author: David A. Minton !! @@ -470,9 +474,11 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) end select end do end associate + return end subroutine rmvs_make_planetocentric + subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) !! author: David A. Minton !! @@ -556,6 +562,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) end subroutine rmvs_peri_tp + subroutine rmvs_end_planetocentric(pl, tp) !! author: David A. Minton !! diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 745888a64..65122881c 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_util use swiftest contains + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -31,6 +32,7 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) return end subroutine rmvs_util_fill_pl + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! @@ -106,6 +108,7 @@ module subroutine rmvs_util_sort_pl(self, sortby, ascending) return end subroutine rmvs_util_sort_pl + module subroutine rmvs_util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -168,9 +171,11 @@ module subroutine rmvs_util_sort_rearrange_pl(self, ind) pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) deallocate(pl_sorted) end associate + return end subroutine rmvs_util_sort_rearrange_pl + module subroutine rmvs_util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -192,8 +197,10 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) tp%xheliocentric(:,1:ntp) = tp_sorted%xheliocentric(:,ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine rmvs_util_sort_rearrange_tp + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton @@ -226,6 +233,7 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) return end subroutine rmvs_util_spill_pl + module subroutine rmvs_util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index cbd7aabfe..5e6933c6e 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_setup use swiftest contains + module subroutine setup_construct_system(system, param) !! author: David A. Minton !! @@ -69,6 +70,7 @@ module subroutine setup_construct_system(system, param) return end subroutine setup_construct_system + module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! @@ -91,6 +93,7 @@ module subroutine setup_initialize_system(self, param) return end subroutine setup_initialize_system + module subroutine setup_body(self,n) !! author: David A. Minton !! @@ -148,6 +151,7 @@ module subroutine setup_body(self,n) return end subroutine setup_body + module subroutine setup_pl(self,n) !! author: David A. Minton !! @@ -186,6 +190,7 @@ module subroutine setup_pl(self,n) self%nplpl = 0 return end subroutine setup_pl + module subroutine setup_tp(self, n) !! author: David A. Minton diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index b8060829c..d307fa7a2 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_collision use swiftest contains + module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! @@ -20,6 +21,7 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_plplenc + module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) !! author: David A. Minton !! @@ -71,9 +73,11 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec end associate end select end select + return end subroutine symba_collision_check_pltpenc + pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmtot, rlim, dt, lvdotr) result(lcollision) !! author: David A. Minton !! @@ -112,8 +116,8 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt end if end if end if + return end function symba_collision_check_one - end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index df94d42b0..282ed2276 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_encounter_check use swiftest contains + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -48,6 +49,7 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -114,10 +116,13 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan end if end associate end do + end select end select - end select + + return end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -166,9 +171,11 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc end associate end if end associate + return end function symba_encounter_check_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) !! author: David A. Minton !! @@ -198,5 +205,4 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, return end subroutine symba_encounter_check_one - end submodule s_symba_encounter_check \ No newline at end of file diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index acc3aabf9..403204017 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_io use swiftest contains + module subroutine symba_io_dump_particle_info(self, param, msg) !! author: David A. Minton !! @@ -11,6 +12,7 @@ module subroutine symba_io_dump_particle_info(self, param, msg) character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine symba_io_dump_particle_info + module subroutine symba_io_initialize_particle_info(self, param) !! author: David A. Minton !! @@ -21,6 +23,7 @@ module subroutine symba_io_initialize_particle_info(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_io_initialize_particle_info + module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -128,6 +131,7 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms return end subroutine symba_io_param_reader + module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! @@ -187,9 +191,9 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end associate return - end subroutine symba_io_param_writer + module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -203,6 +207,7 @@ module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) ierr = 0 end subroutine symba_io_read_frame_info + module subroutine symba_io_write_frame_info(self, iu, param) implicit none diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index e5ba7550e..70f3fa54d 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -2,50 +2,48 @@ use swiftest contains -module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 - !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f - implicit none - ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: k - real(DP) :: irij3, rji2, rlim2, faci, facj - real(DP), dimension(NDIM) :: dx + module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: irij3, rji2, rlim2, faci, facj + real(DP), dimension(NDIM) :: dx - select type(system) - class is (symba_nbody_system) - associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) - call helio_kick_getacch_pl(pl, system, param, t, lbeg) - ! Remove accelerations from encountering pairs - do k = 1, nplplenc - associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - !rlim2 = (pl%radius(i) + pl%radius(j))**2 - !if (rji2 > rlim2) then + select type(system) + class is (symba_nbody_system) + associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + call helio_kick_getacch_pl(pl, system, param, t, lbeg) + ! Remove accelerations from encountering pairs + do k = 1, nplplenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) irij3 = 1.0_DP / (rji2 * sqrt(rji2)) faci = pl%Gmass(i) * irij3 facj = pl%Gmass(j) * irij3 pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) - !end if - end associate - end do - end associate - end select + end associate + end do + end associate + end select - return + return end subroutine symba_kick_getacch_pl + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -79,11 +77,8 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) dx(:) = tp%xh(:,j) - pl%xend(:,i) end if rji2 = dot_product(dx(:), dx(:)) - !rlim2 = (pl%radius(i))**2 - !if (rji2 > rlim2) then - fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) - tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - !end if + fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) end IF end associate end do @@ -92,6 +87,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) return end subroutine symba_kick_getacch_tp + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) !! author: David A. Minton !! @@ -194,6 +190,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) end if end select end select + return end subroutine symba_kick_pltpenc diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 8ae223228..4ddc23ebd 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -1,6 +1,7 @@ submodule(symba_classes) s_symba_setup use swiftest contains + module subroutine symba_setup_pl(self, n) !! author: David A. Minton !! @@ -43,6 +44,7 @@ module subroutine symba_setup_pl(self, n) return end subroutine symba_setup_pl + module subroutine symba_setup_pltpenc(self, n) !! author: David A. Minton !! @@ -73,6 +75,7 @@ module subroutine symba_setup_pltpenc(self, n) return end subroutine symba_setup_pltpenc + module subroutine symba_setup_plplenc(self,n) !! author: David A. Minton !! @@ -100,6 +103,7 @@ module subroutine symba_setup_plplenc(self,n) return end subroutine symba_setup_plplenc + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -133,6 +137,7 @@ module subroutine symba_setup_initialize_system(self, param) return end subroutine symba_setup_initialize_system + module subroutine symba_setup_tp(self,n) !! author: David A. Minton !! @@ -153,6 +158,7 @@ module subroutine symba_setup_tp(self,n) self%nplenc(:) = 0 self%levelg(:) = -1 self%levelm(:) = -1 + return end subroutine symba_setup_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 46065d269..d976e8b8f 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_step use swiftest contains + module subroutine symba_step_system(self, param, t, dt) !! author: David A. Minton !! @@ -36,9 +37,9 @@ module subroutine symba_step_system(self, param, t, dt) end select return - end subroutine symba_step_system + module subroutine symba_step_interp_system(self, param, t, dt) !! author: David A. Minton !! @@ -87,9 +88,11 @@ module subroutine symba_step_interp_system(self, param, t, dt) end select end select end associate + return end subroutine symba_step_interp_system + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! @@ -172,8 +175,10 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) end select end associate + return end subroutine symba_step_recur_system + module subroutine symba_step_reset_system(self) !! author: David A. Minton !! @@ -216,9 +221,7 @@ module subroutine symba_step_reset_system(self) end select end associate - + return end subroutine symba_step_reset_system - - end submodule s_symba_step diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index a19886853..c97913e05 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -1,6 +1,7 @@ submodule(symba_classes) s_symba_util use swiftest contains + module subroutine symba_util_copy_pltpenc(self, source) !! author: David A. Minton !! @@ -18,8 +19,11 @@ module subroutine symba_util_copy_pltpenc(self, source) self%index1(1:n) = source%index1(1:n) self%index2(1:n) = source%index2(1:n) end associate + + return end subroutine symba_util_copy_pltpenc + module subroutine symba_util_copy_plplenc(self, source) !! author: David A. Minton !! @@ -39,6 +43,8 @@ module subroutine symba_util_copy_plplenc(self, source) self%vb2(:,1:n) = source%vb2(:,1:n) end select end associate + + return end subroutine symba_util_copy_plplenc module subroutine symba_util_resize_pltpenc(self, nrequested) @@ -64,9 +70,11 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) self%status(nrequested+1:nold) = INACTIVE end if self%nenc = nrequested + return end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! @@ -114,6 +122,7 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) return end subroutine symba_util_sort_pl + module subroutine symba_util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -148,11 +157,12 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end select call tp%rearrange(ind) - end associate + return end subroutine symba_util_sort_tp + module subroutine symba_util_sort_rearrange_pl(self, ind) !! author: David A. Minton !! @@ -187,9 +197,11 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) end do deallocate(pl_sorted) end associate + return end subroutine symba_util_sort_rearrange_pl + module subroutine symba_util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -210,6 +222,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine symba_util_sort_rearrange_tp diff --git a/src/tides/tides_spin_step.f90 b/src/tides/tides_spin_step.f90 index d6029a7e4..576aff8d7 100644 --- a/src/tides/tides_spin_step.f90 +++ b/src/tides/tides_spin_step.f90 @@ -29,6 +29,7 @@ function tidederiv(x, t, dt, xbeg, xend) result(y) end interface contains + module subroutine tides_step_spin_system(self, param, t, dt) !! author: Jennifer L.L. Pouplin and David A. Minton !! @@ -59,6 +60,7 @@ module subroutine tides_step_spin_system(self, param, t, dt) return end subroutine tides_step_spin_system + function tides_spin_derivs(rot_pl_cb, t, dt, xbeg, xend) result(drot) !! Need to add more arguments so we can pull in mass, radius, Ip, J2, etc... !! author: Jennifer L.L. Pouplin and David A. Minton !! @@ -90,6 +92,7 @@ function tides_spin_derivs(rot_pl_cb, t, dt, xbeg, xend) result(drot) !! Need to ! end do + return end function tides_spin_derivs function tides_derivs_eval(self, x, t) result(y) @@ -105,6 +108,8 @@ function tides_derivs_eval(self, x, t) result(y) else error stop "Lambda function was not initialized" end if + + return end function tides_derivs_eval function tides_derivs_init(lambda, dt, xbeg, xend) result(f) @@ -120,6 +125,8 @@ function tides_derivs_init(lambda, dt, xbeg, xend) result(f) f%dt = dt allocate(f%xbeg, source = xbeg) allocate(f%xend, source = xend) + return end function tides_derivs_init + end submodule s_tides_step_spin \ No newline at end of file diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index 387fc8f6b..bdc772d21 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_util_coord use swiftest contains + module subroutine util_coord_h2b_pl(self, cb) !! author: David A. Minton !! @@ -37,6 +38,7 @@ module subroutine util_coord_h2b_pl(self, cb) return end subroutine util_coord_h2b_pl + module subroutine util_coord_h2b_tp(self, cb) !! author: David A. Minton !! @@ -66,6 +68,7 @@ module subroutine util_coord_h2b_tp(self, cb) return end subroutine util_coord_h2b_tp + module subroutine util_coord_b2h_pl(self, cb) !! author: David A. Minton !! @@ -91,6 +94,7 @@ module subroutine util_coord_b2h_pl(self, cb) return end subroutine util_coord_b2h_pl + module subroutine util_coord_b2h_tp(self, cb) !! author: David A. Minton !! @@ -118,4 +122,5 @@ module subroutine util_coord_b2h_tp(self, cb) return end subroutine util_coord_b2h_tp + end submodule s_util_coord \ No newline at end of file diff --git a/src/util/util_exit.f90 b/src/util/util_exit.f90 index 4413bd9b3..6814b0029 100644 --- a/src/util/util_exit.f90 +++ b/src/util/util_exit.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_exit use swiftest contains + module subroutine util_exit(code) !! author: David A. Minton !! @@ -30,4 +31,5 @@ module subroutine util_exit(code) stop end subroutine util_exit + end submodule s_util_exit diff --git a/src/util/util_peri.f90 b/src/util/util_peri.f90 index 1884728da..407ee5097 100644 --- a/src/util/util_peri.f90 +++ b/src/util/util_peri.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_peri use swiftest contains + module subroutine util_peri_tp(self, system, param) !! author: David A. Minton !! @@ -56,7 +57,8 @@ module subroutine util_peri_tp(self, system, param) end do end if end associate - return + return end subroutine util_peri_tp + end submodule s_util_peri diff --git a/src/util/util_reverse_status.f90 b/src/util/util_reverse_status.f90 index 5fc0d0f22..c416e60e1 100644 --- a/src/util/util_reverse_status.f90 +++ b/src/util/util_reverse_status.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_reverse_status use swiftest contains + module subroutine util_reverse_status(self) !! author: David A. Minton !! @@ -14,5 +15,8 @@ module subroutine util_reverse_status(self) elsewhere (self%status(:) == INACTIVE) self%status(:) = ACTIVE end where + + return end subroutine util_reverse_status + end submodule s_util_reverse_status \ No newline at end of file diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 2c52c86df..c401cb0ce 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -27,9 +27,9 @@ module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) end if return - end subroutine util_set_beg_end_pl + module subroutine util_set_ir3h(self) !! author: David A. Minton !! @@ -53,6 +53,7 @@ module subroutine util_set_ir3h(self) return end subroutine util_set_ir3h + module subroutine util_set_msys(self) !! author: David A. Minton !! @@ -66,6 +67,7 @@ module subroutine util_set_msys(self) return end subroutine util_set_msys + module subroutine util_set_mu_pl(self, cb) !! author: David A. Minton !! @@ -76,9 +78,11 @@ module subroutine util_set_mu_pl(self, cb) 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 !! @@ -93,6 +97,7 @@ module subroutine util_set_mu_tp(self, cb) return end subroutine util_set_mu_tp + module subroutine util_set_rhill(self,cb) !! author: David A. Minton !! @@ -110,6 +115,7 @@ module subroutine util_set_rhill(self,cb) return end subroutine util_set_rhill + module subroutine util_set_rhill_approximate(self,cb) !! author: David A. Minton !! diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 255137f3d..92d785773 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_util_solve use swiftest contains + function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) !! author: David A. Minton !! diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index c08343cee..6c9e51665 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_sort use swiftest contains + module subroutine util_sort_body(self, sortby, ascending) !! author: David A. Minton !! @@ -53,6 +54,7 @@ module subroutine util_sort_body(self, sortby, ascending) return end subroutine util_sort_body + module subroutine util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! @@ -103,6 +105,7 @@ module subroutine util_sort_pl(self, sortby, ascending) return end subroutine util_sort_pl + module subroutine util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -143,6 +146,7 @@ module subroutine util_sort_tp(self, sortby, ascending) return end subroutine util_sort_tp + module subroutine util_sort_rearrange_body(self, ind) !! author: David A. Minton !! @@ -179,9 +183,11 @@ module subroutine util_sort_rearrange_body(self, ind) self%mu(1:n) = body_sorted%mu(ind(1:n)) deallocate(body_sorted) end associate + return end subroutine util_sort_rearrange_body + module subroutine util_sort_rearrange_pl(self, ind) !! author: David A. Minton !! @@ -211,9 +217,11 @@ module subroutine util_sort_rearrange_pl(self, ind) pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) deallocate(pl_sorted) end associate + return end subroutine util_sort_rearrange_pl + module subroutine util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -234,9 +242,11 @@ module subroutine util_sort_rearrange_tp(self, ind) tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine util_sort_rearrange_tp + module subroutine util_sort_dp(arr) !! author: David A. Minton !! @@ -259,9 +269,11 @@ module subroutine util_sort_dp(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_dp + module subroutine util_sort_index_dp(arr, ind) !! author: David A. Minton !! @@ -286,9 +298,11 @@ module subroutine util_sort_index_dp(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_dp + module subroutine util_sort_i4b(arr) !! author: David A. Minton !! @@ -311,9 +325,11 @@ module subroutine util_sort_i4b(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr, ind) !! author: David A. Minton !! @@ -338,9 +354,11 @@ module subroutine util_sort_index_i4b(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_i4b + module subroutine util_sort_sp(arr) !! author: David A. Minton !! @@ -363,9 +381,11 @@ module subroutine util_sort_sp(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_sp + module subroutine util_sort_index_sp(arr, ind) !! author: David A. Minton !! @@ -390,6 +410,8 @@ module subroutine util_sort_index_sp(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_sp + end submodule s_util_sort diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 7cd4b6c7d..0d90cd573 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_spill_and_fill use swiftest contains + module subroutine util_spill_body(self, discards, lspill_list) !! author: David A. Minton !! @@ -70,9 +71,11 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%ldiscard = .true. end associate - + + return end subroutine util_spill_body + module subroutine util_fill_body(self, inserts, lfill_list) !! author: David A. Minton !! @@ -152,9 +155,11 @@ module subroutine util_fill_body(self, inserts, lfill_list) ! This is the base class, so will be the last to be called in the cascade. keeps%nbody = size(keeps%id(:)) end associate - + + return end subroutine util_fill_body + module subroutine util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! @@ -198,9 +203,11 @@ module subroutine util_spill_pl(self, discards, lspill_list) write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' end select end associate + return end subroutine util_spill_pl + module subroutine util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -257,9 +264,11 @@ module subroutine util_fill_pl(self, inserts, lfill_list) write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' end select end associate + return end subroutine util_fill_pl + module subroutine util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! @@ -272,25 +281,27 @@ module subroutine util_spill_tp(self, discards, lspill_list) logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse associate(keeps => self, ntp => self%nbody) - select type(discards) - class is (swiftest_tp) - !> Spill components specific to the test particle class - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - end if - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' - end select + select type(discards) + class is (swiftest_tp) + !> Spill components specific to the test particle class + discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) + discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) + discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + if (count(.not.lspill_list(:)) > 0) then + keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) + keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) + keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) + end if + call util_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' + end select end associate + return end subroutine util_spill_tp + module subroutine util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! @@ -303,23 +314,24 @@ module subroutine util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps associate(keeps => self) - select type(inserts) - class is (swiftest_tp) - !> Spill components specific to the test particle class - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' - end select + select type(inserts) + class is (swiftest_tp) + !> Spill components specific to the test particle class + keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) + keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) + + keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) + keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) + + keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) + keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + + call util_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' + end select end associate + return end subroutine util_fill_tp diff --git a/src/util/util_valid.f90 b/src/util/util_valid.f90 index ac9cc2fad..c5923b38e 100644 --- a/src/util/util_valid.f90 +++ b/src/util/util_valid.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_valid use swiftest contains + module subroutine util_valid(pl, tp) !! author: David A. Minton !! @@ -35,6 +36,6 @@ module subroutine util_valid(pl, tp) end associate return - end subroutine util_valid + end submodule s_util_valid diff --git a/src/util/util_version.f90 b/src/util/util_version.f90 index 2b2c351be..54ef0e14a 100644 --- a/src/util/util_version.f90 +++ b/src/util/util_version.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_version use swiftest contains + module subroutine util_version() !! author: David A. Minton !! diff --git a/src/whm/whm_coord.f90 b/src/whm/whm_coord.f90 index af5368aa8..23f1c11d7 100644 --- a/src/whm/whm_coord.f90 +++ b/src/whm/whm_coord.f90 @@ -1,6 +1,7 @@ submodule (whm_classes) s_whm_coord use swiftest contains + module subroutine whm_coord_h2j_pl(self, cb) !! author: David A. Minton !! @@ -39,6 +40,7 @@ module subroutine whm_coord_h2j_pl(self, cb) return end subroutine whm_coord_h2j_pl + module subroutine whm_coord_j2h_pl(self, cb) !! author: David A. Minton !! @@ -76,6 +78,7 @@ module subroutine whm_coord_j2h_pl(self, cb) return end subroutine whm_coord_j2h_pl + module subroutine whm_coord_vh2vj_pl(self, cb) !! author: David A. Minton !! @@ -107,5 +110,6 @@ module subroutine whm_coord_vh2vj_pl(self, cb) return end subroutine whm_coord_vh2vj_pl + end submodule s_whm_coord diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index 454e1bc53..b205f0828 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) whm_drift use swiftest contains + module subroutine whm_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! @@ -41,7 +42,6 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) end associate return - end subroutine whm_drift_pl end submodule whm_drift diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index c6d0b1723..e4d92e53c 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_gr use swiftest contains + module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies @@ -32,9 +33,11 @@ module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton pl%ah(:, i) = pl%ah(:, i) + aj(:, i) + suma(:) end do end associate + return end subroutine whm_gr_kick_getacch_pl + module subroutine whm_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! @@ -58,8 +61,10 @@ module subroutine whm_gr_kick_getacch_tp(self, param) tp%ah(:, i) = tp%ah(:, i) + beta * tp%xh(:, i) / rjmag4 end do end associate + return end subroutine whm_gr_kick_getacch_tp + module pure subroutine whm_gr_p4_pl(self, param, dt) !! author: David A. Minton diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 4a8b68330..7678a5602 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_kick use swiftest contains + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -50,9 +51,11 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) end associate + return end subroutine whm_kick_getacch_pl + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -93,9 +96,11 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) end associate + return end subroutine whm_kick_getacch_tp + function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) !! author: David A. Minton !! @@ -123,6 +128,7 @@ function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) return end function whm_kick_getacch_ah0 + pure subroutine whm_kick_getacch_ah1(cb, pl) !! author: David A. Minton !! @@ -147,9 +153,9 @@ pure subroutine whm_kick_getacch_ah1(cb, pl) end associate return - end subroutine whm_kick_getacch_ah1 + pure subroutine whm_kick_getacch_ah2(cb, pl) !! author: David A. Minton !! @@ -182,6 +188,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) return end subroutine whm_kick_getacch_ah2 + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -224,6 +231,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) return end subroutine whm_kick_vh_pl + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -262,6 +270,4 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) return end subroutine whm_kick_vh_tp - - end submodule s_whm_kick diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 40dcd4f75..4cdcbc63e 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_setup use swiftest contains + module subroutine whm_setup_pl(self,n) !! author: David A. Minton !! @@ -30,6 +31,7 @@ module subroutine whm_setup_pl(self,n) return end subroutine whm_setup_pl + module subroutine whm_setup_tp(self,n) !! author: David A. Minton !! @@ -47,6 +49,7 @@ module subroutine whm_setup_tp(self,n) return end subroutine whm_setup_tp + module subroutine whm_util_set_mu_eta_pl(self, cb) !! author: David A. Minton !! @@ -69,8 +72,10 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) end do end associate + return end subroutine whm_util_set_mu_eta_pl + module subroutine whm_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -95,6 +100,7 @@ module subroutine whm_setup_initialize_system(self, param) call self%tp%v2pv(param) end if + return end subroutine whm_setup_initialize_system end submodule s_whm_setup \ No newline at end of file diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ebcb94e27..ee1a0c780 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -25,6 +25,7 @@ module subroutine whm_step_system(self, param, t, dt) return end subroutine whm_step_system + module subroutine whm_step_pl(self, system, param, t, dt) !! author: David A. Minton !! @@ -55,9 +56,11 @@ module subroutine whm_step_pl(self, system, param, t, dt) call pl%j2h(cb) call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) end associate + return end subroutine whm_step_pl + module subroutine whm_step_tp(self, system, param, t, dt) !! author: David A. Minton !! @@ -88,6 +91,7 @@ module subroutine whm_step_tp(self, system, param, t, dt) call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end associate end select + return end subroutine whm_step_tp diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 7e1b02f50..e8815a8ea 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -1,49 +1,50 @@ submodule(whm_classes) s_whm_util use swiftest contains - module subroutine whm_util_spill_pl(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) WHM test particle structure from active list to discard list - !! - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - associate(keeps => self) - select type(discards) - class is (whm_pl) - discards%eta(:) = pack(keeps%eta(:), lspill_list(:)) - discards%muj(:) = pack(keeps%muj(:), lspill_list(:)) - discards%ir3j(:) = pack(keeps%ir3j(:), lspill_list(:)) - do i = 1, NDIM - discards%xj(i, :) = pack(keeps%xj(i, :), lspill_list(:)) - discards%vj(i, :) = pack(keeps%vj(i, :), lspill_list(:)) - end do - if (count(.not.lspill_list(:)) > 0) then - keeps%eta(:) = pack(keeps%eta(:), .not. lspill_list(:)) - keeps%muj(:) = pack(keeps%muj(:), .not. lspill_list(:)) - keeps%ir3j(:) = pack(keeps%ir3j(:), .not. lspill_list(:)) + module subroutine whm_util_spill_pl(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) WHM test particle structure from active list to discard list + !! + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + associate(keeps => self) + select type(discards) + class is (whm_pl) + discards%eta(:) = pack(keeps%eta(:), lspill_list(:)) + discards%muj(:) = pack(keeps%muj(:), lspill_list(:)) + discards%ir3j(:) = pack(keeps%ir3j(:), lspill_list(:)) do i = 1, NDIM - keeps%xj(i, :) = pack(keeps%xj(i, :), .not. lspill_list(:)) - keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) + discards%xj(i, :) = pack(keeps%xj(i, :), lspill_list(:)) + discards%vj(i, :) = pack(keeps%vj(i, :), lspill_list(:)) end do - end if - call util_spill_pl(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on whm_pl' - end select - end associate - return + if (count(.not.lspill_list(:)) > 0) then + keeps%eta(:) = pack(keeps%eta(:), .not. lspill_list(:)) + keeps%muj(:) = pack(keeps%muj(:), .not. lspill_list(:)) + keeps%ir3j(:) = pack(keeps%ir3j(:), .not. lspill_list(:)) + do i = 1, NDIM + keeps%xj(i, :) = pack(keeps%xj(i, :), .not. lspill_list(:)) + keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) + end do + end if + call util_spill_pl(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on whm_pl' + end select + end associate + return end subroutine whm_util_spill_pl + module subroutine whm_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -86,97 +87,102 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end associate return - - end subroutine whm_util_fill_pl - - module subroutine whm_util_set_ir3j(self) - !! author: David A. Minton - !! - !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - ! Internals - integer(I4B) :: i - real(DP) :: r2, ir - - if (self%nbody > 0) then - do i = 1, self%nbody - r2 = dot_product(self%xh(:, i), self%xh(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3h(i) = ir / r2 - r2 = dot_product(self%xj(:, i), self%xj(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3j(i) = ir / r2 - end do - end if - end subroutine whm_util_set_ir3j - - module subroutine whm_util_sort_pl(self, sortby, ascending) - !! author: David A. Minton - !! - !! Sort a WHM massive body object in-place. - !! sortby is a string indicating which array component to sort. - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order - ! Internals - integer(I4B), dimension(self%nbody) :: ind - integer(I4B) :: direction - - if (ascending) then - direction = 1 - else - direction = -1 - end if - - associate(pl => self, npl => self%nbody) - select case(sortby) - case("eta") - call util_sort(direction * pl%eta(1:npl), ind(1:npl)) - case("muj") - call util_sort(direction * pl%muj(1:npl), ind(1:npl)) - case("ir3j") - call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) - case("xj", "vj") - write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' - case default - call util_sort_pl(pl, sortby, ascending) - return - end select - - call pl%rearrange(ind) - - end associate - return - end subroutine whm_util_sort_pl - - module subroutine whm_util_sort_rearrange_pl(self, ind) - !! author: David A. Minton - !! - !! Rearrange WHM massive body structure in-place from an index list. - !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) - ! Internals - class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body - integer(I4B) :: i - - associate(pl => self, npl => self%nbody) - call util_sort_rearrange_pl(pl,ind) - allocate(pl_sorted, source=self) - pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) - pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) - pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) - pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) - pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) - deallocate(pl_sorted) - end associate - return - end subroutine whm_util_sort_rearrange_pl + end subroutine whm_util_fill_pl + + + module subroutine whm_util_set_ir3j(self) + !! author: David A. Minton + !! + !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + ! Internals + integer(I4B) :: i + real(DP) :: r2, ir + + if (self%nbody > 0) then + do i = 1, self%nbody + r2 = dot_product(self%xh(:, i), self%xh(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3h(i) = ir / r2 + r2 = dot_product(self%xj(:, i), self%xj(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3j(i) = ir / r2 + end do + end if + + return + end subroutine whm_util_set_ir3j + + + module subroutine whm_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a WHM massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("eta") + call util_sort(direction * pl%eta(1:npl), ind(1:npl)) + case("muj") + call util_sort(direction * pl%muj(1:npl), ind(1:npl)) + case("ir3j") + call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) + case("xj", "vj") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default + call util_sort_pl(pl, sortby, ascending) + return + end select + + call pl%rearrange(ind) + end associate + + return + end subroutine whm_util_sort_pl + + + module subroutine whm_util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange WHM massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) + pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) + pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) + pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) + pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + deallocate(pl_sorted) + end associate + + return + end subroutine whm_util_sort_rearrange_pl end submodule s_whm_util