From 5dee8d3788949f716f15f225678a894b17a1e428 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 19:41:44 -0400 Subject: [PATCH] Reorganized io subroutines into alphabetical order like the other submodules --- .../swiftest_vs_swifter.ipynb | 1208 ++++++++++++++++- src/io/io.f90 | 732 +++++----- src/modules/symba_classes.f90 | 6 +- src/symba/symba_discard.f90 | 2 +- src/symba/symba_fragmentation.f90 | 2 + src/symba/symba_util.f90 | 30 +- src/util/util_spill.f90 | 1 + 7 files changed, 1540 insertions(+), 441 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index 69349f2a4..3a80eebd1 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 6, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "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": 19, "metadata": {}, "outputs": [ { @@ -466,74 +466,1150 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'vx' (time (y): 221)>\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., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n",
-       "       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n",
+       "array([0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "...\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
+       "       0.        , 0.        , 0.02101973, 0.02102004, 0.02102057,\n",
+       "       0.0210213 , 0.02102224, 0.02102336, 0.02102465, 0.02102612,\n",
+       "       0.02102774, 0.02102951, 0.02103142, 0.02103346, 0.02103561,\n",
+       "       0.02103787, 0.02104022, 0.02104267, 0.02104519, 0.02104778,\n",
+       "       0.02105043, 0.02105312, 0.02105586, 0.02105862, 0.0210614 ,\n",
+       "       0.02106419])\n",
        "Coordinates:\n",
-       "    id        float64 100.0\n",
-       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
" + " id float64 2.0\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" ], "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., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n", - " nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n", + "array([0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + "...\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0.02101973, 0.02102004, 0.02102057,\n", + " 0.0210213 , 0.02102224, 0.02102336, 0.02102465, 0.02102612,\n", + " 0.02102774, 0.02102951, 0.02103142, 0.02103346, 0.02103561,\n", + " 0.02103787, 0.02104022, 0.02104267, 0.02104519, 0.02104778,\n", + " 0.02105043, 0.02105312, 0.02105586, 0.02105862, 0.0210614 ,\n", + " 0.02106419])\n", "Coordinates:\n", - " id float64 100.0\n", + " id float64 2.0\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" ] }, - "execution_count": 7, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['vx'].sel(id=100)" + "swiftdiff['vx'].sel(id=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'vx' (time: 221)>\n",
+       "array([ 0.        , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n",
+       "       -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n",
+       "       -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n",
+       "       -0.40940715, -0.43666596, -0.463918  , -0.49116285, -0.51840009,\n",
+       "       -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n",
+       "       -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n",
+       "       -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n",
+       "       -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n",
+       "       -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n",
+       "       -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n",
+       "       -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671  ,\n",
+       "       -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n",
+       "       -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n",
+       "       -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n",
+       "       -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n",
+       "       -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n",
+       "       -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n",
+       "       -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n",
+       "       -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n",
+       "       -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n",
+       "...\n",
+       "       -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n",
+       "       -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n",
+       "       -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n",
+       "       -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n",
+       "       -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n",
+       "       -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n",
+       "       -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n",
+       "       -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n",
+       "       -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n",
+       "       -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n",
+       "       -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n",
+       "       -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n",
+       "       -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n",
+       "       -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n",
+       "       -5.24263186, -5.9750488 ,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan])\n",
+       "Coordinates:\n",
+       "    id       float64 100.0\n",
+       "  * time     (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
" + ], + "text/plain": [ + "\n", + "array([ 0. , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n", + " -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n", + " -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n", + " -0.40940715, -0.43666596, -0.463918 , -0.49116285, -0.51840009,\n", + " -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n", + " -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n", + " -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n", + " -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n", + " -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n", + " -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n", + " -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671 ,\n", + " -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n", + " -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n", + " -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n", + " -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n", + " -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n", + " -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n", + " -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n", + " -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n", + " -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n", + "...\n", + " -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n", + " -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n", + " -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n", + " -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n", + " -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n", + " -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n", + " -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n", + " -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n", + " -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n", + " -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n", + " -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n", + " -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n", + " -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n", + " -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n", + " -5.24263186, -5.9750488 , nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan])\n", + "Coordinates:\n", + " id float64 100.0\n", + " * time (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftestsim.ds.sel(id=100)['vx']" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'vx' (time: 221)>\n",
+       "array([ 0.        , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n",
+       "       -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n",
+       "       -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n",
+       "       -0.40940715, -0.43666596, -0.463918  , -0.49116285, -0.51840009,\n",
+       "       -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n",
+       "       -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n",
+       "       -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n",
+       "       -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n",
+       "       -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n",
+       "       -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n",
+       "       -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671  ,\n",
+       "       -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n",
+       "       -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n",
+       "       -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n",
+       "       -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n",
+       "       -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n",
+       "       -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n",
+       "       -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n",
+       "       -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n",
+       "       -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n",
+       "...\n",
+       "       -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n",
+       "       -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n",
+       "       -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n",
+       "       -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n",
+       "       -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n",
+       "       -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n",
+       "       -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n",
+       "       -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n",
+       "       -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n",
+       "       -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n",
+       "       -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n",
+       "       -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n",
+       "       -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n",
+       "       -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n",
+       "       -5.24263186, -5.9750488 ,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan,         nan,         nan,         nan,         nan,\n",
+       "               nan])\n",
+       "Coordinates:\n",
+       "    id       int64 100\n",
+       "  * time     (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
" + ], + "text/plain": [ + "\n", + "array([ 0. , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n", + " -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n", + " -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n", + " -0.40940715, -0.43666596, -0.463918 , -0.49116285, -0.51840009,\n", + " -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n", + " -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n", + " -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n", + " -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n", + " -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n", + " -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n", + " -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671 ,\n", + " -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n", + " -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n", + " -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n", + " -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n", + " -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n", + " -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n", + " -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n", + " -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n", + " -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n", + "...\n", + " -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n", + " -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n", + " -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n", + " -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n", + " -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n", + " -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n", + " -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n", + " -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n", + " -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n", + " -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n", + " -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n", + " -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n", + " -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n", + " -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n", + " -5.24263186, -5.9750488 , nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan])\n", + "Coordinates:\n", + " id int64 100\n", + " * time (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftersim.ds.sel(id=100)['vx']" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index d2791aa92..145752836 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -2,6 +2,238 @@ use swiftest contains + module subroutine io_dump_param(self, param_file_name) + !! author: David A. Minton + !! + !! Dump integration parameters to file + !! + !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 + !! Adapted from Martin Duncan's Swift routine io_dump_param.f + implicit none + ! Arguments + class(swiftest_parameters),intent(in) :: self !! Output collection of parameters + character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) + ! Internals + integer(I4B), parameter :: LUN = 7 !! Unit number of output file + integer(I4B) :: ierr !! Error code + character(STRMAX) :: error_message !! Error message in UDIO procedure + + open(unit = LUN, file = param_file_name, status='replace', form = 'FORMATTED', iostat =ierr) + if (ierr /=0) then + write(*,*) 'Swiftest error.' + write(*,*) ' Could not open dump file: ',trim(adjustl(param_file_name)) + call util_exit(FAILURE) + end if + + !! todo: Currently this procedure does not work in user-defined derived-type input mode + !! due to compiler incompatabilities + !write(LUN,'(DT)') param + call self%writer(LUN, iotype = "none", v_list = [0], iostat = ierr, iomsg = error_message) + if (ierr /= 0) then + write(*,*) trim(adjustl(error_message)) + call util_exit(FAILURE) + end if + close(LUN) + + return + end subroutine io_dump_param + + + module subroutine io_dump_swiftest(self, param, msg) + !! author: David A. Minton + !! + !! Dump massive body data to files + !! + !! Adapted from David E. Kaufmann's Swifter routine: io_dump_pl.f90 and io_dump_tp.f90 + !! Adapted from Hal Levison's Swift routine io_dump_pl.f and io_dump_tp.f + implicit none + ! Arguments + class(swiftest_base), intent(inout) :: self !! Swiftest base object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + character(*), optional, intent(in) :: msg !! Message to display with dump operation + ! Internals + integer(I4B) :: ierr !! Error code + integer(I4B),parameter :: LUN = 7 !! Unit number for dump file + integer(I4B) :: iu = LUN + character(len=:), allocatable :: dump_file_name + + select type(self) + class is(swiftest_cb) + dump_file_name = trim(adjustl(param%incbfile)) + class is (swiftest_pl) + dump_file_name = trim(adjustl(param%inplfile)) + class is (swiftest_tp) + dump_file_name = trim(adjustl(param%intpfile)) + end select + open(unit = iu, file = dump_file_name, form = "UNFORMATTED", status = 'replace', iostat = ierr) + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " Unable to open binary dump file " // dump_file_name + call util_exit(FAILURE) + end if + call self%write_frame(iu, param) + close(LUN) + + return + end subroutine io_dump_swiftest + + + module subroutine io_dump_system(self, param, msg) + !! author: David A. Minton + !! + !! Dumps the state of the system to files in case the simulation is interrupted. + !! As a safety mechanism, there are two dump files that are written in alternating order + !! so that if a dump file gets corrupted during writing, the user can restart from the older one. + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + character(*), optional, intent(in) :: msg !! Message to display with dump operation + ! Internals + class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names + !! to dump file-specific values without changing the user-defined values + integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security + !! in case the program halts during writing + character(len=:), allocatable :: param_file_name + real(DP) :: tfrac + + allocate(dump_param, source=param) + param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) + dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) + dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) + dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) + dump_param%out_form = XV + dump_param%out_stat = 'APPEND' + dump_param%T0 = param%t + call dump_param%dump(param_file_name) + + call self%cb%dump(dump_param) + if (self%pl%nbody > 0) call self%pl%dump(dump_param) + if (self%tp%nbody > 0) call self%tp%dump(dump_param) + + idx = idx + 1 + if (idx > NDUMPFILES) idx = 1 + + ! Print the status message (format code passed in from main driver) + tfrac = (param%t - param%t0) / (param%tstop - param%t0) + write(*,msg) param%t, tfrac, self%pl%nbody, self%tp%nbody + + return + end subroutine io_dump_system + + + module function io_get_args(integrator, param_file_name) result(ierr) + !! author: David A. Minton + !! + !! Reads in the name of the parameter file from command line arguments. + implicit none + ! Arguments + integer(I4B) :: integrator !! Symbolic code of the requested integrator + character(len=:), allocatable :: param_file_name !! Name of the input parameters file + ! Result + integer(I4B) :: ierr !! I/O error code + ! Internals + character(len=STRMAX) :: arg1, arg2 + integer :: narg,ierr_arg1, ierr_arg2 + character(len=*),parameter :: linefmt = '(A)' + + ierr = -1 ! Default is to fail + narg = command_argument_count() ! + if (narg == 2) then + call get_command_argument(1, arg1, status = ierr_arg1) + call get_command_argument(2, arg2, status = ierr_arg2) + if ((ierr_arg1 == 0) .and. (ierr_arg2 == 0)) then + ierr = 0 + call io_toupper(arg1) + select case(arg1) + case('BS') + integrator = BS + case('HELIO') + integrator = HELIO + case('RA15') + integrator = RA15 + case('TU4') + integrator = TU4 + case('WHM') + integrator = WHM + case('RMVS') + integrator = RMVS + case('SYMBA') + integrator = SYMBA + case('RINGMOONS') + integrator = RINGMOONS + case default + integrator = UNKNOWN_INTEGRATOR + write(*,*) trim(adjustl(arg1)) // ' is not a valid integrator.' + ierr = -1 + end select + param_file_name = trim(adjustl(arg2)) + end if + else + call get_command_argument(1, arg1, status = ierr_arg1) + if (ierr_arg1 == 0) then + if (arg1 == '-v' .or. arg1 == '--version') then + call util_version() + else if (arg1 == '-h' .or. arg1 == '--help') then + call util_exit(HELP) + end if + end if + end if + if (ierr /= 0) call util_exit(USAGE) + + return + end function io_get_args + + + module function io_get_token(buffer, ifirst, ilast, ierr) result(token) + !! author: David A. Minton + !! + !! Retrieves a character token from an input string. Here a token is defined as any set of contiguous non-blank characters not + !! beginning with or containing "!". If "!" is present, any remaining part of the buffer including the "!" is ignored + !! + !! Adapted from David E. Kaufmann's Swifter routine io_get_token.f90 + implicit none + ! Arguments + character(len=*), intent(in) :: buffer !! Input string buffer + integer(I4B), intent(inout) :: ifirst !! Index of the buffer at which to start the search for a token + integer(I4B), intent(out) :: ilast !! Index of the buffer at the end of the returned token + integer(I4B), intent(out) :: ierr !! Error code + ! Result + character(len=:), allocatable :: token !! Returned token string + ! Internals + integer(I4B) :: i,ilength + + ilength = len(buffer) + + if (ifirst > ilength) then + ilast = ifirst + ierr = -1 !! Bad input + token = '' + return + end if + do i = ifirst, ilength + if (buffer(i:i) /= ' ') exit + end do + if ((i > ilength) .or. (buffer(i:i) == '!')) then + ifirst = i + ilast = i + ierr = -2 !! No valid token + token = '' + return + end if + ifirst = i + do i = ifirst, ilength + if ((buffer(i:i) == ' ') .or. (buffer(i:i) == '!')) exit + end do + ilast = i - 1 + ierr = 0 + + token = buffer(ifirst:ilast) + + return + end function io_get_token + + module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -257,342 +489,110 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Calculate the G for the system units self%GU = GC / (self%DU2M**3 / (self%MU2KG * self%TU2S**2)) - ! Calculate the inverse speed of light in the system units - self%inv_c2 = einsteinC * self%TU2S / self%DU2M - self%inv_c2 = (self%inv_c2)**(-2) - - associate(integrator => v_list(1)) - if (integrator == RMVS) then - if (.not.self%lclose) then - write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' - iostat = -1 - return - end if - end if - - ! Determine if the GR flag is set correctly for this integrator - select case(integrator) - case(WHM, RMVS, HELIO, SYMBA) - write(*,*) "GR = ", self%lgr - case default - if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' - self%lgr = .false. - end select - end associate - - iostat = 0 - - return - end subroutine io_param_reader - - - module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) - !! author: David A. Minton - !! - !! Dump integration parameters to file - !! - !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 - !! Adapted from Martin Duncan's Swift routine io_dump_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(in) :: self !! Collection of parameters - integer, intent(in) :: unit !! File unit number - character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. - !! If you do not include a char-literal-constant, the iotype argument contains only DT. - integer, intent(in) :: v_list(:) !! Not used in this procedure - integer, intent(out) :: iostat !! IO status code - character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 - ! Internals - character(*),parameter :: Ifmt = '(I0)' !! Format label for integer values - character(*),parameter :: Rfmt = '(ES25.17)' !! Format label for real values - character(*),parameter :: Rarrfmt = '(3(ES25.17,1X))' !! Format label for real values - character(*),parameter :: Lfmt = '(L1)' !! Format label for logical values - character(len=*), parameter :: Afmt = '(A25,1X,64(:,A25,1X))' - character(256) :: param_name, param_value - type character_array - character(25) :: value - end type character_array - type(character_array), dimension(:), allocatable :: param_array - integer(I4B) :: i - - associate(param => self) - write(param_name, Afmt) "T0"; write(param_value,Rfmt) param%t0; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DT"; write(param_value, Rfmt) param%dt; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "PL_IN"; write(param_value, Afmt) trim(adjustl(param%inplfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TP_in"; write(param_value, Afmt) trim(adjustl(param%intpfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "IN_TYPE"; write(param_value, Afmt) trim(adjustl(param%in_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%istep_out > 0) then - write(param_name, Afmt) "ISTEP_OUT"; write(param_value, Ifmt) param%istep_out; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "BIN_OUT"; write(param_value, Afmt) trim(adjustl(param%outfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_TYPE"; write(param_value, Afmt) trim(adjustl(param%out_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - end if - write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%istep_dump > 0) then - write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - end if - write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%qmin >= 0.0_DP) then - write(param_name, Afmt) "CHK_QMIN_COORD"; write(param_value, Afmt) trim(adjustl(param%qmin_coord)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - allocate(param_array(2)) - write(param_array(1)%value, Rfmt) param%qmin_alo - write(param_array(2)%value, Rfmt) param%qmin_ahi - write(param_name, Afmt) "CHK_QMIN_RANGE"; write(unit, Afmt) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) - end if - write(param_name, Afmt) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - iostat = 0 - iomsg = "UDIO not implemented" - end associate - - return - end subroutine io_param_writer - - - module subroutine io_dump_param(self, param_file_name) - !! author: David A. Minton - !! - !! Dump integration parameters to file - !! - !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 - !! Adapted from Martin Duncan's Swift routine io_dump_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(in) :: self !! Output collection of parameters - character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) - ! Internals - integer(I4B), parameter :: LUN = 7 !! Unit number of output file - integer(I4B) :: ierr !! Error code - character(STRMAX) :: error_message !! Error message in UDIO procedure - - open(unit = LUN, file = param_file_name, status='replace', form = 'FORMATTED', iostat =ierr) - if (ierr /=0) then - write(*,*) 'Swiftest error.' - write(*,*) ' Could not open dump file: ',trim(adjustl(param_file_name)) - call util_exit(FAILURE) - end if - - !! todo: Currently this procedure does not work in user-defined derived-type input mode - !! due to compiler incompatabilities - !write(LUN,'(DT)') param - call self%writer(LUN, iotype = "none", v_list = [0], iostat = ierr, iomsg = error_message) - if (ierr /= 0) then - write(*,*) trim(adjustl(error_message)) - call util_exit(FAILURE) - end if - close(LUN) - - return - end subroutine io_dump_param - - - module subroutine io_dump_swiftest(self, param, msg) - !! author: David A. Minton - !! - !! Dump massive body data to files - !! - !! Adapted from David E. Kaufmann's Swifter routine: io_dump_pl.f90 and io_dump_tp.f90 - !! Adapted from Hal Levison's Swift routine io_dump_pl.f and io_dump_tp.f - implicit none - ! Arguments - class(swiftest_base), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation - ! Internals - integer(I4B) :: ierr !! Error code - integer(I4B),parameter :: LUN = 7 !! Unit number for dump file - integer(I4B) :: iu = LUN - character(len=:), allocatable :: dump_file_name - - select type(self) - class is(swiftest_cb) - dump_file_name = trim(adjustl(param%incbfile)) - class is (swiftest_pl) - dump_file_name = trim(adjustl(param%inplfile)) - class is (swiftest_tp) - dump_file_name = trim(adjustl(param%intpfile)) - end select - open(unit = iu, file = dump_file_name, form = "UNFORMATTED", status = 'replace', iostat = ierr) - if (ierr /= 0) then - write(*, *) "Swiftest error:" - write(*, *) " Unable to open binary dump file " // dump_file_name - call util_exit(FAILURE) - end if - call self%write_frame(iu, param) - close(LUN) - - return - end subroutine io_dump_swiftest - - - module subroutine io_dump_system(self, param, msg) - !! author: David A. Minton - !! - !! Dumps the state of the system to files in case the simulation is interrupted. - !! As a safety mechanism, there are two dump files that are written in alternating order - !! so that if a dump file gets corrupted during writing, the user can restart from the older one. - implicit none - ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation - ! Internals - class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names - !! to dump file-specific values without changing the user-defined values - integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security - !! in case the program halts during writing - character(len=:), allocatable :: param_file_name - real(DP) :: tfrac - - allocate(dump_param, source=param) - param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) - dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) - dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) - dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) - dump_param%out_form = XV - dump_param%out_stat = 'APPEND' - dump_param%T0 = param%t - call dump_param%dump(param_file_name) - - call self%cb%dump(dump_param) - if (self%pl%nbody > 0) call self%pl%dump(dump_param) - if (self%tp%nbody > 0) call self%tp%dump(dump_param) - - idx = idx + 1 - if (idx > NDUMPFILES) idx = 1 - - ! Print the status message (format code passed in from main driver) - tfrac = (param%t - param%t0) / (param%tstop - param%t0) - write(*,msg) param%t, tfrac, self%pl%nbody, self%tp%nbody - - return - end subroutine io_dump_system - - - module function io_get_args(integrator, param_file_name) result(ierr) - !! author: David A. Minton - !! - !! Reads in the name of the parameter file from command line arguments. - implicit none - ! Arguments - integer(I4B) :: integrator !! Symbolic code of the requested integrator - character(len=:), allocatable :: param_file_name !! Name of the input parameters file - ! Result - integer(I4B) :: ierr !! I/O error code - ! Internals - character(len=STRMAX) :: arg1, arg2 - integer :: narg,ierr_arg1, ierr_arg2 - character(len=*),parameter :: linefmt = '(A)' + ! Calculate the inverse speed of light in the system units + self%inv_c2 = einsteinC * self%TU2S / self%DU2M + self%inv_c2 = (self%inv_c2)**(-2) - ierr = -1 ! Default is to fail - narg = command_argument_count() ! - if (narg == 2) then - call get_command_argument(1, arg1, status = ierr_arg1) - call get_command_argument(2, arg2, status = ierr_arg2) - if ((ierr_arg1 == 0) .and. (ierr_arg2 == 0)) then - ierr = 0 - call io_toupper(arg1) - select case(arg1) - case('BS') - integrator = BS - case('HELIO') - integrator = HELIO - case('RA15') - integrator = RA15 - case('TU4') - integrator = TU4 - case('WHM') - integrator = WHM - case('RMVS') - integrator = RMVS - case('SYMBA') - integrator = SYMBA - case('RINGMOONS') - integrator = RINGMOONS - case default - integrator = UNKNOWN_INTEGRATOR - write(*,*) trim(adjustl(arg1)) // ' is not a valid integrator.' - ierr = -1 - end select - param_file_name = trim(adjustl(arg2)) - end if - else - call get_command_argument(1, arg1, status = ierr_arg1) - if (ierr_arg1 == 0) then - if (arg1 == '-v' .or. arg1 == '--version') then - call util_version() - else if (arg1 == '-h' .or. arg1 == '--help') then - call util_exit(HELP) + associate(integrator => v_list(1)) + if (integrator == RMVS) then + if (.not.self%lclose) then + write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' + iostat = -1 + return end if end if - end if - if (ierr /= 0) call util_exit(USAGE) + + ! Determine if the GR flag is set correctly for this integrator + select case(integrator) + case(WHM, RMVS, HELIO, SYMBA) + write(*,*) "GR = ", self%lgr + case default + if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + self%lgr = .false. + end select + end associate - return - end function io_get_args + iostat = 0 + + return + end subroutine io_param_reader - module function io_get_token(buffer, ifirst, ilast, ierr) result(token) + module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! - !! Retrieves a character token from an input string. Here a token is defined as any set of contiguous non-blank characters not - !! beginning with or containing "!". If "!" is present, any remaining part of the buffer including the "!" is ignored + !! Dump integration parameters to file !! - !! Adapted from David E. Kaufmann's Swifter routine io_get_token.f90 + !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 + !! Adapted from Martin Duncan's Swift routine io_dump_param.f implicit none ! Arguments - character(len=*), intent(in) :: buffer !! Input string buffer - integer(I4B), intent(inout) :: ifirst !! Index of the buffer at which to start the search for a token - integer(I4B), intent(out) :: ilast !! Index of the buffer at the end of the returned token - integer(I4B), intent(out) :: ierr !! Error code - ! Result - character(len=:), allocatable :: token !! Returned token string + class(swiftest_parameters),intent(in) :: self !! Collection of parameters + integer, intent(in) :: unit !! File unit number + character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. + !! If you do not include a char-literal-constant, the iotype argument contains only DT. + integer, intent(in) :: v_list(:) !! Not used in this procedure + integer, intent(out) :: iostat !! IO status code + character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 ! Internals - integer(I4B) :: i,ilength - - ilength = len(buffer) - - if (ifirst > ilength) then - ilast = ifirst - ierr = -1 !! Bad input - token = '' - return - end if - do i = ifirst, ilength - if (buffer(i:i) /= ' ') exit - end do - if ((i > ilength) .or. (buffer(i:i) == '!')) then - ifirst = i - ilast = i - ierr = -2 !! No valid token - token = '' - return - end if - ifirst = i - do i = ifirst, ilength - if ((buffer(i:i) == ' ') .or. (buffer(i:i) == '!')) exit - end do - ilast = i - 1 - ierr = 0 - - token = buffer(ifirst:ilast) + character(*),parameter :: Ifmt = '(I0)' !! Format label for integer values + character(*),parameter :: Rfmt = '(ES25.17)' !! Format label for real values + character(*),parameter :: Rarrfmt = '(3(ES25.17,1X))' !! Format label for real values + character(*),parameter :: Lfmt = '(L1)' !! Format label for logical values + character(len=*), parameter :: Afmt = '(A25,1X,64(:,A25,1X))' + character(256) :: param_name, param_value + type character_array + character(25) :: value + end type character_array + type(character_array), dimension(:), allocatable :: param_array + integer(I4B) :: i + + associate(param => self) + write(param_name, Afmt) "T0"; write(param_value,Rfmt) param%t0; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "DT"; write(param_value, Rfmt) param%dt; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "PL_IN"; write(param_value, Afmt) trim(adjustl(param%inplfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TP_in"; write(param_value, Afmt) trim(adjustl(param%intpfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "IN_TYPE"; write(param_value, Afmt) trim(adjustl(param%in_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%istep_out > 0) then + write(param_name, Afmt) "ISTEP_OUT"; write(param_value, Ifmt) param%istep_out; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "BIN_OUT"; write(param_value, Afmt) trim(adjustl(param%outfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_TYPE"; write(param_value, Afmt) trim(adjustl(param%out_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + end if + write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%istep_dump > 0) then + write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + end if + write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%qmin >= 0.0_DP) then + write(param_name, Afmt) "CHK_QMIN_COORD"; write(param_value, Afmt) trim(adjustl(param%qmin_coord)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + allocate(param_array(2)) + write(param_array(1)%value, Rfmt) param%qmin_alo + write(param_array(2)%value, Rfmt) param%qmin_ahi + write(param_name, Afmt) "CHK_QMIN_RANGE"; write(unit, Afmt) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) + end if + write(param_name, Afmt) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + iostat = 0 + iomsg = "UDIO not implemented" + end associate return - end function io_get_token + end subroutine io_param_writer module subroutine io_read_body_in(self, param) @@ -730,50 +730,9 @@ module subroutine io_read_cb_in(self, param) end subroutine io_read_cb_in - module subroutine io_read_param_in(self, param_file_name) - !! author: David A. Minton - !! - !! Read in parameters for the integration - !! - !! Adapted from David E. Kaufmann's Swifter routine io_init_param.f90 - !! Adapted from Martin Duncan's Swift routine io_init_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(inout) :: self !! Current run configuration parameters - character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) - ! Internals - integer(I4B), parameter :: LUN = 7 !! Unit number of input file - integer(I4B) :: ierr = 0 !! Input error code - character(STRMAX) :: error_message !! Error message in UDIO procedure - - ! Read in name of parameter file - write(*, *) 'Parameter input file is ', trim(adjustl(param_file_name)) - write(*, *) ' ' - 100 format(A) - open(unit = LUN, file = param_file_name, status = 'old', iostat = ierr) - if (ierr /= 0) then - write(*,*) 'Swiftest error: ', ierr - write(*,*) ' Unable to open file ',trim(adjustl(param_file_name)) - call util_exit(FAILURE) - end if - - !! todo: Currently this procedure does not work in user-defined derived-type input mode - !! as the newline characters are ignored in the input file when compiled in ifort. - - !read(LUN,'(DT)', iostat= ierr, iomsg = error_message) param - call self%reader(LUN, iotype= "none", v_list = [self%integrator], iostat = ierr, iomsg = error_message) - if (ierr /= 0) then - write(*,*) 'Swiftest error reading ', trim(adjustl(param_file_name)) - write(*,*) ierr,trim(adjustl(error_message)) - call util_exit(FAILURE) - end if - - return - end subroutine io_read_param_in - function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & - xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) + xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) !! author: David A. Minton !! !! Read close encounter data from input binary files @@ -807,7 +766,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & close(unit = iu, iostat = ierr) return end if - + read(iu, iostat = ierr) name1, xh1(1), xh1(2), xh1(3), vh1(1), vh1(2), vh1(3), mass1, radius1 if (ierr /= 0) then close(unit = iu, iostat = ierr) @@ -931,7 +890,7 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) return end subroutine io_read_frame_cb - + module subroutine io_read_frame_system(self, iu, param, form, ierr) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1009,6 +968,47 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr + module subroutine io_read_param_in(self, param_file_name) + !! author: David A. Minton + !! + !! Read in parameters for the integration + !! + !! Adapted from David E. Kaufmann's Swifter routine io_init_param.f90 + !! Adapted from Martin Duncan's Swift routine io_init_param.f + implicit none + ! Arguments + class(swiftest_parameters),intent(inout) :: self !! Current run configuration parameters + character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) + ! Internals + integer(I4B), parameter :: LUN = 7 !! Unit number of input file + integer(I4B) :: ierr = 0 !! Input error code + character(STRMAX) :: error_message !! Error message in UDIO procedure + + ! Read in name of parameter file + write(*, *) 'Parameter input file is ', trim(adjustl(param_file_name)) + write(*, *) ' ' + 100 format(A) + open(unit = LUN, file = param_file_name, status = 'old', iostat = ierr) + if (ierr /= 0) then + write(*,*) 'Swiftest error: ', ierr + write(*,*) ' Unable to open file ',trim(adjustl(param_file_name)) + call util_exit(FAILURE) + end if + + !! todo: Currently this procedure does not work in user-defined derived-type input mode + !! as the newline characters are ignored in the input file when compiled in ifort. + + !read(LUN,'(DT)', iostat= ierr, iomsg = error_message) param + call self%reader(LUN, iotype= "none", v_list = [self%integrator], iostat = ierr, iomsg = error_message) + if (ierr /= 0) then + write(*,*) 'Swiftest error reading ', trim(adjustl(param_file_name)) + write(*,*) ierr,trim(adjustl(error_message)) + call util_exit(FAILURE) + end if + + return + end subroutine io_read_param_in + module subroutine io_toupper(string) !! author: David A. Minton diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index c5aba1a7f..f920fff87 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -537,9 +537,9 @@ end subroutine symba_util_peri_pl module subroutine symba_util_rearray_pl(self, system, param) implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions end subroutine symba_util_rearray_pl end interface diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 33fe47354..6ab835e36 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -310,7 +310,7 @@ module subroutine symba_discard_pl(self, system, param) if (any(pl%ldiscard(:))) then call symba_discard_nonplpl_conservation(self, system, param) - !call pl%rearray(self, system, param) + call pl%rearray(system, param) end if end associate diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index cafaacfd7..f8afffb85 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -97,6 +97,8 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, ibiggest = maxloc(pl%Gmass(family(:)), dim=1) plnew%id(1) = pl%id(family(ibiggest)) plnew%status(1) = ACTIVE + plnew%lcollision = .false. + plnew%ldiscard = .false. plnew%xb(:,1) = xcom(:) plnew%vb(:,1) = vcom(:) plnew%xh(:,1) = xcom(:) - cb%xb(:) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c0276291a..98c8889d8 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -375,17 +375,37 @@ module subroutine symba_util_rearray_pl(self, system, param) !! Clean up the massive body structures to remove discarded bodies and add new bodies implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(symba_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + class(symba_pl), allocatable :: pl_discards !! The discarded body list. + + associate(pl => self, mergeadd_list => system%mergeadd_list) + allocate(pl_discards, mold=pl) + ! Remove the discards + call pl%spill(pl_discards, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) + + ! Add in any new bodies + call pl%append(mergeadd_list) + + ! If there are still bodies in the system, sort by mass in descending order and re-index + if (pl%nbody > 0) then + call pl%sort("mass", ascending=.false.) + pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%nplm = count(pl%lmtiny(:)) + call pl%eucl_index() + end if - ! First + ! Destroy the discarded body list, since we already have what we need in the mergesub_list + call pl_discards%setup(0,param) + deallocate(pl_discards) + end associate return end subroutine symba_util_rearray_pl - module subroutine symba_util_resize_arr_info(arr, nnew) !! author: David A. Minton !! diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 0cef49194..9acc6ae93 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -163,6 +163,7 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) call util_spill(keeps%name, discards%name, lspill_list, ldestructive) call util_spill(keeps%status, discards%status, lspill_list, ldestructive) call util_spill(keeps%lmask, discards%lmask, lspill_list, ldestructive) + call util_spill(keeps%ldiscard, discards%ldiscard, lspill_list, ldestructive) call util_spill(keeps%mu, discards%mu, lspill_list, ldestructive) call util_spill(keeps%xh, discards%xh, lspill_list, ldestructive) call util_spill(keeps%vh, discards%vh, lspill_list, ldestructive)