From bff4f3ece67b8ad0ad6331acd732ff7c06294a1a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:36:02 -0400 Subject: [PATCH 01/29] Added index level code. --- .../swiftest_vs_swifter.ipynb | 252 +++++++++--------- src/symba/symba_step.f90 | 8 +- 2 files changed, 133 insertions(+), 127 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index f1f15c4cb..f6cfff954 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'px' (time (y): 199)>\n",
-       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
+       "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n",
+       "       4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n",
+       "       1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n",
+       "       4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n",
+       "       7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n",
+       "       1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n",
+       "       1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n",
+       "       2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n",
+       "       3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n",
+       "       3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n",
+       "       4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n",
+       "       5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n",
+       "       6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n",
+       "       8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n",
+       "       9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n",
+       "       1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n",
+       "       1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n",
+       "       1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n",
+       "       1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n",
+       "       1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n",
        "...\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
-       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
-       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
-       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
-       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
-       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
-       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
-       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
-       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
-       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
-       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
-       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
-       "        3.88578059e-15,  4.10782519e-15,  1.02750769e-03,  1.03179676e-03,\n",
-       "        1.03606675e-03,  1.04031758e-03,  1.04454916e-03,  1.04876143e-03,\n",
-       "        1.05295429e-03,  1.05712769e-03,  1.06128153e-03,  1.06541574e-03,\n",
-       "        1.06953025e-03,  1.07362498e-03,  1.07769985e-03])\n",
+       "       4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n",
+       "       4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n",
+       "       4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n",
+       "       5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n",
+       "       5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n",
+       "       5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n",
+       "       6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n",
+       "       6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n",
+       "       7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n",
+       "       7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n",
+       "       8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n",
+       "       8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n",
+       "       9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n",
+       "       9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n",
+       "       1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n",
+       "       1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n",
+       "       1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n",
+       "       1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n",
+       "       1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n",
+       "       1.53913603e-02, 1.58186428e-02,            nan])\n",
        "Coordinates:\n",
-       "    id        int64 2\n",
-       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n", + " 4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n", + " 1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n", + " 4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n", + " 7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n", + " 1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n", + " 1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n", + " 2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n", + " 3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n", + " 3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n", + " 4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n", + " 5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n", + " 6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n", + " 8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n", + " 9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n", + " 1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n", + " 1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n", + " 1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n", + " 1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n", + " 1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", - " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", - " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", - " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", - " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", - " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", - " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", - " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", - " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", - " 3.88578059e-15, 4.10782519e-15, 1.02750769e-03, 1.03179676e-03,\n", - " 1.03606675e-03, 1.04031758e-03, 1.04454916e-03, 1.04876143e-03,\n", - " 1.05295429e-03, 1.05712769e-03, 1.06128153e-03, 1.06541574e-03,\n", - " 1.06953025e-03, 1.07362498e-03, 1.07769985e-03])\n", + " 4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n", + " 4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n", + " 4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n", + " 5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n", + " 5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n", + " 5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n", + " 6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n", + " 6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n", + " 7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n", + " 7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n", + " 8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n", + " 8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n", + " 9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n", + " 9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n", + " 1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n", + " 1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n", + " 1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n", + " 1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n", + " 1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n", + " 1.53913603e-02, 1.58186428e-02, nan])\n", "Coordinates:\n", - " id int64 2\n", + " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, @@ -633,7 +633,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=2)" + "swiftdiff['px'].sel(id=100)" ] }, { diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 896af6ab4..1581d82c7 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -152,7 +152,13 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) call plplenc_list%kick(system, dth, irecp, sgn) call pltpenc_list%kick(system, dth, irecp, sgn) end if - + associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & + plind2 => plplenc_list%index2(1:plplenc_list%nenc), & + plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & + tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) + where(pl%levelg([plind1,plind2,plind3]) == irecp) pl%levelg(:) = ireci + where(tp%levelg(tpind) == irecp) tp%levelg(:) = ireci + end associate end do end select end select From 3e7462d65657cefc8f1578ae52c9e4f3934105ad Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:41:44 -0400 Subject: [PATCH 02/29] Added encounter list level change code --- .../swiftest_vs_swifter.ipynb | 254 +++++++++--------- src/symba/symba_step.f90 | 2 + 2 files changed, 129 insertions(+), 127 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index f6cfff954..5ecd1db22 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n",
    -       "       4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n",
    -       "       1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n",
    -       "       4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n",
    -       "       7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n",
    -       "       1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n",
    -       "       1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n",
    -       "       2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n",
    -       "       3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n",
    -       "       3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n",
    -       "       4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n",
    -       "       5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n",
    -       "       6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n",
    -       "       8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n",
    -       "       9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n",
    -       "       1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n",
    -       "       1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n",
    -       "       1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n",
    -       "       1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n",
    -       "       1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n",
    +       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
            "...\n",
    -       "       4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n",
    -       "       4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n",
    -       "       4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n",
    -       "       5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n",
    -       "       5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n",
    -       "       5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n",
    -       "       6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n",
    -       "       6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n",
    -       "       7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n",
    -       "       7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n",
    -       "       8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n",
    -       "       8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n",
    -       "       9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n",
    -       "       9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n",
    -       "       1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n",
    -       "       1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n",
    -       "       1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n",
    -       "       1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n",
    -       "       1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n",
    -       "       1.53913603e-02, 1.58186428e-02,            nan])\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    +       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    +       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    +       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    +       "        3.88578059e-15,  4.10782519e-15,  5.55111512e-15,  7.54951657e-15,\n",
    +       "        8.21565038e-15,  9.43689571e-15,  1.12132525e-14,  1.18793864e-14,\n",
    +       "        1.23234756e-14,  1.39888101e-14,  1.75415238e-14,  3.00870440e-14,\n",
    +       "        4.03010958e-14,  4.11892742e-14,  7.31636973e-14])\n",
            "Coordinates:\n",
    -       "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n", - " 4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n", - " 1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n", - " 4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n", - " 7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n", - " 1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n", - " 1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n", - " 2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n", - " 3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n", - " 3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n", - " 4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n", - " 5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n", - " 6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n", - " 8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n", - " 9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n", - " 1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n", - " 1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n", - " 1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n", - " 1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n", - " 1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n", + "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", "...\n", - " 4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n", - " 4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n", - " 4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n", - " 5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n", - " 5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n", - " 5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n", - " 6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n", - " 6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n", - " 7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n", - " 7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n", - " 8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n", - " 8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n", - " 9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n", - " 9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n", - " 1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n", - " 1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n", - " 1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n", - " 1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n", - " 1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n", - " 1.53913603e-02, 1.58186428e-02, nan])\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", + " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", + " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", + " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", + " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", + " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", + " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", + " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", + " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", + " 3.88578059e-15, 4.10782519e-15, 5.55111512e-15, 7.54951657e-15,\n", + " 8.21565038e-15, 9.43689571e-15, 1.12132525e-14, 1.18793864e-14,\n", + " 1.23234756e-14, 1.39888101e-14, 1.75415238e-14, 3.00870440e-14,\n", + " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", "Coordinates:\n", - " id int64 100\n", + " id int64 2\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, @@ -633,7 +633,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=100)" + "swiftdiff['px'].sel(id=2)" ] }, { diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 1581d82c7..2eecdacc3 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -159,6 +159,8 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) where(pl%levelg([plind1,plind2,plind3]) == irecp) pl%levelg(:) = ireci where(tp%levelg(tpind) == irecp) tp%levelg(:) = ireci end associate + where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci + where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci end do end select end select From ef3915c85c2539b0152b5a7b40ad2a75f1549b25 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:48:01 -0400 Subject: [PATCH 03/29] Added mask to pltp/pl encounter check. --- .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 14 +++++++------- src/symba/symba_encounter_check.f90 | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 5ecd1db22..2023b522a 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -509,7 +509,7 @@ " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", "Coordinates:\n", " id int64 2\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", @@ -627,7 +627,7 @@ " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 17383f9c0..796df5d4a 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -82,7 +82,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - do i = 1, self%nenc + do concurrent(i = 1:self%nenc, self%status(i) == ACTIVE .and. self%level(i) == irec - 1) associate(index_i => self%index1(i), index_j => self%index2(i)) if (isplpl) then xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) From a816f9acaf622856c0aff3f1b83c74fb43080906 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 23:25:34 -0400 Subject: [PATCH 04/29] Changed incorrect pl%mass to pl%Gmass --- src/symba/symba_kick.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 4da46f5a6..e58e575b8 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -160,9 +160,9 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) ir3 = 1.0_DP / (r2 * sqrt(r2)) fac = ir3 end if - faci = fac * pl%mass(i) + faci = fac * pl%Gmass(i) if (isplpl) then - facj = fac * pl%mass(j) + facj = fac * pl%Gmass(j) pl%ah(:,i) = pl%ah(:,i) + facj*dx(:) pl%ah(:,j) = pl%ah(:,j) - faci*dx(:) else From 25b141400e5bf5cf45f03cd74921961a17fcba68 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 23:26:58 -0400 Subject: [PATCH 05/29] Updated example notebook --- .../swiftest_vs_swifter.ipynb | 252 +++++++++--------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 2023b522a..c40b98435 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
            "...\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    -       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    -       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    -       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    -       "        3.88578059e-15,  4.10782519e-15,  5.55111512e-15,  7.54951657e-15,\n",
    -       "        8.21565038e-15,  9.43689571e-15,  1.12132525e-14,  1.18793864e-14,\n",
    -       "        1.23234756e-14,  1.39888101e-14,  1.75415238e-14,  3.00870440e-14,\n",
    -       "        4.03010958e-14,  4.11892742e-14,  7.31636973e-14])\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n",
    +       "       6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n",
    +       "       1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n",
    +       "       3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n",
            "Coordinates:\n",
            "    id        int64 2\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", - " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", - " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", - " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", - " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", - " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", - " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", - " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", - " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", - " 3.88578059e-15, 4.10782519e-15, 5.55111512e-15, 7.54951657e-15,\n", - " 8.21565038e-15, 9.43689571e-15, 1.12132525e-14, 1.18793864e-14,\n", - " 1.23234756e-14, 1.39888101e-14, 1.75415238e-14, 3.00870440e-14,\n", - " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n", + " 6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n", + " 1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n", + " 3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n", "Coordinates:\n", " id int64 2\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } From be6e542b74ad49380127c36ac337abae70395a81 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 07:54:34 -0400 Subject: [PATCH 06/29] Improved io error handling and added rhill to the list binary output files and reinabled it in the swiftest parameter input --- .../1pl_1tp_encounter/init_cond.py | 4 +- .../1pl_1tp_encounter/param.swiftest.in | 1 + .../1pl_1tp_encounter/pl.swifter.in | 2 +- .../1pl_1tp_encounter/pl.swiftest.in | Bin 160 -> 176 bytes .../swiftest_vs_swifter.ipynb | 262 +++++++++--------- python/swiftest/swiftest/io.py | 17 +- python/swiftest/swiftest/simulation_class.py | 1 + src/io/io.f90 | 114 ++++---- src/setup/setup.f90 | 4 +- 9 files changed, 207 insertions(+), 198 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index b292ed42f..5ef0d4df7 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -55,7 +55,7 @@ p_tp = np.array([atp, 0.0, 0.0], dtype=np.double) v_tp = np.array([0.0, vtp, 0.0], dtype=np.double) -Rhill = apl * 0.0100447248332378922085 +Rhill = np.double(apl * 0.0100447248332378922085) #Make Swifter files plfile = open(swifter_pl, 'w') @@ -126,6 +126,7 @@ plfile.write_record(v_pl[1]) plfile.write_record(v_pl[2]) plfile.write_record(mass) +plfile.write_record(Rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(swiftest_tp, 'w') @@ -171,6 +172,7 @@ print(f'MU2KG {MU2KG}') print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') +print(f'RHILL_PRESENT yes') diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in index 36937896f..f2a1422d1 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -27,3 +27,4 @@ GR no MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 +RHILL_PRESENT yes diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in index 95513c9fd..17d461561 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in @@ -2,7 +2,7 @@ 1 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -2 0.00012002693582795244940133 0.010044724833237891545 +2 0.00012002693582795244940133 0.010044724833237892 4.25875607065041e-05 1.0 0.0 0.0 0.0 6.283185307179586 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in index 6f4bc1337f56833a126ada00c5685c950d805447..c94c6ae61581655ba2acb43d632ec99b4c8d1cc3 100644 GIT binary patch delta 35 lcmZ3$xPfuP6q(ga>{UZ1wb*koFff3ykokl{#t=3z9{{*62kQU; delta 19 acmdnMxPWoO6dob-35ARyZ1x-s3=9A{sswKU diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index c40b98435..8d8d319fa 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -465,91 +465,91 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    +       "array([ 0.00000000e+00,  9.11215959e-05,  1.80587788e-04,  2.68393108e-04,\n",
    +       "        3.54531638e-04,  4.38997006e-04,  5.21782391e-04,  6.02880514e-04,\n",
    +       "        6.82283643e-04,  7.59983586e-04,  8.35971688e-04,  9.10238833e-04,\n",
    +       "        9.82775435e-04,  1.05357144e-03,  1.12261631e-03,  1.18989903e-03,\n",
    +       "        1.25540811e-03,  1.31913155e-03,  1.38105688e-03,  1.44117110e-03,\n",
    +       "        1.49946072e-03,  1.55591171e-03,  1.61050954e-03,  1.66323914e-03,\n",
    +       "        1.71408489e-03,  1.76303062e-03,  1.81005960e-03,  1.85515453e-03,\n",
    +       "        1.89829752e-03,  1.93947008e-03,  1.97865314e-03,  2.01582697e-03,\n",
    +       "        2.05097122e-03,  2.08406489e-03,  2.11508630e-03,  2.14401311e-03,\n",
    +       "        2.17082226e-03,  2.19548996e-03,  2.21799170e-03,  2.23830220e-03,\n",
    +       "        2.25639539e-03,  2.27224441e-03,  2.28582155e-03,  2.29709827e-03,\n",
    +       "        2.30604512e-03,  2.31263176e-03,  2.31682691e-03,  2.31859829e-03,\n",
    +       "        2.31791266e-03,  2.31473571e-03,  2.30903208e-03,  2.30076526e-03,\n",
    +       "        2.28989763e-03,  2.27639036e-03,  2.26020337e-03,  2.24129530e-03,\n",
    +       "        2.21962347e-03,  2.19514380e-03,  2.16781076e-03,  2.13757734e-03,\n",
    +       "        2.10439497e-03,  2.06821345e-03,  2.02898089e-03,  1.98664364e-03,\n",
    +       "        1.94114621e-03,  1.89243121e-03,  1.84043924e-03,  1.78510882e-03,\n",
    +       "        1.72637627e-03,  1.66417567e-03,  1.59843868e-03,  1.52909449e-03,\n",
    +       "        1.45606969e-03,  1.37928810e-03,  1.29867071e-03,  1.21413550e-03,\n",
    +       "        1.12559730e-03,  1.03296763e-03,  9.36154537e-04,  8.35062432e-04,\n",
            "...\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n",
    -       "       6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n",
    -       "       1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n",
    -       "       3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n",
    +       "       -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n",
    +       "       -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n",
    +       "       -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n",
    +       "       -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n",
    +       "       -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n",
    +       "       -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n",
    +       "       -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n",
    +       "       -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n",
    +       "       -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n",
    +       "       -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n",
    +       "       -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n",
    +       "       -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n",
    +       "       -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n",
    +       "       -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n",
    +       "       -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n",
    +       "       -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n",
    +       "       -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n",
    +       "        9.12143589e-03,  2.33356115e-02,  3.93212119e-02,  5.77079105e-02,\n",
    +       "        7.94629069e-02,  1.06185107e-01,  1.40789920e-01,  1.89418143e-01,\n",
    +       "        2.68513569e-01,  4.52523697e-01,             nan])\n",
            "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "\n", + "array([ 0.00000000e+00, 9.11215959e-05, 1.80587788e-04, 2.68393108e-04,\n", + " 3.54531638e-04, 4.38997006e-04, 5.21782391e-04, 6.02880514e-04,\n", + " 6.82283643e-04, 7.59983586e-04, 8.35971688e-04, 9.10238833e-04,\n", + " 9.82775435e-04, 1.05357144e-03, 1.12261631e-03, 1.18989903e-03,\n", + " 1.25540811e-03, 1.31913155e-03, 1.38105688e-03, 1.44117110e-03,\n", + " 1.49946072e-03, 1.55591171e-03, 1.61050954e-03, 1.66323914e-03,\n", + " 1.71408489e-03, 1.76303062e-03, 1.81005960e-03, 1.85515453e-03,\n", + " 1.89829752e-03, 1.93947008e-03, 1.97865314e-03, 2.01582697e-03,\n", + " 2.05097122e-03, 2.08406489e-03, 2.11508630e-03, 2.14401311e-03,\n", + " 2.17082226e-03, 2.19548996e-03, 2.21799170e-03, 2.23830220e-03,\n", + " 2.25639539e-03, 2.27224441e-03, 2.28582155e-03, 2.29709827e-03,\n", + " 2.30604512e-03, 2.31263176e-03, 2.31682691e-03, 2.31859829e-03,\n", + " 2.31791266e-03, 2.31473571e-03, 2.30903208e-03, 2.30076526e-03,\n", + " 2.28989763e-03, 2.27639036e-03, 2.26020337e-03, 2.24129530e-03,\n", + " 2.21962347e-03, 2.19514380e-03, 2.16781076e-03, 2.13757734e-03,\n", + " 2.10439497e-03, 2.06821345e-03, 2.02898089e-03, 1.98664364e-03,\n", + " 1.94114621e-03, 1.89243121e-03, 1.84043924e-03, 1.78510882e-03,\n", + " 1.72637627e-03, 1.66417567e-03, 1.59843868e-03, 1.52909449e-03,\n", + " 1.45606969e-03, 1.37928810e-03, 1.29867071e-03, 1.21413550e-03,\n", + " 1.12559730e-03, 1.03296763e-03, 9.36154537e-04, 8.35062432e-04,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n", - " 6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n", - " 1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n", - " 3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n", + " -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n", + " -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n", + " -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n", + " -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n", + " -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n", + " -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n", + " -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n", + " -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n", + " -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n", + " -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n", + " -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n", + " -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n", + " -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n", + " -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n", + " -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n", + " -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n", + " -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n", + " 9.12143589e-03, 2.33356115e-02, 3.93212119e-02, 5.77079105e-02,\n", + " 7.94629069e-02, 1.06185107e-01, 1.40789920e-01, 1.89418143e-01,\n", + " 2.68513569e-01, 4.52523697e-01, nan])\n", "Coordinates:\n", - " id int64 2\n", + " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 8, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['px'].sel(id=2)" + "swiftdiff['vx'].sel(id=100)" ] }, { diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index ceab9a74f..aeaf742bb 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -71,6 +71,7 @@ def read_swiftest_param(param_file_name, param): param['EXTRA_FORCE'] = param['EXTRA_FORCE'].upper() param['BIG_DISCARD'] = param['BIG_DISCARD'].upper() param['CHK_CLOSE'] = param['CHK_CLOSE'].upper() + param['RHILL_PRESENT'] = param['RHILL_PRESENT'].upper() param['FRAGMENTATION'] = param['FRAGMENTATION'].upper() param['ROTATION'] = param['ROTATION'].upper() param['TIDES'] = param['TIDES'].upper() @@ -401,6 +402,8 @@ def make_swiftest_labels(param): plab = tlab.copy() plab.append('Mass') plab.append('Radius') + if param['RHILL_PRESENT'] == 'YES': + plab.append('Rhill') clab = ['Mass', 'Radius', 'J_2', 'J_4'] if param['ROTATION'] == 'YES': clab.append('Ip_x') @@ -491,6 +494,8 @@ def swiftest_stream(f, param): p6 = f.read_reals(np.float64) Mpl = f.read_reals(np.float64) Rpl = f.read_reals(np.float64) + if param['RHILL_PRESENT'] == 'YES': + Rhill = f.read_reals(np.float64) if param['ROTATION'] == 'YES': Ipplx = f.read_reals(np.float64) Ipply = f.read_reals(np.float64) @@ -523,6 +528,9 @@ def swiftest_stream(f, param): tvec = np.empty((6, 0)) tpid = np.empty(0) cvec = np.array([Mcb, Rcb, J2cb, J4cb]) + if param['RHILL_PRESENT'] == 'YES': + if npl > 0: + pvec = np.vstack([pvec, Rhill]) if param['ROTATION'] == 'YES': cvec = np.vstack([cvec, Ipcbx, Ipcby, Ipcbz, rotcbx, rotcby, rotcbz]) if npl > 0: @@ -1021,9 +1029,13 @@ def swifter2swiftest(swifter_param, plname="", tpname="", cbname="", conversion_ for n in range(1, npl): # Loop over planets line = plold.readline() i_list = [i for i in line.split(" ") if i.strip()] - name = int(i_list[0]) + idnum = int(i_list[0]) GMpl = real2float(i_list[1]) - print(name, GMpl, file=plnew) + if swifter_param['RHILL_PRESENT'] == 'YES': + Rhill = real2float(i_list[2]) + print(idnum, GMpl, Rhill, file=plnew) + else: + print(idnum, GMpl, file=plnew) if swifter_param['CHK_CLOSE'] == 'YES': line = plold.readline() i_list = [i for i in line.split(" ") if i.strip()] @@ -1237,7 +1249,6 @@ def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): tmp = swifter_param.pop(key, None) swifter_param['J2'] = J2 swifter_param['J4'] = J4 - swifter_param['RHILL_PRESENT'] = "YES" swifter_param['CHK_CLOSE'] = "YES" if swifter_param['OUT_STAT'] == "REPLACE": swifter_param['OUT_STAT'] = "UNKNOWN" diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index e20ef05f7..670b72a60 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -39,6 +39,7 @@ def __init__(self, codename="Swiftest", param_file=""): 'EXTRA_FORCE': "NO", 'BIG_DISCARD': "NO", 'CHK_CLOSE': "YES", + 'RHILL_PRESENT': "YES", 'FRAGMENTATION': "NO", 'ROTATION': "NO", 'TIDES': "NO", diff --git a/src/io/io.f90 b/src/io/io.f90 index cf4772a8f..82c87dfc7 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -612,41 +612,33 @@ module subroutine io_read_body_in(self, param) do i = 1, nbody select type(self) class is (swiftest_pl) - read(iu, *, iostat = ierr) self%id(i), val - self%Gmass(i) = real(val, kind=DP) - self%mass(i) = real(val / param%GU, kind=DP) - - if (param%lclose) then - if (param%lrhill_present) then - read(iu, *, iostat = ierr) self%radius(i), self%rhill(i) - else - read(iu, *, iostat = ierr) self%radius(i) - end if - if (ierr /= 0 ) exit + if (param%lrhill_present) then + read(iu, *, iostat=ierr, err=100) self%id(i), val, self%rhill(i) else - self%radius(i) = 0.0_DP + read(iu, *, iostat=ierr, err=100) self%id(i), val end if + self%Gmass(i) = real(val, kind=DP) + self%mass(i) = real(val / param%GU, kind=DP) + if (param%lclose) read(iu, *, iostat=ierr, err=100) self%radius(i) if (param%lrotation) then - read(iu, iostat = ierr) self%Ip(:, i) - read(iu, iostat = ierr) self%rot(:, i) + read(iu, iostat=ierr, err=100) self%Ip(:, i) + read(iu, iostat=ierr, err=100) self%rot(:, i) end if if (param%ltides) then - read(iu, iostat = ierr) self%k2(i) - read(iu, iostat = ierr) self%Q(i) + read(iu, iostat=ierr, err=100) self%k2(i) + read(iu, iostat=ierr, err=100) self%Q(i) end if class is (swiftest_tp) - read(iu, *, iostat = ierr) self%id(i) + read(iu, *, iostat=ierr, err=100) self%id(i) end select - if (ierr /= 0 ) exit - read(iu, *, iostat = ierr) self%xh(1, i), self%xh(2, i), self%xh(3, i) - read(iu, *, iostat = ierr) self%vh(1, i), self%vh(2, i), self%vh(3, i) - if (ierr /= 0 ) exit + read(iu, *, iostat=ierr, err=100) self%xh(1, i), self%xh(2, i), self%xh(3, i) + read(iu, *, iostat=ierr, err=100) self%vh(1, i), self%vh(2, i), self%vh(3, i) self%status(i) = ACTIVE end do end if case (REAL4_TYPE, REAL8_TYPE) !, SWIFTER_REAL4_TYPE, SWIFTER_REAL8_TYPE) - open(unit = iu, file = infile, status = 'old', form = 'UNFORMATTED', iostat = ierr) - read(iu, iostat = ierr) nbody + open(unit=iu, file=infile, status='old', form='UNFORMATTED', iostat=ierr) + read(iu, iostat=ierr, err=100) nbody call self%setup(nbody) if (nbody > 0) then call self%read_frame(iu, param, XV, ierr) @@ -658,7 +650,7 @@ module subroutine io_read_body_in(self, param) end select close(iu) - if (ierr /= 0 ) then + 100 if (ierr /= 0 ) then write(*,*) 'Error reading in initial conditions from ',trim(adjustl(infile)) call util_exit(FAILURE) end if @@ -817,45 +809,46 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) integer(I4B), intent(out) :: ierr !! Error code associate(n => self%nbody) - read(iu, iostat = ierr) self%id(1:n) - !read(iu, iostat = ierr) self%name(1:n) + read(iu, iostat=ierr, err=100) self%id(1:n) + !read(iu, iostat=ierr, err=100) self%name(1:n) select case (form) case (EL) - read(iu, iostat = ierr) self%a(1:n) - read(iu, iostat = ierr) self%e(1:n) - read(iu, iostat = ierr) self%inc(1:n) - read(iu, iostat = ierr) self%capom(:) - read(iu, iostat = ierr) self%omega(:) - read(iu, iostat = ierr) self%capm(:) + read(iu, iostat=ierr, err=100) self%a(1:n) + read(iu, iostat=ierr, err=100) self%e(1:n) + read(iu, iostat=ierr, err=100) self%inc(1:n) + read(iu, iostat=ierr, err=100) self%capom(:) + read(iu, iostat=ierr, err=100) self%omega(:) + read(iu, iostat=ierr, err=100) self%capm(:) case (XV) - read(iu, iostat = ierr) self%xh(1, 1:n) - read(iu, iostat = ierr) self%xh(2, 1:n) - read(iu, iostat = ierr) self%xh(3, 1:n) - read(iu, iostat = ierr) self%vh(1, 1:n) - read(iu, iostat = ierr) self%vh(2, 1:n) - read(iu, iostat = ierr) self%vh(3, 1:n) + read(iu, iostat=ierr, err=100) self%xh(1, 1:n) + read(iu, iostat=ierr, err=100) self%xh(2, 1:n) + read(iu, iostat=ierr, err=100) self%xh(3, 1:n) + read(iu, iostat=ierr, err=100) self%vh(1, 1:n) + read(iu, iostat=ierr, err=100) self%vh(2, 1:n) + read(iu, iostat=ierr, err=100) self%vh(3, 1:n) end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - read(iu, iostat = ierr) pl%Gmass(1:n) + read(iu, iostat=ierr, err=100) pl%Gmass(1:n) pl%mass(1:n) = pl%Gmass / param%GU - read(iu, iostat = ierr) pl%radius(1:n) + if (param%lrhill_present) read(iu, iostat=ierr, err=100) pl%rhill(1:n) + read(iu, iostat=ierr, err=100) pl%radius(1:n) if (param%lrotation) then - read(iu, iostat = ierr) pl%rot(1, 1:n) - read(iu, iostat = ierr) pl%rot(2, 1:n) - read(iu, iostat = ierr) pl%rot(3, 1:n) - read(iu, iostat = ierr) pl%Ip(1, 1:n) - read(iu, iostat = ierr) pl%Ip(2, 1:n) - read(iu, iostat = ierr) pl%Ip(3, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(1, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(2, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(3, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(1, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(2, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(3, 1:n) end if if (param%ltides) then - read(iu, iostat = ierr) pl%k2(1:n) - read(iu, iostat = ierr) pl%Q(1:n) + read(iu, iostat=ierr, err=100) pl%k2(1:n) + read(iu, iostat=ierr, err=100) pl%Q(1:n) end if end select end associate - if (ierr /=0) then + 100 if (ierr /=0) then write(*,*) 'Error reading Swiftest body data' call util_exit(FAILURE) end if @@ -878,22 +871,22 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) character(*), intent(in) :: form !! Input format code ("XV" or "EL") integer(I4B), intent(out) :: ierr !! Error cod - read(iu, iostat = ierr) self%id - !read(iu, iostat = ierr) self%name - read(iu, iostat = ierr) self%Gmass + read(iu, iostat=ierr, err=100) self%id + !read(iu, iostat=ierr, err=100) self%name + read(iu, iostat=ierr, err=100) self%Gmass self%mass = self%Gmass / param%GU - read(iu, iostat = ierr) self%radius - read(iu, iostat = ierr) self%j2rp2 - read(iu, iostat = ierr) self%j4rp4 + read(iu, iostat=ierr, err=100) self%radius + read(iu, iostat=ierr, err=100) self%j2rp2 + read(iu, iostat=ierr, err=100) self%j4rp4 if (param%lrotation) then - read(iu, iostat = ierr) self%Ip(:) - read(iu, iostat = ierr) self%rot(:) + read(iu, iostat=ierr, err=100) self%Ip(:) + read(iu, iostat=ierr, err=100) self%rot(:) end if if (param%ltides) then - read(iu, iostat = ierr) self%k2 - read(iu, iostat = ierr) self%Q + read(iu, iostat=ierr, err=100) self%k2 + read(iu, iostat=ierr, err=100) self%Q end if - if (ierr /=0) then + 100 if (ierr /=0) then write(*,*) 'Error reading central body data' call util_exit(FAILURE) end if @@ -1160,6 +1153,7 @@ module subroutine io_write_frame_body(self, iu, param) select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body write(iu) pl%Gmass(1:n) + write(iu) pl%rhill(1:n) write(iu) pl%radius(1:n) if (param%lrotation) then write(iu) pl%rot(1, 1:n) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index e85f9754a..ceed089fe 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -82,12 +82,12 @@ module subroutine setup_initialize_system(self, param) call self%cb%initialize(param) call self%pl%initialize(param) - if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) call self%tp%initialize(param) call self%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) call self%pl%eucl_index() + if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) return end subroutine setup_initialize_system @@ -177,7 +177,7 @@ module subroutine setup_pl(self,n) self%Gmass(:) = 0.0_DP self%rhill(:) = 0.0_DP self%radius(:) = 0.0_DP - self%density(:) = 0.0_DP + self%density(:) = 1.0_DP self%rot(:,:) = 0.0_DP self%Ip(:,:) = 0.0_DP self%k2(:) = 0.0_DP From 7fe286e3caf0c1a97af9f59da940c4800282a6bb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 07:56:33 -0400 Subject: [PATCH 07/29] Fixed bug in the interpolation step where the second test particle kick had the wrong lbeg flag --- src/symba/symba_step.f90 | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 2eecdacc3..594088a9d 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -52,7 +52,6 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth !! Half step size - integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) @@ -62,25 +61,23 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) - irec = -1 call pl%vh2vb(cb) call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == irec)) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == -1)) call tp%vh2vb(vbcb = -cb%ptbeg) call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == irec)) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == -1)) - irec = 0 - call system%recursive_step(param, irec) + call system%recursive_step(param, 0) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end select From ad48621215f08fec0a1bb749c9fa847a5fbf17c6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 08:11:02 -0400 Subject: [PATCH 08/29] Fixed bug that was not passing the correct massive body position to the test particle kick in SyMBA --- .../swiftest_vs_swifter.ipynb | 183 ++++++------------ src/symba/symba_kick.f90 | 6 +- 2 files changed, 59 insertions(+), 130 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 8d8d319fa..3016031e3 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -466,90 +466,40 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    -       "array([ 0.00000000e+00,  9.11215959e-05,  1.80587788e-04,  2.68393108e-04,\n",
    -       "        3.54531638e-04,  4.38997006e-04,  5.21782391e-04,  6.02880514e-04,\n",
    -       "        6.82283643e-04,  7.59983586e-04,  8.35971688e-04,  9.10238833e-04,\n",
    -       "        9.82775435e-04,  1.05357144e-03,  1.12261631e-03,  1.18989903e-03,\n",
    -       "        1.25540811e-03,  1.31913155e-03,  1.38105688e-03,  1.44117110e-03,\n",
    -       "        1.49946072e-03,  1.55591171e-03,  1.61050954e-03,  1.66323914e-03,\n",
    -       "        1.71408489e-03,  1.76303062e-03,  1.81005960e-03,  1.85515453e-03,\n",
    -       "        1.89829752e-03,  1.93947008e-03,  1.97865314e-03,  2.01582697e-03,\n",
    -       "        2.05097122e-03,  2.08406489e-03,  2.11508630e-03,  2.14401311e-03,\n",
    -       "        2.17082226e-03,  2.19548996e-03,  2.21799170e-03,  2.23830220e-03,\n",
    -       "        2.25639539e-03,  2.27224441e-03,  2.28582155e-03,  2.29709827e-03,\n",
    -       "        2.30604512e-03,  2.31263176e-03,  2.31682691e-03,  2.31859829e-03,\n",
    -       "        2.31791266e-03,  2.31473571e-03,  2.30903208e-03,  2.30076526e-03,\n",
    -       "        2.28989763e-03,  2.27639036e-03,  2.26020337e-03,  2.24129530e-03,\n",
    -       "        2.21962347e-03,  2.19514380e-03,  2.16781076e-03,  2.13757734e-03,\n",
    -       "        2.10439497e-03,  2.06821345e-03,  2.02898089e-03,  1.98664364e-03,\n",
    -       "        1.94114621e-03,  1.89243121e-03,  1.84043924e-03,  1.78510882e-03,\n",
    -       "        1.72637627e-03,  1.66417567e-03,  1.59843868e-03,  1.52909449e-03,\n",
    -       "        1.45606969e-03,  1.37928810e-03,  1.29867071e-03,  1.21413550e-03,\n",
    -       "        1.12559730e-03,  1.03296763e-03,  9.36154537e-04,  8.35062432e-04,\n",
    -       "...\n",
    -       "       -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n",
    -       "       -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n",
    -       "       -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n",
    -       "       -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n",
    -       "       -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n",
    -       "       -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n",
    -       "       -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n",
    -       "       -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n",
    -       "       -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n",
    -       "       -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n",
    -       "       -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n",
    -       "       -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n",
    -       "       -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n",
    -       "       -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n",
    -       "       -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n",
    -       "       -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n",
    -       "       -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n",
    -       "        9.12143589e-03,  2.33356115e-02,  3.93212119e-02,  5.77079105e-02,\n",
    -       "        7.94629069e-02,  1.06185107e-01,  1.40789920e-01,  1.89418143e-01,\n",
    -       "        2.68513569e-01,  4.52523697e-01,             nan])\n",
    +       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0., nan])\n",
            "Coordinates:\n",
            "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 9.11215959e-05, 1.80587788e-04, 2.68393108e-04,\n", - " 3.54531638e-04, 4.38997006e-04, 5.21782391e-04, 6.02880514e-04,\n", - " 6.82283643e-04, 7.59983586e-04, 8.35971688e-04, 9.10238833e-04,\n", - " 9.82775435e-04, 1.05357144e-03, 1.12261631e-03, 1.18989903e-03,\n", - " 1.25540811e-03, 1.31913155e-03, 1.38105688e-03, 1.44117110e-03,\n", - " 1.49946072e-03, 1.55591171e-03, 1.61050954e-03, 1.66323914e-03,\n", - " 1.71408489e-03, 1.76303062e-03, 1.81005960e-03, 1.85515453e-03,\n", - " 1.89829752e-03, 1.93947008e-03, 1.97865314e-03, 2.01582697e-03,\n", - " 2.05097122e-03, 2.08406489e-03, 2.11508630e-03, 2.14401311e-03,\n", - " 2.17082226e-03, 2.19548996e-03, 2.21799170e-03, 2.23830220e-03,\n", - " 2.25639539e-03, 2.27224441e-03, 2.28582155e-03, 2.29709827e-03,\n", - " 2.30604512e-03, 2.31263176e-03, 2.31682691e-03, 2.31859829e-03,\n", - " 2.31791266e-03, 2.31473571e-03, 2.30903208e-03, 2.30076526e-03,\n", - " 2.28989763e-03, 2.27639036e-03, 2.26020337e-03, 2.24129530e-03,\n", - " 2.21962347e-03, 2.19514380e-03, 2.16781076e-03, 2.13757734e-03,\n", - " 2.10439497e-03, 2.06821345e-03, 2.02898089e-03, 1.98664364e-03,\n", - " 1.94114621e-03, 1.89243121e-03, 1.84043924e-03, 1.78510882e-03,\n", - " 1.72637627e-03, 1.66417567e-03, 1.59843868e-03, 1.52909449e-03,\n", - " 1.45606969e-03, 1.37928810e-03, 1.29867071e-03, 1.21413550e-03,\n", - " 1.12559730e-03, 1.03296763e-03, 9.36154537e-04, 8.35062432e-04,\n", - "...\n", - " -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n", - " -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n", - " -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n", - " -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n", - " -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n", - " -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n", - " -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n", - " -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n", - " -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n", - " -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n", - " -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n", - " -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n", - " -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n", - " -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n", - " -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n", - " -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n", - " -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n", - " 9.12143589e-03, 2.33356115e-02, 3.93212119e-02, 5.77079105e-02,\n", - " 7.94629069e-02, 1.06185107e-01, 1.40789920e-01, 1.89418143e-01,\n", - " 2.68513569e-01, 4.52523697e-01, nan])\n", + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., nan])\n", "Coordinates:\n", " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 13, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index e58e575b8..ca96eca38 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -72,7 +72,11 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) if (tp%status(j) == ACTIVE) THEN - dx(:) = tp%xh(:,j) - pl%xh(:,i) + if (lbeg) then + dx(:) = tp%xh(:,j) - pl%xbeg(:,i) + else + dx(:) = tp%xh(:,j) - pl%xend(:,i) + end if rji2 = dot_product(dx(:), dx(:)) rlim2 = (pl%radius(i))**2 if (rji2 > rlim2) then From c42ae1ab88952933cb1700e27518ead0a0f13080 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 08:13:40 -0400 Subject: [PATCH 09/29] Removed radius overlap check from acceleration subtraction code until I make this more generalizeable --- src/symba/symba_kick.f90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index ca96eca38..140eb0072 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -29,14 +29,14 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) 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 + !rlim2 = (pl%radius(i) + pl%radius(j))**2 + !if (rji2 > rlim2) then irij3 = 1.0_DP / (rji2 * sqrt(rji2)) faci = pl%Gmass(i) * irij3 facj = pl%Gmass(j) * irij3 pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) - end if + !end if end associate end do call helio_kick_getacch_pl(pl, system, param, t, lbeg) @@ -78,11 +78,11 @@ 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 + !rlim2 = (pl%radius(i))**2 + !if (rji2 > rlim2) then fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - end if + !end if end IF end associate end do From c650865bad95580444772119da42df16a28e10b9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 10:39:12 -0400 Subject: [PATCH 10/29] Added recursion level to collision check method call --- src/modules/symba_classes.f90 | 38 +++++++++++++++++++++++++++------ src/symba/symba_collision.f90 | 40 +++++++++++++++++++++++++++++++++++ src/symba/symba_discard.f90 | 2 ++ src/symba/symba_step.f90 | 35 +++++++++++++++--------------- 4 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 src/symba/symba_collision.f90 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 72fb06ae7..86ccb38a2 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -107,7 +107,7 @@ module symba_classes private procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle end type symba_tp @@ -123,6 +123,7 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains + procedure, public :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays @@ -135,11 +136,12 @@ module symba_classes !******************************************************************************************************************************* !> SyMBA class for tracking pl-pl close encounters in a step type, public, extends(symba_pltpenc) :: symba_plplenc - real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter - real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter + real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter + real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter + real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter + real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains + procedure, public :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc @@ -163,6 +165,27 @@ module symba_classes end type symba_nbody_system interface + + module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_pltpenc + + module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_plplenc + module subroutine symba_discard_pl(self, system, param) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none @@ -345,11 +368,12 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, ireci) + module recursive subroutine symba_step_recur_system(self, param, t, ireci) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B), value, intent(in) :: ireci !! input recursion level + real(DP), value :: t + integer(I4B), value :: ireci !! input recursion level end subroutine symba_step_recur_system module subroutine symba_step_reset_system(self) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 new file mode 100644 index 000000000..70a4a39c6 --- /dev/null +++ b/src/symba/symba_collision.f90 @@ -0,0 +1,40 @@ +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 + !! + !! Check for merger between massive bodies in SyMBA. If the user has turned on the FRAGMENTATION feature, it will call the + !! symba_regime subroutine to determine what kind of collision will occur. + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + 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 + !! + !! Check for merger between massive bodies and test particles in SyMBA + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_merge_tp.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_pltpenc + +end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 8bafdb2b5..a71ee747a 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -19,6 +19,8 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + call discard_tp(self, system, param) + return end subroutine symba_discard_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 594088a9d..4e7082c4b 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -71,7 +71,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == -1)) - call system%recursive_step(param, 0) + call system%recursive_step(param, t, 0) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) @@ -87,7 +87,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) return end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, ireci) + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -99,9 +99,10 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B), value, intent(in) :: ireci !! input recursion level + real(DP), value :: t + integer(I4B), value :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, nloops, sgn + integer(I4B) :: i, j, irecp, nloops real(DP) :: dtl, dth real(DP), dimension(NDIM) :: xr, vr logical :: lencounter @@ -127,27 +128,27 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) end if do j = 1, nloops lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) - sgn = 1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, 1) + call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then - sgn = -1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, -1) + call pltpenc_list%kick(system, dth, irecp, -1) end if call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) - if (lencounter) call system%recursive_step(param, irecp) + if (lencounter) call system%recursive_step(param, t+dth,irecp) - sgn = 1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, 1) + call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then - sgn = -1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, -1) + call pltpenc_list%kick(system, dth, irecp, -1) + end if + if (param%lclose) then + call plplenc_list%collision_check(system, param, t+dtl, dtl, ireci) + call pltpenc_list%collision_check(system, param, t+dtl, dtl, ireci) end if associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & plind2 => plplenc_list%index2(1:plplenc_list%nenc), & From 6e6c0f1d3481d72f93a5a2553e9559085c199322 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:11:30 -0400 Subject: [PATCH 11/29] Restructured orbel subroutines. Consolidated them into the single submodule file orbel.f90 and put the explicit interfaces back. Added an elemental function for checking collisions between encountering bodies. --- src/modules/swiftest_classes.f90 | 19 +- src/orbel/{orbel_el2xv.f90 => orbel.f90} | 347 ++++++++++++++++++++++- src/orbel/orbel_scget.f90 | 27 -- src/orbel/orbel_xv2aeq.f90 | 57 ---- src/orbel/orbel_xv2aqt.f90 | 100 ------- src/orbel/orbel_xv2el.f90 | 142 ---------- src/symba/symba_collision.f90 | 45 ++- 7 files changed, 398 insertions(+), 339 deletions(-) rename src/orbel/{orbel_el2xv.f90 => orbel.f90} (65%) delete mode 100644 src/orbel/orbel_scget.f90 delete mode 100644 src/orbel/orbel_xv2aeq.f90 delete mode 100644 src/orbel/orbel_xv2aqt.f90 delete mode 100644 src/orbel/orbel_xv2el.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 417138122..313893e5d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -661,16 +661,23 @@ end subroutine orbel_scget module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, e, q + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: e !! eccentricity + real(DP), intent(out) :: q !! periapsis end subroutine orbel_xv2aeq module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, q, capm, tperi + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: q !! periapsis + real(DP), intent(out) :: capm !! mean anomaly + real(DP), intent(out) :: tperi !! time of pericenter passage end subroutine orbel_xv2aqt module subroutine orbel_xv2el_vec(self, cb) diff --git a/src/orbel/orbel_el2xv.f90 b/src/orbel/orbel.f90 similarity index 65% rename from src/orbel/orbel_el2xv.f90 rename to src/orbel/orbel.f90 index 3f1a81fe9..850b643f1 100644 --- a/src/orbel/orbel_el2xv.f90 +++ b/src/orbel/orbel.f90 @@ -1,11 +1,15 @@ -submodule (swiftest_classes) s_orbel_el2xv +submodule (swiftest_classes) s_orbel use swiftest contains - module procedure orbel_el2xv_vec + module subroutine orbel_el2xv_vec(self, cb) !! author: David A. Minton !! !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body objec + ! Internals integer(I4B) :: i if (self%nbody == 0) return @@ -15,7 +19,7 @@ call orbel_el2xv(self%mu(i), self%a(i), self%e(i), self%inc(i), self%capom(i), & self%omega(i), self%capm(i), self%xh(:, i), self%vh(:, i)) end do - end procedure orbel_el2xv_vec + end subroutine orbel_el2xv_vec pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) !! author: David A. Minton @@ -118,6 +122,33 @@ 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 + !! + !! Efficiently compute the sine and cosine of an input angle + !! Input angle must be in radians + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_scget.f90 + !! Adapted from Hal Levison's Swift routine orbel_scget.f + implicit none + ! Arguments + real(DP), intent(in) :: angle + real(DP), intent(out) :: sx, cx + ! Internals + integer(I4B) :: nper + real(DP) :: x + + nper = angle / TWOPI + x = angle - nper * TWOPI + if (x < 0.0_DP) x = x + TWOPI + sx = sin(x) + cx = sqrt(1.0_DP - sx**2) + if ((x > PIBY2) .and. (x < PI3BY2)) cx = -cx + + return + + end subroutine orbel_scget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -207,8 +238,6 @@ real(DP) pure function orbel_flon(e,icapn) ! set iflag nonzero if capn < 0., in which case solve for -capn ! and change the sign of the final answer for f. ! Begin with a reasonable guess based on solving the cubic for small F - - a = 6 * ( e - 1.d0) / e b = -6 * capn / e sq = SQRT(0.25_DP * b**2 + a**3 / 27._DP) @@ -657,5 +686,311 @@ 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 + !! + !! Compute semimajor axis, eccentricity, and pericentric distance from relative Cartesian position and velocity + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aeq.f90 + !! Adapted from Luke Dones' Swift routine orbel_xv2aeq.f + implicit none + !! Arguments + real(DP), intent(in) :: mu + real(DP), dimension(:), intent(in) :: x, v + real(DP), intent(out) :: a, e, q + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, energy, fac + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + e = 0.0_DP + q = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec(:) = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + if (h2 == 0.0_DP) return + energy = 0.5_DP * v2 - mu / r + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = PARABOLA + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) e = sqrt(fac) + q = a * (1.0_DP - e) + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + q = a + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + q = a * (1.0_DP - e) + end select + + return + + end subroutine orbel_xv2aeq + + module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) + !! author: David A. Minton + !! + !! Compute semimajor axis, pericentric distance, mean anomaly, and time to nearest pericenter passage from + !! relative Cartesian position and velocity + !! tperi > 0 means nearest pericenter passage is in the future + !! tperi < 0 means nearest pericenter passage is in the past + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aqt.f90 + implicit none + ! Arguments + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: q !! periapsis + real(DP), intent(out) :: capm !! mean anomaly + real(DP), intent(out) :: tperi !! time of pericenter passage + ! Internals + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, rdotv, energy, fac, w, face, cape, e, tmpf, capf, mm + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + q = 0.0_DP + capm = 0.0_DP + tperi = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec(:) = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + if (h2 == 0.0_DP) return + rdotv = dot_product(x(:), v(:)) + energy = 0.5_DP * v2 - mu / r + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = PARABOLA + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) then + e = sqrt(fac) + cape = 0.0_DP + face = (a - r) / (a * e) + if (face < -1.0_DP) then + cape = PI + else if (face < 1.0_DP) then + cape = acos(face) + end if + if (rdotv < 0.0_DP) cape = TWOPI - cape + else + e = 0.0_DP + cape = 0.0_DP + end if + capm = cape - e * sin(cape) + q = a * (1.0_DP - e) + mm = sqrt(mu / a**3) + if (capm < PI) then + tperi = -1.0_DP * capm / mm + else + tperi = -1.0_DP * (capm - TWOPI) / mm + end if + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + w = 0.0_DP + fac = 2 * a / r - 1.0_DP + if (fac < -1.0_DP) then + w = PI + else if (fac < 1.0_DP) then + w = acos(fac) + end if + if (rdotv < 0.0_DP) w = TWOPI - w + tmpf = tan(0.5_DP * w) + capm = tmpf*(1.0_DP + tmpf * tmpf / 3.0_DP) + q = a + mm = sqrt(0.5_DP * mu / q**3) + tperi = -1.0_DP * capm / mm + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + tmpf = (a - r) / (a * e) + if (tmpf < 1.0_DP) tmpf = 1.0_DP + capf = log(tmpf + sqrt(tmpf * tmpf - 1.0_DP)) + if (rdotv < 0.0_DP) capf = -capf + capm = e * sinh(capf) - capf + q = a * (1.0_DP - e) + mm = sqrt(-mu / a**3) + tperi = -1.0_DP * capm / mm + end select + + return + + end subroutine orbel_xv2aqt + + + module subroutine orbel_xv2el_vec(self, cb) + !! author: David A. Minton + !! + !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + ! internals + integer(I4B) :: i + + if (self%nbody == 0) return + call self%set_mu(cb) + !do concurrent (i = 1:self%nbody) + do i = 1, self%nbody + call orbel_xv2el(self%mu(i), self%xh(:, i), self%vh(:, i), self%a(i), self%e(i), self%inc(i), & + self%capom(i), self%omega(i), self%capm(i)) + end do + end subroutine orbel_xv2el_vec + + pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) + !! author: David A. Minton + !! + !! Compute osculating orbital elements from relative Cartesian position and velocity + !! All angular measures are returned in radians + !! If inclination < TINY, longitude of the ascending node is arbitrarily set to 0 + !! + !! If eccentricity < sqrt(TINY), argument of pericenter is arbitrarily set to 0 + !! + !! References: Danby, J. M. A. 1988. Fundamentals of Celestial Mechanics, (Willmann-Bell, Inc.), 201 - 206. + !! Fitzpatrick, P. M. 1970. Principles of Celestial Mechanics, (Academic Press), 69 - 73. + !! Roy, A. E. 1982. Orbital Motion, (Adam Hilger, Ltd.), 75 - 95 + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2el.f90 + !! Adapted from Martin Duncan's Swift routine orbel_xv2el.f + implicit none + real(DP), intent(in) :: mu + real(DP), dimension(:), intent(in) :: x, v + real(DP), intent(out) :: a, e, inc, capom, omega, capm + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, h, rdotv, energy, fac, u, w, cw, sw, face, cape, tmpf, capf + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + e = 0.0_DP + inc = 0.0_DP + capom = 0.0_DP + omega = 0.0_DP + capm = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + h = sqrt(h2) + if (h2 == 0.0_DP) return + rdotv = dot_product(x(:), v(:)) + energy = 0.5_DP * v2 - mu / r + fac = hvec(3) / h + if (fac < -1.0_DP) then + inc = PI + else if (fac < 1.0_DP) then + inc = acos(fac) + end if + fac = sqrt(hvec(1)**2 + hvec(2)**2) / h + if (fac**2 < VSMALL) then + u = atan2(x(2), x(1)) + if (hvec(3) < 0.0_DP) u = -u + else + capom = atan2(hvec(1), -hvec(2)) + u = atan2(x(3) / sin(inc), x(1) * cos(capom) + x(2) * sin(capom)) + end if + if (capom < 0.0_DP) capom = capom + TWOPI + if (u < 0.0_DP) u = u + TWOPI + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = parabola + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) then + e = sqrt(fac) + cape = 0.0_DP + face = (a - r) / (a * e) + if (face < -1.0_DP) then + cape = PI + else if (face < 1.0_DP) then + cape = acos(face) + end if + if (rdotv < 0.0_DP) cape = TWOPI - cape + fac = 1.0_DP - e * cos(cape) + cw = (cos(cape) - e) / fac + sw = sqrt(1.0_DP - e**2) * sin(cape) / fac + w = atan2(sw, cw) + if (w < 0.0_DP) w = w + TWOPI + else + cape = u + w = u + end if + capm = cape - e * sin(cape) + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + w = 0.0_DP + fac = 2 * a / r - 1.0_DP + if (fac < -1.0_DP) then + w = PI + else if (fac < 1.0_DP) then + w = acos(fac) + end if + if (rdotv < 0.0_DP) w = TWOPI - w + tmpf = tan(0.5_DP * w) + capm = tmpf * (1.0_DP + tmpf * tmpf / 3.0_DP) + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + tmpf = max((a - r) / (a * e), 1.0_DP) + capf = log(tmpf + sqrt(tmpf**2 - 1.0_DP)) + if (rdotv < 0.0_DP) capf = -capf + fac = e * cosh(capf) - 1.0_DP + cw = (e - cosh(capf)) / fac + sw = sqrt(e * e - 1.0_DP) * sinh(capf) / fac + w = atan2(sw, cw) + if (w < 0.0_DP) w = w + TWOPI + capm = e * sinh(capf) - capf + end select + omega = u - w + if (omega < 0.0_DP) omega = omega + TWOPI + + return + end subroutine orbel_xv2el -end submodule s_orbel_el2xv +end submodule s_orbel diff --git a/src/orbel/orbel_scget.f90 b/src/orbel/orbel_scget.f90 deleted file mode 100644 index 0cdb67c72..000000000 --- a/src/orbel/orbel_scget.f90 +++ /dev/null @@ -1,27 +0,0 @@ -submodule (swiftest_classes) s_orbel_scget - use swiftest -contains - module procedure orbel_scget - !! author: David A. Minton - !! - !! Efficiently compute the sine and cosine of an input angle - !! Input angle must be in radians - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_scget.f90 - !! Adapted from Hal Levison's Swift routine orbel_scget.f - implicit none - integer(I4B) :: nper - real(DP) :: x - - ! executable code - nper = angle / TWOPI - x = angle - nper * TWOPI - if (x < 0.0_DP) x = x + TWOPI - sx = sin(x) - cx = sqrt(1.0_DP - sx**2) - if ((x > PIBY2) .and. (x < PI3BY2)) cx = -cx - - return - - end procedure orbel_scget -end submodule s_orbel_scget diff --git a/src/orbel/orbel_xv2aeq.f90 b/src/orbel/orbel_xv2aeq.f90 deleted file mode 100644 index 8338d6559..000000000 --- a/src/orbel/orbel_xv2aeq.f90 +++ /dev/null @@ -1,57 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2aeq - use swiftest -contains - module procedure orbel_xv2aeq - !! author: David A. Minton - !! - !! Compute semimajor axis, eccentricity, and pericentric distance from relative Cartesian position and velocity - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aeq.f90 - !! Adapted from Luke Dones' Swift routine orbel_xv2aeq.f - implicit none - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, energy, fac - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - e = 0.0_DP - q = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec(:) = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - if (h2 == 0.0_DP) return - energy = 0.5_DP * v2 - mu / r - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = PARABOLA - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) e = sqrt(fac) - q = a * (1.0_DP - e) - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - q = a - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - q = a * (1.0_DP - e) - end select - - return - - end procedure orbel_xv2aeq -end submodule s_orbel_xv2aeq diff --git a/src/orbel/orbel_xv2aqt.f90 b/src/orbel/orbel_xv2aqt.f90 deleted file mode 100644 index 3c8bf3f3e..000000000 --- a/src/orbel/orbel_xv2aqt.f90 +++ /dev/null @@ -1,100 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2aqt - use swiftest -contains - module procedure orbel_xv2aqt ! (mu, px, py, pz, vx, vy, vz, a, q, capm, tperi - !! author: David A. Minton - !! - !! Compute semimajor axis, pericentric distance, mean anomaly, and time to nearest pericenter passage from - !! relative Cartesian position and velocity - !! tperi > 0 means nearest pericenter passage is in the future - !! tperi < 0 means nearest pericenter passage is in the past - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aqt.f90 - implicit none - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, rdotv, energy, fac, w, face, cape, e, tmpf, capf, mm - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - q = 0.0_DP - capm = 0.0_DP - tperi = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec(:) = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - if (h2 == 0.0_DP) return - rdotv = dot_product(x(:), v(:)) - energy = 0.5_DP * v2 - mu / r - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = PARABOLA - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) then - e = sqrt(fac) - cape = 0.0_DP - face = (a - r) / (a * e) - if (face < -1.0_DP) then - cape = PI - else if (face < 1.0_DP) then - cape = acos(face) - end if - if (rdotv < 0.0_DP) cape = TWOPI - cape - else - e = 0.0_DP - cape = 0.0_DP - end if - capm = cape - e * sin(cape) - q = a * (1.0_DP - e) - mm = sqrt(mu / a**3) - if (capm < PI) then - tperi = -1.0_DP * capm / mm - else - tperi = -1.0_DP * (capm - TWOPI) / mm - end if - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - w = 0.0_DP - fac = 2 * a / r - 1.0_DP - if (fac < -1.0_DP) then - w = PI - else if (fac < 1.0_DP) then - w = acos(fac) - end if - if (rdotv < 0.0_DP) w = TWOPI - w - tmpf = tan(0.5_DP * w) - capm = tmpf*(1.0_DP + tmpf * tmpf / 3.0_DP) - q = a - mm = sqrt(0.5_DP * mu / q**3) - tperi = -1.0_DP * capm / mm - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - tmpf = (a - r) / (a * e) - if (tmpf < 1.0_DP) tmpf = 1.0_DP - capf = log(tmpf + sqrt(tmpf * tmpf - 1.0_DP)) - if (rdotv < 0.0_DP) capf = -capf - capm = e * sinh(capf) - capf - q = a * (1.0_DP - e) - mm = sqrt(-mu / a**3) - tperi = -1.0_DP * capm / mm - end select - - return - - end procedure orbel_xv2aqt -end submodule s_orbel_xv2aqt diff --git a/src/orbel/orbel_xv2el.f90 b/src/orbel/orbel_xv2el.f90 deleted file mode 100644 index 434925c7d..000000000 --- a/src/orbel/orbel_xv2el.f90 +++ /dev/null @@ -1,142 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2el - use swiftest -contains - - module procedure orbel_xv2el_vec - !! author: David A. Minton - !! - !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. - implicit none - integer(I4B) :: i - - if (self%nbody == 0) return - call self%set_mu(cb) - !do concurrent (i = 1:self%nbody) - do i = 1, self%nbody - call orbel_xv2el(self%mu(i), self%xh(:, i), self%vh(:, i), self%a(i), self%e(i), self%inc(i), & - self%capom(i), self%omega(i), self%capm(i)) - end do - end procedure orbel_xv2el_vec - - pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) - !! author: David A. Minton - !! - !! Compute osculating orbital elements from relative Cartesian position and velocity - !! All angular measures are returned in radians - !! If inclination < TINY, longitude of the ascending node is arbitrarily set to 0 - !! - !! If eccentricity < sqrt(TINY), argument of pericenter is arbitrarily set to 0 - !! - !! References: Danby, J. M. A. 1988. Fundamentals of Celestial Mechanics, (Willmann-Bell, Inc.), 201 - 206. - !! Fitzpatrick, P. M. 1970. Principles of Celestial Mechanics, (Academic Press), 69 - 73. - !! Roy, A. E. 1982. Orbital Motion, (Adam Hilger, Ltd.), 75 - 95 - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2el.f90 - !! Adapted from Martin Duncan's Swift routine orbel_xv2el.f - implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, e, inc, capom, omega, capm - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, h, rdotv, energy, fac, u, w, cw, sw, face, cape, tmpf, capf - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - e = 0.0_DP - inc = 0.0_DP - capom = 0.0_DP - omega = 0.0_DP - capm = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - h = sqrt(h2) - if (h2 == 0.0_DP) return - rdotv = dot_product(x(:), v(:)) - energy = 0.5_DP * v2 - mu / r - fac = hvec(3) / h - if (fac < -1.0_DP) then - inc = PI - else if (fac < 1.0_DP) then - inc = acos(fac) - end if - fac = sqrt(hvec(1)**2 + hvec(2)**2) / h - if (fac**2 < VSMALL) then - u = atan2(x(2), x(1)) - if (hvec(3) < 0.0_DP) u = -u - else - capom = atan2(hvec(1), -hvec(2)) - u = atan2(x(3) / sin(inc), x(1) * cos(capom) + x(2) * sin(capom)) - end if - if (capom < 0.0_DP) capom = capom + TWOPI - if (u < 0.0_DP) u = u + TWOPI - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = parabola - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) then - e = sqrt(fac) - cape = 0.0_DP - face = (a - r) / (a * e) - if (face < -1.0_DP) then - cape = PI - else if (face < 1.0_DP) then - cape = acos(face) - end if - if (rdotv < 0.0_DP) cape = TWOPI - cape - fac = 1.0_DP - e * cos(cape) - cw = (cos(cape) - e) / fac - sw = sqrt(1.0_DP - e**2) * sin(cape) / fac - w = atan2(sw, cw) - if (w < 0.0_DP) w = w + TWOPI - else - cape = u - w = u - end if - capm = cape - e * sin(cape) - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - w = 0.0_DP - fac = 2 * a / r - 1.0_DP - if (fac < -1.0_DP) then - w = PI - else if (fac < 1.0_DP) then - w = acos(fac) - end if - if (rdotv < 0.0_DP) w = TWOPI - w - tmpf = tan(0.5_DP * w) - capm = tmpf * (1.0_DP + tmpf * tmpf / 3.0_DP) - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - tmpf = max((a - r) / (a * e), 1.0_DP) - capf = log(tmpf + sqrt(tmpf**2 - 1.0_DP)) - if (rdotv < 0.0_DP) capf = -capf - fac = e * cosh(capf) - 1.0_DP - cw = (e - cosh(capf)) / fac - sw = sqrt(e * e - 1.0_DP) * sinh(capf) / fac - w = atan2(sw, cw) - if (w < 0.0_DP) w = w + TWOPI - capm = e * sinh(capf) - capf - end select - omega = u - w - if (omega < 0.0_DP) omega = omega + TWOPI - - return - end subroutine orbel_xv2el -end submodule s_orbel_xv2el diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 70a4a39c6..1a44b55ce 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -11,6 +11,7 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec !! !! Adapted from Hal Levison's Swift routine symba5_merge.f implicit none + ! Arguments class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -19,7 +20,6 @@ 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 !! @@ -29,6 +29,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec !! !! Adapted from Hal Levison's Swift routine symba5_merge.f implicit none + ! Arguments class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -37,4 +38,46 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level 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 + !! + !! Check for a merger between a single pair of particles + !! + !! Adapted from David E. Kaufmann's Swifter routines symba_merge_tp.f90 and symba_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + ! Arguments + real(DP), intent(in) :: xr, yr, zr !! Relative position vector components + real(DP), intent(in) :: vxr, vyr, vzr !! Relative velocity vector components + real(DP), intent(in) :: Gmtot !! Sum of G*mass of colliding bodies + real(DP), intent(in) :: rlim !! Collision limit - Typically the sum of the radii of colliding bodies + real(DP), intent(in) :: dt !! Step size + logical, intent(in) :: lvdotr !! Logical flag indicating that these two bodies are approaching in the current substep + ! Result + logical :: lcollision !! Logical flag indicating whether these two bodies will collide or not + ! Internals + real(DP) :: r2, rlim2, a, e, q, vdotr, tcr2, dt2 + + r2 = xr**2 + yr**2 + zr**2 + rlim2 = rlim**2 + + if (r2 <= rlim2) then ! checks if bodies are actively colliding in this time step + lcollision = .true. + else ! if they are not actively colliding in this time step, checks if they are going to collide next time step based on velocities and q + lcollision = .false. + vdotr = xr * vxr + yr * vyr + zr * vzr + if (lvdotr .and. (vdotr > 0.0_DP)) then + tcr2 = r2 / (vxr**2 + vyr**2 + vzr**2) + dt2 = dt**2 + if (tcr2 <= dt2) then + call orbel_xv2aeq(Gmtot, [xr, yr, zr], [vxr, vyr, vzr], a, e, q) + lcollision = (q < rlim) + end if + end if + end if + return + end function symba_collision_check_one + + end submodule s_symba_collision \ No newline at end of file From 6e37462eb32303ff468ee569696b5d232c89136a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:47:03 -0400 Subject: [PATCH 12/29] Enabled test particle/massive body collisions. --- src/modules/swiftest_globals.f90 | 1 + src/symba/symba_collision.f90 | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index a1f0d7511..5ec55f6c6 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -86,6 +86,7 @@ module swiftest_globals integer(I4B), parameter :: SUPERCATASTROPHIC = -10 integer(I4B), parameter :: GRAZE_AND_MERGE = -11 integer(I4B), parameter :: HIT_AND_RUN = -12 + integer(I4B), parameter :: COLLISION = -13 !>Symbolic names for collisional outcomes from collresolve_resolve: integer(I4B), parameter :: COLLRESOLVE_REGIME_MERGE = 1 diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 1a44b55ce..a1662b661 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -36,6 +36,41 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec real(DP), intent(in) :: t !! current time real(DP), intent(in) :: dt !! step size integer(I4B), intent(in) :: irec !! Current recursion level + ! Internals + logical, dimension(:), allocatable :: lcollision, mask + real(DP), dimension(NDIM) :: xr, vr + integer(I4B) :: k + + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1(1:self%nenc), tpind => self%index2(1:self%nenc)) + allocate(lcollision(npltpenc), mask(npltpenc)) + mask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) .and. (pl%levelg(plind) >= irec) .and. (tp%levelg(tpind) >= irec)) + lcollision(:) = .false. + do concurrent(k = 1:npltpenc, mask(k)) + associate(i => plind(k), j => tpind(k)) + xr(:) = pl%xh(:, i) - tp%xh(:, j) + vr(:) = pl%vb(:, i) - tp%vb(:, j) + lcollision(i) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) + end associate + end do + + if (any(lcollision(:))) then + where(lcollision(1:npltpenc)) + pltpenc_list%status(1:npltpenc) = COLLISION + tp%status(tpind(1:npltpenc)) = DISCARDED_PLR + end where + do k = 1, npltpenc + if (pltpenc_list%status(k) /= COLLISION) cycle + write(*,*) 'Test particle ',tp%id(tpind(k)), ' collided with massive body ',pl%id(plind(k)), ' at time ',t + end do + end if + 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) From 9ddf1e2ae90696a471ffcd842f8933a98798bd66 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:57:42 -0400 Subject: [PATCH 13/29] Removed unnecessary symba_discard_tp subroutine. Flag collided bodies for discard to trigger base discard method. --- src/modules/symba_classes.f90 | 9 --------- src/symba/symba_collision.f90 | 1 + src/symba/symba_discard.f90 | 12 ------------ 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 86ccb38a2..0a6dcb290 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -105,7 +105,6 @@ module symba_classes integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains private - procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle @@ -194,14 +193,6 @@ module subroutine symba_discard_pl(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_pl - module subroutine symba_discard_tp(self, system, param) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_discard_tp - module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) implicit none real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index a1662b661..59f43c69c 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -61,6 +61,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec where(lcollision(1:npltpenc)) pltpenc_list%status(1:npltpenc) = COLLISION tp%status(tpind(1:npltpenc)) = DISCARDED_PLR + tp%ldiscard(tpind(1:npltpenc)) = .true. end where do k = 1, npltpenc if (pltpenc_list%status(k) /= COLLISION) cycle diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index a71ee747a..3f8ada6fe 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -12,16 +12,4 @@ module subroutine symba_discard_pl(self, system, param) return end subroutine symba_discard_pl - module subroutine symba_discard_tp(self, system, param) - implicit none - ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - call discard_tp(self, system, param) - - return - end subroutine symba_discard_tp - end submodule s_symba_discard \ No newline at end of file From 6d84eeb1c22beb1ef83d7c11c6bb05f0e07b6c09 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 12:00:56 -0400 Subject: [PATCH 14/29] Updated test with successful run --- .../swiftest_vs_swifter.ipynb | 112 ++++++++---------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 3016031e3..71a2c4da6 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 1.355e-01\n", + "Reading in time 1.348e-01\n", "Creating Dataset\n", - "Successfully converted 199 output frames.\n", + "Successfully converted 198 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 6, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -103,7 +103,7 @@ } ], "source": [ - "swiftdiff['px'].plot.line(x=\"time (y)\")" + "swiftdiff['vx'].plot.line(x=\"time (y)\")" ] }, { @@ -465,41 +465,33 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    -       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0., nan])\n",
    +       "
    <xarray.DataArray 'vx' (time (y): 198)>\n",
    +       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
            "Coordinates:\n",
    -       "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ - "\n", - "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., nan])\n", + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", - " id int64 100\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" + " id float64 100.0\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348" ] }, "execution_count": 7, From 01413ddaafe43ac6e524cd687ddec23bb20c638a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 12:10:05 -0400 Subject: [PATCH 15/29] Working on adding Rhill to initial condition generator --- .../9pl_18tp_encounters/init_cond.py | 1 + python/swiftest/swiftest/init_cond.py | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py index 321c79932..82850837d 100755 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py @@ -37,6 +37,7 @@ sim.param['OUT_STAT'] = "UNKNOWN" sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' +sim.param['RHILL_PRESENT'] = 'YES' sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 6e5048c0f..3316e7fe2 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -121,7 +121,6 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('vx') tlab.append('vy') tlab.append('vz') - plab.append('Rhill') dims = ['time', 'id', 'vec'] t = np.array([0.0]) @@ -193,11 +192,16 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): p11.append(pldata[key].vectors()['vy'][0] * VCONV) p12.append(pldata[key].vectors()['vz'][0] * VCONV) if ispl: - Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) Rpl.append(planetradius[key] * DCONV) GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors - pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + if (param['RHILL_PRESENT'] == 'yes'): + print("We are appending the Hill sphere") + Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + else: + print("Why aren't we appending the Hill sphere?") + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]) plab = tlab.copy() From aed1bc90e2f44783365132a174fe99a04056087f Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 27 Jul 2021 12:16:14 -0400 Subject: [PATCH 16/29] Fixed bug in initial conditions function for checking if RHILL_PRESENT is turned on --- .../9pl_18tp_encounters/cb.in | 2 +- .../9pl_18tp_encounters/cb.swiftest.in | 2 +- .../9pl_18tp_encounters/param.swifter.in | 2 +- .../9pl_18tp_encounters/param.swiftest.in | 1 + .../9pl_18tp_encounters/pl.in | 48 +++++++------- .../9pl_18tp_encounters/pl.swifter.in | 50 +++++++-------- .../9pl_18tp_encounters/pl.swiftest.in | 48 +++++++------- .../9pl_18tp_encounters/tp.in | 64 +++++++++---------- python/swiftest/swiftest/init_cond.py | 4 +- 9 files changed, 110 insertions(+), 111 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in index 81c636655..673a79459 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in @@ -1,5 +1,5 @@ 0 -0.00029591220819207774 +0.0002959122081920778 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in index 81c636655..673a79459 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 -0.00029591220819207774 +0.0002959122081920778 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in index aa33eeaa4..d87472e35 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in index 6504c9637..06edc324b 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index bd980fc4b..d85d737f5 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 +1 4.9125474498983625056e-11 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index 701e9a14f..ba4f47b86 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 0.00029591220819207775568 +0 0.00029591220819207776388 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751243077781048702 +1 4.9125474498983625056e-11 0.3870979888395936208 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 0.006759104275397271956 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 0.7233257098327222634 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 0.010044787321379672528 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 1.000013777403204962 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 0.007246743835971885302 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 1.523730802569037035 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 0.35527126534549128905 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 5.2035172582389037643 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 0.4376527512949726007 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 9.581689367400855417 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 0.4695362423191493196 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 19.232766114773518495 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 0.7812870996943599397 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 30.285501702709421323 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index bd980fc4b..d85d737f5 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 +1 4.9125474498983625056e-11 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in index c7cf002d6..e7424ed6f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in @@ -1,49 +1,49 @@ 16 101 -0.33208578766229190915 0.07439013071780828379 -0.02438290851908785084 --0.008988542188201206762 0.028710618792657981169 0.0034094833969203438596 +-0.032410259440139366216 0.30734953478203003163 0.0280888997405028297 +-0.031019262600390007378 -0.0019305604712619159943 0.0029264451427202888868 102 -0.33203966624962866216 0.07434400930514498129 -0.02438290851908785084 --0.014195641132219511543 0.028710618792657981169 0.0034094833969203438596 +-0.032456380852802668713 0.30730341336936678465 0.0280888997405028297 +-0.03622636154440830869 -0.0019305604712619159943 0.0029264451427202888868 103 --0.7187543234391324809 -0.011798260816488121555 0.041316403191083782287 -0.0065615071841567274707 -0.020313576971905909774 -0.00029114855617710840843 +-0.6608419365545701307 -0.28799974456994492655 0.034183953683804932377 +0.014290252347442427075 -0.018635382188272479886 -0.00071410720992500279457 104 --0.71886874402007694407 -0.011912681397432518804 0.041316403191083782287 --0.006132960226534060408 -0.020313576971905909774 -0.00029114855617710840843 +-0.6609563571355145939 -0.2881141651508892787 0.034183953683804932377 +0.0015957849367516391964 -0.018635382188272479886 -0.00071410720992500279457 105 -0.35683111163121072895 -0.9518327808922094624 4.4027442504036787155e-05 -0.022724479262608666269 0.0059737936889703449964 -3.3484113013969089573e-07 +0.5666051762815753623 -0.8427917875260713121 3.8152874628327130158e-05 +0.020893043539853186491 0.009533392738922031109 -5.008237574040859916e-07 106 -0.3567106558193317012 -0.95195323670408849015 4.4027442504036787155e-05 -0.008935598794060913702 0.0059737936889703449964 -3.3484113013969089573e-07 +0.56648472046969633453 -0.84291224333795033985 3.8152874628327130158e-05 +0.0071041630713054347915 0.009533392738922031109 -5.008237574040859916e-07 107 --1.5233391647104730371 0.6724145771476651712 0.051459143378398922164 --0.0020480822268840624331 -0.011607719813367209372 -0.000117479966462153095864 +-1.5854279813093821172 0.50603262218427835784 0.049495356229978339224 +-0.00065310310407921696313 -0.0121364162752466003825 -0.00016278089870573419053 108 --1.5234032495379807859 0.6723504923201574224 0.051459143378398922164 --0.008207040423331847523 -0.011607719813367209372 -0.000117479966462153095864 +-1.585492066136889866 0.50596853735677060904 0.049495356229978339224 +-0.0068120613005270029203 -0.0121364162752466003825 -0.00016278089870573419053 109 -4.050605826355517358 -2.9904269687677218492 -0.078187280837353656526 -0.041279424970441319642 0.006432188574295680597 -0.00012509257442073270106 +4.1112407225284242074 -2.8997027378816566667 -0.07992066204197022239 +0.041146757578404392908 0.006527961423420942065 -0.00012252307659855749943 110 -4.049284028339322994 -2.9917487667839162135 -0.078187280837353656526 --0.032485009432853539924 0.006432188574295680597 -0.00012509257442073270106 +4.109918924512229843 -2.901024535897851031 -0.07992066204197022239 +-0.032617676824890466658 0.006527961423420942065 -0.00012252307659855749943 111 -6.299479995832536261 -7.7058625321556393217 -0.11669919842191249504 -0.02612723553831041573 0.0035242303011843410798 -0.00022097170940726839814 +6.3554898083384054885 -7.6562954388962722874 -0.11978932080537739446 +0.026100461582326782428 0.0035567518157804990653 -0.00022047226166396519348 112 -6.2983790111222752728 -7.70696351686590031 -0.11669919842191249504 --0.01809910222875676239 0.0035242303011843410798 -0.00022097170940726839814 +6.3543888236281445003 -7.6573964236065332756 -0.11978932080537739446 +-0.018125876184740395691 0.0035567518157804990653 -0.00022047226166396519348 113 -14.856321905516212567 13.007829033301401722 -0.14417795763685259391 -0.010478935887110856981 0.0027821364817078499815 4.40781085949555924e-05 +14.819643486317822578 13.046730592886092381 -0.14356031024960910769 +0.010470819978811187617 0.002775224845039696818 4.4157032104701469965e-05 114 -14.855842389541807691 13.007349517326996846 -0.14417795763685259391 --0.015710591190212928187 0.0027821364817078499815 4.40781085949555924e-05 +14.819163970343417702 13.046251076911687505 -0.14356031024960910769 +-0.015718707098512599285 0.002775224845039696818 4.4157032104701469965e-05 115 -29.55768244045575699 -4.6291447957067299868 -0.58590957207831262377 -0.014905509815736753265 0.0031274056019462009859 -7.51415892482447254e-05 +29.56422775190525698 -4.58535534656341337 -0.5869609072731380994 +0.014900806169871520443 0.0031282283842968541462 -7.504927375628088796e-05 116 -29.557216915563323312 -4.6296103205991601115 -0.58590957207831262377 --0.0139657618108195089035 0.0031274056019462009859 -7.51415892482447254e-05 +29.563762227012823303 -4.585820871455843495 -0.5869609072731380994 +-0.013970465456684741726 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 3316e7fe2..995b30194 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -195,12 +195,10 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): Rpl.append(planetradius[key] * DCONV) GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors - if (param['RHILL_PRESENT'] == 'yes'): - print("We are appending the Hill sphere") + if (param['RHILL_PRESENT'] == 'YES'): Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) else: - print("Why aren't we appending the Hill sphere?") pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]) From 6703c5e28230363e9d6a4c7c45e4d9c3fe1a5a1f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:03:50 -0400 Subject: [PATCH 17/29] Added Rhill to initial conditions generator --- .../9pl_18tp_encounters/cb.in | 2 +- .../9pl_18tp_encounters/cb.swiftest.in | 2 +- .../9pl_18tp_encounters/pl.in | 16 +++--- .../9pl_18tp_encounters/pl.swifter.in | 18 +++--- .../9pl_18tp_encounters/pl.swiftest.in | 16 +++--- python/swiftest/swiftest/init_cond.py | 4 +- python/swiftest/swiftest/io.py | 56 +++++++++++++------ 7 files changed, 68 insertions(+), 46 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in index 673a79459..81c636655 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in @@ -1,5 +1,5 @@ 0 -0.0002959122081920778 +0.00029591220819207774 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in index 673a79459..81c636655 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 -0.0002959122081920778 +0.00029591220819207774 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index d85d737f5..cd3c71538 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983625056e-11 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index ba4f47b86..e42b53b68 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 0.00029591220819207776388 +0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983625056e-11 0.3870979888395936208 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 0.7233257098327222634 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 1.000013777403204962 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 1.523730802569037035 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 5.2035172582389037643 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 9.581689367400855417 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 19.232766114773518495 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 30.285501702709421323 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index d85d737f5..cd3c71538 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983625056e-11 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 995b30194..f9a7378c0 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -196,8 +196,8 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors if (param['RHILL_PRESENT'] == 'YES'): - Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) - pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + Rhill.append(pldata[key].elements()['a'][0] * DCONV * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, Rhill, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index aeaf742bb..2dd4ef7b3 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -678,7 +678,10 @@ def swiftest_xr2infile(ds, param, framenum=-1): print(pl.id.count().values, file=plfile) for i in pl.id: pli = pl.sel(id=i) - print(i.values, pli['Mass'].values, file=plfile) + if param['RHILL_PRESENT'] == 'YES': + print(i.values, pli['Mass'].values, pli['Rhill'].values, file=plfile) + else: + print(i.values, pli['Mass'].values, file=plfile) print(pli['Radius'].values, file=plfile) print(pli['px'].values, pli['py'].values, pli['pz'].values, file=plfile) print(pli['vx'].values, pli['vy'].values, pli['vz'].values, file=plfile) @@ -697,36 +700,55 @@ def swiftest_xr2infile(ds, param, framenum=-1): # Now make Swiftest files cbfile = FortranFile(param['CB_IN'], 'w') cbfile.write_record(cbid) - MSun = np.double(1.0) cbfile.write_record(np.double(GMSun)) - cbfile.write_record(np.double(rmin)) + cbfile.write_record(np.double(RSun)) cbfile.write_record(np.double(J2)) cbfile.write_record(np.double(J4)) cbfile.close() plfile = FortranFile(param['PL_IN'], 'w') - plfile.write_record(npl) + npl = pl.id.count().values + plid = pl.id.values + px = pl['px'].values + py = pl['py'].values + pz = pl['pz'].values + vx = pl['vx'].values + vy = pl['vy'].values + vz = pl['vz'].values + mass = pl['Mass'].values + radius = pl['Radius'].values + plfile.write_record(npl) plfile.write_record(plid) - plfile.write_record(p_pl[0]) - plfile.write_record(p_pl[1]) - plfile.write_record(p_pl[2]) - plfile.write_record(v_pl[0]) - plfile.write_record(v_pl[1]) - plfile.write_record(v_pl[2]) + plfile.write_record(px) + plfile.write_record(py) + plfile.write_record(pz) + plfile.write_record(vx) + plfile.write_record(vy) + plfile.write_record(vz) plfile.write_record(mass) + if param['RHILL_PRESENT'] == 'YES': + rhill = pl['Rhill'].values + plfile.write_record(rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(param['TP_IN'], 'w') - ntp = 1 + ntp = tp.id.count().values + tpid = tp.id.values + px = tp['px'].values + py = tp['py'].values + pz = tp['pz'].values + vx = tp['vx'].values + vy = tp['vy'].values + vz = tp['vz'].values tpfile.write_record(ntp) tpfile.write_record(tpid) - tpfile.write_record(p_tp[0]) - tpfile.write_record(p_tp[1]) - tpfile.write_record(p_tp[2]) - tpfile.write_record(v_tp[0]) - tpfile.write_record(v_tp[1]) - tpfile.write_record(v_tp[2]) + tpfile.write_record(px) + tpfile.write_record(py) + tpfile.write_record(pz) + tpfile.write_record(vx) + tpfile.write_record(vy) + tpfile.write_record(vz) else: print(f"{param['IN_TYPE']} is an unknown file type") From bd2e19431e5ed49aad2643a8db3272da9e1b88ff Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:05:36 -0400 Subject: [PATCH 18/29] Fixed bad index bug --- src/symba/symba_collision.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 59f43c69c..b8060829c 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -53,7 +53,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec associate(i => plind(k), j => tpind(k)) xr(:) = pl%xh(:, i) - tp%xh(:, j) vr(:) = pl%vb(:, i) - tp%vb(:, j) - lcollision(i) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) end associate end do From f38d19e3483f2330a3bb3449ac51ac53089e95ca Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:33:24 -0400 Subject: [PATCH 19/29] Updated symba 9pl 18tp example notebook --- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 753 ------------------ .../swiftest_symba_vs_swifter_symba.ipynb | 753 ++++++++++++++++++ 2 files changed, 753 insertions(+), 753 deletions(-) delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb deleted file mode 100644 index d0d223ce7..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ /dev/null @@ -1,753 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import swiftest\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swifter file param.swifter.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swifter simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swifter.in'\n", - "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", - "swiftersim.bin2xr()\n", - "swifterdat = swiftersim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swiftest.in'\n", - "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", - "swiftestsim.bin2xr()\n", - "swiftestdat = swiftestsim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftestdat - swifterdat" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", - "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", - "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAriklEQVR4nO3deZxcdZ3v/9e7qzvpTrqzhy0JJGwicoGBgHhxAUdGYMYfOi6DOoqKIuPoeH9uMDP+HJfxqtfRmfHnwmW4iKgjDx03HBFcccGNBMISMpEshDQB0mRfupPuqs/945xOqitVne6iqk519fv5eNSjz/I9pz59urs+/f1+z/l+FRGYmZkNa8s6ADMzay5ODGZmNoITg5mZjeDEYGZmIzgxmJnZCE4MZmY2ghODlSXpg5K+ki4fK2m3pFzWcY1G0vMkrW7we4akE5/mOVZKuqA2ER1y7oo/R0lHSvqFpF2SPqXEFyVtk/T7esRjE4MTQ4uS9IikF5Vse4OkX433XBHxaER0R0S+dhGOz1g+gCPilxHxjEbFVCsR8ayIuBNGfpDX4X1Kf45XAU8BMyLi3cBzgYuAhRFxbj1isInBicFagqT2rGOYgI4DHoqDT7keBzwSEXvGeyJf/9bixDCJSTpG0jcl9UlaL+lvKpRbnP7H3l503K2StkpaI+ktRWVzkv5O0tq0iWK5pEXpvlMk/Sg9brWkVxUdd5Okz0n6fnrc7ySdkO77RVrsvrQp5C8kXSCpV9I1kp4Avji8reiciyR9K/3+tkj6bIVr0C9pTtG2P5L0lKSOdP1NklalTSx3SDquwnWaKenm9P02SHq/pLai/W9Jz7NL0kOSzkq3PyLpRZIuBv4O+Iv0+7xP0islLS95n3dL+k6FGJZI+nn6Hj8C5pX7OUq6CbgCeF/6Xm8FbgCek65/KD3mzyStkLRd0q8lnV50vkfS638/sCc973lpue1p/BcUlb9T0kck3ZXG90NJxfE9t+jYjZLekG6fKumfJD0q6UlJ10nqSvfNk/Sf6TFbJf2y+JpblSLCrxZ8AY8ALyrZ9gbgV+lyG7Ac+AAwBTgeWAe8ON3/QeAr6fJiIID2dP3nwOeBTuBMoA/443Tfe4EHgGcAAs4A5gLTgY3AG4F24CySZoxnpcfdBGwFzk33fxW4pSj2AE4sWr8AGAI+AUwFutJtven+HHAf8M/pe3cCz61wrX4KvKVo/ZPAdenyS4E1wDPTuN4P/LpcXMDNwHeBnvSa/QG4Mt33SuAx4Jz0upwIHFf6syq+7un61PS6PLNo273Ayyt8L78BPp0e93xg1yg/x5uAfyz3+5GunwVsBp6dXs8r0linFsW9AliUXv8FwBbgUpLfr4vS9flp+TuBtcDJafk7gY+n+45NY3010EHyO3Nmuu9fgFuBOem1/R7wsXTfx4Dr0mM6gOcByvrvb6K/Mg/Arzr9YJM/2t3A9qLXXg4mhmcDj5Yc87fAF9PlAx9QxR8o6YdAHugpOu5jwE3p8mrgsjLx/AXwy5Jt/xv4h3T5JuCGon2XAv9VtF4uMewHOku2DSeG55AkrPYxXKs3Az9Nl0WSwJ6frv+A9MM9XW9Lr+NxxXGRfHDuA04tKvtW4M50+Q7gnaP8rMomhnTbF4CPpsvPAraRfjiXlDuWJFlOL9r27+V+jkXXfLTE8AXgIyXvsRp4QVHcbyradw3w5ZLydwBXpMt3Au8v2vc24Pai371vl/meBOwBTija9hxgfbr8YZJkfGLpsX5V/3KVq7W9NCJmDb9I/hCHHQcck1bBt0vaTtKMceRhznkMsDUidhVt20Dy3yIkiWNtmeOOA55d8n6vBY4qKvNE0fJeoPswsfRFxECFfYuADRExdJhzAPwHSRPKMST/ZQfwy6K4/7Uo5q0kH1YLSs4xj6TmtaFo21iuy1h8CXiNJAGvA74eEfvKlDsG2BYj+wg2lCk3VscB7y75mS1K32fYxpLyrywp/1zg6KIylX7Gla7PfGAasLzonLen2yGp3a0BfihpnaRrx/9tWil3GE1eG0n+6zppnMdtAuZI6ilKDseSNJMMn/cE4MEy7/fziLio2oDLGG1o4I3AsZLaD5ccImK7pB8CryJpMvpapP+Opuf5aER89TCxPAUMknboptvKXZfDOeR7iojfStpP0kzymvRVzuPAbEnTi5LDseXOOUbD3/tHxxjvRpIaw1sqFT7Me5W7E+opoJ+kyfGx0p3p7+C7SRLYs4CfSbo7In5SRQyWco1h8vo9sDPtPOxS0ml8mqRzRjsoIjYCvwY+Jqkz7Yy8kqRPAJIOzI9IOkmJ0yXNBf4TOFnS6yR1pK9zJD1zjPE+SdIPMp7v73Hg45Kmp7GeP0r5fwdeD7w8XR52HfC36YfOcAfzK0sPjuQW0K8DH5XUo6SD+l3A8K2nNwDvkXR2el1OVPlO7CeBxWU6UG8GPgsMRUTZW44jYgOwDPiQpCmSngu8ZJTv+XD+Dbha0rPTmKdL+lNJPRXKfwV4iaQXp79PnUpuCFg4hvf6KvAiSa9KO7HnSjozIgppHP8s6QgASQskvThd/rP0WgrYSdLMmdlt1a3CiWGSSj/IXkLSebye5D+zG4CZYzj81STt1ZuAb5P0E/wo3fdpkg/IH5L8of4foCv9z+5PgMvT457gYMfxWHwQ+FLanPCqwxUu+v5OBB4Fekn6OSq5FTgJeDIi7is6z7fTOG+RtJOkJnRJhXO8g6Q9fB3wK5IEc2N6nm8AH0237QK+Q9KZWuob6dctku4p2v5l4LT062heQ9J/tBX4B5KEUpWIWAa8hSQhbSNpsnnDKOU3ApeRNEn2kdQC3ssYPmci4lGSfqV3p7GvILlxAZK+izXAb9OfwY9Jbm6A5Gf2Y5L+tN8An4/0mRCrng7WmM2sWaW3Z24GzoqIh7OOx1qbawxmE8NfAXc7KVgjuPPZrMlJeoTkTqiXZhuJTRZuSjIzsxHclGRmZiM4MZjVkaTXps9IHK5c3UZVrYaSsav+Mes4LBtODNY0dHC+gOFXSNpTtP68Ks55yPDjJfsvkFRIz79LyeB+b6wy/hGDDQJExFcj4k+qOZ9ZVtz5bE0jvZf9wDAYkgI4IyLW1PmtN0XEwvQhqcuA/5D0u4h46HAHDpOHnbYW4hqDTQiqYuhlSV8mGRLie2mN4H2jvUckvkPyMNep6VO+90raqWQY6A8WxTNcO7hS0qMkI7QODw++PX2/56hkciRJz9LBoceflPR3Fb7f0YavfoOScYF2KRku/bWjXLN/kbQpff2LpKnpvuFhy98tabOkxyvVlCQ9KOklResdSoYlP3O062kTlxODTRSfIBmu+UySp5kXkAwZDsnTsr0kA6sdSfLkbUTE60ieen5JJDOX/a/R3iBNJi8DZpEMHb6HZJiMWcCfAn8l6aUlh72AZHylF5MMwAcwK32/35Scv4fkKd3bSQaiOxE4ZEwfSQuA7wP/SPJ09HuAb0qaL2k68BngkojoAf47yVPC5fw9cB7JNTuDZCyi9xftP4rkSfcFJMOafE7S7DLnuRn4y6L1S4HHI6LS+9oE1xKJQdKN6X89pQO3VXOuC5VMTDL8GijzYWANlDbxvAX4fyNieGTX/0kyvAYkg9cdTTIU9mAkU3yO5z7sY5SM2vkUyTASr4uI1RFxZ0Q8EBGFiLgf+BpJIij2wYjYExH9Y3ifPwOeiIhPRcRAROyKiN+VKfeXwG0RcVv63j8iGQPp0nR/AThNUldEPB4RKyu832uBD0fE5ojoAz5EMjrrsMF0/2BE3EYyrES5qVG/AlwqaUa6/joOPzSHTWAtkRhIxpW/uBYnioifRcSZEXEm8EKSoYEPe1eJ1VW9h17elA5NPif92d8CoGTwuJ8pmZFtB3A1RTOipTYecrbKxjr0dsXhq9NRU/8ijeVxJTPenVLhPMdw6DDgxUNmbykZebbsUOcRsQm4C3i5pFkkY0UdbrRZm8BaIjFExC9IBt46QNIJkm5XMrXkL0f54xnNK4AfRMTemgRq1Soeenl4fomZEdENydDLEfHuiDieZOC8d0n64/TYp/ME57+TDK63KCJmkoy0qpIyUWG5nLEOvT08fPWsotf0iPg4QETckQ5ffjTwXySjj5aziSTJDDs23VaNL5HUZF4J/KbcENjWOloiMVRwPfCOiDibpI3281Wc43KS5gPL0NMcenm8w3UX6yGZlGhA0rlUngdhWB9JM0+l9/tP4ChJ/yPtGO6R9Owy5SoOXy3pSEn/T9rXsI+k+afSMNNfA96f9k3MI+mTqfZZie+QTPX5Tp7GiK02MbRkYpDUTdIp9w1JK0imkDw63ffn6V0Wpa87Ss5xNPDfSKYmtOxVO/Tyx0g+HLdLes843/NtwIcl7SL5UP36aIXTmuVHgbvS9zuvZP8uknmQX0Iy7PjDwIVlzjPa8NVtJJ3tm0hqyS9g5Mx8xf6RpG/ifpLO9HvSbeOW9qF8E1gCfKuac9jE0TJjJUlaDPxnRJyWdpKtjoijD3PYaOd7J0nTxVW1itFsIpP0AeDkiPjLwxa2Ca0lawwRsRNYr3SmLSXOOMxhpV6Nm5HMAJA0h+SW1uuzjsXqryUSg6SvkTQhPCN9aOdKklv1rpR0H7CSpGo+1vMtJrmD5Od1CNdsQpH0FpLmrB+kN3pYi2uZpiQzM6uNlqgxmJlZ7Uz4gb/mzZsXixcvzjoMM7MJZfny5U9FxPxy+yZ8Yli8eDHLli3LOgwzswlF0oZK+9yUZGZmIzgxmJnZCE4MZmY2ghODmZmN4MRgZmYjODGYmdkITgxmZjaCE4OZWRPYfddd7Fu3PuswgBZ4wM3MrBVsvPLNADzzv1ZlHIlrDGZmmYtCIesQRnBiMDPLWGHXrgPLQ1u2ZBhJwonBzCxj+W3bDiwPrFyZYSQJJwYzs4wNbXViMDOzIvntBxPDUN9TGUaSaFhikHSjpM2SHqywX5I+I2mNpPslndWo2MzMsnSgKUkiv3vX6IUboJE1hpuAi0fZfwlwUvq6CvhCA2IyM8vccGLoOHYRhV27M46mgYkhnUR86yhFLgNujsRvgVmSjm5MdGZm2Rnatg1NnUrH/CNG3KGUlWbqY1gAbCxa7023HULSVZKWSVrW19fXkODMzOolv207udmzaevpIb97EtUYxkBltkW5ghFxfUQsjYil8+eXnbLUzGzCyG/dSm7ObNp6ul1jKNELLCpaXwhsyigWM7OGyW/bRvusWeS6XWModSvw+vTupPOAHRHxeNZBmZnVW2HvHtq6e2jr6aGwezcRZRtLGqZhg+hJ+hpwATBPUi/wD0AHQERcB9wGXAqsAfYCb2xUbGZmWSr0D9DW1UmupxvyeWLvXjR9embxNCwxRMSrD7M/gL9uUDhmZk2jMDCAOrto6+4BIL97N20ZJoZmakoyM5uUor+fts5O2nq6ATLvgHZiMDPLUEQkNYauTnIzZgCQd2IwM5vEBgchn09qDN1pjSHjO5OcGMzMMlTYtw8AdXaS60n6GNyUZGY2iRX6+wFo6+yiLU0M+YzHS3JiMDPLUAwMACS3qx5oSnKNwcxs0ir0J4lBnV1o2jSQKOzZk2lMTgxmZhmKgbQpqasTSbRNm+bEYGY2mR2sMXQC0DZ9OnknBjOzyatwoMbQlXzt7qaw24nBzGzSOtD5XFRjcFOSmdkkVq4pyYnBzGwSi32uMZiZWZEDNYa0jyHXPd1DYpiZTWYHbledOjX56hqDmdnkVugfgI4O1NEBODGYmU16hYH+A/0LkCSGGByksH9/ZjE5MZiZZSj6B0oSQzpeUoa1BicGM7MMJZP0dB1YH57S04nBzGySioH+Ax3P4MRgZjbpFfpdYzAzsyKlnc+57jQxZPgsgxODmVmGYmAf6hp5VxK4xmBmNmklNYaipqR0Frd8hvM+OzGYmWXokNtVe2YAUMhw3mcnBjOzDCW3qxY3JU2Dtjbyh5n3Ob9zJ5HP1yUmJwYzswxF/8imJEm09fRQ2Dl6Ynj4BRew+Z8+VZeYnBjMzDISEUmNoXPqiO25nh7yu3ZWPK6wfz/R309u5sy6xOXEYGaWkRgchEJhRI0BoG3G6DWGwo4dAORmzqhLXA1NDJIulrRa0hpJ15bZP1PS9yTdJ2mlpDc2Mj4zs0aK/uH5njtHbM/1zBi1jyF/IDFM8BqDpBzwOeAS4FTg1ZJOLSn218BDEXEGcAHwKUlTGhWjmVkjFQaGp/UsqTH0dI9aYxhODG0zJnhiAM4F1kTEuojYD9wCXFZSJoAeSQK6ga3AUANjNDNrmEgTQ9kawyjPMeR3JP0PE77GACwANhat96bbin0WeCawCXgAeGdEFEpPJOkqScskLevr66tXvGZmdXWwxlCSGGb0UBg1MaRNSbMmfmJQmW1Rsv5iYAVwDHAm8FlJh/SuRMT1EbE0IpbOnz+/1nGamTXEwT6Gkqak7h4Ku3dXfE4hv2M7ALkZE7/zuRdYVLS+kKRmUOyNwLcisQZYD5zSoPjMzBpquMbQVqbGAJUH0ivs3Anp8w710MjEcDdwkqQlaYfy5cCtJWUeBf4YQNKRwDOAdQ2M0cysYQppjaG0KWl4WIxK/Qz57TvIzZiB2urzEd5el7OWERFDkt4O3AHkgBsjYqWkq9P91wEfAW6S9ABJ09M1EfFUo2I0M2ukqFBjaOtJp/eslBh27KCtTh3P0MDEABARtwG3lWy7rmh5E/AnjYzJzCwrhf6087mkjyE3XGPYUf7p5/zOnXW7Iwn85LOZWWYKA2nnc2kfw+xZwMG7j0rld+yoW8czODGYmWUm+ss/4JabPRuA/NYtZY/L79juGoOZWSsq7BvuYxg5iF57mhiGtmwte1x+67YDyaMenBjMzDIS/QOoowO1j+zuVUcHuZkzy9YYCgMDFHbtor2Oz3A5MZiZZSSZpKer7L7c3LkMbd12yPahp5IbNZ0YzMxaUAz00zZ1atl9uTmzyW85tMYwtDkZBqj9iPolhsPerirp2DGea3tEVJ5ZwszMRij0V64xtM+Zy761aw/ZPpSOD9c+b17d4hrLcwxfIhnTqNxYR8MCuAm4uQYxmZlNCoX+/kPGSRqWmzuH/O9/f8j2oafSxFDHpqTDJoaIuLB0m6SjIuKJ+oRkZjY5RP/eQ55hGNY+Zy75HTuIoaERndNDfX2QyzXlXUmvr2kUZmaTUKF/AE2rUGOYMxsiyG/fPmL7UF8f7XPmoFyubnFVmxguk/R2Sc+oaTRmZpNI0pQ0rey+9rlzARgq6YAeeuqpujYjQfWJ4c+BNcDLJN1Qw3jMzCaN6O+v2JTUcdRRAAxuGjk7wdDmvronhqoG0YuIJ4Hb05eZmVWh0N9fsSmpY+FCAAZ7HzuwLSIY3LCBaUuX1jWuqmoMkj4n6aZ02aOhmplVYbSmpNzcuairi8He3gPb8lu2UNi7lynHjvUpgupU25S0n4MT6LywRrGYmU0qhYGBik1JkuhYcAz7HzuYGPZv2ADAlMXH1TWuahPDXmCmpA6gvqnLzKwFxeAgDA7SVqEpCWDKgoUjmpL2b3g02d6kNYatwFrgc8BdtQvHzGxyODCtZ4UH3CDpZxjs7SUigLTGkMvRccwxdY1tXIlB0ixJXwRenm66GahvL4iZWQsanr2trXP0xFDYvfvAswz7N2ygY+EC1NFR19jGlRgiYjvwceBDwO+Ak4Bv1T4sM7PWFv17AUZtSup8xskADKx8KPn6wAN0nnxy3WOr5nbVK4H1EXEHsLzG8ZiZTQqFgfLzPRfrPP0MyOXov2c5U49fwuBjjzHnivoPPFFNYtgGXJ0+9XwfsCIi7q1tWGZmra2wd3i+58qJIdc9nc5TTmHv8nuYsmQJANPOOafusY07MUTExyT9BPgDcCbwfMCJwcxsHApjaEoC6DrrLLZ/4xuovZ22nh6mNqApadx3JUn6MHAZcBHwWET8a82jMjNrcZE2JVUadnvY7Fe9EiLYc9ddzHnDFXUdPG/YuBNDRHwA2Jce+3JJ/1bzqMzMWtxwU5JGaUoCmHrSSRzzT59k9mtezby3vrURoVU3VhJwI/BmYDrw+dqFY2Y2OYy1KQlgxkUXMeOii+od0gHVPuD2NyRJpR1wU5KZ2TiNtSkpC9UmhrVAJ/DdiHh+DeMxM5sUDjQltVBiWAn8FLhS0t01jMfMbFIoDPRDLlf3p5irUW0fwwkkzzNcn341M7NxKOzdS1tXF5KyDuUQ1dYYNkbErSSzuK0a60GSLpa0WtIaSddWKHOBpBWSVkr6eZXxmZk1tcKePbRNn551GGVVW2O4WNIfSEZX3UDSGT0qSbm0/EVAL3C3pFsj4qGiMrNI7nK6OCIelXRElfGZmTW1wp69TZsYqq0xzAKuAd5H8kzDWJwLrImIdRGxH7iF5EG5Yq8BvhURjwJExOYq4zMza2rNXGOoNjF8mOSOpNVAfozHLAA2Fq33ptuKnQzMlnSnpOWSyo4WJekqScskLevr6xtv7GZmmWuJxCDpjOHliOiNiB+ny2X7Csqdosy2KFlvB84G/hR4MfD/STpkYJCIuD4ilkbE0vnz54/x7c3Mmkdhzx7auid4YgDulXS/pPdJWlTFe/UCxcctBDaVKXN7ROyJiKeAXwBnYGbWYgq7d5Ob6DUG4FMkQ2B8HFgv6WeS3jSO4+8GTpK0RNIU4HLg1pIy3wWeJ6ld0jTg2Yzjriczs4miJZqSIuK9EXECyVSeN5AMt339OI4fAt4O3EHyYf/1iFgp6WpJV6dlVgG3A/cDvwduiIgHx/oeZmYTRTMnhjHfrippLvAy4BXAhSR9Bo+O580i4jbgtpJt15WsfxL45HjOa2Y2kcT+/cTg4MRPDMATJDWMbcAXga9ExK/qEpWZWQvL79kDQNu0iZ8Yvg18BfhBRAzWKR4zs5ZX2JMOud3dnXEk5Y05MUTEq+oZiJnZZFHYsxugaZuSqn3AzczMqlQYbkpqlcQg6SX1CMTMbLI4mBimZRxJedXUGD5a8yjMzCaRlqsxUH5oCzMzG6PhxNAKTz4PKx3fyMzMxuFAjaFJ70py57OZWYPld+0CWqspyczMnobCzl20TZuG2qudK62+qkkMT9Y8CjOzSSS/cydtM2dmHUZF404MEXFRPQIxM5ss8rt2kuvpyTqMityUZGbWYIUdO8nNmJF1GBU5MZiZNVh+1y7aWi0xSHpX0fIzaheOmVnry+/c0dQ1hnF1iUuaBfwzcIqkAZIJda4E3lj70MzMWlNhx07aZjRvH8O4EkNEbAfeKOnFwFPA6cC36hCXmVlLiqEhCnv2kJvRvHclVXsT7WBELJe0Cdhcy4DMzFrZ8MNtzdyUVG3n88WSFgLXkTQtmZnZGBSGn3pu4qakahPDLOAa4H3AvppFY2bW4vI7dgK0ZFPSh4FnRMRqSflaBmRm1sryO3cAkGviGkO1ieFvgenAT4Cf1S4cM7PWdrApqfX6GPYD69LlC2sUi5lZy8tvH64xtF5i2AvMlNQBHFvDeMzMWlp+21YAcnPmZBxJZdUmhn8A1gKfA75au3DMzFrb0NZttHV30zZlStahVFRtH8PfRMSnwUNimJmNR37r1qauLUB1Q2J8ATguHRLjPuDNeEgMM7MxyW/bSvvs2VmHMapxD4khqRf4BfA74Aw8JIaZ2ZgNbd1Gx9FHZx3GqKrpY9gCXA28Pl3vHeuBki6WtFrSGknXjlLuHEl5Sa+oIj4zs6aVNCW1UI0BICI+LumnwB+AM4HnAfce7jhJOZLO6otIksndkm6NiIfKlPsEcMd4YzMza2YRwdC2bbS3Uh8DgKQPAzlgBbAiIu4c46HnAmsiYl16nluAy4CHSsq9A/gmcM54YzMza2aFXbtgcJDc7OZODNXM+fwB4DPALuDlkv5tjIcuADYWrfem2w6QtAB4GcngfBVJukrSMknL+vr6xhy7mVmW8luHn2Fosaak1FuB/x0Rt4/jGJXZFiXr/wJcExF5qVzx9KCI64HrAZYuXVp6DjOzpjS0dRtA6zUlpW4E/krSdOCrEbFiDMf0AouK1hcCm0rKLAVuSZPCPOBSSUMR8Z0q4zQzaxr5rVsAWq8pKfU3JEmlnaRZaSzuBk6StETSFOBy4NbiAhGxJCIWR8Ri4D+AtzkpmFmrGEqbvtuPOCLjSEZXbWJYC3QC342I54/lgIgYAt5OcrfRKuDrEbFS0tWSrq4yDjOzCWPwySchl6N93tysQxlVtU1JK0k6kq+U9MmIGNMdRBFxG3BbybayHc0R8YYqYzMza0pDm/tonzcP5XJZhzKqahPDCcA2kg7gbbULx8ysdQ09+WTTNyNB9YlhY0T8VNLRwOZaBmRm1qqGNm+m47jmn6mg2j6GiyUtJHne4J9rGI+ZWcsa3LyZjglQY6g2McwCrgHeB+yrWTRmZi2qMDBAYccO2o84MutQDmvMiUHSGUWrHya5I2k1kK95VGZmLWZoc9Lq3n5kCyUG4F5J90t6H6CI+DFARFQcJdXMzBKDTzwBQMeRrdWU9ClgOvBxYL2kn0l6U33CMjNrLYO9jwHQsXBhxpEc3pgTQ0S8NyJOIBm24gbg+aTjFZmZ2egGe3uhra3pJ+mBcdyuKmkuycinrwAuJBkU79E6xWVm1lIGH+ul/agjUUdH1qEc1nieY3iCpIaxDfgi8JWI+FVdojIzazH7N/YyZUHzNyPB+BLDt4GvAD+IiME6xWNm1pIGe3uZfv75WYcxJodNDJKGH9N7T/r16ApzJWyPiJ21CszMrFUU9u1LnnpeuODwhZvAWGoMX+LghDqVZs8J4Cbg5hrEZGbWUgYfS+5ImjIB7kiCMSSGiLiwEYGYmbWqfWvXAjDl+OMzjmRsqh0Sw8zMxmj/2nUATFnixGBmZsD+9etoP+ooct3Tsw5lTJwYzMzqbN/adUydIM1I4MRgZlZXEcH+desmTP8CODGYmdXV4GObKOzdy9QTT8w6lDFzYjAzq6OBVQ8B0HnqMzOOZOycGMzM6mjfqlWQyzH15JOzDmXMnBjMzOpo4KFVTD1+CW2dnVmHMmZODGZmdTSwahVTnzlxmpHAicHMrG4GH3+coSefpOu0/5Z1KOPixGBmVid7l98DwLSlZ2ccyfg4MZiZ1Un/Pctpmz59QnU8gxODmVnd7F22nK4zz0Tt45n6JntODGZmdZDfsYN9Dz9M19lnZR3KuDkxmJnVQf+KFRDBtLOXZh3KuDU0MUi6WNJqSWskXVtm/2sl3Z++fi3pjEbGZ2ZWK3uXLYf2drpOn1h3JEEDE4OkHPA54BLgVODVkk4tKbYeeEFEnA58BLi+UfGZmdXS3nvuofPUU2nr6so6lHFrZI3hXGBNRKyLiP3ALcBlxQUi4tcRsS1d/S0wMebBMzMrUti3j4H772fa0onXjASNTQwLgI1F673ptkquBH5QboekqyQtk7Ssr6+vhiGamT19A/ffTwwOOjGMgcpsi7IFpQtJEsM15fZHxPURsTQils6fP7+GIZqZPX17ly0DiWkT8I4kgEbeXNsLLCpaXwhsKi0k6XTgBuCSiNjSoNjMzGpm793LmHryyeRmzsw6lKo0ssZwN3CSpCWSpgCXA7cWF5B0LPAt4HUR8YcGxmZmVhMxOMjeFSsmbDMSNLDGEBFDkt4O3AHkgBsjYqWkq9P91wEfAOYCn5cEMBQRE/fqmtmkM7BqFbF374QbH6lYQ5/TjojbgNtKtl1XtPxm4M2NjMnMrJb2LlsOQNfZEzcx+MlnM7Ma6r/3HjqOPZaOI47IOpSqOTGYmdXQwMqH6DrttKzDeFqcGMzMamRo2zYGN22i81mlgzpMLE4MZmY1sm/VKgA6T3ViMDMzYOChhwDonGBzPJdyYjAzq5F9Dz9M+5FHkps1K+tQnhYnBjOzGtm3bj1TTzg+6zCeNicGM7MaiAj2r1/PlMVLsg7laXNiMDOrgaG+Pgq7dzPleNcYzMwM2L/+EQCmLFmcaRy14MRgZlYD+9evA2CqawxmZgawf/161NVF+5FHZh3K0+bEYGZWA/vWrWfKksWobeJ/rE7878DMrMFicJCBhx4i9u8/sG3/+vVMbYE7ksCJwcxsXPb87veseeEfs/7PX07vu95F5PMUBgYYfOyxlrgjCZwYzMzG5fH3vx91dTHniivY/eOfsOO7t7J/w6MQ0RJ3JIETg5nZuAxt2ULPC1/IEddeQ8eiRey87Tb2r1sLtMYdSdDgGdzMzCayyOeJvXtp6+5GEjMuvpgtN95IbuZM1NXFlBNOyDrEmnCNwcxsjAp79gCQ6+kGYMafXgr5PDu//32mnXsObVOmZBlezTgxmJmNUWH3bgDaupPE0HnKKUw77zwAus8/P7O4as2JwcxsjPK70sQwvfvAtnlv+ytys2fT/cIXZhVWzbmPwcxsjAp7RtYYAKafey4n/+bXWYVUF64xmJmN0XBTUq57esaR1JcTg5nZGJX2MbQqJwYzszE60MfQ05NxJPXlxGBmNkYHagzTXWMwMzPSzmeJtmldWYdSV04MZmZjlN+9m7bp01tiaO3RtPZ3Z2ZWQ4Vdu1u+4xkanBgkXSxptaQ1kq4ts1+SPpPuv1/SWY2Mz8xsNIXduw8Mh9HKGpYYJOWAzwGXAKcCr5Z0akmxS4CT0tdVwBcaFZ+Z2eEU9uxu+Y5naOyTz+cCayJiHYCkW4DLgIeKylwG3BwRAfxW0ixJR0fE47UO5v9/zZvIF/K1Pq2ZtbwpcPkVWQcBQK4txzv+/caan7eRTUkLgI1F673ptvGWQdJVkpZJWtbX11fzQM3MJrNG1hhUZltUUYaIuB64HmDp0qWH7B+LemRZM7NW0MgaQy+wqGh9IbCpijJmZlZHjUwMdwMnSVoiaQpwOXBrSZlbgdendyedB+yoR/+CmZlV1rCmpIgYkvR24A4gB9wYESslXZ3uvw64DbgUWAPsBd7YqPjMzCzR0PkYIuI2kg//4m3XFS0H8NeNjMnMzEbyk89mZjaCE4OZmY3gxGBmZiM4MZiZ2QhK+nsnLkl9wIYqD58HPFXDcOrFcdbORIgRHGctTYQYofFxHhcR88vtmPCJ4emQtCwilmYdx+E4ztqZCDGC46yliRAjNFecbkoyM7MRnBjMzGyEyZ4Yrs86gDFynLUzEWIEx1lLEyFGaKI4J3Ufg5mZHWqy1xjMzKyEE4OZmY0waRODpIslrZa0RtK1GcfyiKQHJK2QtCzdNkfSjyQ9nH6dXVT+b9O4V0t6cR3julHSZkkPFm0bd1ySzk6/vzWSPiOp3IRMtY7zg5IeS6/pCkmXZhmnpEWSfiZplaSVkt6Zbm+q6zlKnE1zPSV1Svq9pPvSGD+Ubm+2a1kpzqa5lhVFxKR7kQz7vRY4HpgC3AecmmE8jwDzSrb9L+DadPla4BPp8qlpvFOBJen3katTXM8HzgIefDpxAb8HnkMyQ98PgEsaEOcHgfeUKZtJnMDRwFnpcg/whzSWprqeo8TZNNczPV93utwB/A44rwmvZaU4m+ZaVnpN1hrDucCaiFgXEfuBW4DLMo6p1GXAl9LlLwEvLdp+S0Tsi4j1JHNXnFuPACLiF8DWpxOXpKOBGRHxm0h+w28uOqaecVaSSZwR8XhE3JMu7wJWkcxn3lTXc5Q4K2l4nJHYna52pK+g+a5lpTgryexvqNRkTQwLgI1F672M/stfbwH8UNJySVel246MdPa69OsR6fasYx9vXAvS5dLtjfB2SfenTU3DzQqZxylpMfBHJP9BNu31LIkTmuh6SspJWgFsBn4UEU15LSvECU10LcuZrImhXPtclvftnh8RZwGXAH8t6fmjlG222IdViiureL8AnACcCTwOfCrdnmmckrqBbwL/IyJ2jla0QjxZxdlU1zMi8hFxJsm88OdKOm2U4pldywpxNtW1LGeyJoZeYFHR+kJgU0axEBGb0q+bgW+TNA09mVYhSb9uTotnHft44+pNl0u311VEPJn+URaAf+Ngc1tmcUrqIPmw/WpEfCvd3HTXs1yczXg907i2A3cCF9OE17JcnM16LYtN1sRwN3CSpCWSpgCXA7dmEYik6ZJ6hpeBPwEeTOO5Ii12BfDddPlW4HJJUyUtAU4i6ZhqlHHFlVbpd0k6L72T4vVFx9TN8AdE6mUk1zSzONNz/h9gVUR8umhXU13PSnE20/WUNF/SrHS5C3gR8F8037UsG2czXcuK6tmz3cwv4FKSOy7WAn+fYRzHk9yJcB+wcjgWYC7wE+Dh9OucomP+Po17NXW8OwH4GklVd5Dkv5Yrq4kLWEryy78W+CzpE/d1jvPLwAPA/SR/cEdnGSfwXJLq//3AivR1abNdz1HibJrrCZwO3JvG8iDwgWr/Zup8LSvF2TTXstLLQ2KYmdkIk7UpyczMKnBiMDOzEZwYzMxsBCcGMzMbwYnBzMxGcGIwKyJplqS3Fa0fI+k/6vReL5X0gQr7dqdf50u6vR7vb1aJE4PZSLOAA4khIjZFxCvq9F7vAz4/WoGI6AMel3R+nWIwO4QTg9lIHwdOSMfJ/6SkxUrneZD0BknfkfQ9SeslvV3SuyTdK+m3kuak5U6QdHs6KOIvJZ1S+iaSTgb2RcRT6foSSb+RdLekj5QU/w7w2rp+12ZFnBjMRroWWBsRZ0bEe8vsPw14Dcn4Nh8F9kbEHwG/IRmqAJJJ3d8REWcD76F8reB84J6i9X8FvhAR5wBPlJRdBjyvyu/HbNzasw7AbIL5WSTzFOyStAP4Xrr9AeD0dFTS/w58o2iSrallznM00Fe0fj7w8nT5y8AnivZtBo6pTfhmh+fEYDY++4qWC0XrBZK/pzZgeyRDLY+mH5hZsq3S+DSdaXmzhnBTktlIu0imtKxKJHMXrJf0SkhGK5V0Rpmiq4ATi9bvIhnlFw7tTziZgyNwmtWdE4NZkYjYAtwl6UFJn6zyNK8FrpQ0PGJuuWljfwH8kQ62N72TZJKmuzm0JnEh8P0qYzEbN4+uapYRSf8KfC8ifnyYcr8ALouIbY2JzCY71xjMsvM/gWmjFZA0H/i0k4I1kmsMZmY2gmsMZmY2ghODmZmN4MRgZmYjODGYmdkITgxmZjbC/wWUDs+mQLA8xQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "...\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n",
    -       "       6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n",
    -       "       3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n",
    -       "       4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n",
    -       "       3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n",
    -       "       1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n",
    -       "       4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n",
    -       "       2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n",
    -       "       4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n",
    -       "       3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n",
    -       "       1.17040422e-11])\n",
    -       "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " - ], - "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n", - " 6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n", - " 3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n", - " 4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n", - " 3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n", - " 1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n", - " 4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n", - " 2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n", - " 4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n", - " 3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n", - " 1.17040422e-11])\n", - "Coordinates:\n", - " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "swiftdiff['rmag'].sel(id=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "swiftestOOF", - "language": "python", - "name": "swiftestoof" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb new file mode 100644 index 000000000..500096a76 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -0,0 +1,753 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import swiftest\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swifter.in'\n", + "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swiftest.in'\n", + "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestdat - swifterdat" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", + "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", + "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    +       "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n",
    +       "       3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n",
    +       "       3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n",
    +       "       3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n",
    +       "       3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n",
    +       "       3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n",
    +       "       3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n",
    +       "       3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n",
    +       "       3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n",
    +       "       3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n",
    +       "       3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n",
    +       "       3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n",
    +       "       3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n",
    +       "       3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n",
    +       "       3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n",
    +       "       3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n",
    +       "       3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n",
    +       "       3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n",
    +       "       3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n",
    +       "       6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n",
    +       "...\n",
    +       "       1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n",
    +       "       1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n",
    +       "       1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n",
    +       "       1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n",
    +       "       1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n",
    +       "       1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n",
    +       "       1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n",
    +       "       1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n",
    +       "       1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n",
    +       "       1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n",
    +       "       1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n",
    +       "       1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n",
    +       "       1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n",
    +       "       1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n",
    +       "       1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n",
    +       "       1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n",
    +       "       1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n",
    +       "       1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n",
    +       "       1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n",
    +       "       1.25413096e+00])\n",
    +       "Coordinates:\n",
    +       "    id        int64 2\n",
    +       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + ], + "text/plain": [ + "\n", + "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n", + " 3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n", + " 3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n", + " 3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n", + " 3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n", + " 3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n", + " 3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n", + " 3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n", + " 3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n", + " 3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n", + " 3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n", + " 3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n", + " 3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n", + " 3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n", + " 3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n", + " 3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n", + " 3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n", + " 3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n", + " 3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n", + " 6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n", + "...\n", + " 1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n", + " 1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n", + " 1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n", + " 1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n", + " 1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n", + " 1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n", + " 1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n", + " 1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n", + " 1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n", + " 1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n", + " 1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n", + " 1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n", + " 1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n", + " 1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n", + " 1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n", + " 1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n", + " 1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n", + " 1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n", + " 1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n", + " 1.25413096e+00])\n", + "Coordinates:\n", + " id int64 2\n", + " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['rmag'].sel(id=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 49b18b06cf87595e6ecea0a0a68cde31cdda4a54 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 17:39:14 -0400 Subject: [PATCH 20/29] Replaced NR quicksort with simple insertion sort, as it performs better for partially sorted lists, and nearly every time we need to sort in SyMBA it's a nearly sorted list --- .../swiftest_symba_vs_swifter_symba.ipynb | 4 +- src/setup/setup.f90 | 2 +- src/util/util_sort.f90 | 279 +++--------------- src/util/util_valid.f90 | 1 - 4 files changed, 50 insertions(+), 236 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index 500096a76..b3b31d703 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -622,7 +622,7 @@ " 1.25413096e+00])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index ceed089fe..cbd7aabfe 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -69,7 +69,6 @@ module subroutine setup_construct_system(system, param) return end subroutine setup_construct_system - module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! @@ -83,6 +82,7 @@ module subroutine setup_initialize_system(self, param) call self%cb%initialize(param) call self%pl%initialize(param) call self%tp%initialize(param) + call util_valid(self%pl, self%tp) call self%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 126f4f12d..108e7941d 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -4,260 +4,75 @@ module subroutine util_sort_dp(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using Quicksort algorithm + !! Sort input double precision array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_dp.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 implicit none ! Arguments real(DP), dimension(:), intent(inout) :: arr ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - real(DP) :: a, dum - integer(I4B) :: n, k, i, j, jstack, l, r - integer(I4B), dimension(NSTACK) :: istack + real(DP) :: tmp + integer(I4B) :: n, i, j - ! executable code n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_I4B" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) + end do + arr(j + 1) = tmp end do - return - end subroutine util_sort_dp module subroutine util_sort_i4b(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using Quicksort algorithm + !! Sort input integer array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_i4b.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 implicit none ! Arguments integer(I4B), dimension(:), intent(inout) :: arr ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - integer(I4B) :: a, n, k, i, j, jstack, l, r, dum - integer(I4B), dimension(NSTACK) :: istack - - ! executable code + integer(I4B) :: tmp + integer(I4B) :: n, i, j + n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_i4b" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) + end do + arr(j + 1) = tmp end do - return - - end subroutine util_sort_i4b + end subroutine util_sort_i4b + + module subroutine util_sort_sp(arr) + !! author: David A. Minton + !! + !! Sort input single precision array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + ! + implicit none + ! Arguments + real(SP), dimension(:), intent(inout) :: arr + ! Internals + real(SP) :: tmp + integer(I4B) :: n, i, j - module subroutine util_sort_sp(arr) - !! author: David A. Minton - !! - !! Sort input single precision array into ascending numerical order using Quicksort algorithm - !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_DP.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 - implicit none - ! Arguments - real(SP), dimension(:), intent(inout) :: arr - ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - real(SP) :: a, dum - integer(I4B) :: n, k, i, j, jstack, l, r - integer(I4B), dimension(NSTACK) :: istack - - ! executable code - n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_I4B" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + n = size(arr) + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) end do - - return - - end subroutine util_sort_sp + arr(j + 1) = tmp + end do + return + end subroutine util_sort_sp end submodule s_util_sort diff --git a/src/util/util_valid.f90 b/src/util/util_valid.f90 index ac81673ca..ac9cc2fad 100644 --- a/src/util/util_valid.f90 +++ b/src/util/util_valid.f90 @@ -32,7 +32,6 @@ module subroutine util_valid(pl, tp) call util_exit(FAILURE) end if end do - deallocate(idarr) end associate return From 81ecfaf1a151158cdcb9d64151776634555ece29 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 17:56:13 -0400 Subject: [PATCH 21/29] Replaced all the old sorting routines with new ones. util_index is now part of the generic util_sort --- .../9pl_18tp_encounters/pl.swiftest.in | 4 +- src/modules/swiftest_classes.f90 | 26 +++-- src/util/util_index.f90 | 103 ------------------ src/util/util_sort.f90 | 87 ++++++++++++++- 4 files changed, 105 insertions(+), 115 deletions(-) delete mode 100644 src/util/util_index.f90 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index cd3c71538..8bc636061 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,5 +1,5 @@ 8 -1 4.9125474498983623693e-11 0.0014751237493860230134 +201 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 @@ -7,7 +7,7 @@ 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +1003 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 313893e5d..b16df1020 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -20,7 +20,7 @@ module swiftest_classes public :: tides_kick_getacch_pl, tides_step_spin_system public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & - util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & + util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** @@ -789,12 +789,6 @@ module subroutine util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_tp - module subroutine util_index(arr, index) - implicit none - integer(I4B), dimension(:), intent(out) :: index - real(DP), dimension(:), intent(in) :: arr - end subroutine util_index - module subroutine util_peri_tp(self, system, param) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object @@ -856,15 +850,33 @@ module subroutine util_sort_i4b(arr) integer(I4B), dimension(:), intent(inout) :: arr end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr,ind) + implicit none + integer(I4B), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_i4b + module subroutine util_sort_sp(arr) implicit none real(SP), dimension(:), intent(inout) :: arr end subroutine util_sort_sp + module subroutine util_sort_index_sp(arr,ind) + implicit none + real(SP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_sp + module subroutine util_sort_dp(arr) implicit none real(DP), dimension(:), intent(inout) :: arr end subroutine util_sort_dp + + module subroutine util_sort_index_dp(arr,ind) + implicit none + real(DP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_dp end interface interface diff --git a/src/util/util_index.f90 b/src/util/util_index.f90 deleted file mode 100644 index fcece8809..000000000 --- a/src/util/util_index.f90 +++ /dev/null @@ -1,103 +0,0 @@ -submodule (swiftest_classes) s_util_index - use swiftest -contains - module subroutine util_index(arr, index) - !! author: David A. Minton - !! - !! Index input real array into ascending numerical order using Quicksort algorithm - !! - !! Adapted from David E. Kaufmann's Swifter routine: util_index.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1173-4 - implicit none - ! Arguments - integer(I4B), dimension(:), intent(out) :: index - real(DP), dimension(:), intent(in) :: arr - ! Internals - integer(I4B), parameter :: nn = 15, nstack = 50 - integer(I4B) :: n, k, i, j, indext, jstack, l, r, dum - integer(I4B), dimension(nstack) :: istack - real(DP) :: a - - n = size(arr) - if (n /= size(index)) then - write(*, *) "Swiftest Error:" - write(*, *) " array size mismatch in util_index" - call util_exit(FAILURE) - end if - index = arth(1, 1, n) - jstack = 0 - ! l is the counter ie 'the one we are at' - l = 1 - ! r is the length of the array ie 'the total number of particles' - r = n - do - if ((r - l) < nn) then - do j = l + 1, r - indext = index(j) - a = arr(indext) - do i = j - 1, l, -1 - if (arr(index(i)) <= a) exit - index(i+1) = index(i) - end do - index(i+1) = indext - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = index(k); index(k) = index(l+1); index(l+1) = dum - ! if the mass of the particle we are at in our counting is greater than the mass of the last particle then put the particle we are at above the last one - if (arr(index(l)) > arr(index(r))) then - dum = index(l); index(l) = index(r); index(r) = dum - end if - ! if the mass of the particle above the one we are at in our counting is greater than the last particle then put that particle above the last one - if (arr(index(l+1)) > arr(index(r))) then - dum = index(l+1); index(l+1) = index(r); index(r) = dum - end if - ! if the mass of teh particle we are at in our counting is greater than the one above it, then put it above the one above it - if (arr(index(l)) > arr(index(l+1))) then - dum = index(l); index(l) = index(l+1); index(l+1) = dum - end if - i = l + 1 - j = r - indext = index(l+1) - a = arr(indext) - do - do - i = i + 1 - if (arr(index(i)) >= a) exit - end do - do - j = j - 1 - if (arr(index(j)) <= a) exit - end do - if (j < i) exit - dum = index(i); index(i) = index(j); index(j) = dum - end do - index(l+1) = index(j) - index(j) = indext - jstack = jstack + 2 - if (jstack > nstack) then - write(*, *) "Swiftest Error:" - write(*, *) " nstack too small in util_sort" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if - end do - - return - - end subroutine util_index -end submodule s_util_index diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 108e7941d..73e1a4978 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -4,7 +4,7 @@ module subroutine util_sort_dp(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using insertion sort. + !! Sort input double precision array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) !! implicit none @@ -26,10 +26,37 @@ module subroutine util_sort_dp(arr) return end subroutine util_sort_dp + module subroutine util_sort_index_dp(arr, ind) + !! author: David A. Minton + !! + !! Sort input double precision array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + real(DP) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + 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 !! - !! Sort input integer array into ascending numerical order using insertion sort. + !! Sort input integer array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) !! implicit none @@ -51,10 +78,37 @@ module subroutine util_sort_i4b(arr) return end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr, ind) + !! author: David A. Minton + !! + !! Sort input integer array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + integer(I4B), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + integer(I4B) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + 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 !! - !! Sort input single precision array into ascending numerical order using insertion sort. + !! Sort input single precision array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) ! implicit none @@ -75,4 +129,31 @@ module subroutine util_sort_sp(arr) end do return end subroutine util_sort_sp + + module subroutine util_sort_index_sp(arr, ind) + !! author: David A. Minton + !! + !! Sort input single precision array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + real(SP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + real(SP) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + end do + ind(j + 1) = i + end do + return + end subroutine util_sort_index_sp end submodule s_util_sort From 99396624902297788899c9bd4ff405c70f97ee3e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 18:19:33 -0400 Subject: [PATCH 22/29] Added new sorting methods for swiftest bodies --- src/modules/swiftest_classes.f90 | 20 ++++++++++++++++++-- src/util/util_sort.f90 | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index b16df1020..d9758570b 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,7 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_sort_pl, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -186,6 +186,7 @@ module swiftest_classes procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: sort => util_sort_body !! Sorts a body by an attribute (base method only allows for sorting by id. Override to add other capabilities) procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure end type swiftest_body @@ -228,6 +229,7 @@ module swiftest_classes procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: sort => util_sort_pl !! Sorts a body by an attribute (adds ability to sort by mass) 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 @@ -877,9 +879,23 @@ module subroutine util_sort_index_dp(arr,ind) real(DP), dimension(:), intent(in) :: arr integer(I4B), dimension(:), intent(out) :: ind end subroutine util_sort_index_dp - end interface + end interface util_sort interface + module subroutine util_sort_body(self, sortby, reverse) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, reverse) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_pl + module subroutine util_spill_body(self, discards, lspill_list) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 73e1a4978..1f201179f 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,6 +1,29 @@ submodule (swiftest_classes) s_util_sort use swiftest contains + module subroutine util_sort_body(self, sortby, reverse) + !! author: David A. Minton + !! + !! Sort a Swiftest body structure in-place. + !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. + !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, reverse) + !! author: David A. Minton + !! + !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. + !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_pl + module subroutine util_sort_dp(arr) !! author: David A. Minton !! From ba99dd75b6548122f9f31b125e943387b3f8c23a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 22:48:08 -0400 Subject: [PATCH 23/29] Started a polymorphic sorting method --- src/modules/swiftest_classes.f90 | 22 ++++--------- src/util/util_sort.f90 | 56 ++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d9758570b..fe9b7e86d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,7 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_sort_pl, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -229,7 +229,6 @@ module swiftest_classes procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: sort => util_sort_pl !! Sorts a body by an attribute (adds ability to sort by mass) 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 @@ -884,23 +883,16 @@ end subroutine util_sort_index_dp interface module subroutine util_sort_body(self, sortby, reverse) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) end subroutine util_sort_body - module subroutine util_sort_pl(self, sortby, reverse) - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_pl - module subroutine util_spill_body(self, discards, lspill_list) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest 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 + class(swiftest_body), intent(inout) :: self !! Swiftest 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 end subroutine util_spill_body module subroutine util_spill_pl(self, discards, lspill_list) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 1f201179f..190561002 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -8,21 +8,49 @@ module subroutine util_sort_body(self, sortby, reverse) !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_body + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + ! Internals + class(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body + integer(I4B), dimension(:), allocatable :: ind - module subroutine util_sort_pl(self, sortby, reverse) - !! author: David A. Minton - !! - !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. - !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_pl + associate(n => self%nbody) + allocate(body_sorted, source=self) + allocate(ind(n)) + select case(sortby) + case("id") + if (reverse) then + call util_sort(-self%id(1:n), ind(1:n)) + else + call util_sort(self%id(1:n), ind(1:n)) + end if + end select + + self%id(1:n) = body_sorted%id(ind(1:n)) + self%name(1:n) = body_sorted%name(ind(1:n)) + self%status(1:n) = body_sorted%status(ind(1:n)) + self%ldiscard(1:n) = body_sorted%ldiscard(ind(1:n)) + self%xh(:,1:n) = body_sorted%xh(:,ind(1:n)) + self%vh(:,1:n) = body_sorted%vh(:,ind(1:n)) + self%xb(:,1:n) = body_sorted%xb(:,ind(1:n)) + self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) + self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) + self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) + self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) + self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) + self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) + self%a(1:n) = body_sorted%a(ind(1:n)) + self%e(1:n) = body_sorted%e(ind(1:n)) + self%inc(1:n) = body_sorted%inc(ind(1:n)) + self%capom(1:n) = body_sorted%capom(ind(1:n)) + self%omega(1:n) = body_sorted%omega(ind(1:n)) + self%capm(1:n) = body_sorted%capm(ind(1:n)) + self%mu(1:n) = body_sorted%mu(ind(1:n)) + end associate + return + end subroutine util_sort_body module subroutine util_sort_dp(arr) !! author: David A. Minton From bcb2f461e04b1463bc62781235ea53e05b1d4cd6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 01:36:49 -0400 Subject: [PATCH 24/29] Added new methods for sorting bodies in various ways --- src/modules/swiftest_classes.f90 | 125 ++++++++++------ src/util/util_sort.f90 | 236 +++++++++++++++++++++++++++++-- 2 files changed, 304 insertions(+), 57 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fe9b7e86d..7f91f93f2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,9 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, & + util_sort, util_sort_body, util_sort_pl, util_sort_tp, util_sort_rearrange_body, util_sort_rearrange_pl, util_sort_rearrange_tp, & + util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -130,8 +132,8 @@ module swiftest_classes 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 :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body end type swiftest_cb !******************************************************************************************************************************** @@ -172,22 +174,23 @@ module swiftest_classes procedure(abstract_step_body), public, deferred :: step procedure(abstract_accel), public, deferred :: accel ! These are concrete because the implementation is the same for all types of particles - procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables - procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators - procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators - 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 :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors - procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements - procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) - procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays + procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables + procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators + procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators + 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 :: 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 :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) - procedure, public :: sort => util_sort_body !! Sorts a body by an attribute (base method only allows for sorting by id. Override to add other capabilities) - procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + 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 :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + procedure, public :: sort => util_sort_body !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -217,19 +220,21 @@ module swiftest_classes private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: 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 :: sort => util_sort_pl !! Sorts body arrays by a sortable component + procedure, public :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + 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 !******************************************************************************************************************************** @@ -247,16 +252,18 @@ 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 :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies - 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 :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - 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 :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + 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 :: 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 :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure, public :: sort => util_sort_tp !! Sorts body arrays by a sortable component + procedure, public :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + 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 !******************************************************************************************************************************** @@ -289,10 +296,10 @@ module swiftest_classes ! Concrete classes that are common to the basic integrator (only test particles considered for discard) procedure, public :: discard => discard_system !! Perform a discard step on the system procedure, public :: dump => io_dump_system !! Dump the state of the system to a file - procedure, public :: initialize => setup_initialize_system !! Initialize the system from input files procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file 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 :: initialize => setup_initialize_system !! Initialize the system from input files procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system @@ -881,12 +888,44 @@ end subroutine util_sort_index_dp end interface util_sort interface - module subroutine util_sort_body(self, sortby, reverse) + module subroutine util_sort_rearrange_body(self, ind) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest 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) + end subroutine util_sort_rearrange_body + + module subroutine util_sort_rearrange_pl(self, ind) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest 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) + end subroutine util_sort_rearrange_pl + + module subroutine util_sort_rearrange_tp(self, ind) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle 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) + end subroutine util_sort_rearrange_tp + + module subroutine util_sort_body(self, sortby, ascending) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, ascending) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest 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 + end subroutine util_sort_pl + + module subroutine util_sort_tp(self, sortby, ascending) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest 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 + end subroutine util_sort_tp module subroutine util_spill_body(self, discards, lspill_list) implicit none diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 190561002..fdaded124 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,33 +1,185 @@ submodule (swiftest_classes) s_util_sort use swiftest contains - module subroutine util_sort_body(self, sortby, reverse) + module subroutine util_sort_body(self, sortby, ascending) !! author: David A. Minton !! !! Sort a Swiftest body structure in-place. - !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. - !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + !! sortby is a string indicating which array component to sort. implicit none ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + class(swiftest_body), intent(inout) :: self !! Swiftest 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 - class(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body integer(I4B), dimension(:), allocatable :: ind - associate(n => self%nbody) - allocate(body_sorted, source=self) - allocate(ind(n)) + associate(body => self, n => self%nbody) select case(sortby) case("id") - if (reverse) then - call util_sort(-self%id(1:n), ind(1:n)) + if (ascending) then + call util_sort(body%id(1:n), ind(1:n)) + else + call util_sort(-body%id(1:n), ind(1:n)) + end if + case("a") + if (ascending) then + call util_sort(body%a(1:n), ind(1:n)) + else + call util_sort(-body%a(1:n), ind(1:n)) + end if + case("e") + if (ascending) then + call util_sort(body%e(1:n), ind(1:n)) + else + call util_sort(-body%e(1:n), ind(1:n)) + end if + case("inc") + if (ascending) then + call util_sort(body%inc(1:n), ind(1:n)) + else + call util_sort(-body%inc(1:n), ind(1:n)) + end if + case("capom") + if (ascending) then + call util_sort(body%capom(1:n), ind(1:n)) + else + call util_sort(-body%capom(1:n), ind(1:n)) + end if + case("mu") + if (ascending) then + call util_sort(body%mu(1:n), ind(1:n)) + else + call util_sort(-body%mu(1:n), ind(1:n)) + end if + case default + write(*,*) 'Cannot sort structure by component '//trim(adjustl(sortby)) + end select + + call body%rearrange(ind) + end associate + + return + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest 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(:), allocatable :: ind + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("Gmass","mass") + if (ascending) then + call util_sort(pl%Gmass(1:npl), ind(1:npl)) + else + call util_sort(-pl%Gmass(1:npl), ind(1:npl)) + end if + case("rhill") + if (ascending) then + call util_sort(pl%rhill(1:npl), ind(1:npl)) + else + call util_sort(-pl%rhill(1:npl), ind(1:npl)) + end if + case("radius") + if (ascending) then + call util_sort(pl%radius(1:npl), ind(1:npl)) + else + call util_sort(-pl%radius(1:npl), ind(1:npl)) + end if + case("density") + if (ascending) then + call util_sort(pl%density(1:npl), ind(1:npl)) else - call util_sort(self%id(1:n), ind(1:n)) + call util_sort(-pl%density(1:npl), ind(1:npl)) end if + case("k2") + if (ascending) then + call util_sort(pl%k2(1:npl), ind(1:npl)) + else + call util_sort(-pl%k2(1:npl), ind(1:npl)) + end if + case("Q") + if (ascending) then + call util_sort(pl%Q(1:npl), ind(1:npl)) + else + call util_sort(-pl%Q(1:npl), ind(1:npl)) + end if + case("tlag") + if (ascending) then + call util_sort(pl%tlag(1:npl), ind(1:npl)) + else + call util_sort(-pl%tlag(1:npl), ind(1:npl)) + end if + case default + call util_sort_body(pl, sortby, ascending) end select + call pl%rearrange(ind) + end associate + + return + end subroutine util_sort_pl + + module subroutine util_sort_tp(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle 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(:), allocatable :: ind + + associate(tp => self, ntp => self%nbody) + select case(sortby) + case("peri") + if (ascending) then + call util_sort(tp%peri(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%peri(1:ntp), ind(1:ntp)) + end if + case("atp") + if (ascending) then + call util_sort(tp%atp(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%atp(1:ntp), ind(1:ntp)) + end if + case default + call util_sort_body(tp, sortby, ascending) + end select + + call tp%rearrange(ind) + end associate + + return + end subroutine util_sort_tp + + module subroutine util_sort_rearrange_body(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest 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(swiftest_body), intent(inout) :: self !! Swiftest 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(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body + + associate(n => self%nbody) + allocate(body_sorted, source=self) self%id(1:n) = body_sorted%id(ind(1:n)) self%name(1:n) = body_sorted%name(ind(1:n)) self%status(1:n) = body_sorted%status(ind(1:n)) @@ -48,9 +200,65 @@ module subroutine util_sort_body(self, sortby, reverse) self%omega(1:n) = body_sorted%omega(ind(1:n)) self%capm(1:n) = body_sorted%capm(ind(1:n)) self%mu(1:n) = body_sorted%mu(ind(1:n)) + deallocate(body_sorted) end associate return - end subroutine util_sort_body + end subroutine util_sort_rearrange_body + + module subroutine util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest 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 + class(swiftest_pl), intent(inout) :: self !! Swiftest 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(swiftest_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + + call util_sort_rearrange_body(self,ind) + associate(n => self%nbody) + allocate(pl_sorted, source=self) + self%mass(1:n) = pl_sorted%mass(ind(1:n)) + self%Gmass(1:n) = pl_sorted%Gmass(ind(1:n)) + self%rhill(1:n) = pl_sorted%rhill(ind(1:n)) + self%radius(1:n) = pl_sorted%radius(ind(1:n)) + self%xbeg(:,1:n) = pl_sorted%xbeg(:,ind(1:n)) + self%xend(:,1:n) = pl_sorted%xend(:,ind(1:n)) + self%vbeg(:,1:n) = pl_sorted%vbeg(:,ind(1:n)) + self%density(1:n) = pl_sorted%density(ind(1:n)) + self%Ip(:,1:n) = pl_sorted%Ip(:,ind(1:n)) + self%rot(:,1:n) = pl_sorted%rot(:,ind(1:n)) + self%k2(1:n) = pl_sorted%k2(ind(1:n)) + self%Q(1:n) = pl_sorted%Q(ind(1:n)) + self%tlag(1:n) = pl_sorted%tlag(ind(1:n)) + deallocate(pl_sorted) + end associate + return + end subroutine util_sort_rearrange_pl + + module subroutine util_sort_rearrange_tp(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest 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(swiftest_tp), intent(inout) :: self !! Swiftest test particle 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(swiftest_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + + call util_sort_rearrange_body(self,ind) + associate(n => self%nbody) + allocate(tp_sorted, source=self) + self%isperi(1:n) = tp_sorted%isperi(ind(1:n)) + self%peri(1:n) = tp_sorted%peri(ind(1:n)) + self%atp(1:n) = tp_sorted%atp(ind(1:n)) + deallocate(tp_sorted) + end associate + return + end subroutine util_sort_rearrange_tp module subroutine util_sort_dp(arr) !! author: David A. Minton From c85f8a97e1e06675edaeb4bd5ce5888afbad538e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:32:15 -0400 Subject: [PATCH 25/29] Corrected allocation of polymorphic parameter file for SyMBA and fixed bugs in param reader. Added all sorting methods and sort by mass in symba_setup_system --- .../1pl_1tp_encounter/init_cond.py | 2 +- .../9pl_18tp_encounters/init_cond.py | 1 + .../9pl_18tp_encounters/param.swiftest.in | 2 +- .../9pl_18tp_encounters/pl.in | 48 +++--- .../9pl_18tp_encounters/pl.swifter.in | 48 +++--- .../9pl_18tp_encounters/pl.swiftest.in | 48 +++--- .../9pl_18tp_encounters/tp.in | 64 +++---- src/io/io.f90 | 4 +- src/main/swiftest_driver.f90 | 10 +- src/modules/symba_classes.f90 | 45 ++++- src/symba/symba_io.f90 | 5 +- src/symba/symba_setup.f90 | 2 + src/symba/symba_util.f90 | 161 ++++++++++++++++++ src/util/util_sort.f90 | 6 +- 14 files changed, 325 insertions(+), 121 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index 5ef0d4df7..86c13a50e 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -173,7 +173,7 @@ print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') print(f'RHILL_PRESENT yes') - +print(f'MTINY 1e-12') diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py index 82850837d..18ef4ce48 100755 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py @@ -38,6 +38,7 @@ sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' sim.param['RHILL_PRESENT'] = 'YES' +sim.param['MTINY'] = 1.0e-12 sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in index 06edc324b..e9ed6376c 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in @@ -33,4 +33,4 @@ ENERGY NO GR NO YARKOVSKY NO YORP NO -MTINY 0.0 +MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index cd3c71538..fea43297f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index e42b53b68..79614abb4 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -2,35 +2,35 @@ 0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index 8bc636061..fea43297f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -201 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -1003 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in index e7424ed6f..7c1b15bd6 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in @@ -1,49 +1,49 @@ 16 101 --0.032410259440139366216 0.30734953478203003163 0.0280888997405028297 --0.031019262600390007378 -0.0019305604712619159943 0.0029264451427202888868 +-0.0658187108448175795 0.30391138014159824188 0.030872485461978960153 +-0.030537616761930286291 -0.0049297226604189817514 0.0026371811668407158825 102 --0.032456380852802668713 0.30730341336936678465 0.0280888997405028297 --0.03622636154440830869 -0.0019305604712619159943 0.0029264451427202888868 +-0.065864832257480881994 0.3038652587289349949 0.030872485461978960153 +-0.035744715705948587603 -0.0049297226604189817514 0.0026371811668407158825 103 --0.6608419365545701307 -0.28799974456994492655 0.034183953683804932377 -0.014290252347442427075 -0.018635382188272479886 -0.00071410720992500279457 +-0.6526399503364792576 -0.30651935535365792962 0.033456491497379246824 +0.014807065041004032965 -0.0184014319837384685 -0.0007407193515014080928 104 --0.6609563571355145939 -0.2881141651508892787 0.034183953683804932377 -0.0015957849367516391964 -0.018635382188272479886 -0.00071410720992500279457 +-0.65275437091742372075 -0.30663377593460228177 0.033456491497379246824 +0.0021125976303132450868 -0.0184014319837384685 -0.0007407193515014080928 105 -0.5666051762815753623 -0.8427917875260713121 3.8152874628327130158e-05 -0.020893043539853186491 0.009533392738922031109 -5.008237574040859916e-07 +0.58052308875528702004 -0.8331397763444912119 3.7646553415201541957e-05 +0.020730998066553867065 0.009770187318278569788 -5.1179589633921335467e-07 106 -0.56648472046969633453 -0.84291224333795033985 3.8152874628327130158e-05 -0.0071041630713054347915 0.009533392738922031109 -5.008237574040859916e-07 +0.58040263294340799227 -0.83326023215637023966 3.7646553415201541957e-05 +0.0069421175980061153657 0.009770187318278569788 -5.1179589633921335467e-07 107 --1.5854279813093821172 0.50603262218427835784 0.049495356229978339224 --0.00065310310407921696313 -0.0121364162752466003825 -0.00016278089870573419053 +-1.5891096979602641337 0.49388011604967890777 0.049330990309104823244 +-0.00055132825635455804184 -0.012168467501132099878 -0.00016594932370266260858 108 --1.585492066136889866 0.50596853735677060904 0.049495356229978339224 --0.0068120613005270029203 -0.0121364162752466003825 -0.00016278089870573419053 +-1.5891737827877718825 0.49381603122217127 0.049330990309104823244 +-0.0067102864528023435653 -0.012168467501132099878 -0.00016594932370266260858 109 -4.1112407225284242074 -2.8997027378816566667 -0.07992066204197022239 -0.041146757578404392908 0.006527961423420942065 -0.00012252307659855749943 +4.1155004823659924185 -2.893171407164709663 -0.080043092204059404504 +0.0411371945893665783 0.006534697671907701254 -0.00012233719535540690457 110 -4.109918924512229843 -2.901024535897851031 -0.07992066204197022239 --0.032617676824890466658 0.006527961423420942065 -0.00012252307659855749943 +4.114178684349798054 -2.8944932051809040274 -0.080043092204059404504 +-0.032627239813928281265 0.006534697671907701254 -0.00012233719535540690457 111 -6.3554898083384054885 -7.6562954388962722874 -0.11978932080537739446 -0.026100461582326782428 0.0035567518157804990653 -0.00022047226166396519348 +6.3594761400945154506 -7.652737529060036792 -0.12000977499446359442 +0.02609853948273724994 0.0035590677039893160206 -0.00022043610541731448703 112 -6.3543888236281445003 -7.6573964236065332756 -0.11978932080537739446 --0.018125876184740395691 0.0035567518157804990653 -0.00022047226166396519348 +6.3583751553842544624 -7.65383851377029778 -0.12000977499446359442 +-0.01812779828432992818 0.0035590677039893160206 -0.00022043610541731448703 113 -14.819643486317822578 13.046730592886092381 -0.14356031024960910769 -0.010470819978811187617 0.002775224845039696818 4.4157032104701469965e-05 +14.817019253266252576 13.049505570448612701 -0.14351615042000470668 +0.010470241012353788054 0.002774730265364384104 4.416262654344997005e-05 114 -14.819163970343417702 13.046251076911687505 -0.14356031024960910769 --0.015718707098512599285 0.002775224845039696818 4.4157032104701469965e-05 +14.8165397372918477 13.049026054474207825 -0.14351615042000470668 +-0.015719286064969997113 0.002774730265364384104 4.416262654344997005e-05 115 -29.56422775190525698 -4.58535534656341337 -0.5869609072731380994 -0.014900806169871520443 0.0031282283842968541462 -7.504927375628088796e-05 +29.564692754289236376 -4.5822270889269072214 -0.5870359532621901577 +0.014900470225798949711 0.0031282868879460171488 -7.5042704502708602616e-05 116 -29.563762227012823303 -4.585820871455843495 -0.5869609072731380994 --0.013970465456684741726 0.0031282283842968541462 -7.504927375628088796e-05 +29.564227229396802699 -4.582692613819337346 -0.5870359532621901577 +-0.013970801400757312458 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/src/io/io.f90 b/src/io/io.f90 index 82c87dfc7..7c50242cb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -259,10 +259,10 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Determine if the GR flag is set correctly for this integrator select case(integrator) - case(WHM, RMVS) + case(WHM, RMVS, SYMBA) write(*,*) "GR = ", self%lgr case default - write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' end select end associate diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 4ed7cf3fe..4c6bccc72 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -10,9 +10,9 @@ program swiftest_driver implicit none class(swiftest_nbody_system), allocatable :: nbody_system !! Polymorphic object containing the nbody system to be integrated - type(swiftest_parameters) :: param + class(swiftest_parameters), allocatable :: param !! Run configuration parameters integer(I4B) :: integrator !! Integrator type code (see swiftest_globals for symbolic names) - character(len=:),allocatable :: param_file_name !! Name of the file containing user-defined parameters + character(len=:),allocatable :: param_file_name !! Name of the file containing user-defined parameters integer(I4B) :: ierr !! I/O error code integer(I8B) :: iloop !! Loop counter integer(I8B) :: idump !! Dump cadence counter @@ -31,6 +31,12 @@ program swiftest_driver end if !$ start_wall_time = omp_get_wtime() !> Read in the user-defined parameters file and the initial conditions of the system + select case(integrator) + case(symba) + allocate(symba_parameters :: param) + case default + allocate(swiftest_parameters :: param) + end select param%integrator = integrator call setup_construct_system(nbody_system, param) call param%read_from_file(param_file_name) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 0a6dcb290..98108e9df 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -89,10 +89,12 @@ module symba_classes type(symba_particle_info), dimension(:), allocatable :: info contains private - procedure, public :: discard => symba_discard_pl !! Process massive body discards - procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other - procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure, public :: discard => symba_discard_pl !! Process massive body discards + procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure, public :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl !******************************************************************************************************************************** @@ -105,9 +107,11 @@ module symba_classes integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains private - procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure, public :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_tp !******************************************************************************************************************************** @@ -390,5 +394,32 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B), intent(in) :: nrequested !! New size of list needed end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) + implicit none + class(symba_pl), intent(inout) :: self !! Symba 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 + end subroutine symba_util_sort_pl + + module subroutine symba_util_sort_tp(self, sortby, ascending) + implicit none + class(symba_tp), intent(inout) :: self !! Swiftest test particle 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 + end subroutine symba_util_sort_tp + + module subroutine symba_util_sort_rearrange_pl(self, ind) + implicit none + class(symba_pl), intent(inout) :: self !! Symba 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) + end subroutine symba_util_sort_rearrange_pl + + module subroutine symba_util_sort_rearrange_tp(self, ind) + implicit none + class(symba_tp), intent(inout) :: self !! Symba 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) + end subroutine symba_util_sort_rearrange_tp + + end interface end module symba_classes \ No newline at end of file diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index bebb225b5..acc3aabf9 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -51,6 +51,7 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms call random_seed(size = nseeds) if (allocated(param%seed)) deallocate(param%seed) allocate(param%seed(nseeds)) + rewind(unit) do read(unit = unit, fmt = linefmt, iostat = iostat, end = 1) line line_trim = trim(adjustl(line)) @@ -121,8 +122,10 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms return end if end associate - return + iostat = 0 + + return end subroutine symba_io_param_reader module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, iomsg) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 5ac26c220..9efb37e9a 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -104,6 +104,7 @@ module subroutine symba_setup_system(self, param) !! author: David A. Minton !! !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. + !! This subroutine will also sort the massive bodies in descending order by mass !! implicit none ! Arguments @@ -121,6 +122,7 @@ module subroutine symba_setup_system(self, param) call system%plplenc_list%setup(1) select type(pl => system%pl) class is (symba_pl) + call pl%sort("mass", ascending=.false.) select type(param) class is (symba_parameters) pl%lmtiny(:) = pl%Gmass(:) > param%MTINY diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 031ae4ae5..24a59a9cc 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -65,5 +65,166 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) return end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! Symba 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 + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("nplenc") + if (ascending) then + call util_sort(pl%nplenc(1:npl), ind(1:npl)) + else + call util_sort(-pl%nplenc(1:npl), ind(1:npl)) + end if + case("ntpenc") + if (ascending) then + call util_sort(pl%ntpenc(1:npl), ind(1:npl)) + else + call util_sort(-pl%ntpenc(1:npl), ind(1:npl)) + end if + case("levelg") + if (ascending) then + call util_sort(pl%levelg(1:npl), ind(1:npl)) + else + call util_sort(-pl%levelg(1:npl), ind(1:npl)) + end if + case("levelm") + if (ascending) then + call util_sort(pl%levelm(1:npl), ind(1:npl)) + else + call util_sort(-pl%levelm(1:npl), ind(1:npl)) + end if + case("peri") + if (ascending) then + call util_sort(pl%peri(1:npl), ind(1:npl)) + else + call util_sort(-pl%peri(1:npl), ind(1:npl)) + end if + case("atp") + if (ascending) then + call util_sort(pl%atp(1:npl), ind(1:npl)) + else + call util_sort(-pl%atp(1:npl), ind(1:npl)) + end if + case default + call util_sort_pl(pl, sortby, ascending) + end select + call pl%rearrange(ind) + end associate + + return + end subroutine symba_util_sort_pl + + module subroutine symba_util_sort_tp(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Swiftest test particle 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 + + associate(tp => self, ntp => self%nbody) + select case(sortby) + case("nplenc") + if (ascending) then + call util_sort(tp%nplenc(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%nplenc(1:ntp), ind(1:ntp)) + end if + case("levelg") + if (ascending) then + call util_sort(tp%levelg(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%levelg(1:ntp), ind(1:ntp)) + end if + case("levelm") + if (ascending) then + call util_sort(tp%levelm(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%levelm(1:ntp), ind(1:ntp)) + end if + case default + call util_sort_tp(tp, 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 + !! + !! Rearrange SyMBA 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(symba_pl), intent(inout) :: self !! Symba 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(symba_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i, j + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%lcollision(1:npl) = pl_sorted%lcollision(ind(1:npl)) + pl%lencounter(1:npl) = pl_sorted%lencounter(ind(1:npl)) + pl%nplenc(1:npl) = pl_sorted%nplenc(ind(1:npl)) + pl%ntpenc(1:npl) = pl_sorted%ntpenc(ind(1:npl)) + pl%levelg(1:npl) = pl_sorted%levelg(ind(1:npl)) + pl%levelm(1:npl) = pl_sorted%levelm(ind(1:npl)) + pl%isperi(1:npl) = pl_sorted%isperi(ind(1:npl)) + pl%peri(1:npl) = pl_sorted%peri(ind(1:npl)) + pl%atp(1:npl) = pl_sorted%atp(ind(1:npl)) + pl%info(1:npl) = pl_sorted%info(ind(1:npl)) + pl%kin(1:npl) = pl_sorted%kin(ind(1:npl)) + do i = 1, npl + do j = 1, pl%kin(i)%nchild + pl%kin(i)%child(j) = ind(pl%kin(i)%child(j)) + end do + 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 + !! + !! Rearrange SyMBA test particle object in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Symba 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(symba_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + + associate(tp => self, ntp => self%nbody) + call util_sort_rearrange_tp(tp,ind) + allocate(tp_sorted, source=self) + tp%nplenc(1:ntp) = tp_sorted%nplenc(ind(1:ntp)) + tp%levelg(1:ntp) = tp_sorted%levelg(ind(1:ntp)) + tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) + deallocate(tp_sorted) + end associate + return + end subroutine symba_util_sort_rearrange_tp end submodule s_symba_util \ No newline at end of file diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index fdaded124..044e56428 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -12,7 +12,7 @@ module subroutine util_sort_body(self, sortby, ascending) 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(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(body => self, n => self%nbody) select case(sortby) @@ -73,7 +73,7 @@ module subroutine util_sort_pl(self, sortby, ascending) 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(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(pl => self, npl => self%nbody) select case(sortby) @@ -140,7 +140,7 @@ module subroutine util_sort_tp(self, sortby, ascending) 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(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(tp => self, ntp => self%nbody) select case(sortby) From c15eaeb60bbbcdc15064cd50ef71bf6bcc63b030 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:45:28 -0400 Subject: [PATCH 26/29] Fixed issue in polymorphic sorting where sorting would be attempted more than once. --- src/symba/symba_util.f90 | 4 ++-- src/util/util_sort.f90 | 45 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 24a59a9cc..a89da7b6a 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -118,10 +118,10 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) end if case default call util_sort_pl(pl, sortby, ascending) + return end select call pl%rearrange(ind) end associate - return end subroutine symba_util_sort_pl @@ -160,10 +160,10 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end if case default call util_sort_tp(tp, sortby, ascending) + return end select call tp%rearrange(ind) end associate - return end subroutine symba_util_sort_tp diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 044e56428..34fe600ed 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -54,8 +54,8 @@ module subroutine util_sort_body(self, sortby, ascending) end if case default write(*,*) 'Cannot sort structure by component '//trim(adjustl(sortby)) + return end select - call body%rearrange(ind) end associate @@ -121,8 +121,8 @@ module subroutine util_sort_pl(self, sortby, ascending) end if case default call util_sort_body(pl, sortby, ascending) + return end select - call pl%rearrange(ind) end associate @@ -158,6 +158,7 @@ module subroutine util_sort_tp(self, sortby, ascending) end if case default call util_sort_body(tp, sortby, ascending) + return end select call tp%rearrange(ind) @@ -216,22 +217,22 @@ module subroutine util_sort_rearrange_pl(self, ind) ! Internals class(swiftest_pl), allocatable :: pl_sorted !! Temporary holder for sorted body - call util_sort_rearrange_body(self,ind) - associate(n => self%nbody) + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_body(pl,ind) allocate(pl_sorted, source=self) - self%mass(1:n) = pl_sorted%mass(ind(1:n)) - self%Gmass(1:n) = pl_sorted%Gmass(ind(1:n)) - self%rhill(1:n) = pl_sorted%rhill(ind(1:n)) - self%radius(1:n) = pl_sorted%radius(ind(1:n)) - self%xbeg(:,1:n) = pl_sorted%xbeg(:,ind(1:n)) - self%xend(:,1:n) = pl_sorted%xend(:,ind(1:n)) - self%vbeg(:,1:n) = pl_sorted%vbeg(:,ind(1:n)) - self%density(1:n) = pl_sorted%density(ind(1:n)) - self%Ip(:,1:n) = pl_sorted%Ip(:,ind(1:n)) - self%rot(:,1:n) = pl_sorted%rot(:,ind(1:n)) - self%k2(1:n) = pl_sorted%k2(ind(1:n)) - self%Q(1:n) = pl_sorted%Q(ind(1:n)) - self%tlag(1:n) = pl_sorted%tlag(ind(1:n)) + pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) + pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) + pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) + pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) + pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) + pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) + pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) + pl%density(1:npl) = pl_sorted%density(ind(1:npl)) + pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) + pl%rot(:,1:npl) = pl_sorted%rot(:,ind(1:npl)) + pl%k2(1:npl) = pl_sorted%k2(ind(1:npl)) + pl%Q(1:npl) = pl_sorted%Q(ind(1:npl)) + pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) deallocate(pl_sorted) end associate return @@ -249,12 +250,12 @@ module subroutine util_sort_rearrange_tp(self, ind) ! Internals class(swiftest_tp), allocatable :: tp_sorted !! Temporary holder for sorted body - call util_sort_rearrange_body(self,ind) - associate(n => self%nbody) + associate(tp => self, ntp => self%nbody) + call util_sort_rearrange_body(tp,ind) allocate(tp_sorted, source=self) - self%isperi(1:n) = tp_sorted%isperi(ind(1:n)) - self%peri(1:n) = tp_sorted%peri(ind(1:n)) - self%atp(1:n) = tp_sorted%atp(ind(1:n)) + tp%isperi(1:ntp) = tp_sorted%isperi(ind(1:ntp)) + tp%peri(1:ntp) = tp_sorted%peri(ind(1:ntp)) + tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) deallocate(tp_sorted) end associate return From afcf1b979e60c3326291a0e407a88eaaeb1a20ef Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:51:48 -0400 Subject: [PATCH 27/29] Removed obsolete nrutil module. No more numerical recipes code --- Makefile | 1 - src/modules/module_nrutil.f90 | 189 ---------------------------------- src/modules/swiftest.f90 | 1 - 3 files changed, 191 deletions(-) delete mode 100644 src/modules/module_nrutil.f90 diff --git a/Makefile b/Makefile index 7154c63b1..63cfb0ee0 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,6 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ rmvs_classes.f90 \ helio_classes.f90 \ symba_classes.f90 \ - module_nrutil.f90 \ lambda_function.f90\ swiftest.f90 diff --git a/src/modules/module_nrutil.f90 b/src/modules/module_nrutil.f90 deleted file mode 100644 index ce8eeabbc..000000000 --- a/src/modules/module_nrutil.f90 +++ /dev/null @@ -1,189 +0,0 @@ -!********************************************************************************************************************************** -! -! Unit Name : module_nrutil -! Unit Type : module -! Project : SWIFTEST -! Package : module -! Language : Fortran 90/95 -! -! Description : Definition of data and utility functions taken from Numerical Recipes in Fortran 90 -! -! Input -! Arguments : N/A -! Terminal : N/A -! File : N/A -! -! Output -! Arguments : N/A -! Terminal : N/A -! File : N/A -! -! Invocation : N/A -! -! Notes : Reference: Press, W. H., Teukolsky, S. A., Vetterling, W. T. & Flannery B. P. 1996. Numerical Recipes in -! Fortran 90, The Art of Scientific Computing, 2nd Edition, Vol. 2 of Fortran Numerical Recipes, -! (Cambridge University Press). -! -!********************************************************************************************************************************** -MODULE module_nrutil - - USE swiftest_globals - IMPLICIT NONE - - INTEGER(I4B), PARAMETER :: NPAR_ARTH = 16 - INTEGER(I4B), PARAMETER :: NPAR2_ARTH = 8 - INTEGER(I4B), PARAMETER :: NPAR_CUMSUM = 16 - - INTERFACE arth - MODULE PROCEDURE arth_d, arth_i - END INTERFACE - - INTERFACE cumsum - MODULE PROCEDURE cumsum_i - END INTERFACE - - INTERFACE outerdiff - MODULE PROCEDURE outerdiff_d, outerdiff_i - END INTERFACE - - INTERFACE outerprod - MODULE PROCEDURE outerprod_d - END INTERFACE - -CONTAINS - - FUNCTION arth_d(first, increment, n) - INTEGER(I4B), INTENT(IN) :: n - REAL(DP), INTENT(IN) :: first, increment - REAL(DP), DIMENSION(n) :: arth_d - INTEGER(I4B) :: k, k2 - REAL(DP) :: temp - IF (n > 0) arth_d(1) = first - IF (n <= NPAR_ARTH) THEN - DO k = 2, n - arth_d(k) = arth_d(k-1) + increment - END DO - ELSE - DO k = 2, NPAR2_ARTH - arth_d(k) = arth_d(k-1) + increment - END DO - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - DO - IF (k >= n) EXIT - k2 = k + k - arth_d(k+1:MIN(k2, n)) = temp + arth_d(1:MIN(k, n-k)) - temp = temp + temp - k = k2 - END DO - END IF - RETURN - END FUNCTION arth_d - - FUNCTION arth_i(first, increment, n) - INTEGER(I4B), INTENT(IN) :: first, increment, n - INTEGER(I4B), DIMENSION(n) :: arth_i - INTEGER(I4B) :: k, k2, temp - IF (n > 0) arth_i(1) = first - IF (n <= NPAR_ARTH) THEN - DO k = 2, n - arth_i(k) = arth_i(k-1) + increment - END DO - ELSE - DO k = 2, NPAR2_ARTH - arth_i(k) = arth_i(k-1) + increment - END DO - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - DO - IF (k >= n) EXIT - k2 = k + k - arth_i(k+1:MIN(k2, n)) = temp + arth_i(1:MIN(k, n-k)) - temp = temp + temp - k = k2 - END DO - END IF - RETURN - END FUNCTION arth_i - - RECURSIVE FUNCTION cumsum_i(arr, seed) RESULT(ans) - INTEGER(I4B), DIMENSION(:), INTENT(IN) :: arr - INTEGER(I4B), OPTIONAL, INTENT(IN) :: seed - INTEGER(I4B), DIMENSION(SIZE(arr)) :: ans - INTEGER(I4B) :: n, j, sd - n = SIZE(arr) - IF (n == 0_I4B) RETURN - sd = 0_I4B - IF (PRESENT(seed)) sd = seed - ans(1) = arr(1) + sd - IF (n < NPAR_CUMSUM) THEN - DO j = 2, n - ans(j) = ans(j-1) + arr(j) - END DO - ELSE - ans(2:n:2) = cumsum_i(arr(2:n:2) + arr(1:n-1:2), sd) - ans(3:n:2) = ans(2:n-1:2) + arr(3:n:2) - END IF - RETURN - END FUNCTION cumsum_i - - FUNCTION iminloc(arr) - REAL(DP), DIMENSION(:), INTENT(IN) :: arr - INTEGER(I4B), DIMENSION(1) :: imin - INTEGER(I4B) :: iminloc - imin = MINLOC(arr(:)) - iminloc = imin(1) - RETURN - END FUNCTION iminloc - - FUNCTION outerdiff_d(a, b) - REAL(DP), DIMENSION(:), INTENT(IN) :: a, b - REAL(DP), DIMENSION(SIZE(a), SIZE(b)) :: outerdiff_d - outerdiff_d = SPREAD(a, DIM = 2, NCOPIES = SIZE(b)) - SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerdiff_d - - FUNCTION outerdiff_i(a, b) - INTEGER(I4B), DIMENSION(:), INTENT(IN) :: a, b - INTEGER(I4B), DIMENSION(SIZE(a), SIZE(b)) :: outerdiff_i - outerdiff_i = SPREAD(a, DIM = 2, NCOPIES = SIZE(b)) - SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerdiff_i - - FUNCTION outerprod_d(a, b) - REAL(DP), DIMENSION(:), INTENT(IN) :: a, b - REAL(DP), DIMENSION(SIZE(a), SIZE(b)) :: outerprod_d - outerprod_d = SPREAD(a, DIM = 2, NCOPIES = SIZE(b))*SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerprod_d - - FUNCTION upper_triangle(j, k, extra) - INTEGER(I4B), INTENT(IN) :: j, k - INTEGER(I4B), OPTIONAL, INTENT(IN) :: extra - LOGICAL , DIMENSION(j, k) :: upper_triangle - INTEGER(I4B) :: n - n = 0 - IF (PRESENT(extra)) n = extra - upper_triangle = (outerdiff(arth_i(1, 1, j), arth_i(1, 1, k)) < n) - RETURN - END FUNCTION upper_triangle - -END MODULE module_nrutil -!********************************************************************************************************************************** -! -! Author(s) : David E. Kaufmann -! -! Revision Control System (RCS) Information -! -! Source File : $RCSfile$ -! Full Path : $Source$ -! Revision : $Revision$ -! Date : $Date$ -! Programmer : $Author$ -! Locked By : $Locker$ -! State : $State$ -! -! Modification History: -! -! $Log$ -!********************************************************************************************************************************** diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 2ab44a9d5..10578c5b6 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -10,7 +10,6 @@ module swiftest use rmvs_classes use helio_classes use symba_classes - use module_nrutil use lambda_function !use advisor_annotate !$ use omp_lib From 5588444ec278bdc28a32f28789dce604f5339baa Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 08:55:01 -0400 Subject: [PATCH 28/29] Refactored and rearranged some subroutine calls to maintain consistency and make it easier to find things --- src/modules/rmvs_classes.f90 | 6 +++--- src/modules/symba_classes.f90 | 6 +++--- src/modules/whm_classes.f90 | 12 ++++++------ src/rmvs/rmvs_setup.f90 | 6 +++--- src/symba/symba_setup.f90 | 6 +++--- src/whm/whm_setup.f90 | 27 ++------------------------- src/whm/whm_util.f90 | 23 +++++++++++++++++++++++ 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 8b0ad2c2f..c167906fc 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -26,7 +26,7 @@ module rmvs_classes contains private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => rmvs_setup_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures + procedure, public :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures procedure, public :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step end type rmvs_nbody_system @@ -152,12 +152,12 @@ module subroutine rmvs_setup_pl(self,n) integer, intent(in) :: n !! Number of test particles to allocate end subroutine rmvs_setup_pl - module subroutine rmvs_setup_system(self, param) + module subroutine rmvs_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(rmvs_nbody_system), intent(inout) :: self !! RMVS system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine rmvs_setup_system + end subroutine rmvs_setup_initialize_system module subroutine rmvs_setup_tp(self,n) implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 98108e9df..3fe5a1824 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -160,7 +160,7 @@ module symba_classes class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure contains private - procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps + procedure, public :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary @@ -332,12 +332,12 @@ module subroutine symba_setup_plplenc(self,n) integer, intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_plplenc - module subroutine symba_setup_system(self, param) + module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine symba_setup_system + end subroutine symba_setup_initialize_system module subroutine symba_setup_tp(self,n) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 46a4e3743..a61cefb78 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -41,7 +41,7 @@ module whm_classes procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. - procedure, public :: set_ir3 => whm_setup_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure, public :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl @@ -72,7 +72,7 @@ module whm_classes contains private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => whm_setup_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses + procedure, public :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses procedure, public :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step end type whm_nbody_system @@ -199,10 +199,10 @@ module subroutine whm_setup_pl(self,n) integer(I4B), intent(in) :: n !! Number of test particles to allocate end subroutine whm_setup_pl - module subroutine whm_setup_set_ir3j(self) + module subroutine whm_util_set_ir3j(self) implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object - end subroutine whm_setup_set_ir3j + end subroutine whm_util_set_ir3j module subroutine whm_util_set_mu_eta_pl(self, cb) use swiftest_classes, only : swiftest_cb @@ -211,12 +211,12 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine whm_util_set_mu_eta_pl - module subroutine whm_setup_system(self, param) + module subroutine whm_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(whm_nbody_system), intent(inout) :: self !! WHM nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine whm_setup_system + end subroutine whm_setup_initialize_system !> Reads WHM test particle object in from file module subroutine whm_setup_tp(self,n) diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 4cda7bd6f..58002401e 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -46,7 +46,7 @@ module subroutine rmvs_setup_pl(self,n) return end subroutine rmvs_setup_pl - module subroutine rmvs_setup_system(self, param) + module subroutine rmvs_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize an RMVS nbody system from files and sets up the planetocentric structures. @@ -64,7 +64,7 @@ module subroutine rmvs_setup_system(self, param) integer(I4B) :: i, j ! Call parent method - call whm_setup_system(self, param) + call whm_setup_initialize_system(self, param) ! Set up the pl-tp planetocentric encounter structures for pl and cb. The planetocentric tp structures are ! generated as necessary during close encounter steps. @@ -116,7 +116,7 @@ module subroutine rmvs_setup_system(self, param) end select end select - end subroutine rmvs_setup_system + end subroutine rmvs_setup_initialize_system module subroutine rmvs_setup_tp(self,n) !! author: David A. Minton diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 9efb37e9a..51aaf69ba 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -100,7 +100,7 @@ module subroutine symba_setup_plplenc(self,n) return end subroutine symba_setup_plplenc - module subroutine symba_setup_system(self, param) + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. @@ -115,7 +115,7 @@ module subroutine symba_setup_system(self, param) ! Call parent method associate(system => self) - call whm_setup_system(system, param) + call whm_setup_initialize_system(system, param) call system%mergeadd_list%setup(1) call system%mergesub_list%setup(1) call system%pltpenc_list%setup(1) @@ -131,7 +131,7 @@ module subroutine symba_setup_system(self, param) end select end associate return - end subroutine symba_setup_system + end subroutine symba_setup_initialize_system module subroutine symba_setup_tp(self,n) !! author: David A. Minton diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 1f098df26..940ba0b26 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -71,7 +71,7 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) end subroutine whm_util_set_mu_eta_pl - module subroutine whm_setup_system(self, param) + module subroutine whm_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize a WHM nbody system from files @@ -91,29 +91,6 @@ module subroutine whm_setup_system(self, param) call self%tp%v2pv(param) end if - end subroutine whm_setup_system - - module subroutine whm_setup_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_setup_set_ir3j + end subroutine whm_setup_initialize_system end submodule s_whm_setup \ No newline at end of file diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 275130df9..67c7ef4a1 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -89,4 +89,27 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) 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 + end submodule s_whm_util From 720f15eee06914737d679533da6f13a9869a903e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 09:05:41 -0400 Subject: [PATCH 29/29] Switched to a default public model, since that was effectively what we were doing anyway, and this simplifies the code quite a bit --- src/modules/helio_classes.f90 | 39 +++---- src/modules/rmvs_classes.f90 | 57 +++++----- src/modules/swiftest_classes.f90 | 177 +++++++++++++------------------ src/modules/symba_classes.f90 | 86 +++++++-------- src/modules/whm_classes.f90 | 54 +++++----- 5 files changed, 189 insertions(+), 224 deletions(-) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 2f8a52808..d03466676 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -7,21 +7,22 @@ module helio_classes use swiftest_classes, only : swiftest_cb, swiftest_pl, swiftest_tp, swiftest_nbody_system use whm_classes, only : whm_nbody_system implicit none + public !******************************************************************************************************************************** ! helio_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(whm_nbody_system) :: helio_nbody_system + type, extends(whm_nbody_system) :: helio_nbody_system contains - procedure, public :: step => helio_step_system !! Advance the Helio nbody system forward in time by one step + procedure :: step => helio_step_system !! Advance the Helio nbody system forward in time by one step end type helio_nbody_system !******************************************************************************************************************************** ! helio_cb class definitions and method interfaces !******************************************************************************************************************************* !> Helio central body particle class - type, public, extends(swiftest_cb) :: helio_cb + type, extends(swiftest_cb) :: helio_cb real(DP), dimension(NDIM) :: ptbeg !! negative barycentric velocity of the central body at the beginning of time step real(DP), dimension(NDIM) :: ptend !! negative barycentric velocity of the central body at the end of time step contains @@ -32,15 +33,15 @@ module helio_classes !******************************************************************************************************************************* !! Helio massive body particle class - type, public, extends(swiftest_pl) :: helio_pl + type, extends(swiftest_pl) :: helio_pl 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 :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities - procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) + procedure :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities + procedure :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl !******************************************************************************************************************************** @@ -48,15 +49,15 @@ module helio_classes !******************************************************************************************************************************* !! Helio test particle class - type, public, extends(swiftest_tp) :: helio_tp + type, extends(swiftest_tp) :: helio_tp 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 :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities - procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) + procedure :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities + procedure :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp interface diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index c167906fc..37a88993c 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -6,28 +6,27 @@ module rmvs_classes use swiftest_globals use whm_classes, only : whm_cb, whm_pl, whm_tp, whm_nbody_system implicit none - public + integer(I4B), private, parameter :: NTENC = 10 integer(I4B), private, parameter :: NTPHENC = 3 integer(I4B), private, parameter :: NTPENC = NTENC * NTPHENC - real(DP), private, parameter :: RHSCALE = 3.5_DP - real(DP), private, parameter :: RHPSCALE = 1.0_DP - real(DP), private, parameter :: FACQDT = 2.0_DP + real(DP), private, parameter :: RHSCALE = 3.5_DP + real(DP), private, parameter :: RHPSCALE = 1.0_DP + real(DP), private, parameter :: FACQDT = 2.0_DP !******************************************************************************************************************************** ! rmvs_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(whm_nbody_system) :: rmvs_nbody_system + type, extends(whm_nbody_system) :: rmvs_nbody_system !> In the RMVS integrator, only test particles are discarded logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations real(DP) :: rts !! fraction of Hill's sphere radius to use as radius of encounter region real(DP), dimension(:,:), allocatable :: vbeg !! Planet velocities at beginning ot step contains - private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures - procedure, public :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step + procedure :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures + procedure :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step end type rmvs_nbody_system type, private :: rmvs_interp @@ -41,7 +40,7 @@ module rmvs_classes ! rmvs_cb class definitions and method interfaces !******************************************************************************************************************************* !> RMVS central body particle class - type, public, extends(whm_cb) :: rmvs_cb + type, extends(whm_cb) :: rmvs_cb 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 logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations @@ -52,7 +51,7 @@ module rmvs_classes !******************************************************************************************************************************* !! RMVS test particle class - type, public, extends(whm_tp) :: rmvs_tp + type, extends(whm_tp) :: rmvs_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as rmvs_setup_tp and rmvs_util_spill_tp ! encounter steps) @@ -67,14 +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 - private - procedure, public :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered - procedure, public :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the - !! if the test particle is undergoing a close encounter or not - procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered + procedure :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + !! if the test particle is undergoing a close encounter or not + procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure :: spill => rmvs_util_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,19 +80,18 @@ module rmvs_classes !******************************************************************************************************************************* !> RMVS massive body particle class - type, public, 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 - 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 + type, 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 + class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric !! Planetocentric version of the massive body objects (one for each massive body) + logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - private - procedure, public :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7f91f93f2..eff9f4077 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -5,25 +5,7 @@ module swiftest_classes !! Adapted from David E. Kaufmann's Swifter routine: module_swifter.f90 use swiftest_globals implicit none - private - public :: discard_pl, discard_system, discard_tp - public :: drift_all, drift_body, drift_one - public :: eucl_dist_index_plpl - public :: gr_kick_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel - public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & - io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & - io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_getacch_int_pl - public :: obl_acc_body, obl_acc_pl, obl_acc_tp - public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt - public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp - public :: tides_kick_getacch_pl, tides_step_spin_system - public :: user_kick_getacch_body - public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & - util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, & - util_sort, util_sort_body, util_sort_pl, util_sort_tp, util_sort_rearrange_body, util_sort_rearrange_pl, util_sort_rearrange_tp, & - util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + public !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -31,7 +13,7 @@ module swiftest_classes !> User defined parameters that are read in from the parameters input file. !> Each paramter is initialized to a default values. - type, public :: swiftest_parameters + type :: swiftest_parameters integer(I4B) :: integrator = UNKNOWN_INTEGRATOR !! Symbolic name of the nbody integrator used integer(I4B) :: nplmax = -1 !! Maximum allowed number of massive bodies integer(I4B) :: ntpmax = -1 !! Maximum allowed number of test particles @@ -78,33 +60,31 @@ module swiftest_classes logical :: lyarkovsky = .false. !! Turn on Yarkovsky effect logical :: lyorp = .false. !! Turn on YORP effect contains - private - procedure, public :: reader => io_param_reader - procedure, public :: writer => io_param_writer - procedure, public :: dump => io_dump_param - procedure, public :: read_from_file => io_read_param_in + procedure :: reader => io_param_reader + procedure :: writer => io_param_writer + procedure :: dump => io_dump_param + procedure :: read_from_file => io_read_param_in end type swiftest_parameters !******************************************************************************************************************************** ! swiftest_base class definitions and methods !******************************************************************************************************************************** - type, abstract, public :: swiftest_base + type, abstract :: swiftest_base !! An superclass for a generic Swiftest object logical :: lintegrate = .false. !! Flag indicating that this object should be integrated in the current step contains !! The minimal methods that all systems must have - private procedure :: dump => io_dump_swiftest - procedure(abstract_initialize), public, deferred :: initialize - procedure(abstract_read_frame), public, deferred :: read_frame - procedure(abstract_write_frame), public, deferred :: write_frame + procedure(abstract_initialize), deferred :: initialize + procedure(abstract_read_frame), deferred :: read_frame + procedure(abstract_write_frame), deferred :: write_frame end type swiftest_base !******************************************************************************************************************************** ! swiftest_cb class definitions and methods !******************************************************************************************************************************** !> A concrete lass for the central body in a Swiftest simulation - type, abstract, public, extends(swiftest_base) :: swiftest_cb + type, abstract, extends(swiftest_base) :: swiftest_cb character(len=STRMAX) :: name !! Non-unique name integer(I4B) :: id = 0 !! External identifier (unique) real(DP) :: mass = 0.0_DP !! Central body mass (units MU) @@ -130,17 +110,16 @@ module swiftest_classes real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body contains - private - procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data - 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 :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: initialize => io_read_cb_in !! I/O routine for reading in central body data + procedure :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body + procedure :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body end type swiftest_cb !******************************************************************************************************************************** ! swiftest_body definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest bodies - type, abstract, public, extends(swiftest_base) :: swiftest_body + type, abstract, extends(swiftest_base) :: swiftest_body !! Superclass that defines the generic elements of a Swiftest particle logical :: lfirst = .true. !! Run the current step as a first integer(I4B) :: nbody = 0 !! Number of bodies @@ -167,37 +146,36 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains - private - procedure(abstract_discard_body), public, deferred :: discard - procedure(abstract_kick_body), public, deferred :: kick - procedure(abstract_set_mu), public, deferred :: set_mu - procedure(abstract_step_body), public, deferred :: step - procedure(abstract_accel), public, deferred :: accel + procedure(abstract_discard_body), deferred :: discard + procedure(abstract_kick_body), deferred :: kick + procedure(abstract_set_mu), deferred :: set_mu + procedure(abstract_step_body), deferred :: step + procedure(abstract_accel), deferred :: accel ! These are concrete because the implementation is the same for all types of particles - procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables - procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators - procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators - 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 :: 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 :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays - procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure - procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) - procedure, public :: sort => util_sort_body !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables + procedure :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators + procedure :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators + procedure :: initialize => io_read_body_in !! Read in body initial conditions from a file + procedure :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors + procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements + procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays + procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen + procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** ! swiftest_pl definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest massive bodies - type, abstract, public, extends(swiftest_body) :: swiftest_pl + type, abstract, extends(swiftest_body) :: swiftest_pl !! Superclass that defines the generic elements of a Swiftest particle real(DP), dimension(:), allocatable :: mass !! Body mass (units MU) real(DP), dimension(:), allocatable :: Gmass !! Mass gravitational term G * mass (units GU * MU) @@ -217,31 +195,30 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_pl and util_spill_pl contains - private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: 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 :: sort => util_sort_pl !! Sorts body arrays by a sortable component - procedure, public :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - 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 :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass + procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body + procedure :: sort => util_sort_pl !! Sorts body arrays by a sortable component + procedure :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: 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 !******************************************************************************************************************************** ! swiftest_tp definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest test particles - type, abstract, public, extends(swiftest_body) :: swiftest_tp + type, abstract, extends(swiftest_body) :: swiftest_tp !! Superclass that defines the generic elements of a Swiftest test particle integer(I4B), dimension(:), allocatable :: isperi !! Perihelion passage flag real(DP), dimension(:), allocatable :: peri !! Perihelion distance @@ -249,28 +226,27 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_tp and util_spill_tp contains - 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 :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies - 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 :: 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 :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure, public :: sort => util_sort_tp !! Sorts body arrays by a sortable component - procedure, public :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - 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 :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component + procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: 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 !******************************************************************************************************************************** ! swiftest_nbody_system class definitions and methods !******************************************************************************************************************************** !> An abstract class for a basic Swiftest nbody system - type, abstract, public, extends(swiftest_base) :: swiftest_nbody_system + type, abstract, extends(swiftest_base) :: swiftest_nbody_system !! This superclass contains a minimial system of a set of test particles (tp), massive bodies (pl), and a central body (cb) class(swiftest_cb), allocatable :: cb !! Central body data structure class(swiftest_pl), allocatable :: pl !! Massive body data structure @@ -289,19 +265,18 @@ module swiftest_classes !! 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 - procedure(abstract_step_system), public, deferred :: step + procedure(abstract_step_system), deferred :: step ! Concrete classes that are common to the basic integrator (only test particles considered for discard) - procedure, public :: discard => discard_system !! Perform a discard step on the system - procedure, public :: dump => io_dump_system !! Dump the state of the system to a file - procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file - 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 :: initialize => setup_initialize_system !! Initialize the system from input files - procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. - procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. + procedure :: discard => discard_system !! Perform a discard step on the system + procedure :: dump => io_dump_system !! Dump the state of the system to a file + procedure :: read_frame => io_read_frame_system !! Append a frame of output data to file + procedure :: write_discard => io_write_discard !! Append a frame of output data to file + procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure :: initialize => setup_initialize_system !! Initialize the system from input files + procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. + procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system abstract interface diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 3fe5a1824..fc3520079 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -8,6 +8,7 @@ module symba_classes use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind implicit none + public integer(I4B), private, parameter :: NENMAX = 32767 integer(I4B), private, parameter :: NTENC = 3 @@ -16,28 +17,26 @@ module symba_classes character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file - type, public, extends(swiftest_parameters) :: symba_parameters + type, extends(swiftest_parameters) :: symba_parameters character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating integer(I4B), dimension(:), allocatable :: seed !! Random seeds logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. contains - private - procedure, public :: reader => symba_io_param_reader - procedure, public :: writer => symba_io_param_writer + procedure :: reader => symba_io_param_reader + procedure :: writer => symba_io_param_writer end type symba_parameters !******************************************************************************************************************************** ! symba_cb class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA central body particle class - type, public, extends(helio_cb) :: symba_cb + type, extends(helio_cb) :: symba_cb real(DP) :: M0 = 0.0_DP !! Initial mass of the central body real(DP) :: dM = 0.0_DP !! Change in mass of the central body real(DP) :: R0 = 0.0_DP !! Initial radius of the central body real(DP) :: dR = 0.0_DP !! Change in the radius of the central body contains - private end type symba_cb !******************************************************************************************************************************** @@ -45,17 +44,16 @@ module symba_classes !******************************************************************************************************************************* !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime !> of fragments produced in collisional events. - type, public, extends(swiftest_base) :: symba_particle_info + type, extends(swiftest_base) :: symba_particle_info character(len=32) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) real(DP) :: origin_time !! The time of the particle's formation real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation contains - private - procedure, public :: dump => symba_io_dump_particle_info !! I/O routine for dumping particle info to file - procedure, public :: initialize => symba_io_initialize_particle_info !! I/O routine for reading in particle info data - procedure, public :: read_frame => symba_io_read_frame_info !! I/O routine for reading in a single frame of particle info - procedure, public :: write_frame => symba_io_write_frame_info !! I/O routine for writing out a single frame of particle info + procedure :: dump => symba_io_dump_particle_info !! I/O routine for dumping particle info to file + procedure :: initialize => symba_io_initialize_particle_info !! I/O routine for reading in particle info data + procedure :: read_frame => symba_io_read_frame_info !! I/O routine for reading in a single frame of particle info + procedure :: write_frame => symba_io_write_frame_info !! I/O routine for writing out a single frame of particle info end type symba_particle_info !******************************************************************************************************************************** @@ -72,7 +70,7 @@ module symba_classes ! symba_pl class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA massive body class - type, public, extends(helio_pl) :: symba_pl + type, extends(helio_pl) :: symba_pl logical, dimension(:), allocatable :: lcollision !! flag indicating whether body has merged with another this time step logical, dimension(:), allocatable :: lencounter !! flag indicating whether body is part of an encounter this time step logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the MTINY cutoff value @@ -88,37 +86,35 @@ module symba_classes type(symba_kinship), dimension(:), allocatable :: kin !! Array of merger relationship structures that can account for multiple pairwise mergers in a single step type(symba_particle_info), dimension(:), allocatable :: info contains - private - procedure, public :: discard => symba_discard_pl !! Process massive body discards - procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other - procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle - procedure, public :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: discard => symba_discard_pl !! Process massive body discards + procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen + procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl !******************************************************************************************************************************** ! symba_tp class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA test particle class - type, public, extends(helio_tp) :: symba_tp + type, extends(helio_tp) :: symba_tp integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with planets this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this particle should be moved integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains - private - procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle - procedure, public :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen + procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_tp !******************************************************************************************************************************** ! symba_pltpenc class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA class for tracking pl-tp close encounters in a step - type, public :: symba_pltpenc + type :: symba_pltpenc integer(I4B) :: nenc !! Total number of encounters logical, dimension(:), allocatable :: lvdotr !! relative vdotr flag integer(I4B), dimension(:), allocatable :: status !! status of the interaction @@ -126,49 +122,47 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains - procedure, public :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body - procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other - procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion - procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another - procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small + procedure :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body + procedure :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other + procedure :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion + procedure :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** ! symba_plplenc class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA class for tracking pl-pl close encounters in a step - type, public, extends(symba_pltpenc) :: symba_plplenc + type, extends(symba_pltpenc) :: symba_plplenc real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide - procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another + procedure :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide + procedure :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(helio_nbody_system) :: symba_nbody_system + type, extends(helio_nbody_system) :: symba_nbody_system class(symba_pl), allocatable :: mergeadd_list !! List of added bodies in mergers or collisions class(symba_pl), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure contains - private - procedure, public :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps - procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step - procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system - procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary - procedure, public :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step + procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps + procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step + procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary + procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system interface - module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index a61cefb78..a6ab59958 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -12,7 +12,7 @@ module whm_classes ! whm_cb class definitions and method interfaces !******************************************************************************************************************************* !> Swiftest central body particle class - type, public, extends(swiftest_cb) :: whm_cb + type, extends(swiftest_cb) :: whm_cb contains end type whm_cb @@ -21,7 +21,7 @@ module whm_classes !******************************************************************************************************************************* !> WHM massive body particle class - type, public, extends(swiftest_pl) :: whm_pl + type, extends(swiftest_pl) :: whm_pl real(DP), dimension(:), allocatable :: eta !! Jacobi mass real(DP), dimension(:,:), allocatable :: xj !! Jacobi position real(DP), dimension(:,:), allocatable :: vj !! Jacobi velocity @@ -30,20 +30,20 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_pl and whm_util_spill_pl contains - procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates - procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates - procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies - procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. - procedure, public :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) - procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize - procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates + procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates + procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates + procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates + procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. + procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure :: step => whm_step_pl !! Steps the body forward one stepsize + procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -51,29 +51,27 @@ module whm_classes !******************************************************************************************************************************* !! WHM test particle class - type, public, extends(swiftest_tp) :: whm_tp + type, extends(swiftest_tp) :: whm_tp !! 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_tp and whm_util_spill_tp contains - private - procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles - procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations - procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize + procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles + procedure :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations + procedure :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp !******************************************************************************************************************************** ! whm_nbody_system class definitions and method interfaces !******************************************************************************************************************************** !> An abstract class for the WHM integrator nbody system - type, public, extends(swiftest_nbody_system) :: whm_nbody_system + type, extends(swiftest_nbody_system) :: whm_nbody_system contains - private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses - procedure, public :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step + procedure :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses + procedure :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step end type whm_nbody_system interface