diff --git a/Makefile.Defines b/Makefile.Defines index 07126f842..291f2c604 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -71,7 +71,7 @@ FORTRAN = ifort #AR = xiar #FORTRAN = gfortran -#FFLAGS = -ffree-line-length-none $(GDEBUG) #$(GMEM) +#FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/helio_gr_test/cb.swiftest.in similarity index 75% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in rename to examples/helio_gr_test/cb.swiftest.in index 81c636655..e4a010b1e 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ b/examples/helio_gr_test/cb.swiftest.in @@ -1,5 +1,5 @@ 0 -0.00029591220819207774 +39.476926408897626 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/helio_gr_test/init_cond.py b/examples/helio_gr_test/init_cond.py new file mode 100755 index 000000000..8d197c6f4 --- /dev/null +++ b/examples/helio_gr_test/init_cond.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import swiftest + +sim = swiftest.Simulation() +sim.param['PL_IN'] = "pl.swiftest.in" +sim.param['TP_IN'] = "tp.swiftest.in" +sim.param['CB_IN'] = "cb.swiftest.in" +sim.param['BIN_OUT'] = "bin.swiftest.dat" +sim.param['ENC_OUT'] = "enc.swiftest.dat" + +sim.param['MU2KG'] = swiftest.MSun +sim.param['TU2S'] = swiftest.YR2S +sim.param['DU2M'] = swiftest.AU2M +sim.param['T0'] = 0.0 +sim.param['DT'] = 0.25 * swiftest.JD2S / swiftest.YR2S +sim.param['TSTOP'] = 1000.0 +sim.param['ISTEP_OUT'] = 1461 +sim.param['ISTEP_DUMP'] = 1461 +sim.param['CHK_QMIN_COORD'] = "HELIO" +sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" +sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_RMAX'] = 1000.0 +sim.param['CHK_EJECT'] = 1000.0 +sim.param['OUT_FORM'] = "EL" +sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['GR'] = 'YES' + +bodyid = { + "Sun": 0, + "Mercury": 1, + "Venus": 2, + "Earth": 3, + "Mars": 4, + "Jupiter": 5, + "Saturn": 6, + "Uranus": 7, + "Neptune": 8, +} + +for name, id in bodyid.items(): + sim.add(name, idval=id) + +sim.save("param.swiftest.in") +sim.param['PL_IN'] = "pl.swifter.in" +sim.param['TP_IN'] = "tp.swifter.in" +sim.param['BIN_OUT'] = "bin.swifter.dat" +sim.param['ENC_OUT'] = "enc.swifter.dat" +sim.save("param.swifter.in", codename="Swifter") + + diff --git a/examples/helio_gr_test/param.swifter.in b/examples/helio_gr_test/param.swifter.in new file mode 100644 index 000000000..789250f41 --- /dev/null +++ b/examples/helio_gr_test/param.swifter.in @@ -0,0 +1,27 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 1000.0 +DT 0.0006844626967830253 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 +OUT_FORM EL +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swifter.in +TP_IN tp.swifter.in +BIN_OUT bin.swifter.dat +ENC_OUT enc.swifter.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +C 63241.07708426628 +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 +RHILL_PRESENT YES diff --git a/examples/helio_gr_test/param.swiftest.in b/examples/helio_gr_test/param.swiftest.in new file mode 100644 index 000000000..ace6f3cad --- /dev/null +++ b/examples/helio_gr_test/param.swiftest.in @@ -0,0 +1,35 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 1000.0 +DT 0.0006844626967830253 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 +OUT_FORM EL +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +CB_IN cb.swiftest.in +BIN_OUT bin.swiftest.dat +ENC_OUT enc.swiftest.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY NO +GR YES +YARKOVSKY NO +YORP NO +MTINY 0.0 diff --git a/examples/helio_gr_test/pl.swifter.in b/examples/helio_gr_test/pl.swifter.in new file mode 100644 index 000000000..782e57140 --- /dev/null +++ b/examples/helio_gr_test/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 39.476926408897625196 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 6.5537098095653139645e-06 0.0014751234419554511911 +1.6306381826061645943e-05 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +2 9.663313399581537916e-05 0.00675908960945781479 +4.0453784346544178454e-05 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +3 0.000120026935827952453094 0.010044837538502923644 +4.25875607065040958e-05 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +4 1.2739802010675941456e-05 0.0072467236860282326973 +2.265740805092889601e-05 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +5 0.037692251088985676735 0.35527094075555771578 +0.00046732617030490929307 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +6 0.011285899820091272997 0.43765464106459166412 +0.00038925687730393611812 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +7 0.0017236589478267730203 0.46956055286931676728 +0.00016953449859497231466 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +8 0.0020336100526728302319 0.7813163071687303693 +0.000164587904124493665 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/helio_gr_test/pl.swiftest.in b/examples/helio_gr_test/pl.swiftest.in new file mode 100644 index 000000000..10d425453 --- /dev/null +++ b/examples/helio_gr_test/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 6.5537098095653139645e-06 +1.6306381826061645943e-05 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +2 9.663313399581537916e-05 +4.0453784346544178454e-05 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +3 0.000120026935827952453094 +4.25875607065040958e-05 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +4 1.2739802010675941456e-05 +2.265740805092889601e-05 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +5 0.037692251088985676735 +0.00046732617030490929307 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +6 0.011285899820091272997 +0.00038925687730393611812 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +7 0.0017236589478267730203 +0.00016953449859497231466 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +8 0.0020336100526728302319 +0.000164587904124493665 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/helio_gr_test/swiftest_relativity.ipynb b/examples/helio_gr_test/swiftest_relativity.ipynb new file mode 100644 index 000000000..03948cdf7 --- /dev/null +++ b/examples/helio_gr_test/swiftest_relativity.ipynb @@ -0,0 +1,192 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import swiftest\n", + "from astroquery.jplhorizons import Horizons" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 1.000e+03\n", + "Creating Dataset\n", + "Successfully converted 1001 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftersim = swiftest.Simulation(param_file=\"param.swifter.in\", 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 1.000e+03\n", + "Creating Dataset\n", + "Successfully converted 1001 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swifterdat['varpi'] = swifterdat['omega'] + swifterdat['capom']\n", + "swiftestdat['varpi'] = swiftestdat['omega'] + swiftestdat['capom']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "obj = Horizons(id='1', id_type='majorbody',location='@sun',\n", + " epochs={'start':'2021-01-28', 'stop':'3021-02-05',\n", + " 'step':'1y'})\n", + "el = obj.elements()\n", + "t = (el['datetime_jd']-el['datetime_jd'][0]) / 365.25\n", + "varpi_obs = el['w'] + el['Omega']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "varpiswiftest = swiftestdat['varpi'].sel(id=1) * 180.0 / np.pi\n", + "varpiswifter = swifterdat['varpi'].sel(id=1) * 180.0 / np.pi\n", + "tsim = swiftestdat['time']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "dvarpi_swiftest = np.diff(varpiswiftest) * 3600 * 100 \n", + "dvarpi_swifter = np.diff(varpiswifter) * 3600 * 100 \n", + "dvarpi_obs = np.diff(varpi_obs) / np.diff(t) * 3600 * 100 " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", + "JPL Horizons : 571.3210506300043\n", + "Swifter GR : 571.6183105524942\n", + "Swiftest GR : 571.6157754511288\n", + "Obs - Swifter : -0.2972599224899675\n", + "Obs - Swiftest : -0.2947248211246545\n", + "Swiftest - Swifter: -0.0025351013653107657\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", + "\n", + "ax.plot(t, varpi_obs, label=\"JPL Horizons\")\n", + "ax.plot(tsim, varpiswifter, label=\"Swifter GR\")\n", + "ax.plot(tsim, varpiswiftest, label=\"Swiftest GR\")\n", + "ax.set_xlabel('Time (y)')\n", + "ax.set_ylabel('Mercury $\\\\varpi$ (deg)')\n", + "ax.legend()\n", + "print('Mean precession rate for Mercury long. peri. (arcsec/100 y)')\n", + "print(f'JPL Horizons : {np.mean(dvarpi_obs)}')\n", + "print(f'Swifter GR : {np.mean(dvarpi_swifter)}')\n", + "print(f'Swiftest GR : {np.mean(dvarpi_swiftest)}')\n", + "print(f'Obs - Swifter : {np.mean(dvarpi_obs - dvarpi_swifter)}')\n", + "print(f'Obs - Swiftest : {np.mean(dvarpi_obs - dvarpi_swiftest)}')\n", + "print(f'Swiftest - Swifter: {np.mean(dvarpi_swiftest - dvarpi_swifter)}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "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/helio_gr_test/tp.swifter.in b/examples/helio_gr_test/tp.swifter.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/helio_gr_test/tp.swifter.in @@ -0,0 +1 @@ +0 diff --git a/examples/helio_gr_test/tp.swiftest.in b/examples/helio_gr_test/tp.swiftest.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/helio_gr_test/tp.swiftest.in @@ -0,0 +1 @@ +0 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.in similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.in diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in new file mode 100644 index 000000000..2e8d49f62 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in @@ -0,0 +1,5 @@ +0 +0.00029591220819207774 +0.004650467260962157 +0.0 +0.0 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py similarity index 98% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/init_cond.py rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py index 321c79932..094b261f0 100755 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -25,8 +25,8 @@ sim.param['T0'] = 0.0 sim.param['DT'] = 1.0 sim.param['TSTOP'] = 365.25e1 -sim.param['ISTEP_OUT'] = 11 -sim.param['ISTEP_DUMP'] = 1 +sim.param['ISTEP_OUT'] = 10 +sim.param['ISTEP_DUMP'] = 10 sim.param['CHK_QMIN_COORD'] = "HELIO" sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in similarity index 83% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in index aa33eeaa4..6a283276e 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -2,8 +2,8 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 11 -ISTEP_DUMP 1 +ISTEP_OUT 10 +ISTEP_DUMP 10 OUT_FORM XV OUT_TYPE REAL8 OUT_STAT UNKNOWN @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES -J2 4.7535806948127355e-12 -J4 -2.2473967953572827e-18 RHILL_PRESENT YES +J2 0.0 +J4 0.0 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in similarity index 93% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index 6504c9637..b08b66850 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -2,8 +2,8 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 11 -ISTEP_DUMP 1 +ISTEP_OUT 10 +ISTEP_DUMP 10 OUT_FORM XV OUT_TYPE REAL8 OUT_STAT UNKNOWN @@ -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/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in new file mode 100644 index 000000000..86a616119 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in new file mode 100644 index 000000000..595cdc169 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 0.00029591220819207775568 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in new file mode 100644 index 000000000..86a616119 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb new file mode 100644 index 000000000..124ae2910 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -0,0 +1,642 @@ +{ + "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.650e+03\n", + "Creating Dataset\n", + "Successfully converted 366 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.650e+03\n", + "Creating Dataset\n", + "Successfully converted 366 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-8pl_16tp-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-8pl_16tp-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-8pl_16tp-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": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAElCAYAAAD3KtVsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA1FUlEQVR4nO3deZxcVZn/8c+3OyshJkLCloUghP0HAQOCIMIMS2BkouMyIIMbksGRcUZxwRlfqDiOOPxcf6CYYQIiCq9xFAxO2BSQRdAECDuBEJaEEBJIQkLWrqrn98c51V2pvlVdXan11vN+verVVXeperpudz117jnnuTIznHPOuYF0NTsA55xz7cEThnPOuYp4wnDOOVcRTxjOOecq4gnDOedcRTxhOOecq4gnDDdokr4m6dp4f7KkNyV1NzuuciS9S9KiBr+mSdpnO5/jCUnH1yaifs9d8jhK2lXS3ZLWS/qOgqskrZH053rE41qfJ4wOJOkFSScWLfuYpHsH+1xm9pKZ7Whm2dpFODiVfDCb2T1mtl+jYqoVMzvIzO6CbT/g6/A6xcdxFvAa8BYzuwA4FjgJmGhmR9YjBtf6PGG41JM0pNkxtKE9gSetb2bvnsALZrZhsE/k7396eMJwiSTtIelXklZJel7SZ0psNyV+wx9SsN9cSaslLZZ0bsG23ZL+RdJz8VTHg5ImxXX7S7o97rdI0ocK9rta0uWS/jfu9ydJe8d1d8fNHomnVP5W0vGSlkn6kqQVwFX5ZQXPOUnSr+Pv97qky0q8B5sk7VSw7DBJr0kaGh9/QtJT8VTNrZL2LPE+jZF0TXy9FyV9RVJXwfpz4/Osl/SkpMPj8hcknShpBvAvwN/G3/MRSR+U9GDR61wg6cYSMewl6Q/xNW4HxiUdR0lXAx8Fvhhf6++BK4Gj4+Ovx33eI2mhpLWS/ijpkILneyG+/48CG+LzHhW3WxvjP75g+7skfUPSfTG+2yQVxndswb5LJX0sLh8u6f9KeknSq5KukDQyrhsn6bdxn9WS7il8z10VzMxvHXYDXgBOLFr2MeDeeL8LeBC4CBgGvA1YApwS138NuDbenwIYMCQ+/gPwI2AEMA1YBfxlXPcF4DFgP0DAocDOwChgKfBxYAhwOOF0yEFxv6uB1cCRcf3PgesLYjdgn4LHxwMZ4NvAcGBkXLYsru8GHgG+F197BHBsiffqDuDcgseXAlfE++8FFgMHxLi+AvwxKS7gGuA3wOj4nj0DnBPXfRB4GTgivi/7AHsWH6vC9z0+Hh7flwMKlj0MvL/E73I/8N2433HA+jLH8Wrg35L+PuLjw4GVwDvi+/nRGOvwgrgXApPi+z8BeB04jfD3dVJ8PD5ufxfwHLBv3P4u4JK4bnKM9UxgKOFvZlpc931gLrBTfG9vAr4V130LuCLuMxR4F6Bm//+1863pAfitCQc9/DO/CawtuG2kL2G8A3ipaJ8vA1fF+70fXIUfNPHDIQuMLtjvW8DV8f4iYGZCPH8L3FO07CfAV+P9q4ErC9adBjxd8DgpYWwFRhQtyyeMowmJbEgF79UngTvifRES23Hx8c3ED/34uCu+j3sWxkX4QN0CHFiw7d8Dd8X7twL/VOZYJSaMuOzHwDfj/YOANcQP7aLtJhOS6KiCZb9IOo4F73m5hPFj4BtFr7EIeHdB3J8oWPcl4GdF298KfDTevwv4SsG6fwBuKfjbuyHhdxKwAdi7YNnRwPPx/sWEJL1P8b5+q+7mzbPO9V4zG5u/Ef5B8/YE9ohN+bWS1hJOh+w6wHPuAaw2s/UFy14kfLuEkFCeS9hvT+AdRa93FrBbwTYrCu5vBHYcIJZVZra5xLpJwItmlhngOQD+h3AqZg/Ct3ID7imI+wcFMa8mfIhNKHqOcYSW2osFyyp5XyrxU+DDkgScDfy3mW1J2G4PYI1t2wfxYsJ2ldoTuKDomE2Kr5O3tGj7DxZtfyywe8E2pY5xqfdnPLAD8GDBc94Sl0NoDS4GbpO0RNKFg/81XSHvjHJJlhK+pU0d5H7LgZ0kjS5IGpMJp1vyz7s38HjC6/3BzE6qNuAE5cowLwUmSxoyUNIws7WSbgM+RDj1dJ3Fr6/xeb5pZj8fIJbXgB5iR3JclvS+DKTf72RmD0jaSjjd8uF4S/IK8FZJowqSxuSk56xQ/nf/ZoXxLiW0MM4ttfEAr5U0Mus1YBPh1OXLxSvj3+AFhMR2EHCnpPlm9vsqYnB4p7dL9mdgXey0HKnQWX2wpCPK7WRmS4E/At+SNCJ2gp5D6HOA0HH6DUlTFRwiaWfgt8C+ks6WNDTejpB0QIXxvkroZxnM7/cKcImkUTHWY8ps/wvgI8D74/28K4Avxw+jfMf2B4t3tjBU9b+Bb0oardAx/jkgP0T2SuDzkt4e35d9lNx5/iowJaHj9hrgMiBjZolDo83sRWAB8HVJwyQdC5xe5nceyH8C50l6R4x5lKS/kjS6xPbXAqdLOiX+PY1QGIgwsYLX+jlwoqQPxc7znSVNM7NcjON7knYBkDRB0inx/nvieylgHeF0adOGf6eBJwzXT/yAO53Qaf084ZvclcCYCnY/k3A+fDlwA6Ef4va47ruED87bCP/A/wWMjN8ETwbOiPutoK/DuhJfA34aT0t8aKCNC36/fYCXgGWEfpRS5gJTgVfN7JGC57khxnm9pHWEltOpJZ7jHwnn25cA9xISz5z4PL8EvhmXrQduJHTiFvtl/Pm6pIcKlv8MODj+LOfDhP6p1cBXCYmmKma2ADiXkKjWEE79fKzM9kuBmYRTm6sIrYYvUMFnkJm9ROi3uiDGvpAwYAJC38hi4IF4DH5HGFQB4Zj9jtBfdz/wI4tzWlx11Ne6ds61oziMdCVwuJk92+x4XHp5C8O59vcpYL4nC1dv3untXBuT9AJhZNZ7mxuJ6wR+Sso551xF/JSUc865injCcK4JJJ0V53cMtF3dKtRWQ6Gu1781Ow7XHJ4wXMtT37Ua8jeTtKHg8buqeM5+Jd6L1h8vKReff71CQcSPVxn/NgUaAczs52Z2cjXP51yzeKe3a3lxHH5vKRBJBhxqZovr/NLLzWxinPg1E/gfSX8ysycH2jFPXtrbpYi3MFxbUxXlrSX9jFAW46bYgvhiudew4EbCBLUD44zmhyWtUyi1/bWCePKtiXMkvUSodpsvwb42vt7RKrpglaSD1Ffe/VVJ/1Li9y1XIvxjCjWT1iuUpD+rzHv2fUnL4+37kobHdfnS8BdIWinplVItK0mPSzq94PFQhdLv08q9n659ecJw7e7bhJLY0wgztycQyrJDmBm8jFCMblfCLGMzs7MJM7xPt3CVuf8o9wIxybwPGEsoz76BUCpkLPBXwKckvbdot3cTak+dQihaCDA2vt79Rc8/mjAj+RZC8b59gH71jiRNAP4X+DfCTPDPA7+SNF7SKOCHwKlmNhp4J2FGdJJ/BY4ivGeHEuo0faVg/W6EWf0TCKVdLpf01oTnuQb4u4LHpwGvmFmp13VtLvUJQ9Kc+E2puOBdtc93S/x299ui5X8p6SGFC8rcq+28lrMbWDxVdC7wWTPLV8n9d0KJEQgF/3YnlBvvsXCZ1sGMI99DoQLqa4RSGmeb2SIzu8vMHjOznJk9ClxHSBCFvmZmG8xsUwWv8x5ghZl9x8w2m9l6M/tTwnZ/B8wzs3nxtW8n1Ic6La7PAQdLGmlmr5jZEyVe7yzgYjNbaWargK8TKt3m9cT1PWY2j1BaI+nyttcCp0l6S3x8NgOXJ3FtLPUJg1DXf0YNn+9Stv3nyvsxcJaZTSPUBPpKwjautupd3np5LP++k5lNM7PrARQK7t2pcPW8N4DzKLh6XbS037OVVml585IlwmMF2r+NsbyicHXC/Us8zx70L7VeWJb89aIqvonl5M1sOXAf8H5JYwl1tAaq3OvaWOoThpndTShY1kvS3rGl8GA8r13qHyvp+X5PKBDXbxWQ/6Y1hlBEz9VXYXnr/LU9xpjZjhDKW5vZBWb2NkKxwc9J+su47/bMWP0FoSDhJDMbQ6haq6JtrMT9JJWWN8+XCB9bcBtlZpcAmNmtsUT87sDThEquSZYTkk/eZKr/e/0poeXzQeD+pDLjLj1SnzBKmA38o5m9nXAe+Ec1eM5PAvMUrht9NnBJDZ7TlbGd5a0HWxK90GjChaI2SzqS0tegyFtFOF1U6vV+C+wm6Z9jh/RoSe9I2K5kiXBJu0r669iXsYVwGqlUKe/rgK/Evo9xhD6faud63Ei4XOs/sR3Vb1176LiEIWlHQofgLyUtJFwKdPe47m/iyI/i260VPPVngdPMbCJwFaGUt6u/astbf4vwoblW0ucH+Zr/AFwsaT3hw/a/y21sZhsJ5cvvi693VNH69YRrXJ9OKO3+LHBCwvOUKxHeRejkX05oUb+bba+iWOjfCH0fjxI68R+KywYt9tH8CtgL+HU1z+HaR0fUkpI0BfitmR0cO+gWmdnuA+xW7vmOBz5vZu+Jj8cDD5jZ3vHxZML1iA/c3tida3WSLgL2NbO/G3Bj19Y6roVhZuuA5xWvjKbg0AF2G8gaYIykfePjk4CntvM5nWt5knYiDL2d3exYXP2lPmFIuo5wOmK/OCHpHMKwwnMkPQI8QWjmV/p89xCufPaX8flOiSNKziWMiX+E0IfxhVr/Ls61EknnEk6L3RwHl7iU64hTUs4557Zf6lsYzjnnaiPVhdHGjRtnU6ZMaXYYzjnXNh588MHXzGx80rqGJQxJkwjjtHcjjEmfbWY/KNpGwA8IpQ42Ah8zs4fiuhlxXTdwZX6yUjlTpkxhwYIFNf09nHMuzSS9WGpdI09JZYALzOwAQuGzT0sqHnZ6KmHs/FRgFqHcBpK6gcvj+gOBMxP2dc45V0cNSxixGNpD8f56wrDTCUWbzQSuieWkHwDGStqdUE1zsZktMbOtwPUMYmSTc8657deUTu84ke4woLgi5wS2Ldq2LC4rtTzpuWdJWiBpwapVq2oWs3POdbqGJ4xYmuNXwD/HSXTbrE7Yxcos77/QbLaZTTez6ePHJ/bbOOecq0JDR0lJGkpIFj83s6S6M8sIpZ7zJhJq4wwrsdw551yDNKyFEUdA/RfwlJmVKsw3F/hILNdxFPCGmb0CzAemStpL0jDCBXLmNiRw55xzQGNbGMcQSmY8FqvEQqi6ORnAzK4A5hGG1C4mDKv9eFyXkXQ+cCthWO2cMlcTc845VwcNSxhmdi/JfRGF2xjw6RLr5hESinPONc1rL73AogfubXYYZQ0dPoIjZ36g5s+b6pnezjlXa3+68Zc8fd8fQGW//zbVqDFjPWE451yzbVizmgn7H8gZX/+PZofScF580DnnBmHD2jWMGvPWZofRFJ4wnHNuEDa8sYYdxnrCcM65tvO/P7yUa7/8WVa99ELdXyuzdStbNmxgVIcmDO/DcM61rTdXvx46oIHFf76f8ZOn1PX1Nr6xFqBjE4a3MJxzbWvFksW99199fnGZLWtjw9o1gCcM55xrO68uWYzUxT5HHM2rzz1b99fr9IThp6Scc21lw9o13P3zq8j09PDKs0+z04SJTDzgIBbPv5+53/131NVdt9det3IF4AnDOefawjMP3MuTd9/BW/eYyNBhw/k/f3EKbzt8Ok/efSevL32p7q8/Zdrb2WHs2Lq/TivyhOGcaysvP/0kO+48jk9874ptlp/97R+U2MPViicM51zTbNm4EQnU3U139xDUFbpVn1+4gC51ses++/bb5+VnnmLCfn6F5mbwhOGca4qFt83j9//1o37Lu7q7yWWzZfedsL8njGbwhOGca4pnHriXMbvsyqEn/xW5bBbLZslms1guy9jd9mDo8OG9o5IKdQ8ZwgHvOqEJETtPGM65hjAzNq0PV2XObN3Ky08/yeGn/TVHnP43TY7MVcoThnOuIe68ejYP33LTNsv2mvb2JkXjqtGwhCFpDvAeYKWZHZyw/gvAWQVxHQCMN7PVkl4A1gNZIGNm0xsTtXOuVl589GF22WtvDj7+RACG7zCKSQcd0uSo3GA0soVxNXAZcE3SSjO7FLgUQNLpwGfNbHXBJieY2Wv1DtI5V3tbNm5k9Ssv884PfpjDZpze7HBclRpWGsTM7gZWD7hhcCZwXR3Dcc41iOVyvLrkWTBjt7dNbXY4bju0XB+GpB2AGcD5BYsNuE2SAT8xs9lNCc45Nyib3lzPnM+cy+YNbwKw696eMNpZyyUM4HTgvqLTUceY2XJJuwC3S3o6tlj6kTQLmAUwefLk+kfr+jEzHvjNEt5cs7l3mRAHHTeB3fce08TIXKNtXLuGzRveZN+jjmWfI45ih7f48W9nrZgwzqDodJSZLY8/V0q6ATgSSEwYsfUxG2D69OlW31Bdki0bMjx0y4uMGDWUYSNDIbj1r2+me1iXJ4wOY7kcAPsdfSz7HnVsk6Nx26ulEoakMcC7gb8rWDYK6DKz9fH+ycDFTQrRVcAs5Okj3rMXh5wwEYCrvnQv5Dx/d5r834LkV1JIg0YOq70OOB4YJ2kZ8FVgKICZ5auIvQ+4zcw2FOy6K3CDpHy8vzCzWxoVtxu8+BlBOGTxPqEjynWWXGxh0KXyG7q20LCEYWZnVrDN1YTht4XLlgCH1icq1zCSZ4xOFL89dHV5CyMN/Ci6mus9DVHwrdLzRWfK92H4Kal08KPoGkP0natyHSN/SkrewkgFP4qu5iyett62D0OeLzpQX6e392GkgScMVwcJmcF7vTuS5cJ1LfyUVDr4UXQ11zdKqrgPwzNGp+nrz/KPmjTwo+jqp/AshPd6dyTL9R8A4dqXJwxXc33nrfuWeZ93ZzLv9E4VP4qu9noTg2eMTmfmw2rTxI+iq7nEmd6Sn5HqQH3zMPyUVBp4wnB1kM8YyYtd5zCf6Z0qfhRdzZUcJeUJo+P0npLyhJEKfhRd7SUlBs8YHclneqeLH0VXc4mjpHxUbWfK+UzvNPGE4erH+zA6Xt8oKU8YaeAJw9Vcbx8GxX0YnjE6Td8pqe4mR+JqwROGq718Xiie6e06TlKpe9e+PGG4mkuqUOp93p3J52GkS8MShqQ5klZKerzE+uMlvSFpYbxdVLBuhqRFkhZLurBRMbsa84zRccxPSaVKI1sYVwMzBtjmHjObFm8XA0jqBi4HTgUOBM6UdGBdI3XbxWd6uzy/Hka6NCxhmNndwOoqdj0SWGxmS8xsK3A9MLOmwbka85neLvDig+nSakfxaEmPSLpZ0kFx2QRgacE2y+KyRJJmSVogacGqVavqGasrwWd6u7y+md7ewkiDVkoYDwF7mtmhwP8DbozLk/7SSn70mNlsM5tuZtPHjx9f+yjdwHymt4v6Or1b6aPGVatljqKZrTOzN+P9ecBQSeMILYpJBZtOBJY3IURXIZ/p7fLyF1Dy4oPp0DJHUdJuiucwJB1JiO11YD4wVdJekoYBZwBzmxepq1hxR6e3MDpO/pSUz8NJhyGNeiFJ1wHHA+MkLQO+CgwFMLMrgA8An5KUATYBZ1j4qpqRdD5wK9ANzDGzJxoVtxu8kqOkPF90nPwpqS4fVpsKDUsYZnbmAOsvAy4rsW4eMK8ecbk6SEgM/gWzM/lM73RpmVNSLj0Sx957LamO5DO908UThqsfn4fR8fx6GOniR9HVnCXM2/M+jM7U19r0j5o08KPoaq9E8UHXefpmevsfQBp4wnA119uS2KaJ4X0Ynciv6Z0ufhRdHSTVkvKZe53Icn5KKk38KLqaS+7D8Hl7ncgsB5KPkkoJTxiu9npPSfkwqU5nOfNkkSIDTtyTNLnC51prZuu2Mx6XAkn5Ql0+SqoTWS7rp6NSpJKZ3j8lfAaU+5pghAskXVODmFybSyw+iJ+S6kRm5oUHU2TAhGFmJxQvk7Sbma2oT0iu7fUmBs8Ync7MwIfUpka1qf8jNY3CpUvSsNqyDVSXVpbLegsjRaotPjhT0kbgdjNbVMuAXPuzmDF8lJQLnd6eMNKi2iP5N8Bi4H2SrqxhPC4N8sNqu3ymd6cz81FSaVJVC8PMXgVuiTfntpHYkpB8pncHyuVyPss7Rao6kpIul3R1vH9yTSNybc+SZu7hp6Q6knnCSJNqj+RWYEm8/xeV7CBpjqSVkh4vsf4sSY/G2x8lHVqw7gVJj0laKGlBlTG7BhNFp6Q8YXScXC7np6RSpNqEsREYI2koUOnEvquBGWXWPw+828wOAb4BzC5af4KZTTOz6YMN1jVYbx9G3yJ5xuhIljNvYaRItaOkVhOuu305cF8lO5jZ3ZKmlFn/x4KHDwATq4zNNVliWvBRUh3JLOejpFJkUEdS0lhJVwHvj4uuAerxjf8c4OaCxwbcJulBSbPq8HquhvoqlBacksITRicy7/ROlUG1MMxsraRLgCnAa8AhwK9rGZCkEwgJ49iCxceY2XJJuwC3S3razO4usf8sYBbA5MmVni1zdecZoyOZmV88KUWqSf3nAG8zswfN7Cozu6lWwUg6BLgSmGlmr+eXm9ny+HMlcANwZKnnMLPZZjbdzKaPHz++VqG5wfCZ3i4y7/ROlWoSxhrgPEnfl/RxSYfVIpBYFffXwNlm9kzB8lGSRufvAycDiSOtXGvoneldeEqqyxsYnSickupudhiuRgbd6W1m35L0e+AZYBpwHPDwQPtJug44HhgnaRnwVWBofM4rgIuAnYEfxQ+aTBwRtStwQ1w2BPiFmfmEwVaWHyVVVHvQdR6f6Z0ug04Yki4GuoGFwEIzu6uS/czszAHWfxL4ZMLyJcCh/fdwrarkTO+cNzE6jeVyXnwwRQZ9JM3sImBL3Pf9kv6z5lG5tlZypnfjQ3FNFobVegsjLapN/XOAA4inkGoXjkuT/jO9PWV0mlwuB97CSI1qj+RnCKezhgA/qF04LhVKzvR2HcevuJcq1R7J54ARwG/M7LgaxuNSILEqrcByjY/FNZcPq02XahPGE8AdwDmS5tcwHpcCvV0YxTO9vRej44Tig97CSItqa0ntTZiPMTv+dK48rz3YkcJMb08YaVFtwlhqZndI2h1YWcuAXAokjZLy0xKdyXJeGiRFqk39MyRNBK4AvlfDeFwK9FYG0bajpHyQVOfxK+6lS7VHcizwJeCLhDkZzvXKd24Xz/T2S7R2HsuZ92GkSLWnpC4G9jezRZKytQzIpUHSKCl5H0YHslwODan2Y8a1mopTf+ElU81smZn9Lt6/sB6BufZlSdVqPV90JPNreqfKYI7kw/F621+UNKluEbnU2LYPwzsxOpGPkkqXwRzJ7wCjgEuA5yXdKekT9QnLtTWvVusiLz6YLhUfSTP7gpntTbgk65WEsuaz6xWYa1+WdE7KZ3p3JMuZD6lOkYp7oyTtDLwP+ABwAuHT4KU6xeXamJVoYfhM785juayPkkqRwQxfWEFokawBrgKuNbN76xKVS4fiiXueLzqOefHBVBlMwrgBuBa42cx66hSPSwNLuESrn5XoSH7FvXQZTB/Gh8xsbrXJQtIcSSslJV6PW8EPJS2Oo7EOL1g3Q9KiuM6H8ba45Cvu+SCpTuTXw0iXRh7Jq4EZZdafCkyNt1nAjwEkdQOXx/UHAmdKOrCukbrtktyHIZ/p3YnMR0mlyaCPpKTTq3khM7sbWF1mk5nANRY8AIyNxQ2PBBab2RIz2wpcH7d1LSup+CDeh9GBQmkQPyWVFtWk/m/WPIpgArC04PGyuKzU8kSSZklaIGnBqlWr6hKoK6+vWG3RsNrmhOOayIsPpks1R7JeXxeSntfKLE9kZrPNbLqZTR8/fnzNgnODkDQNw2d6dyQzv4BSmlRTFaxe//XLgMKSIxOB5cCwEstdi7LeUVJ9y0K12ubE45rHcn49jDRppdQ/F/hIHC11FPCGmb0CzAemStpL0jDgjLita3X9Z+65DuO1pNKlYXWHJV0HHA+Mk7QM+CowFMDMrgDmAacBi4GNwMfjuoyk84FbgW5gjpk90ai43eCVuuCez/TuPJbLead3ilSTMF6t5oXM7MwB1hvw6RLr5hESimsHSeXNvde7I4VTUt3NDsPVyKDbimZ2Uj0CcemRb0n0m+ntCaPj+EzvdPGTi672Sl1AyXu9O453eqeLJwxXc72jpAqWSfIGRgcyn+mdKlUdSUmfK7i/X+3CcalS/MXSM0bHCdfD8ISRFoPq9JY0FvgesL+kzcCjwDnEEU3OQWEtKa9W2+n8invpMqiEYWZrgY9LOgV4DTgE+HUd4nLtLLEPIzzwTtDOEmZ6+/FOi2rnYfSY2YOSlgMraxmQa3/JfRj5dd7aSKNXlyxmxXPP9Fuey3otqWrkNm1i81NPVV0eQUOGMPLQQ2scVfUJY4akZwhlx18EPlO7kFxqJGUGK1UezLWzW3/yQ1a9sCRx3eidxzU4mva36vvfZ/VPr6l6/+5x49j33ntqGFFQbcIYC3wJ+CLwyZpF41Kh1Exv8H7vtMps2cw+RxzFiZ/cdu6turrY4S1jmhRV+8qsXsOQXXZhj0u+VdX+Gjq0xhEF1SaMi4H9zGyRpGwtA3Ip4Bmj4+SyWYaNGMmosW9tdiipYJs30T1mDKPe+c5mh7KNahPGl4FRwO+BO2sXjkuD3j7vpFFSnjBSKZvN0jWkYaXpUi+3aTMaObLZYfRTbW/UViB/wvKEGsXi0qJMN4XP9k6nXCZDV7fXjKqV3OZNdI0Y0eww+qk2YWwExkgaCkyuYTwuBcysX77ItzY8XaRTLpv1hFFDtnkLGjG82WH0U23C+CrwHGGU1M9rF45LBaP02FnPGKmUy2bo6vZTUrUSWhitd0qq2iP8GTP7LnhpENdfUr5QwcQ9lz65jLcwask2baZrZOudkqqmNMiPgT1jaZBHCMNqvTSI62PWvw/DO71TLZvN0O2d3jWT27IFDW+9hDGoU1KxNMgy4GfAA8C+DKI0iKQZkhZJWizpwoT1X5C0MN4el5SVtFNc94Kkx+K6BYOJ2zVWyBfbZgwfVZteZhZqRnkLo2Zs06b2b2FErwPnAfsRWhjLKtlJUjehz+OkuM98SXPN7Mn8NmZ2KXBp3P504LNmtrrgaU4ws9eqiNk1UrnJ3H5KKnVy2TAVq8uvrFczuc2bURr6MMzsEkl3AM8A04B3AQ9XsOuRwGIzWwIg6XpgJvBkie3PBK4bbHyu+ZLyRV8fRsPDcXWWy2YAfB5GjVhPD2SzdKVhlJSkiwkf9CcBL5vZDyvcdQKwtODxsrgs6TV2AGYAvypYbMBtkh6UNKtMfLMkLZC0YNWqVRWG5mrKDIqvsublo1Krt4Xhp6RqIrd5M0BLtjCquab3RcAPgfXA+yX9Z4W7Jn1klPq+eTpwX9HpqGPM7HDgVODTko4rEd9sM5tuZtPHjx9fYWiulhL7vHur1XoTI22ymdjC8GG1NZHbtAkgNX0YAH8P/MTMbhnEPsuASQWPJwLLS2x7BkWno8xsefy5UtINhFNcdw/i9V2jJPZheK93WuVbGN1DvIVRC7ZlC0D7j5IqMAf4lKRLJU2rcJ/5wFRJe0kaRkgKc4s3kjQGeDfwm4JloySNzt8HTgYerzJ2V2dG0kzvuM4TRur09mF4C6Mm0tjC+AyhntQQwumpxNNDhcwsI+l84FagG5hjZk9IOi+uvyJu+j7gNjPbULD7rsANseN0CPCLQbZuXCOVm+ntUieXzQHeh1Er1tuHkZ6E8RwwFfiNmX220p3MbB4wr2jZFUWPrwauLlq2BKj95aNcXSTO9O7ymd5p1dfC8IRRC/lO71YsDVLtKakngDuAcyTNr2E8Lg1yCb3eeZ4vUifnnd41Zb0Jo/WG1VZ7hPcG1gCz40/neoU+7xIzvT1hpE42P6zWO71rIrcpnpJqwethVJswlprZHZJ2B1bWMiCXAmUv2+0ZI23yp6S6vYVRE7Yl38JITx/GDEnPEEp9vEjoBHcOGKgPo/HxuPrKZdpj4l72zTfJrl498IZN1rM8zDZIU6f3WOBLwBcJ1Wqd62Pmo6Q6SC7XHgljyXtOJ7NiRbPDqIxE16hRzY6in4oThqRDzeyR+PBiYH8zWyQpW5/QXLsqO9M7502MtGmHFoblcmRWrGD0SScy+sQTmx3OgIbsuivdO+7Y7DD6GUwL42FJjwPXAteZ2e8AzKxfmXLX4ZIyhheTSq12mLiXnz094pBDGDNzZpOjaV+DGVb7HWAUcAnwvKQ7JX2iPmG5dpZcrTau8wZG6mR7S4O0bsJo5bkN7aTihGFmXzCzvYHpwJWE2d2z6xWYa2PW18md19el4Rkjbdph4l7v3IYWLLfRTgbTh7EzoWzHB4ATCF8iX6pTXK6NJaYEvx5GarXDxL3euQ0tWNCvnQzmCK8gtEjWAFcB15rZvXWJyrU3n+ndUfquh1Ft4Yj6s82tW9CvnQwmYdxA6PC+2cx66hSPS4HyM709Y6RNX8Jo4RbG5tYtGd5OBjzCkibHu5+PP3dX8hj7tWa2rlaBuTaW2OvdjEBcI+TaoDSItzBqo5KvBD+l70RCuRMNVwPX1CAm1+YM6z/T2/swUivbBqVBWvmyp+1kwCNsZic0IhCXHpaj5ExvPyWVPn0T91o3YbRyBdh20rq9VK6t9Z+H4ZdoTaveYbUtfEqqd5SUtzC2iycMV3uJM71dWvX2YXS1cMLY4vMwaqGhCUPSDEmLJC2W1K+kiKTjJb0haWG8XVTpvq51hGq1fj2MTpHNtH4Lw3weRk007KSjpG5COfSTgGXAfElzzezJok3vMbP3VLmvawUJxWr7EohnjLSxXDZUV23lFkZ+lJT3YWyXRrYwjgQWm9kSM9sKXA9UWgVse/Z1DZbYsd1brbaxsbj6y2azdLdwWRAA27wFDR2KWrjeVTtoZMKYACwteLwsLit2tKRHJN0s6aBB7oukWZIWSFqwatWqWsTtBivpCkoutXKZTEuPkIIwrLYVL0jUbhqZMJI+QYq/ij4E7GlmhwL/D7hxEPuGhWazzWy6mU0fP358tbG67ZB4xT2f6Z1auWy2pQsPQpi414qXPG03jUwYy4BJBY8nAssLNzCzdWb2Zrw/DxgqaVwl+7oWUrYPw6VNLptp+YSR27zFWxg10MiEMR+YKmkvScOAM4C5hRtI2k3xk0XSkTG+1yvZ17WO0Ioozhj5dQ0Px9VZNpOlq8X7BryFURsNO8pmlpF0PnAr0A3MMbMnJJ0X119BKJ3+KUkZYBNwhoVPn8R9GxW7G5ykfNG3zjNG2liu9U9J5TZtRiN90t72aujXgniaaV7RsisK7l8GXFbpvq65zKz30pfbLM9mkVlv/R4A6wkFjnNbtm6z3LWWXC7be32L0tvkWPrUE2xeH2qNrl62lK6u7pY+rrlNm+ga7kNqt1drtyNdS1tx0UWs/eX/9Fv+5sHnsWX4GBZN+1jvstd3OhAO+TQvfeSjvLHu+QZG6SplwB/2n8zG4UMHve9Ob25i0bTDah9UDe14/PHNDqHtecJwVduy5HmGTp7M2A9+YJvlwxbvRq6nm/EXfK53WXbdSHgWxp55BuN27N8qcc2Xy+XYeMdN7LHTeHbbqfwIw7fu+BbGjhrd+3jksOEtPxdjx+OOa3YIbc8ThquaZXoYNmkS4849d5vlwy57hOz6rYw797TeZZueXA3PLmTM6X/NuH3GNjhSV4meLZvhjpvYe8ZfceTMDwy8g+s4XnzQVS+TTZw5W3amt/d5t6xcNkzDb/UObNc8njBc1SyTgaEJjdTEmXuFK10r6i1T3uKztl3zeMJwVbNMBiV8uJTLF97CaF191+b2FoZL5gnDVc0yPcnF3Kz0JVq9gdG6esuUe8JwJXjCcNXryZTow4DSM709Y7SqfAuju8Vnbbvm8YThqlaqD8MSa0nFdQ2Iy1Wnrw/DWxgumScMVzXLJo+SCtUHi5d5xmh1fX0Y3sJwyTxhuKpZJoOGJMwKTkoKfsG9ltebMFr4UquuuTxhuOr19KCE0xfhlFTxNb3DY/OM0bLyNaRa+VKrrrk8YbiqWSaDEvswkkZJ5dc1IDBXlWy+09v7MFwJnjBc1SyTgVIjakpdL8kTRsvq7fT2UVKuBE8YriqWy0EuV6YPw4fVtptcxifuufI8YbjqxPPdpeZh+CVa208u56OkXHkNTRiSZkhaJGmxpAsT1p8l6dF4+6OkQwvWvSDpMUkLJS1oZNyuP+tNGEnfRkv3Yfgpqdbl8zDcQBr2VUJSN3A5cBKwDJgvaa6ZPVmw2fPAu81sjaRTgdnAOwrWn2BmrzUqZldaPmEk9WFYUjGp3nWeMVqVn5JyA2lkC+NIYLGZLTGzrcD1wMzCDczsj2a2Jj58AJjYwPjcIPS1MPr3YVjCvL3eYbWeL1pWNrYwvDSIK6WRCWMCsLTg8bK4rJRzgJsLHhtwm6QHJc0qtZOkWZIWSFqwatWq7QrYlWY9pfswEjOGa3lerdYNpJFfJZI+QhK/b0o6gZAwji1YfIyZLZe0C3C7pKfN7O5+T2g2m3Aqi+nTp/v32XrJ9AAkzsOAhIl7+a8mfkRaVu/EPe/0diU0soWxDJhU8HgisLx4I0mHAFcCM83s9fxyM1sef64EbiCc4nJNYvHbKCVmepeqJeUzvVtX3ygpb2G4ZI1MGPOBqZL2kjQMOAOYW7iBpMnAr4GzzeyZguWjJI3O3wdOBh5vWOSun/J9GJbQhxHX5eocmKuad3q7gTSs7WlmGUnnA7cC3cAcM3tC0nlx/RXARcDOwI/iKY2MmU0HdgVuiMuGAL8ws1saFbvrr2wfBpQcJeVal8/0dgNp6F+Gmc0D5hUtu6Lg/ieBTybstwQ4tHi5ax4r04eROBLKZ3q3PK8l5QbiM71ddcrM9MZnercl7/R2A/GE4arSO3Ev4cMlVKstLm/et861Jh9W6wbiCcNVxWIHaek+jFI71icet/3yo6TU5R8LLpn/ZbiqDNSH4TO9208uk6Gre4ifPnQlecJw1Snbh+EzvdtRNpv1y7O6sjxhuKqUKz4I5WZ6exOjVeWyGbq9w9uV4QnDVaVvHkZy8cGSM709X7SsXCbrHd6uLE8YrirlrodRdqa3J4yWlctmPGG4sjxhuOpky8/DKD3T2zNGq8plcz4Hw5XlCcNVxcpdopWEiXtdfkqq1eWyGe/0dmV5wnBVyfdhkNCH4aOk2lM2m/UWhivLE4arSm8Lo+Q8jBIzvXPexGhVuUzG60i5sjxhuKr0TtxL+oApM0rKta5cNpN8PJ2LPGG46pTtw/BRUu0ol816C8OV5QnDVSVfS4qhSX0YQFdxr3fdQ3LbKed9GG4AnjBcVcqNkoLStaS8idG6cl4axA3AE4arimV6oKsrsbKp5UqPkvJ80bqy2Yy3MFxZDU0YkmZIWiRpsaQLE9ZL0g/j+kclHV7pvq7BMqU7SJP6vL2B0fq8NIgbSMO+TkjqBi4HTgKWAfMlzTWzJws2OxWYGm/vAH4MvKPCfV0DWU8muf8CSszcK1zpWtFgS4PkL4ZVq3Lohc+3cd0bbFi7Bkmoq4uuri5G7DiakaPfUhRzlo3r3mDjG2vZtH4dGGzesJ41y18mm+lhr8Oms/vU/ZFENtPDxnVvsGXDBrq6hzB0+HCGjRzJsBEje1vKPVu3sP6118hleugaMoSurm66uuNtyBBeeXYRZsaE/Q5gxKgd2bzhTYYMG8aQYcPLvg9mxqb16+jZvJlsJkM200Muk+Et43dh+A6jQuz0XYtEXV0IxQmv4acQ5H9K4b2RWPvqCla/vJQtGzew+9T92GmPiTU5HknUqCugSToa+JqZnRIffxnAzL5VsM1PgLvM7Lr4eBFwPDBloH2TTJ8+3RYsWDDoWL9/xtkY2UHv14my3f3/Sbpy3fQM2cTWoev6FpoYtXlXTFlMnjRaUmY9NmICube+q9mRuO1kXZu58LufqGpfSQ+a2fSkdY08YTkBWFrweBmhFTHQNhMq3BcASbOAWQCTJ0+uKtAuDcUa+ta0p2w3ZEo0MjYO30zPkJ5tlnV1ZenOldjBNd+wnekZvROZESuaHYnbTlKmLs/byE/FpPZa8VfNUttUsm9YaDYbmA2hhTGYAPM+c92canZzzrlUa2TCWAZMKng8EVhe4TbDKtjXOedcHTVylNR8YKqkvSQNA84A5hZtMxf4SBwtdRTwhpm9UuG+zjnn6qhhLQwzy0g6H7gV6AbmmNkTks6L668A5gGnAYuBjcDHy+3bqNidc841cJRUM1Q7Sso55zpVuVFSPtPbOedcRTxhOOecq4gnDOeccxXxhOGcc64iqe70lrQKeLHK3ccBr9UwnHpohxjB46y1doizHWIEjzPJnmY2PmlFqhPG9pC0oNRIgVbRDjGCx1lr7RBnO8QIHudg+Skp55xzFfGE4ZxzriKeMEqb3ewAKtAOMYLHWWvtEGc7xAge56B4H4ZzzrmKeAvDOedcRTxhOOecq4gnjCKSZkhaJGmxpAtbIJ4XJD0maaGkBXHZTpJul/Rs/PnWgu2/HGNfJOmUOsY1R9JKSY8XLBt0XJLeHn+/xZJ+qFpdILp0jF+T9HJ8PxdKOq2ZMcbnnyTpTklPSXpC0j/F5S3zfpaJsaXeT0kjJP1Z0iMxzq/H5S3zXg4QZ0u9n/2Ymd/ijVA6/TngbYSLNj0CHNjkmF4AxhUt+w/gwnj/QuDb8f6BMebhwF7xd+muU1zHAYcDj29PXMCfgaMJV1W8GTi1zjF+Dfh8wrZNiTE+/+7A4fH+aOCZGE/LvJ9lYmyp9zM+547x/lDgT8BRrfReDhBnS72fxTdvYWzrSGCxmS0xs63A9cDMJseUZCbw03j/p8B7C5Zfb2ZbzOx5wnVFjqxHAGZ2N7B6e+KStDvwFjO738Jf/jUF+9QrxlKaEmOM8xUzeyjeXw88RbiOfcu8n2ViLKVZx9zM7M34cGi8GS30Xg4QZylN+/ss5AljWxOApQWPl1H+n6IRDLhN0oOSZsVlu1q4EiHx5y5xebPjH2xcE+L94uX1dr6kR+Mpq/ypiZaIUdIU4DDCN86WfD+LYoQWez8ldUtaCKwEbjezlnwvS8QJLfZ+FvKEsa2kc3/NHnd8jJkdDpwKfFrScWW2bcX4oXRczYj3x8DewDTgFeA7cXnTY5S0I/Ar4J/NbF25TUvEVPdYE2JsuffTzLJmNg2YSPgWfnCZzVstzpZ7Pwt5wtjWMmBSweOJwPImxQKAmS2PP1cCNxBOMb0am6LEnyvj5s2Of7BxLYv3i5fXjZm9Gv9Rc8B/0nfKrqkxShpK+CD+uZn9Oi5uqfczKcZWfT9jbGuBu4AZtNh7WSrOVn4/wRNGsfnAVEl7SRoGnAHMbVYwkkZJGp2/D5wMPB5j+mjc7KPAb+L9ucAZkoZL2guYSugQa5RBxRVPDayXdFQc2fGRgn3qIv+hEb2P8H42Ncb4vP8FPGVm3y1Y1TLvZ6kYW+39lDRe0th4fyRwIvA0LfRelouz1d7PfurVm96uN+A0wgiQ54B/bXIsbyOMjHgEeCIfD7Az8Hvg2fhzp4J9/jXGvog6jpYAriM0mXsI33LOqSYuYDrhn+I54DJi9YE6xvgz4DHgUcI/4e7NjDE+/7GE0wiPAgvj7bRWej/LxNhS7ydwCPBwjOdx4KJq/2eaFGdLvZ/FNy8N4pxzriJ+Sso551xFPGE455yriCcM55xzFfGE4ZxzriKeMJxzzlXEE4ZzFZA0VtI/FDzeQ9L/1Om13ivpohLr3ow/x0u6pR6v71wpnjCcq8xYoDdhmNlyM/tAnV7ri8CPym1gZquAVyQdU6cYnOvHE4ZzlbkE2Dteo+BSSVMUr7Mh6WOSbpR0k6TnJZ0v6XOSHpb0gKSd4nZ7S7olFpK8R9L+xS8iaV9gi5m9Fh/vJel+SfMlfaNo8xuBs+r6WztXwBOGc5W5EHjOzKaZ2RcS1h8MfJhQ++ebwEYzOwy4n1CuAWA28I9m9nbg8yS3Io4BHip4/APgx2Z2BLCiaNsFwLuq/H2cG7QhzQ7AuZS408J1ItZLegO4KS5/DDgkVnl9J/DLgguiDU94nt2BVQWPjwHeH+//DPh2wbqVwB61Cd+5gXnCcK42thTczxU8zhH+z7qAtRbKWZezCRhTtKxU/Z4RcXvnGsJPSTlXmfWES5NWxcK1I56X9EEI1V8lHZqw6VPAPgWP7yNUTYb+/RX70lfN1Lm684ThXAXM7HXgPkmPS7q0yqc5CzhHUr76cNLlf+8GDlPfeat/Ilw4az79Wx4nAP9bZSzODZpXq3WuxUj6AXCTmf1ugO3uBmaa2ZrGROY6nbcwnGs9/w7sUG4DSeOB73qycI3kLQznnHMV8RaGc865injCcM45VxFPGM455yriCcM551xFPGE455yryP8HPznzbNYRFcsAAAAASUVORK5CYII=\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-8pl_16tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time (d)' :'time'})" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'px' ()>\n",
+       "array(0.)\n",
+       "Coordinates:\n",
+       "    id       int64 105\n",
+       "    time     float64 1.09e+03
" + ], + "text/plain": [ + "\n", + "array(0.)\n", + "Coordinates:\n", + " id int64 105\n", + " time float64 1.09e+03" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['px'].sel(id=105).isel(time=109)" + ] + }, + { + "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/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in new file mode 100644 index 000000000..c8cc418b0 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in @@ -0,0 +1,49 @@ +16 +105 +0.59427697124197276235 -0.8232523083817967491 3.7129329104855261984e-05 +0.020564990514662154913 0.010004295439859960809 -5.226292361234363611e-07 +109 +4.119750673485228276 -2.8866333472175926822 -0.080165336328135106125 +0.041127620144391897894 0.0065414198811065849687 -0.00012215100047356211078 +101 +-0.09859055695785905182 0.2975290300646933339 0.03335708456145129036 +-0.029750083068855306956 -0.0078122718370876240157 0.0023293874953380202045 +102 +-0.09863667837052235432 0.29748290865203008693 0.03335708456145129036 +-0.034957182012873608268 -0.0078122718370876240157 0.0023293874953380202045 +103 +-0.6439245854659476631 -0.32479782779646521051 0.032702713983447248558 +0.0153169432007213678765 -0.018153139924556138673 -0.0007667345025597138231 +104 +-0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 +0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 +106 +0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 +0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 +107 +-1.5926895092930311026 0.48169594448240382611 0.049163460846716633412 +-0.00044929323243133797994 -0.01219974682608557931 -0.00016910795626524249315 +108 +-1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 +-0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 +110 +4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 +-0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 +111 +6.3634605491076454697 -7.64917730379279881 -0.12023019299387090186 +0.026096616095614821179 0.0035613826786502411278 -0.00022039988214595340028 +112 +6.3623595643973844815 -7.650278288503059798 -0.12023019299387090186 +-0.01812972167145235694 0.0035613826786502411278 -0.00022039988214595340028 +113 +14.814394441298382787 13.052280053388562564 -0.14347198499748289868 +0.010469662145386185101 0.0027742356008832688187 4.416821810149910185e-05 +114 +14.813914925323977911 13.051800537414157688 -0.14347198499748289868 +-0.015719864931937603536 0.0027742356008832688187 4.416821810149910185e-05 +115 +29.565157420731857485 -4.579098772788029237 -0.5871109926822926095 +0.014900134286357700347 0.003128345390031967918 -7.5036135696161668576e-05 +116 +29.564691895839423808 -4.5795642976804593616 -0.5871109926822926095 +-0.0139711373401985618214 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in deleted file mode 100644 index bd980fc4b..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in deleted file mode 100644 index 701e9a14f..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ /dev/null @@ -1,36 +0,0 @@ -9 -0 0.00029591220819207775568 -0.0 0.0 0.0 -0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751243077781048702 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 0.006759104275397271956 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 0.010044787321379672528 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 0.007246743835971885302 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 0.35527126534549128905 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 0.4376527512949726007 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 0.4695362423191493196 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 0.7812870996943599397 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in deleted file mode 100644 index bd980fc4b..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb deleted file mode 100644 index cd1a5aab8..000000000 --- a/examples/rmvs_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": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAElCAYAAADnZln1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAxL0lEQVR4nO3deZxcdZnv8c/TeyfdSUjSITtZWBISICYRUDECCoKDF1lEA4yACI7jOHoVt5m5KnoV1OuCg8sgm4BDZmQGRTZZArIPBEgggJElgXTWztL03tVV9dw/zqnu6k6vldr7+3696tWnTp3lqdPdT/3qd37nOebuiIhI8SvJdQAiIpIdSvgiIqOEEr6IyCihhC8iMkoo4YuIjBJK+CIio4QS/ihkZt8ys1vC6dlm1mJmpbmOazBm9l4z25DlfbqZHbyf23jJzI5PT0T7bHvA36OZHWhmj5hZs5n9yAI3mNleM3s6E/FI/lPCL0BmtsnMPtBn3oVm9thIt+Xub7l7jbvH0hfhyAwnsbr7o+5+WLZiShd3X+TuD0PvBJ2B/fT9PV4K7ALGufuXgOOAk4CZ7n50JmKQ/KeEL3nPzMpyHUMBOgh42XuurDwI2OTurSPdkI5/8VDCL1JmNt3M/svMGsxso5n94wDLzQlb2GVJ691hZnvM7DUzuyRp2VIz+yczez3sKnjWzGaFry0ws/vD9TaY2TlJ691oZj83s7vC9f7HzOaHrz0SLrYu7JL4mJkdb2b1ZvZVM9sO3JCYl7TNWWb23+H7221mVw9wDNrNbGLSvHeY2S4zKw+ff9LMXgm7Ov5kZgcNcJzGm9lN4f7eNLN/MbOSpNcvCbfTbGYvm9nScP4mM/uAmZ0C/BPwsfB9rjOzj5rZs3328yUz+/0AMcw1sz+H+7gfmNzf79HMbgQuAL4S7uvTwLXAu8Lnl4frnGZma82s0cyeMLMjk7a3KTz+LwCt4XaPDZdrDOM/Pmn5h83sO2b2eBjffWaWHN9xSetuNrMLw/mVZvb/zOwtM9thZr8ys+rwtclmdme4zh4zezT5mEsK3F2PAnsAm4AP9Jl3IfBYOF0CPAt8A6gA5gFvAB8MX/8WcEs4PQdwoCx8/mfgF0AVsARoAN4fvvZl4EXgMMCAo4BJwFhgM3ARUAYsJehOWBSudyOwBzg6fP23wKqk2B04OOn58UAU+D5QCVSH8+rD10uBdcBPwn1XAccNcKxWA5ckPf8h8Ktw+iPAa8DCMK5/AZ7oLy7gJuAPQG14zP4KXBy+9lFgC/DO8LgcDBzU93eVfNzD55XhcVmYNO954KwB3suTwI/D9VYAzYP8Hm8E/m9/fx/h86XATuCY8HheEMZamRT3WmBWePxnALuBDxH8fZ0UPq8Ll38YeB04NFz+YeDK8LXZYawrgXKCv5kl4Ws/Be4AJobH9o/AFeFrVwC/CtcpB94LWK7//wr5kfMA9Ejhlxb8M7YAjUmPNnoS/jHAW33W+TpwQzjdnXiSE0X4zx0DapPWuwK4MZzeAJzeTzwfAx7tM+/fgG+G0zcC1ya99iHgL0nP+0v4EaCqz7xEwn8XwQdR2TCO1aeA1eG0EXwwrQif30OYtMPnJeFxPCg5LoKE2AkcnrTsp4GHw+k/AZ8f5HfVb8IP5/0S+G44vQjYS5h0+yw3m+BDcGzSvH/v7/eYdMwHS/i/BL7TZx8bgPclxf3JpNe+CtzcZ/k/AReE0w8D/5L02t8D9yb97d3ez3syoBWYnzTvXcDGcPrbBB+yB/ddV4/UHvp6VLg+4u4TEg+Cf7CEg4Dp4VfhRjNrJOhOOHCIbU4H9rh7c9K8NwladxB8ILzez3oHAcf02d95wNSkZbYnTbcBNUPE0uDuHQO8Ngt4092jQ2wD4DaCrozpBK1iBx5NivuqpJj3ECShGX22MZngm9KbSfOGc1yG4zfAuWZmwN8C/+nunf0sNx3Y67374N/sZ7nhOgj4Up/f2axwPwmb+yz/0T7LHwdMS1pmoN/xQMenDhgDPJu0zXvD+RB8G3sNuM/M3jCzr438bUoynYwpTpsJWkmHjHC9rcBEM6tNSvqzCborEtudD6zvZ39/dveTUg24H4OVcd0MzDazsqGSvrs3mtl9wDkEXTe3eth8DLfzXXf/7RCx7AK6CE+EhvP6Oy5D2ec9uftTZhYh6K44N3z0ZxtwgJmNTUr6s/vb5jAl3vt3hxnvZoIW/iUDLTzEvvobGbQLaCfo+tvS98Xwb/BLBB9Mi4CHzOwZd38whRgEnbQtVk8DTeFJt2oLTrYuNrN3DraSu28GngCuMLOq8CTexQR97hCc+PuOmR1igSPNbBJwJ3Comf2tmZWHj3ea2cJhxruD4DzDSN7fNuBKMxsbxvqeQZb/d+ATwFnhdMKvgK+HySRxYvajfVf2YKjjfwLfNbNaC07sfhFIDLG8FrjMzJaFx+Vg6//k7w5gTj8nHm8Crgai7t7v0Fp3fxNYA1xuZhVmdhzw4UHe81B+DfydmR0TxjzWzP7GzGoHWP4W4MNm9sHw76nKghPpM4exr98CHzCzc8KTv5PMbIm7x8M4fmJmUwDMbIaZfTCcPi08lgY0EXQ35mz4cDFQwi9CYYL6MMFJ140ELalrgfHDWH0lQX/wVuB2gn74+8PXfkyQ+O4j+Ae8DqgOW2InAx8P19tOzwnX4fgW8Jvwa/05Qy2c9P4OBt4C6gnOIwzkDuAQYIe7r0vazu1hnKvMrIngm8upA2zjcwT9zW8AjxF8cFwfbud3wHfDec3A7wlOQvb1u/DnbjN7Lmn+zcDi8OdgziU4P7MH+CbBB0VK3H0NcAnBB81egq6TCwdZfjNwOkHXYANBq/3LDCOHuPtbBOdtvhTGvpbghD8E5wZeA54KfwcPEAwKgOB39gDB+aongV94eE2DpMZ6vt2KSC6EwxB3Akvd/dVcxyPFSy18kdz7DPCMkr1kmk7aiuSQmW0iGBn0kdxGIqOBunREREYJdemIiIwSSvhSNKyfKqLFwvrUPBJJhRK+FJQw6bVaUARsi5n92LJcy9/SUCdfJBeU8KUQHeXuNcD7Ccamp3L1p8ioo4QvBcvd/0JQF2dx39fM7GgzezK8mGubmV1tZhVJr7uZ/Z2ZvWpBaeSfh1d0Jl7vt2yy9V/OedhlfM3s3Wb2jJm9Hf58d9Jrg5YYTlpuRGWVRRKU8KVgmdnhBDVonu/n5RjwvwkKn72L4NvA3/dZ5jSCksZHEdTaSVzS/xGCK0rPJCjk9ShwK4C7rwjXPcqDO0z9B8EVpPXhsgeG6+4z/M2Cuvx3AT8jKBH8Y+CusDxFwrkEZaanEBRsu6yf93YHMLdP6YrzGfpKXRnl8j7hm9n1ZrbTzPoW7Ep1e/eGLbE7+8z/Bwtu+OH9taokrzxnZnsJaqdfC9zQdwF3f9bdn3L3qLtvIijX/L4+i13p7o3hpf8PEZSigKD08RXu/kpYnO17wJIB6uNAUFhtGkFZ5S4PbsfY33jnvwFedfebw7huBf5C75o4N7j7X929naCMxZK+Gwmraf4HQZInrAU0h6CmkciA8j7hE9T1PiWN2/shQRnavh4HPsD+lZyV7Fjq7ge4+3x3/5ewCFcvZnZo2M2yPazR8j2S7hAVGqic73DLJicMt4zvdPb9+0ouszxYTH0Nt6yySLe8T/ju/gjBP1w3M5sfttSfDftLF4xgew8SFLjqO//5sCUoxeGXBK3nQ9x9HEE3iw2+SrfNwKeT7zfg7tXu/kR/C7t7s7t/yd3nEbTWv2hm7+9n0a0EHybJksssD5u7P0Vwk5hEWWV158iQ8j7hD+Aa4HPuvoygj/MXOY5H8k8tQUXPlrBB8JkRrDtU2eRe5ZxHUMb3boIy0ueGZYI/BhxO6l0xQ5ZVFklWcBdxmFkN8G7gd0mDKirD184kuC1aX1vc/YPZiVDyxGUEDYOvEJzU/Q/gxOGs6O63h39nq8J++7eB++kpb/wtgnLO1cClBF0yVxOctN3LAGV83X23mZ0GXEXwDeQ14DR335Xie7wZ+E74EBlSQdTSMbM5wJ3uvtjMxgEb3H3aEKsNtr3jgcvc/bR+XtsELN+Pf0KRrFBZZRmpguvScfcmYGPiK7YFjhpiNZFipLLKMiJ5n/DN7FaCu90cZmb1ZnYxwQ2yLzazdcBLBHfiGe72HiX4av7+cHuJsdf/aGb1wEzgBTO7Nt3vRSRdwm+inye4BkBkWAqiS0dERPZf3rfwRUQkPfJ6lM7kyZN9zpw5uQ5DRKRgPPvss7vcva6/1/I64c+ZM4c1a9bkOgwRkYJhZgNWC1CXjojIKKGELyIySijhi4iMEnndh9+frq4u6uvr6ejoyHUoA6qqqmLmzJmUl5fnOhQRkW4Fl/Dr6+upra1lzpw5JNXSyRvuzu7du6mvr2fu3Lm5DkdEpFvBdel0dHQwadKkvEz2AGbGpEmT8vobiIiMTgWX8IG8TfYJ+R6fiIxOWU34ZrbJzF40s7VmpgH2IiJAeyTGbc/Wk+lSN7lo4Z/g7kvcfXkO9g3Au9/97n7nX3jhhdx2221ZjkZERrvv3PUyl/1uHU+9sWfohfdDQXbp7K8nnuj3TnUiIjmxtbEdgPauaEb3k+1ROk5wo2cH/s3dr+m7gJldSnAXIWbPnp2RIGpqamhpacHd+dznPsfq1auZO3duxr9OiYj0JxYPck9Jhs//ZbuF/x53XwqcCnzWzFb0XcDdr3H35e6+vK6u3/o/aXP77bezYcMGXnzxRX7961+r5S8iOZFI+GUlmU3JWU347r41/LkTuB04Opv77+uRRx5h5cqVlJaWMn36dE48cVi3PBURSatomPAzPcAvawnfzMaaWW1iGjgZWJ+t/Q9EQyhFJNcSLfyuWDyj+8lmC/9A4LHwtoRPA3e5+71Z3P8+VqxYwapVq4jFYmzbto2HHnool+GIyCiVaOFHoplN+Fk7aevubwB5dbPxM844g9WrV3PEEUdw6KGH8r73vS/XIYnIKBTvbuFnduBIwdXSSYeWlhYg6M65+uqrcxyNiIx2xdilIyIi/Ugk/IgSvohIcYvGg0SvFr6ISJGLZemkrRK+iEiORdWHLyIyOmRrlI4SvohIjmVrHL4Sfgo++clPMmXKFBYvXpzrUESkCHR0xQB16eSlCy+8kHvvzelFwiJSRDq6gkSvFn4eWrFiBRMnTsx1GCJSBKKxePf4+0y38Av6StvL//gSL29tSus2D58+jm9+eFFatykiMpCOpFZ9RCdtRUSKV3sk1j2tFv4g1BIXkUKXOGELOmkrIlLUkhO+TtrmoZUrV/Kud72LDRs2MHPmTK677rpchyQiBao9iy38gu7SyZVbb7011yGISJFI7sPXSVsRkSLWGXbjlBh0qUtHRKR4JUojj6ko00lbEZFiliiYNqaiVDdAEREpZtHkhK8uHRGR4pXo0qlWl46ISHFL7tJRPfw8s3nzZk444QQWLlzIokWLuOqqq3IdkogUsGgscdK2VOPw801ZWRk/+tGPWLp0Kc3NzSxbtoyTTjqJww8/PNehiUgB6oqrDz9vTZs2jaVLlwJQW1vLwoUL2bJlS46jEpFC1dPCL8v4KJ3CbuHf8zXY/mJ6tzn1CDj1ymEtumnTJp5//nmOOeaY9MYgIqNGYpROdRa6dNTCT1FLSwtnnXUWP/3pTxk3blyuwxGRAtWVuPCqPPMnbQu7hT/Mlni6dXV1cdZZZ3Heeedx5pln5iQGESkOyePwY3EnFndKSywj+1ILf4TcnYsvvpiFCxfyxS9+MdfhiEiBS/ThV1WUApmtmKmEP0KPP/44N998M6tXr2bJkiUsWbKEu+++O9dhiUiB6oo7ZSVGRWmQjjN54jbrXTpmVgqsAba4+2nZ3v/+Ou6443DPbD+biIwe0VicslKjoixI+JmsmJmLFv7ngVdysF8RkbwTjTvlJSWUhy38TJ64zWrCN7OZwN8A12ZzvyIi+Soac8pKLSnhF08L/6fAV4AB35GZXWpma8xsTUNDQ9YCExHJhWg8TllpSXeXTmcxdOmY2WnATnd/drDl3P0ad1/u7svr6uqyFJ2ISG50xZzyEqOi1MLnRZDwgfcA/8vMNgGrgBPN7JYs7l9EJO8EJ21LiqtLx92/7u4z3X0O8HFgtbufn639i4jko6548fbhF7yOjg6OPvpojjrqKBYtWsQ3v/nNXIckIgUsGotTXpKdPvyclFZw94eBh3Ox7/1VWVnJ6tWrqampoauri+OOO45TTz2VY489NtehiUgB2neUTpEMyywGZkZNTQ0Q1NTp6urCLDN1L0Sk+AVdOiXdV9pm8sKrgi6e9v2nv89f9vwlrdtcMHEBXz36q4MuE4vFWLZsGa+99hqf/exnVR5ZRFIWdOkY5WXFNUqnaJSWlrJ27Vrq6+t5+umnWb9+fa5DEpEC1bdLp6hq6aTTUC3xTJswYQLHH3889957L4sXL85pLCJSmLricWrKy3qKpxXDhVfFoqGhgcbGRgDa29t54IEHWLBgQW6DEpGCFY2F1TLLMn/StqBb+Lmwbds2LrjgAmKxGPF4nHPOOYfTTiu4op8ikie6snjhlRL+CB155JE8//zzuQ5DRIpENO6UlxrlRVZaQURE+ojG4pQlXXiVyZO2SvgiIjnUlRilU6KTtiIiRWHznjb+sr1pn/nReJyyEqOkxCgrMfXhi4gUuvf+4CEANl35N73mB+Pwg7Z3eWmJSiuIiBSrrvBKW4DyUstol86QLXwzmz3MbTW6+77fV0REZECxeE8Lv6KsNOddOr8BHBisQpgDNwI3pSGmghCLxVi+fDkzZszgzjvvzHU4IlKgEvXwASpy3cJ39xP6zjOzqe6+PTMhFYarrrqKhQsX0tSkLzUikrpEPXyA8rKSvByH/4m0RlFg6uvrueuuu/jUpz6V61BEpADE4z0nYt291/y4093Cz/RJ21RH6ZxuZm3A/e6+IZ0BjcT2732PzlfSWx65cuECpv7TPw26zBe+8AV+8IMf0NzcnNZ9i0hxao1Eu6e7Yk5FohRyPGjNlyeN0snHC6/OBF4DzjCza9MYT9678847mTJlCsuWLct1KCJSIJo6ehJ+RzTWPR0NW/Nl4Sidigx36aTUwnf3HcC94SNnhmqJZ8Ljjz/OHXfcwd13301HRwdNTU2cf/753HLLLVmPRUQKQ3NHV/d0Z1ccqoLp7oSfGKWT4ZO2KbXwzeznZnZjOH1yWiPKc1dccQX19fVs2rSJVatWceKJJyrZi8igmtp7WvidSS38ni6d5D78PEv4QAR4I5w+MU2xiIgUpeQWfkdXT0Lv6dJJ7sPPv5O2bcB4MysHhnthVtE5/vjjOf7443MdhojkuabkLp3kFn7Ymu8eh19Wkpc3Md8DtAM/Bx5PXzgiIsWnOfmkbXILPxyuWd594VUedemY2QQzuwE4K5x1E7A87VGJiBSRpvb+W/jRRAu/u0vH8ucm5u7eaGZXAnOAXcCRwH9nIC4RkaKR3MLvTGrhJy6y6nXSNs+6dC4GNrr7n4Bn0xyPiEjRSR6Hn9zCT0xXlpcCQWmFfDtpuxf4OzM7DFgHrHV33eRVRGQAyUk+uQ+/M2zNV5YlxuHn2YVX7n6FmT0I/BVYAqwAlPBFRAYQicapLCuhMxrvk/zDFn5Z0MLPuyttzezbQCmwlqB1/3CaY8p7c+bMoba2ltLSUsrKylizZk2uQxKRPBaJxqmtKqezpXPQFn7Ob4DSl7t/w8y+QTDC5ywzm+/ul6Q/tPz20EMPMXny5FyHISIFIBKLM666jF0tnX368IPkXlUeJPyxlWVE405HV4yqsF8/nVK90vZ6YCEwCfjFcFYwsyoze9rM1pnZS2Z2eYr7FhEpKIkWPvQepdPZp0tnXLhM8jDOdEr1wqt/JCivUAZcRdCPP5RO4ER3bwmv0H3MzO5x96dSjIFH//Ov7Nrckurq/Zo8q4b3nnPooMuYGSeffDJmxqc//WkuvfTStMYgIsUlEo0zpryU0hLrVS2zu0snbOGPrw4S/tvtXUwZV5X2OFJN+K8DhwB/cPf/PZwVPKj6n8jO5eEjc+OPMujxxx9n+vTp7Ny5k5NOOokFCxawYsVwPvNEZDSKxOKMrSyjqqykVwu/70nb5ISfCakm/JeAzcDFZvZDd3/ncFYys1KCsfsHAz939/9Jcf8AQ7bEM2X69OkATJkyhTPOOIOnn35aCV9EBhSJxqkoK6GyvLT/Fn7Zvi38TEi1D38+wYfFNcBFw13J3WPuvgSYCRxtZov7LmNml5rZGjNb09DQkGJ4mdPa2tp9p6vW1lbuu+8+Fi/e522IiHRLJPy+LfxsJ/xUW/ib3X21mU0Ddo505bBEw8PAKcD6Pq9dQ/BBwvLly/Ouy2fHjh2cccYZAESjUc4991xOOeWUHEclIvmsMxqnsjTRwk9O+DEqykowC0or5GvCP8XM/kpQLfNNgpO4gzKzOqArTPbVwAeA76e4/5yZN28e69aty3UYIlJAIrGwS6espHtkDgQjdqrKejpaaquClJxvXToTgK8CXyEYfTMc04CHzOwF4BmCG6DfmeL+RUQKRu8+/N5dOpVJ4+3LSkuoqSzLuxb+t4EF7r7BzGJDLg24+wvAO1Lcn4hIwYpE41SUBn34Hb1a+LHu/vuE8dXluW/hm9lRiWl3r3f3B8Lpr2UiMBGRYpHo0qmuKO2d8MMaO8nGVZf3ugduOo2kS+d5M3vBzL5iZrMyEo2ISJGJxZ1Y3KksK6W6vJT2SO/yyIkx+Anjq8sydqXtSBL+j4CxwJXARjN7yMw+mZGoRESKRKIYWqKF396nhZ+oo5OQF1067v5ld59PcEvDawnKKVyTkahERIpEr4Tft4XfFe+nhZ8HCd/MJpnZp4DvEVxsZQRX2446jY2NnH322SxYsICFCxfy5JNP5jokEclTnbEgwXcn/KQWfkc01l1HJ+GUxVP51HvnZiSWkYzS2U7wAbEXuAG4xd0fy0hUee7zn/88p5xyCrfddhuRSIS2trZchyQieSrRwq8sLWFM2KXj7phZ2MLvnfBPXHAgJy7ITCwjSfi3A7cA97h7Zr5vFICmpiYeeeQRbrzxRgAqKiqoqKjIbVAikreSu3SqKkpxT/Tdl/Z70jaThp3w3f2cTAaSioduvIadb76R1m1OOWgeJ1w4cLnjN954g7q6Oi666CLWrVvHsmXLuOqqqxg7dmxa4xCR4hCJ9e7DB2iPxMKEv28LP5Oyt6ciEY1Gee655/jMZz7D888/z9ixY7nyyitzHZaI5KnuFn5pUsIP+/ETLf1sSeWeth929z9mIpiRGqwlnikzZ85k5syZHHPMMQCcffbZSvgiMqC+wzIhKeH3c6VtJqWyp++mPYoCMnXqVGbNmsWGDRsAePDBBzn88MNzHJWI5Ku+wzKB7qGZHdH4PqN0MimVWjqW9igKzL/+679y3nnnEYlEmDdvHjfccEOuQxKRPNUZ67+FH43Fu6/AzZZUEn7e1ajPtiVLlrBmzZpchyEiBSC5Dz+e1MLve/OTbEi1WqaIiAxDJCmxh/c5ob1LCV9EpOgk9+GXlgQZvz0So7UzqIg5pjJ7aTiVPe1IexQiIkUqeRx+QntXjMa24PrVCeFtDbNhxAnf3U/KRCAiIsUouQ8/uYWfKJA2YUz2rtRXl46ISAYld+kkWvntXTEa2yNAz43Ls0FX2oqIZFByl05FaQkl1reFn+cJ38y+mDR9WPrCyX8bNmxgyZIl3Y9x48bx05/+NNdhiUie6kzq0jGz7hLJiT78bLbwR9SlY2YTgJ8AC8ysA3gBuJigPv6ocNhhh7F27VoAYrEYM2bM4IwzzshtUCKStzrC8gkWjsmsriijvSto4VeWleRvLR13bwQuMrMPAruAI4H/zkBcBeHBBx9k/vz5HHTQQbkORUTyVFskypiKnqReXVFCeyRGLOZZ7c6B1E/adrn7s2a2FdiZzoBGovGPrxPZ2prWbVZMH8uED88f1rKrVq1i5cqVad2/iBSXtkiMMRU9qfaAMRXsbo1QXV7ChOrs3ksj1ZO2p5jZTOBXBF08o04kEuGOO+7gox/9aK5DEZE81h6JddfQAZg2voptje00tnVltf8eUm/hTwC+CnwF+FTaohlpEMNsiWfCPffcw9KlSznwwANzFoOI5L+ghd+T8KdPqOaxV3dRWmLMmjgmq7Gk2sL/NvB7d98AxIZauBjdeuut6s4RkSG1d8W6yyIDzJhQTWskxuY9bVm9yhZST/hfB/42nH4oTbEUjLa2Nu6//37OPPPMXIciInmuvU8Lf9r4agBaI7Gsn7RNNeFHgMTNZE9IUywFY8yYMezevZvx48fnOhQRySMv1DfS3NHVa14wSqen93z6hKru6QPHVZFNqSb8NmC8mZUDs9MYj4hIQWrtjPK/rn6cL6xa22t+35O20ydUd09/cNHUbIUHpJ7wvwm8Dvwc+G36whERKUybdgdDxF/e1tRrfltX7y6duprK7ulsn7RNdZTOP7r7j2H0lVYQEenPxl1Bwp9U03tsfVufFn5JifHPH1rIkTOz3yWcSmmFXwIHhaUV1hEMyxyytIKZzQJuAqYCceAad79qpAGLiOSjTWHCnzi2pwUfizuRaJwx5b1T7SUr5mU1toQRl1Yws3rgEeB/gKMYfmmFKPAld3/OzGqBZ83sfnd/eUQRi4jkoTfChB+Lx7vntUXCu1pVZK9ezmBS6cPfDfwd8Inwef1wVnL3be7+XDjdDLwCzEhh/yIieSfRpdPcEe2e1x4JLlOqLtSE7+5XApcA3wI2Au8d6TbMbA7wDoJvCX1fu9TM1pjZmoaGhpFuOit+8pOfsGjRIhYvXszKlSvp6OjIdUgikmOb97QBvRN+W5jwC7aFb2bfBk4HTgK2uPvPRrh+DfBfwBfcvanv6+5+jbsvd/fldXV1Iw0v47Zs2cLPfvYz1qxZw/r164nFYqxatSrXYYlIjjWFiT55HH6+JfxU7mn7DTM7kKCFfpaZzXf3S4azbjhu/7+A37p7wZZVjkajtLe3U15eTltbG9OnT891SCKSQ12xePetDJuSu3S6gunqivy4m2yqUXwa+Dd3v3e4K1hQ/f864JXEkM79dc8997B9+/Z0bKrb1KlTOfXUUwd8fcaMGVx22WXMnj2b6upqTj75ZE4++eS0xiAihSXRkp84toI9rRE6ozEqy0rzroWf6oVX1wOfMbMfmtmSYa7zHoL6Oyea2drw8aEU958ze/fu5Q9/+AMbN25k69attLa2csstt+Q6LBHJocRonESphEQ/fiLhV2fxrlaDSfnCK4J6OmXAz4AVQ63g7o8BluL++jVYSzxTHnjgAebOnUvi/MKZZ57JE088wfnnn5/1WEQkP7R2Bol96rhKXtkWJPzJNZV0dBX4KJ3Q60AV8Ad3HzLZF5PZs2fz1FNP0dbWhrvz4IMPsnDhwlyHJSI5lGjhTw0rYSZO3BZLl85LwGrgYjN7Jo3x5L1jjjmGs88+m6VLl3LEEUcQj8e59NJLcx2WiORQTwu/d5dOS/hzbGVhn7SdD+wFrgl/jiqXX345l19+ea7DEJE80dPCD8oqJFr4u1sjVJSWUFvgCX+zu682s2nk8CbmIiL5oDXsukmctG1qDz4Adrd0MnFsBcEgxdzTTcxFRPZTW2eQ4GeEte73tEWCn62Rfapn5lKqCX8CPTcx70xbNMPk7tne5Yjke3wikl6JFn5dbSXV5aXsag7S4q7WCJOS6t/n2rATvpkdlfT02wQjdLJ+E/Oqqip2796dt0nV3dm9ezdVVdm9dZmI5E57d1XMMibXVtDQEiT83S2dTB6bPy38kfThP29m64FbgFvd/QEAd/9aRiIbwMyZM6mvrydfC6tB8KE0c+bMXIchIlnSGolRUVpCRVkJk2sq2dWd8CNMLNCE/yPgTOBK4Htm9ihws7tfn5HIBlBeXs7cuXOzuUsRkUG1dUYZUxmMta+rqeTN3W20RaK0d8UKs0vH3b/s7vOB5cC1BFfXXpOpwERECkVrJMbYsEDa5NpKGlo62d0SnLjNp5O2w27hm9kk4AzgbOAEgjIJb2UoLhGRgtEWiXZfTTu5ppK9bRF2NneEzwsw4QPbCb4R7AVuAG4J6+OIiIxqrZ0xxoQXV9XVVuIOr+5oAXrf4zbXRpLwbyc4YXuPu3cNtbCIyGjRFokytiLRhx+06J98YzfQMzY/HwyZ8M1sdjh5Wfhz2gBXjTX2dwcrEZFi19oZY/qEINFPDk/S3vnCNuZOHktdbWG18H8DJAa9D3R9sAM3AjelISYRkYLSGokyNhylc+jUWqrKS+joivPOOQfkOLLehkz47n5CNgIRESlUTe1djKsqB2BcVTkrDqnjvpd3cMTMCbkNrI/8KOEmIlKg3J2mjijjq8u75/3fjyxmbGUZpx0xLYeR7UsJX0RkP7RGYsTi3ivhTxlXxU8+tiR3QQ0g1eJpIiICvN0eDFocV53/7WclfBGR/dAUJvzkFn6+UsIXEdkP3S38KiV8EZGi1tOlo4QvIlLU1KUjIjJKqIUvIjJKNHVEMYPaSo3SEREpak3tXdRWllFSMlDlmfyhhC8ish+a2rsKojsHlPBFRPbL2+1dBXHCFpTwRUT2S6MSvojI6LD97Q6mjqvKdRjDkrWEb2bXm9lOM1ufrX2KiGRSLO7saOpg2gQl/L5uBE7J4v5ERDJqV0sn0bgzdXz+3MZwMFlL+O7+CLAnW/sTEcm0rY3tAEwfrxZ+SszsUjNbY2ZrGhoach2OiMiAtr3dAcA0tfBT4+7XuPtyd19eV1eX63BERAbU3cJXH76ISHHb/nYHVeUlGpYpIlLstjS2M318NWb5X1YBsjss81bgSeAwM6s3s4uztW8RkUzYsL2Zg6fU5DqMYctaeTd3X5mtfYmIZFprZ5SNu1s5fcmMXIcybOrSERFJcse6rVz32MYhl3tlWxPusGj6uCxElR5K+CIiSf7jmbe4fhgJ/6WtTQAsmqGELyJSkBqaO2lo6cTde83f/nYHH7/mSba9HQzFfKH+bSaNrSiYOjqghC8i0ktDcyeRaJym9miv+Xe+sJWn3tjDT+7/KwBPb9rN8jkHFMwIHVDCFxHpFonG2dsW3KN2Z3NHr9faIjEANuxoYUtjO5v3tHPsvElZj3F/KOGLiIR2t3Z2T+9s7uz12lt72gBYv+Vt/rR+OwDHzFXCFxEpSDubkhN+7xb+W7vbKC0xYnHnFw+/zoQx5SyYWpvtEPeLEr6ISKghqVWfnPwhaOF/+MhpjK0oZVdLJysOqSuIG5cnU8IXEQk1tPTfpdPRFWN7Uwfz6mo4Juy3f9+hhVfcUQlfRCSUaOFPH1/VK+HX7w3672dPHMP7F06hqryEFQWY8LNWWkFEJN81NHcyYUw5Mw6opiGpDz9xwnb2pDEsmTmBUxZNZVJNZa7CTJla+CIioYbmTupqKplS27uF/+bunhZ+SYkVZLIHJXwRkW47mzuoq62krraShqSTtm/taWNMRSmTxlbkMLr9p4QvIhJqaOnsTvjNnVHaw4ut3trdxuyJYwrqqtr+KOGLiADuTkNzJ1NqK5lSG3TZJMbiv7UnSPiFTglfRARo6YzS0RWnrraSKWFBtJ3NncTjzlt72jhokhK+iEhRSAzJrEtu4Td1svXtdjqjcWZPGpvL8NJCwzJFREhK+DVVvbp01m0OXj9yxvhchZY2SvgiIvRcZVtXW8kBYyooKzEamjvZsredyrISFk4rnBudDEQJX0SEnto5dbWVlJQYk2sq2fZ2B2/ubuWIGeOpKCv8HvDCfwciImmwq6WT0hJjQnU5AO+cO5EHXtnB+i1NvGP2hNwGlyZK+CIiwN62Lg4YU95dAXPl0bNo7oiCwcqjZ+c4uvRQl46ICNDYFmHCmJ4rad81bxLvXzCF4w6ZzLy6mhxGlj5K+CIiwN62CAeMKe9+bmZcd+E7cxhR+qlLR0QEaGzrYnx1YdfKGYoSvogIQcJPbuEXIyV8ERHCLp0Cr4Y5FCV8ERn1OrpidEbjTCjyFr5O2orIqLe3LQLAAWP6aeHv2Qgv/x52vQrN26B8DNQcCLOOgXnvg9qpw99RPA4Nf4HGt6CjEarGw/hZULcASjOfjpXwRWTU29vaBdDTh9/ZDC//Adb+O7z5eDCvdlrwaN4OGx+BNdeBlcD898PST8BhH+o/absH23juJnj1Pmjfu+8yVeNh3gnwjvOD7ZVkpvMlqwnfzE4BrgJKgWvd/cps7l9EpD+NbRHKiDJ315/h9oeDZN/VBhPnw4n/B476OIyf2bNCPAY71sMrfww+FP7zb2HcDFh2ESy7AGqmQEsDrPv3INHvfg0qx8GC02Due2HyYVA9AdobYc8bsPHPsOGe4JvEhINg+UVw7GehLL3nFMzd07rBAXdkVgr8FTgJqAeeAVa6+8sDrbN8+XJfs2ZNVuITkdHr7he30fK7i1hQ/SwtlTW0zz6W1tlH01wzheauZpojvR9NkSZaulpo62oj7nFi0Q482oHHolTGnWovYUw0xhiPM6a0htrxs6gdP4+ayvHUlI2lpnwsNWVjGVs6hpqyMVSXVhHpaKHjrSdp3/QoFmnhpK+uhRTusGVmz7r78v5ey2YL/2jgNXd/IwxqFXA6MGDCT9Wvv/IjOipi6d6siBS1E9nReiK0AnuAtV3AFgCqgCpqqKMGmDbyTdf3TEZw9tDCHlr6WXAicDrVkZKUkv1QsjlKZwawOel5fTivFzO71MzWmNmahoaGFHcVT3E9EZHcKyktzch2s9nC7+/jap/+JHe/BrgGgi6dVHZ0yQ++nMpqIiJFLZst/HpgVtLzmcDWLO5fRGRUy2bCfwY4xMzmmlkF8HHgjizuX0RkVMtal467R83sH4A/EQzLvN7dX8rW/kVERrusjsN397uBu7O5TxERCaiWjojIKKGELyIySijhi4iMEkr4IiKjRNZq6aTCzBqAN1NcfTKwK43hZEIhxAiKM50KIUZQnOmU7RgPcve6/l7I64S/P8xszUAFhPJFIcQIijOdCiFGUJzplE8xqktHRGSUUMIXERklijnhX5PrAIahEGIExZlOhRAjKM50ypsYi7YPX0REeivmFr6IiCRRwhcRGSWKLuGb2SlmtsHMXjOzr+VBPJvM7EUzW2tma8J5E83sfjN7Nfx5QNLyXw9j32BmH8xgXNeb2U4zW580b8Rxmdmy8P29ZmY/M0vffdkGiPFbZrYlPJ5rzexDOY5xlpk9ZGavmNlLZvb5cH6+HcuB4sy341llZk+b2bowzsvD+XlzPAeJMa+OZb/cvWgeBGWXXwfmARXAOuDwHMe0CZjcZ94PgK+F018Dvh9OHx7GXAnMDd9LaYbiWgEsBdbvT1zA08C7CO5odg9waoZj/BZwWT/L5irGacDScLoW+GsYS74dy4HizLfjaUBNOF0O/A9wbD4dz0FizKtj2d+j2Fr43TdKd/cIkLhRer45HfhNOP0b4CNJ81e5e6e7bwReI3hPaefujxDcqjnluMxsGjDO3Z/04K/3pqR1MhXjQHIV4zZ3fy6cbgZeIbhXc74dy4HiHEiu4nR3T9zduzx8OHl0PAeJcSA5OZb9KbaEP6wbpWeZA/eZ2bNmdmk470B33wbBPyIwJZyf6/hHGteMcLrv/Ez7BzN7IezySXy1z3mMZjYHeAdBiy9vj2WfOCHPjqeZlZrZWmAncL+7593xHCBGyLNj2VexJfxh3Sg9y97j7kuBU4HPmtmKQZbNx/hh4LhyEe8vgfnAEmAb8KNwfk5jNLMa4L+AL7h702CLDhBPruLMu+Pp7jF3X0Jw3+ujzWzxIIvnJM4BYsy7Y9lXsSX8vLtRurtvDX/uBG4n6KLZEX6dI/y5M1w81/GPNK76cLrv/Ixx9x3hP1sc+DU9XV45i9HMygmS6G/d/b/D2Xl3LPuLMx+PZ4K7NwIPA6eQh8ezb4z5fCwTii3h59WN0s1srJnVJqaBk4H1YUwXhItdAPwhnL4D+LiZVZrZXOAQgpM62TKiuMKv1s1mdmw4uuATSetkROKfPnQGwfHMWYzhNq8DXnH3Hye9lFfHcqA48/B41pnZhHC6GvgA8Bfy6HgOFGO+Hct+ZfKMcC4ewIcIRiC8DvxzjmOZR3B2fh3wUiIeYBLwIPBq+HNi0jr/HMa+gQyesQduJfja2UXQ0rg4lbiA5QR/2K8DVxNevZ3BGG8GXgReIPhHmpbjGI8j+Br+ArA2fHwoD4/lQHHm2/E8Eng+jGc98I1U/2cyFecgMebVsezvodIKIiKjRLF16YiIyACU8EVERgklfBGRUUIJX0RklFDCFxEZJZTwZVQwswlm9vdJz6eb2W0Z2tdHzOwbA7zWEv6sM7N7M7F/kYEo4ctoMQHoTvjuvtXdz87Qvr4C/GKwBdy9AdhmZu/JUAwi+1DCl9HiSmB+WKf8h2Y2x8I6+2Z2oZn93sz+aGYbzewfzOyLZva8mT1lZhPD5eab2b1hIbxHzWxB352Y2aFAp7vvCp/PNbMnzewZM/tOn8V/D5yX0XctkkQJX0aLrwGvu/sSd/9yP68vBs4lqH/yXaDN3d8BPElwyTsEN6P+nLsvAy6j/1b8e4Dnkp5fBfzS3d8JbO+z7BrgvSm+H5ERK8t1ACJ54iEP6sQ3m9nbwB/D+S8CR4ZVJt8N/C7ppkSV/WxnGtCQ9Pw9wFnh9M3A95Ne2wlMT0/4IkNTwhcJdCZNx5Oexwn+T0qARg9K4g6mHRjfZ95A9UuqwuVFskJdOjJaNBPc2i8lHtSO32hmH4Wg+qSZHdXPoq8AByc9f5ygaivs219/KD0VFUUyTglfRgV33w08bmbrzeyHKW7mPOBiM0tUP+3v9pmPAO+wnn6fzxPc+OYZ9m35nwDclWIsIiOmapkiaWZmVwF/dPcHhljuEeB0d9+bnchktFMLXyT9vgeMGWwBM6sDfqxkL9mkFr6IyCihFr6IyCihhC8iMkoo4YuIjBJK+CIio4QSvojIKPH/AR0puYBOqeiSAAAAAElFTkSuQmCC\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": "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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(\"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/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in deleted file mode 100644 index c7cf002d6..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in +++ /dev/null @@ -1,49 +0,0 @@ -16 -101 -0.33208578766229190915 0.07439013071780828379 -0.02438290851908785084 --0.008988542188201206762 0.028710618792657981169 0.0034094833969203438596 -102 -0.33203966624962866216 0.07434400930514498129 -0.02438290851908785084 --0.014195641132219511543 0.028710618792657981169 0.0034094833969203438596 -103 --0.7187543234391324809 -0.011798260816488121555 0.041316403191083782287 -0.0065615071841567274707 -0.020313576971905909774 -0.00029114855617710840843 -104 --0.71886874402007694407 -0.011912681397432518804 0.041316403191083782287 --0.006132960226534060408 -0.020313576971905909774 -0.00029114855617710840843 -105 -0.35683111163121072895 -0.9518327808922094624 4.4027442504036787155e-05 -0.022724479262608666269 0.0059737936889703449964 -3.3484113013969089573e-07 -106 -0.3567106558193317012 -0.95195323670408849015 4.4027442504036787155e-05 -0.008935598794060913702 0.0059737936889703449964 -3.3484113013969089573e-07 -107 --1.5233391647104730371 0.6724145771476651712 0.051459143378398922164 --0.0020480822268840624331 -0.011607719813367209372 -0.000117479966462153095864 -108 --1.5234032495379807859 0.6723504923201574224 0.051459143378398922164 --0.008207040423331847523 -0.011607719813367209372 -0.000117479966462153095864 -109 -4.050605826355517358 -2.9904269687677218492 -0.078187280837353656526 -0.041279424970441319642 0.006432188574295680597 -0.00012509257442073270106 -110 -4.049284028339322994 -2.9917487667839162135 -0.078187280837353656526 --0.032485009432853539924 0.006432188574295680597 -0.00012509257442073270106 -111 -6.299479995832536261 -7.7058625321556393217 -0.11669919842191249504 -0.02612723553831041573 0.0035242303011843410798 -0.00022097170940726839814 -112 -6.2983790111222752728 -7.70696351686590031 -0.11669919842191249504 --0.01809910222875676239 0.0035242303011843410798 -0.00022097170940726839814 -113 -14.856321905516212567 13.007829033301401722 -0.14417795763685259391 -0.010478935887110856981 0.0027821364817078499815 4.40781085949555924e-05 -114 -14.855842389541807691 13.007349517326996846 -0.14417795763685259391 --0.015710591190212928187 0.0027821364817078499815 4.40781085949555924e-05 -115 -29.55768244045575699 -4.6291447957067299868 -0.58590957207831262377 -0.014905509815736753265 0.0031274056019462009859 -7.51415892482447254e-05 -116 -29.557216915563323312 -4.6296103205991601115 -0.58590957207831262377 --0.0139657618108195089035 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in new file mode 100644 index 000000000..d0ae0ed15 Binary files /dev/null and b/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in differ diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py new file mode 100755 index 000000000..eeb2791d0 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +""" +For testing RMVS, the code generates clones of test particles based on one that is fated to impact Mercury. +To use the script, modify the variables just after the "if __name__ == '__main__':" line +""" +import numpy as np +import swiftest +from scipy.io import FortranFile +import sys + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_tp = "tp.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_tp = "tp.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.dat" +swiftest_enc = "enc.swiftest.dat" + +MU2KG = swiftest.MSun +TU2S = swiftest.YR2S +DU2M = swiftest.AU2M + +GMSun = swiftest.GMSunSI * TU2S**2 / DU2M**3 + +# Simple initial conditions of a circular planet with one smaller massive body in a close encounter state +# Simulation start, stop, and output cadence times +t_0 = 0 # simulation start time +deltaT = 0.25 * swiftest.JD2S / TU2S # simulation step size +end_sim = deltaT #0.15 +t_print = deltaT #output interval to print results + +iout = int(np.ceil(t_print / deltaT)) +rmin = swiftest.RSun / swiftest.AU2M +rmax = 1000.0 + +npl = 2 +ntp = 0 +plid1 = 2 +plid2 = 100 + +radius1 = np.double(4.25875607065041e-05) +mass1 = np.double(0.00012002693582795244940133) +mass2 = mass1 / 100.0 +radius2 = radius1 * (mass2 / mass1)**(1.0/3.0) + +apl1 = np.longdouble(1.0) +apl2 = np.longdouble(1.01) +vpl1 = np.longdouble(2 * np.pi) +vpl2 = np.longdouble(2 * np.pi / np.sqrt(apl2)) + +p_pl1 = np.array([apl1, 0.0, 0.0], dtype=np.double) +v_pl1 = np.array([0.0, vpl1, 0.0], dtype=np.double) + +p_pl2 = np.array([apl2, 0.0, 0.0], dtype=np.double) +v_pl2 = np.array([0.0, vpl2, 0.0], dtype=np.double) + +Rhill1 = np.double(apl1 * 0.0100447248332378922085) +Rhill2 = Rhill1 * (mass2 / mass1)**(1.0 / 3.0) + +#Make Swifter files +plfile = open(swifter_pl, 'w') +print(npl+1, f'! Planet input file generated using init_cond.py',file=plfile) + +print(1,GMSun,file=plfile) +print('0.0 0.0 0.0',file=plfile) +print('0.0 0.0 0.0',file=plfile) + +print(plid1,"{:.23g}".format(mass1),Rhill1, file=plfile) +print(radius1, file=plfile) +print(*p_pl1, file=plfile) +print(*v_pl1, file=plfile) + +print(plid2,"{:.23g}".format(mass2),Rhill2, file=plfile) +print(radius2, file=plfile) +print(*p_pl2, file=plfile) +print(*v_pl2, file=plfile) + +plfile.close() + +tpfile = open(swifter_tp, 'w') +print(0,file=tpfile) +tpfile.close() + +sys.stdout = open(swifter_input, "w") +print(f'! Swifter input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'PL_IN {swifter_pl}') +print(f'TP_IN {swifter_tp}') +print(f'IN_TYPE ASCII') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swifter_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT UNKNOWN') +#print(f'J2 {swiftest.J2Sun}') +#print(f'J4 {swiftest.J4Sun}') +print(f'J2 0.0') +print(f'J4 0.0') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swifter_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'RHILL_PRESENT yes') +sys.stdout = sys.__stdout__ + +#Now make Swiftest files +cbfile = FortranFile(swiftest_cb, 'w') +Msun = np.double(1.0) +cbfile.write_record(0) +cbfile.write_record(np.double(GMSun)) +cbfile.write_record(np.double(rmin)) +#cbfile.write_record(np.double(swiftest.J2Sun)) +#cbfile.write_record(np.double(swiftest.J4Sun)) +cbfile.write_record(np.double(0.0)) +cbfile.write_record(np.double(0.0)) +cbfile.close() + +plfile = FortranFile(swiftest_pl, 'w') +plfile.write_record(npl) + +plfile.write_record(plid1) +plfile.write_record(np.vstack([p_pl1[0],p_pl2[0]])) +plfile.write_record(np.vstack([p_pl1[1],p_pl2[1]])) +plfile.write_record(np.vstack([p_pl1[2],p_pl2[2]])) +plfile.write_record(np.vstack([v_pl1[0],v_pl2[0]])) +plfile.write_record(np.vstack([v_pl1[1],v_pl2[1]])) +plfile.write_record(np.vstack([v_pl1[2],v_pl2[2]])) +plfile.write_record(np.array([mass1,mass2])) +plfile.write_record(np.array([Rhill1,Rhill2])) +plfile.write_record(np.array([radius1,radius2])) +plfile.close() +tpfile = FortranFile(swiftest_tp, 'w') +tpfile.write_record(ntp) + +tpfile.close() + +sys.stdout = open(swiftest_input, "w") +print(f'! Swiftest input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'CB_IN {swiftest_cb}') +print(f'PL_IN {swiftest_pl}') +print(f'TP_IN {swiftest_tp}') +print(f'IN_TYPE REAL8') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swiftest_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT REPLACE') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swiftest_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'ROTATION no') +print(f'GR no') +print(f'MU2KG {MU2KG}') +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/1pl_1pl_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in new file mode 100644 index 000000000..037d91c09 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in @@ -0,0 +1,26 @@ +! Swifter input file generated using init_cond.py +T0 0 +TSTOP 0.0006844626967830253 +DT 0.0006844626967830253 +PL_IN pl.swifter.in +TP_IN tp.swifter.in +IN_TYPE ASCII +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swifter.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT UNKNOWN +J2 0.0 +J4 0.0 +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swifter.dat +EXTRA_FORCE no +BIG_DISCARD no +RHILL_PRESENT yes diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in new file mode 100644 index 000000000..3e8f808ce --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -0,0 +1,31 @@ +! Swiftest input file generated using init_cond.py +T0 0 +TSTOP 0.0006844626967830253 +DT 0.0006844626967830253 +CB_IN cb.swiftest.in +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +IN_TYPE REAL8 +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swiftest.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT REPLACE +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swiftest.dat +EXTRA_FORCE no +BIG_DISCARD no +ROTATION no +GR no +MU2KG 1.988409870698051e+30 +DU2M 149597870700.0 +TU2S 31557600.0 +RHILL_PRESENT yes +MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in new file mode 100644 index 000000000..9f0548fc1 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in @@ -0,0 +1,12 @@ +3 ! Planet input file generated using init_cond.py +1 39.476926408897625196 +0.0 0.0 0.0 +0.0 0.0 0.0 +2 0.00012002693582795244940133 0.010044724833237892 +4.25875607065041e-05 +1.0 0.0 0.0 +0.0 6.283185307179586 0.0 +100 1.2002693582795244601319e-06 0.002164070363255244 +9.17521181499312e-06 +1.01 0.0 0.0 +0.0 6.252003053624663 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in new file mode 100644 index 000000000..51f919531 Binary files /dev/null and b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in differ 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 new file mode 100644 index 000000000..dc1a9992f --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import swiftest\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 6.845e-04\n", + "Creating Dataset\n", + "Successfully converted 2 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftersim = swiftest.Simulation(param_file=\"param.swifter.in\", codename=\"Swifter\")\n", + "swiftersim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 6.845e-04\n", + "Creating Dataset\n" + ] + }, + { + "ename": "MergeError", + "evalue": "conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mMergeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mswiftestsim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswiftest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSimulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam_file\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"param.swiftest.in\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mswiftestsim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/simulation_class.py\u001b[0m in \u001b[0;36mbin2xr\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swiftest\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 137\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswiftest2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 138\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Swiftest simulation data stored as xarray DataSet .ds'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swifter\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/io.py\u001b[0m in \u001b[0;36mswiftest2xr\u001b[0;34m(param)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mtpds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtpda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'vec'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\nCreating Dataset'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombine_by_coords\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcbds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpds\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Successfully converted {ds.sizes['time']} output frames.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/combine.py\u001b[0m in \u001b[0;36mcombine_by_coords\u001b[0;34m(datasets, compat, data_vars, coords, fill_value, join, combine_attrs)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m )\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge\u001b[0;34m(objects, compat, join, fill_value, combine_attrs)\u001b[0m\n\u001b[1;32m 893\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 895\u001b[0;31m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 896\u001b[0m )\n\u001b[1;32m 897\u001b[0m \u001b[0mmerged\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_construct_direct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mmerge_result\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_asdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_core\u001b[0;34m(objects, compat, join, combine_attrs, priority_arg, explicit_coords, indexes, fill_value)\u001b[0m\n\u001b[1;32m 625\u001b[0m \u001b[0mprioritized\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_priority_vars_and_indexes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maligned\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 626\u001b[0m variables, out_indexes = merge_collected(\n\u001b[0;32m--> 627\u001b[0;31m \u001b[0mcollected\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprioritized\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 628\u001b[0m )\n\u001b[1;32m 629\u001b[0m \u001b[0massert_unique_multiindex_level_names\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariables\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_collected\u001b[0;34m(grouped, prioritized, compat, combine_attrs)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0mvariables\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mvariable\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvariable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0melements_list\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 234\u001b[0;31m \u001b[0mmerged_vars\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munique_variable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvariables\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 235\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mMergeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcompat\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"minimal\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36munique_variable\u001b[0;34m(name, variables, compat, equals)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mequals\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m raise MergeError(\n\u001b[0;32m--> 142\u001b[0;31m \u001b[0;34mf\"conflicting values for variable {name!r} on objects to be combined. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 143\u001b[0m \u001b[0;34m\"You can skip this check by specifying compat='override'.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 144\u001b[0m )\n", + "\u001b[0;31mMergeError\u001b[0m: conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'." + ] + } + ], + "source": [ + "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", + "swiftestsim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestsim.ds - swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (y)'})\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['vx'].plot.line(x=\"time (y)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['vx'].sel(id=100)" + ] + }, + { + "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/1pl_1pl_encounter/tp.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in new file mode 100644 index 000000000..64bf92f74 Binary files /dev/null and b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in differ diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in index 96c7f920c..d0ae0ed15 100644 Binary files a/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in and b/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in differ 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 86c13a50e..338b5d5a8 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -25,6 +25,9 @@ TU2S = swiftest.YR2S DU2M = swiftest.AU2M +J2 = 0.0 #swiftest.J2Sun +J4 = 0.0 #swiftest.J4Sun + GMSun = swiftest.GMSunSI * TU2S**2 / DU2M**3 # Simple initial conditions of a circular planet with one test particle in a close encounter state @@ -90,8 +93,8 @@ print(f'OUT_TYPE REAL8') print(f'OUT_FORM XV') print(f'OUT_STAT UNKNOWN') -print(f'J2 {swiftest.J2Sun}') -print(f'J4 {swiftest.J4Sun}') +print(f'J2 {J2}') +print(f'J4 {J4}') print(f'CHK_CLOSE yes') print(f'CHK_RMIN {rmin}') print(f'CHK_RMAX {rmax}') @@ -111,8 +114,8 @@ cbfile.write_record(0) cbfile.write_record(np.double(GMSun)) cbfile.write_record(np.double(rmin)) -cbfile.write_record(np.double(swiftest.J2Sun)) -cbfile.write_record(np.double(swiftest.J4Sun)) +cbfile.write_record(np.double(J2)) +cbfile.write_record(np.double(J4)) cbfile.close() plfile = FortranFile(swiftest_pl, 'w') diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in index d1a0c9f27..853815639 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in @@ -11,8 +11,8 @@ BIN_OUT bin.swifter.dat OUT_TYPE REAL8 OUT_FORM XV OUT_STAT UNKNOWN -J2 2.198e-07 -J4 -4.805e-09 +J2 0.0 +J4 0.0 CHK_CLOSE yes CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 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 f2a1422d1..a7f91ba33 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -28,3 +28,4 @@ MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 RHILL_PRESENT yes +MTINY 1e-12 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 71a2c4da6..02d6b0bef 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.348e-01\n", + "Reading in time 1.355e-01\n", "Creating Dataset\n", - "Successfully converted 198 output frames.\n", + "Successfully converted 199 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 11, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -465,33 +465,41 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\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",
+       "
<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",
        "Coordinates:\n",
        "    id        float64 100.0\n",
-       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348
  • " ], "text/plain": [ - "\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", + "\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 float64 100.0\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348" + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, "execution_count": 7, diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in index 81c636655..2e8d49f62 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 0.00029591220819207774 0.004650467260962157 -4.7535806948127355e-12 --2.2473967953572827e-18 +0.0 +0.0 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in index d87472e35..f9305cfa2 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -22,5 +22,5 @@ EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES RHILL_PRESENT YES -J2 4.7535806948127355e-12 -J4 -2.2473967953572827e-18 +J2 0.0 +J4 0.0 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index c76e792f3..b348d1f81 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -104,7 +104,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -130,7 +130,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA55ElEQVR4nO2de5xcdXn/35+57CWbZANJSEIgBEJAARW5CSqI9YZUi4q2WOutKLVqq61U0fZHqdWqv/5qqz8vSK0C1mp/3ihavOGl4AUlKLcAgXBLQkKyuWwuu9nduTy/P86Z2dnJzOzs7MycM7PP+/Wa157bnPPMd2bP5zzP8/0+X5kZjuM4jlMgEbUBjuM4TrxwYXAcx3Gm4MLgOI7jTMGFwXEcx5mCC4PjOI4zBRcGx3EcZwouDE5FJF0l6d/D5VWSDkhKRm1XLSSdK2lD1HbA9La0s00l/VTSW8Ll10n6Qcm+50h6KLTlFZKWSbpF0n5J/9Rq25x44sLQpUh6TNILy7a9SdLPZnouM9tkZvPNLNc8C2eGJJN0fK1jzOxWMzuxXTbVotyW8u8jqjY1sy+b2YtLNn0Q+FRoyw3AZcBOYKGZvaedtjnxwYXB6QokpaK2oUM5Blhftn6fNTDy1b+D7sGFYQ4j6UhJ35A0JOlRSX9e5bjV4RN7quR9N0raLWmjpLeWHJuU9AFJD4fhiDskHR3ue4qkH4bv2yDp90ved62kT0v67/B9v5K0Jtx3S3jYXWHI4w8knS9pi6T3SXoS+GJhW8k5j5b0zfDz7ZL0qSqf7ypJX5f0n+G1fyPpGSX7nxqGY4YlrZf0eyX7LpR0X/i+JyRdHm4v2iLpS8Aq4Nuh/e+dYZteJen/Sbo+vM56SWfU+F5fJOkBSXvDz6ySfUWvUdLDwHEldn0FeCPw3nD9hZISkq4Iv89doR2Hl/0uLpW0CfhxuP2PJd0vaY+k70s6puT6JultYfhqT/idl9r31vC9+8N2Pa2kfSr+ViWdJWmdpH2Stkv6eLW2cerEzPzVhS/gMeCFZdveBPwsXE4AdwBXAj0EN4hHgJeE+68C/j1cXg0YkArX/wf4DNAHnAoMAS8I9/0VcA9wIsEN6RnAYmAA2Ay8GUgBpxGELE4O33ctsBs4K9z/ZeCrJbYbcHzJ+vlAFvgY0Av0h9u2hPuTwF3AP4fX7gOeW6WtrgIywKuBNHA58Gi4nAY2Ah8I2+l3gP3AieF7twHnhsuHAaeV2Lel2vcxwza9ChgDLgw/10eA26p8liXAvpLP8hdhO72l/DdQxa5rgQ+VrL8buA04KmznzwFfKfsM14dt3A+8Imyvp4bf498Avyj7Hr8DLCIQyyHggnDfa4AngDMJfjvHE3gw0/1Wfwm8PlyeD5wd9f9fp78iN8BfLfpig3/4A8BwyWuUSWF4FrCp7D3vB74YLl9FBWEAjgZywIKS930EuDZc3gBcVMGePwBuLdv2OeBvw+Vrgc+X7LsQeKBkvZIwTAB9ZdsKwnBOeNNJ1dFWV1Fyow1vRNuAc8PXk0CiZP9XgKvC5U3AnxDE5KlkS8n3UVEY6mjTq4CbS/adBBys8lneUPZZBGyhcWG4n1CgwvUVBCKaKvkMx5Xs/y5waVlbjgLHlHyPzy3Z//+AK8Ll7wPvqvCZpvut3gL8HbAk6v+7bnl5KKm7eYWZLSq8gLeX7DsGODIMjwxLGiZ4Kl42zTmPBHab2f6SbY8DK8Plo4GHK7zvGOBZZdd7HbC85JgnS5ZHCZ7+ajFkZmNV9h0NPG5m2WnOUWBzYcHM8gQ30yPD1+ZwW4HSz3sxgYg9Lul/JJ1T5/VKma5N4dC26VPlmP6RZZ/FStcb4BjgWyXf2f0EIlb6O9lcdvwnSo7fTSBOtT5L4Xuu9dup9Vu9FDgBeEDS7ZJeNuNP6UzBk0Vzl83Ao2a2dobv2wocLmlByY1sFUEIoHDeNcC9Fa73P2b2okYNrkCtBOlmYJWkVJ3icHRhQVKCIHSytbBPUqJEHFYBDwKY2e3ARZLSwDsJnoCL56rT1unadCZsK/ssqmJPvWwG/tjMfl6+Q9LqcNHKjv+wmX25wWutqbK96m/VzB4CXht+b68Cvi5psZmNNGCDgyef5zK/BvaFydt+BUnjUySdWetNZrYZ+AXwEUl9kp5O8MRWuBF8Hvh7SWsV8HRJiwniyidIer2kdPg6U9JT67R3O0FseSafbxvwUUkDoa3PqXH86ZJeFT6FvxsYJ4it/woYIUjIpiWdD7wc+KqkHgXjAgbNLEMQ26/W/bSq/XW06Uz4b+Dkks/y50z1ymbK1cCHCwlkSUslXTTN8e+XdHJ4/KCk19R5rc8Dl0s6PfztHB9et+ZvVdIfSVoaCvdweK7IulZ3Ay4McxQL+s+/nCDR+ShBIvjzwGAdb38tQXx5K/AtgjzBD8N9Hyd4av4BwY3y34D+8En4xcAl4fueZDJxXA9XAdeFoYTfn+7gks93PEEeYAtBnqMa/xXu3wO8HniVmWXMbAL4PeClBG30GeANZvZA+L7XA49J2ge8DfijKuf/CPA3of2XV9hfq03rxsx2EiRxPwrsAtYChzztz4BPADcCP5C0n0Asn1Xj+t8i+F6/GrbJvQRtV4/tXwM+DPwHQYL/BuDwOn6rFwDrJR0I7b2kRojRqQOFyRvHmbNIuoogsV3tpu44cwr3GBzHcZwpuDA4juM4U/BQkuM4jjMF9xgcx3GcKbgwOE4LUVmZ6xrHFcucxwEFtas+FLUdTjS4MDixQZNzFBReJmmkZP3cBs55SPnxsv3nS8qH59+voLjfmxu0f0phPKhY5tpxYo+PfHZig5ltoqQMhiQDnmFmG1t86a1mdlQ4SvgigpGzvzKz++o9QZXyFI7TkbjH4HQEknol/R9JmxSUVr5aUn+4b4mk74SDx3ZLulVBuehDyl3XuoYF3EAwyO0kSb8r6bcKyjlvDsc7FOypVHK6UB58OLzeOSqbHEnSyZosPb5d0geqfN6zJf0i/Ex3hSOuC/veJOmR0MN5VNLrarTZv0jaGr7+RVJvuK9Qtvw9knZI2lbNU5J0r6SXl6ynJe2UdGqt9nQ6FxcGp1P4GEGhtFMJRjOvJCjDDPAegpHNSwkKq32A4D7/eoJRzy+3YIay/13rAqGYvJKgJPQ9BKUw3hCu/y7wp5JeUfa25xGUmH4JcF64bVF4vV+WnX8BcDPwPYJid8cDP6pgx0qC0hYfAg4nKAP+jbAcxQDwSeClZrYAeDZwZ5WP9NfA2QRt9gyCkuZ/U7J/OcHo4ZUEJTg+LemwCue5nqkjui8EtplZtes6HU5XCIOkL4RPPeWF2xo93/fCJ7XvlG3/HQWTuNwr6ToPH7SHMMTzVuAvzKxQhfQfCMprQFAGegVBaeeMBdNqzqQf9pEKKnbuBP6WoLb/BjP7qZndY2Z5M7uboNz288ree5WZjZjZwTqu8zLgSTP7JzMbM7P9ZvarCsf9EXCTmd0UXvuHwDqCGzJAHjhFUr+ZbTOz9RXOAUH12g+a2Q4zGyIoTf36kv2ZcH/GzG4iKNNeaWrUfwculLQwXH898KU6Pq/ToXSFMBDUkL+gief7R6b+AxUqbl5HUIflFIKyyG9s4jWd6iwF5gF3aLLs8vfC7RB8XxsJ6vk8IumKGZ5/a1ia/HAzO9XMvgog6VmSfqJg1rC9BLWQlpS9dyYlrauVlS7nGOA1mlpm+rnAirBi6B+EtmxTMOPdU6qc50iC32mBx8NtBXaVVZ6tWOrczLYS1Fu6WNIigtpHjRT4czqErhAGM7uFoO57EUlrwif/O8KYc7V/nkrn+xFBEa9SFgPjZvZguP5Dglr8TuvZCRwkmO2tML/EoJnNBwifvN9jZscRFFv7S0kvCN87mxGc/0FQQO5oMxskqByqsmOsynIlqpWVrnTcl0rn0jCzATP7KICZfT8sX74CeAD41yrn2UogMgVWMVlKfKZcR+DJvAb4pZk1UhLc6RC6QhiqcA3wZ2Z2OkGM9jOzPN9OIK3JuXZfzezq3Dt1EpZT/lfgnyUdAUEcXtJLwuWXKSjRLCZLXxfKLs+0XHcpCwgm0BmTdBbwh9McP0QQ5ql2ve8AyyW9O0wML5BUqVLpvwMvl/QSBSWm+8Jk8VGSlkn6vTDXME4Q/qlWYvorBBVdl0paQpCTaXSsxA0E07G+iyDn4HQxXSkMkuYTJOW+JulOgikkV4T7XhXmCMpf3691zjBmfQnBzenXBB5FvbODObPnfQThotsUlHO+mcl4+Npw/QDB/L+fMbOfhvumK3ddi7cDH1RQbvpKgnLiVTGzUYKy0T8Pr3d22f79wIsIvJongYeA51c4z2aCbrMfIBCbzQRzaSfC13sInvx3E+Q83l5+jpAPEeQm7iZIpv8m3DZjwhzKN4BjgW82cg6nc+iaWkkKZpP6jpmdEibJNpjZilmc73zgcjOrOE2gpBcTzKM77dwAjtMNSLoSOMHLk3c/XekxmNk+4FGFM0cp4BmzPW9JGKOX4An26tme03E6AUmHE3RpvSZqW5zW0xXCIOkrBCGEE8NBO5cSdNW7VNJdwHoC17ze890KfA14QXi+l4S7/krS/QSu+bfN7MdN/SCOE0MkvZUgnPXdsKOH0+V0TSjJcRzHaQ5d4TE4juM4zaPjR+4uWbLEVq9eHbUZjuM4HcUdd9yx08yWVtrX8cKwevVq1q1bF7UZjuM4HYWkx6vt81CS4ziOMwUXBsdxHGcKLgyO4zjOFFwYHMdxnCm4MDiO4zhTcGFwHMdxpuDC4DiO40yh48cxOI7TuWx+YDdbHxxu2vkWr5zP8acf0bTzxZEtD+zmibDNVhw/yKqTFjf9Gi4MjuNExi++sZGdmw8cOi9eIxikehJdLwy/+ObDDG3aD4LTXnyMC4PjON1FLpNnzWlHcMFlp8z6XHd87zFuu+ERMhM50j3JJlgXT3LZPGueuZQL/uRpLbuG5xgcx4mMfM5IJJvhLkDfQBqAsQOZppwvruRzhprUZtVwYXAcJzLy+SYKw/xQGEa6XRjyTWuzargwOI4TGS3xGLpeGIxEsrW3bhcGx3EiI3j6bc5taC6FktxjcByna8nnjESiuaGk8bngMTSpzarhwuA4TmQ0NcdQDCVlm3K+uNLMNquGC4PjOJHRzLBIMpUg3ZucAzmG5oXfquHC4DhOZDQ7LNI3kJ4DwuChJMdxuhQzw5ocFumb393CYGaefHYcp3vJ5w2gqWGRvoEUQ4/vJzuRa9o544QFTdY9wiDpaEk/kXS/pPWS3lXhGEn6pKSNku6WdFq77HMcp73kcwVhaN5NbmCwl9F9E3z3c/c27ZxxIp/LA10kDEAWeI+ZPRU4G3iHpJPKjnkpsDZ8XQZ8to32OY7TRlohDGe/cg2p3iT7dh5s2jnjRLHNEl2SfDazbWb2m3B5P3A/sLLssIuA6y3gNmCRpBXtstFxnPbRiqffgcFeTnzW8q7NM7RCTCsRSY5B0mrgmcCvynatBDaXrG/hUPFwHKcLmLzJNfc21DeQYnwkg4U5jG6ia4VB0nzgG8C7zWxf+e4Kbznk25V0maR1ktYNDQ21wkzHcVpMq25yfQNpzGD8YPcNdOtKYZCUJhCFL5vZNyscsgU4umT9KGBr+UFmdo2ZnWFmZyxdurQ1xjqO01Im4+VNFoYurrLadclnSQL+DbjfzD5e5bAbgTeEvZPOBvaa2bZ22eg4Tvto1U2um6ustir8Vk47Z3B7DvB64B5Jd4bbPgCsAjCzq4GbgAuBjcAo8OY22uc4ThtpxTgG6O4qq5Nt1lqPoW3CYGY/Y5qZXc3MgHe0xyLHcaKklTkG6M4qq12ZY3AcxynQ+hxDNyafw/Cb10pyHKcbadXTb29/CslzDLPBhcFxnEiwfGuSz0qI3nlpzzHMAhcGx3EiIdfCp99urbLqOQbHcbqaVt7k+gZSXSoMnmNwHKeLaa0wdLvH4DkGx3G6EGu1MHRjjsFDSY7jdDO5Ylik+behXs8xzAoXBsdxIqHVoaTsRJ5sprtmcsu3qCdXOS4MjuNEQquFAWDsQHcNcnOPwXGcrsZa2Ce/WwvpefLZcZyuZrK6avNvQ/1dWnrbPQbHcbqaXItqJUFJvaQu65nUqvpS5bgwOI4TCR5KmjmtbLNSXBgcx4mEtiSfu0wYci0Mv5XSzol6HMdxirRymspkOkGqN8mWB3aTSidIphKcePZyevo6+5bXrhxDZ7eS4zgdSyHHoBbFyxcfOcATG4Z5YsMwAD39KU581vKWXKtdtCvH4MLgOE4kWM5IJEQwHXzzedXlp5GZyHNw/wRfvvI2Jg52/pgGyxtS68S0gAuD4ziRkM9ZS0MiiWSC3v5E8RoTY50vDPlcvuX5BfDks+M4EdFqYSiQSieQIDPW+eUxcm1qMxcGx3EiIZ/Lozbc5CSR7kuRGe98YWiXmLowOI4TCfm8tSUsApDuTTLRBcJgLgyO43Qz+ZyRbMNNDqCnL0mmW3IMLU48gwuD4zgR0a6wCAQeQ/eEkjz57DhOl5LP5Vve7bJAui/VNcnnduRlXBgcx4mEtucYukAYLN+e8JsLg+M4kdDOUFJPX5LMeDfkGNrUxbflV3AcxwkZG8kUyzpkxnNtSz53enfVgwcmsDxkxrNt8bJcGBzHaQuP3b2T//7M3VO2rTh+sC3X7uRQ0gO/3MaPrru/uL5iTevbzIXBcZy2sH/3GADnvHINPX1JAJavWdSWa/f0Jcll8m0rKdFM9u48CMB5l5yABMtdGBzH6RYKIaSTnnNkcYa1dpHuDYQoM56jd15nCUN2Ik8qneBp5x/Vtmt2Vgs5jtOx5Ns0+1glCsLQieGk3ESOZE97b9UuDI7jtIVWTswzHYUJejoxAZ3J5En3JNt6TRcGx3HaQrtmH6tEOsxpdOIgt9xEjmTaPQbHcbqQfItnbKtFMZTUgWMZMhN5Uu4xOI7TjeTzrZ2xrRbFUFInegyZHCn3GBzH6UbaOdK5nNJeSZ1Gtps9BklfkLRD0r1V9p8vaa+kO8PXle2yzXGc1hOMIYhIGPo6WBgyeVJt7pXUznEM1wKfAq6vccytZvay9pjjOE47ybepMmglJrurdl6OITuRI5XuUo/BzG4Bdrfreo7jxIt2VlMtJ92ThA6d9zkIJcXMY5C0qs5zDZvZvlnac46ku4CtwOVmtr6KTZcBlwGsWlWveY7jREk7Z2wrRwmR7unMyXqymVzbcwz1hJKuAwyo9Y0aQaioVphoOn4DHGNmByRdCNwArK14MbNrgGsAzjjjDJvFNR3HaRPtnJinEukOnd6zUBKjnUwrDGb2/PJtkpab2ZPNNKTU2zCzmyR9RtISM9vZzOs4jhMNUfZKgqDL6kSHeQxmFuQYOqQkxhuaagWB2Cjs4CzpLALbdjX7Oo7jRIO1ab7ianTivM/5nGFG25PPjfZKukjSKPBDM9tQzxskfQU4H1giaQvwt0AawMyuBl4N/KmkLHAQuMTMPEzkOF1CLmKPId2b7Ljkc3YisDd2yecqvAp4JvBKSceb2Vume4OZvXaa/Z8i6M7qOE4Xks8FI5+joqcvyYHh8ciu3wjZTFB4MI7J50Mws+3A98KX4zjOtEQ5wA0K03uORnb9RojKY2joapI+LenacPnFTbXIcZyuxPIeSpop2YnQY+iQAW4TwCPh8u80yRbHcbqYfNTJ575kx/VKKgpDJ3gMwCgwKCkN+Agzx3GmJerkc09vkux4Dst3Tp+WbCYMJcVtHEMVdhP0HPo08PPmmeM4TrcSeY6hNyy9PZErluGOO5MeQ4xDSZIWSfoicHG46XrgjKZb5ThO12H5aHsldeIsbkWPIc6hJDMbBj4K/B3wK4KSFd9svlmO43QbUecYekJh2HjHjshsmAm5bJ4HfrEN6IwBbpcCj5rZ94E7mmyP4zhdStQ5hgWL+wH42dceYs1pS5l/WF9kttTDlgf28Ng9QfGH/gXptl67EfneA7xN0r9IerOkZzbbKMdxuo+ocwwr1gzygjc+FYADe+I/0G38YAaAi993Or3z2isMM/YYzOwjkn4EPAicCpwH/LbJdjmO02VYxB4DwOKj5gMw0gEjoAuJ54HB3rZfe8bCIOmDQBK4E7jTzH7aZJscx+lCopyop0DhJjuydyJSO+ohqjEM0JjHcKWkZQS1ki6WtMbM3tp80xzH6SairpUE0D8/TSIhRvZ2gMdQHMPQ3sQzND6O4U+Az5mZ10pyHKcuok4+QzCTW//CHkY7QRiK5TA6wGMI+QJBiewB4MtmdmfzTHIcpxuJQ44BYGCwh9EOCCXlMjmSqUQks941KkV/TiAqKeCTzTPHcZxuJepeSQXmDfZ2RCgpM5GPJL8AjQvDw0Af8F9mdl4T7XEcpwuxfDATWdQ5Bgg8hk5IPucmcpGEkaBxYVgP/Bi4VNLtTbTHcZwuJJ8LCtdF3SsJYGBRL2MHMuTCSXDiSuAxtD/xDI3nGE4AhoBrCAa8OY7jVCWfLwhD9B7D/MOCLqsHhscZXNofsTXVyWU6L5T0FIJBbZcDlzXPHMdxupF8Lng6j4UwHB6Uwti/eyxiS2qTnchF5jE0KgyLgPcB7wXi3bqO40TOZCgpemFYEArDgbgLQyYfWY6h0VDSB4GnmNkGSfEO1DmOEzmToaTocwyFUFIneAz9C3oiuXZd35KkpKRtkt4CYGZbzOzmcPmKVhroOE7nEyePIZVOMm9hT/yFIUKPoa6rmlkOuBdY01pzHMfpRuKUY4AgzxD7UFKEOYaZhJLmAe+V9CJga7jNzOyi5pvlOE43UfQYYjCOAYI8w64nDkRtRk2yE3mSEfVKmokwnBP+PS18AXTOrNqO40RGnMYxACxc0sejdw+Ry+RJRhSumY7sRI50BAX0YGbCcGzLrHAcp6uJU44BYNmxC8lnjaHN+1l+3GDU5lQkm+kAj8HMHm+lIY7jdC9xE4aCGDz5yN5YCkM+lyefM9IdNsDNcRynborJ55jkGAYGe1m4pI8nH94btSkVyYblOpIRhZJcGBzHaTlxKolRYNnqhex4fH/UZlSkMBdDx3gMkl7eCkMcx+le4pZ8BhhcNo/9e8bIZeM3Rjc7Ecze1kkew4ebboXjOF1N3HIMQFBAz2D/rviNZ4hyvmdorCRGfL5Zx3FiyZ03b5oSvy/MfxArYVgSVFbdO3SQRcvmRWzNVIrzPXfAALcCPnbBcZya/OYHm8hn8wws6i1uW7FmMFZlrhcunRSGuBHlfM/QeBE9x3GcquRzedaeuYznvfbEqE2pyryFPaR6EuzbGUdhiNZjiE8myHGcrsFyFquwUSUksXBJfzw9hky0HkMjV93edCscx+kq8jmLVQ+kaiw+coAdj+3D8vGKkE96DB0iDGb2olYY4jhO95DvAI8B4JhTFjO6b4KhzfEaz1D0GLo9lCTpC5J2SLq3yn5J+qSkjZLulnRapeMcx4k3ZkY+b7EZ5VyLVacsBsFjd++M2pQpdJzHMAuuBS6osf+lwNrwdRnw2TbY5DhOk7EYjnKuRv/8HpYfO8hj9+yK2pQpTPZK6iCPQdJflizX1e3AzG4Bdtc45CLgegu4DVgkaUUj9jmOEx1xHMxWi9VPX8zQpv2M7B2P2pQiRY+hE5LPkhZJ+iLwGklvl/RcoFlTe64ENpesbwm3VbLjMknrJK0bGhpq0uUdx2kGcSx/UYvVT1sCwOP3xsdryGbyJFMJFFE4bkbfnJkNm9mbgQ8BvwLOBb7ZJFsqtUDFrgJmdo2ZnWFmZyxdurRJl3ccpxnEbba26Tj8yAHmLexh20PDUZtSJDuRjyy/AI3nGJ5H0G31bKBZvZS2AEeXrB/F5BSijuN0CHGspFoLSSxY3BevUFImF1kYCRoXhkXA+4D3As2qQHUj8Iawd9LZwF4z29akcztOR7J/9xiP/HaIR+4cYuxAJmpz6qI490KHCAMEo6AL9ZziQOAxRJN4hsZLYnwQeIqZbZBUV81aSV8BzgeWSNoC/C2QBjCzq4GbgAuBjcAo8OYGbXOcruHH19/Plgf2AHDK81bGusREgU7LMUAwcc/WjcNRm1EkO5GLNJTUkDCY2RaC0A9mVlfy2cxeO81+A97RiD2O063s3jbCcacuZdfWA4wMxyfUUYtO65UEMLCoh/GRLLlMnmSEIZwC2Uy0HkOj3VU/LenacPnFTbXIcRwAJsayjO6d4IjVCxgY7GVspFNCSZ0nDPMGgyqwI/viIb7Zic7MMUwAj4TLv9MkWxzHKWHvjqC426Jl8+ibn2ZsJBuxRfWRz3dmjgFgNCZ5hqhzDI0KwygwKCkNrGqiPY7jhAxvHwVg0RHz6BtId6DHEH1Ipl4K80bEpWdSNpPvSI9hN/Aw8Gng580zx3EcCMpKbFofDLgaXNpP30Ca8QMZglRcvOnEUNJAGEra9cQIB/ZEP9VnkHzuEI+hZOTzxeGm64Ezmm6V48xxfv2dR3ngtidZuKSPVE+SvoE0+byRGctFbdq0dNoAN4D++WmS6QS3f+dRrnv/L3h8fbSjoLOZPMlO6ZVkZsOSPgqsBnYCT6d5I58dxwkZ2hSUgX7p254OQN/84F91bCRDT3+8J17sxHEMSohX/MUz2f7oPn72tYci7wGWnciRjqiAHjQWSroUOM7M7jCzL5rZt5ttlOPMdYa3j3L86Uew5Kj5APQNpAE6Is/QiTkGgOXHDbL2zGUA5DJ1Dc9qGbmJDvIYQvYAbwurqt4F3Glmv22uWY4zd8ll8+zbNVa8SUGJMHTA6OdOK4lRSiHhm8tGJwy5XJ583kh3kjCY2Uck/Qh4EDgVOA9wYXCcJrFv50Esbyw6or+4rW9+B3oMHZRjKJBMxUAYwrkYkhGGkmYsDJI+CCSBOwm8hZ822SbHmdMMh+MXBpfNK27rzFBS5wlDIhXYnI0wlJQJ52LoNI/hSklXEuQnLpa0xsze2nzTHGduUjp+oUDvvOBf9db/fIjBpfM45pTFMzrnlgd2892r7ynetI952hJSPQkevmNHw3amepNc/Fens6hEwKAzk88FJJFMJabNMXz9Y+vYteVAcb2nP8Vr3n8m8w8Lur3+/OsPce//PBHsTIjz//BETnzW8mmvn8vl+eoHfw0E7RsVjXZv+ALwFmAA+EzzzHEcZ3jHKH3z00UvAYJE7vmvO5GffnkDOx7fN2NheOLBYTITeU59wdFsfmA3WzcOk0onWLi0n2NOntm5AEb3T7DhtifZs330UGHId2byuUAynagZSspmcmx/dB9Hrl3EstULGR/Lct+tW9m6cQ8nnBnc/B+/dxcLFvex+mlLuOsnmxnatL8uYZgYzTI2kmHeYA+rT1nStM80UxoVhj8nKIuRAj5BkGdwHKcJ7N0+OsVbKHDyuSv5xTc2NhROGt4+ysLFfTz74uP55bce5s4fbiLbk+DYZyzh2RcfP+Pz7dp6gA23PVmcgrKUTg4lASRTqukxjB0ISpOsPXMZp5y3klwuz4ZfPsnQ4/s54czl5PPG3qGDnPrCoznnlcfzwG3b6g5NFY571u8dV8wrRUGjkv4w0Af8l5m5KDhOExnePsqiZf0V9wU1kxoQhh2TT/alg+VKvZKZkA5H5RYmrS+l44UhXTuUVGj/QtslkwkWHzW/OPZk/64x8jljMBT3VE+yooBWIlvML0QXRoLGhWE98GPgUkm3N9Eex5nTTIxlGdk7cUh4pkDfQLr4xFovZhaITXijKgyWK5yvEQqlqXOZSh5D5+YYAFLpZM1Q0qQwTLbj0lULGNq0H8sbwzvCHFH4HabSiYoCWolssUdStGG4Rq++hiCMdA0+oY7jNI1iRdUKoSSgoWJ6I8MTZCfyRS+kVAwaDVcUnmgzNT2GDs0xpFQz9FMYS1LadsuPW8jEWI7H1+86pPNAqidJtoKAViIuHkOjOYbNZvZjSSuAxrs1OI4zheJNpYrH0DuQZnjo4MzOGT7BDpaEkgo07DH01PIYOjyUlEqQy1YvVlgeSgJYe/oy7vju49x87X0kUwl6+lP0Lwj2p3pm4DGEghTlqGdo3GO4QNJRwNXAPzfRHseZ02zbOEyqJ1HdY5ifZnyGHkP5E2zpk27DwpBMkEiotsfQgQPcoNArqfoTfiVhSKYTvOiPT2LFmkUsOWo+p19wDFLw+Tsxx9Cox7AIeB/wXoJuq47jNIHH79vNUSceVjXG3DeQZnw0Sz6XrztUM7xjlFQ6wfxwzoEpwjCLni/JnkRxlG4pnVwSAwKPodaNfGwkQyqdOKQs9hHHLOR33/70Q45PpROM7puhx9ChOYYPEvRI2gDEvw6w43QAwztG2Td0kKNPqj6uoPCUOj5afwJ67/ZRBo+Yh8In+N55adDU8zVCtdh5PpdHCRWfmDuNVLp2KGn8QGZGgtqIx5DqhFCSpKSkbZLeAmBmW8zs5nD5ilYa6Dhzhc337QZg1cmHVz2mtPx2vQzvODil+2siIXr7UyRTiVndgKr1tsnnrGO9BQg9hmm6q/bOQFBT03R/LaXQnqkI6yRBncJgZjngXoLeSI7jtIBN9+1m4dL+qvkFmHmV1Vwuz76hg4ecs28gTd9AalZP9dU9BuvY/AJMP/J5bCQzI08r1ZMs1j+ajqIwROwxzCTHMA94r6QXAVvDbWZmFzXfLMeZW+SyebZs2MNTzq5dNqFwQ1p302PMP6yXeYO9nPXyY6ve4PfvHCOft0N6OfXNT5OdmN3Np6rHkO98j6H2ALcsi1f21X2+VLpyLqYSBaGNclpPmJkwnBP+PS18AcR/AlrH6QDW3/oE2fHctHWLFh0xj8Ur57PriQNsf2wf46NZnnLOCgaXVh4p/eQjewFYHE74U+DYZyyZ9WQ0qZ5EdY+hk4VhupHPM84xBKEpM5vWQ8tO5EmkFLnHNRNhOLZlVjjOHGbXEwf4+dc2svppi6ctjtfTn+KS/3UWAI/evZObPnM3YyOZqsLw2D07GRjsKc4EV+D0C1bP2u5UT5KJg4cmwWfSYyqO1AolWd4YH81MGfU8HYWn/1wmP60nkM3kIs8vQB3CIGlVuFjROyjZP2xm+5plmOPMBcyMW776ID39KV7wppOKPYfqoW9e7UR0Lptn0327WXvmspb0EEqlE4zurZJ87uQcQ41Q0vjBLGYz681VyBdkJ+oQhol85PkFqM9juI5AFGp90wZcC1zfBJscZ86w64kRtj40zHN/f+2Mu44WZ3Wrkoje8+QombEcR5142KztrES1bpidHkpKpRPk8xbkSsoErlI5jOnPFxYczOSA2u8LPIYOEAYze347DHGcuchj9+wE4PjTj5jxe6eb1e3AnjEAFhxef6J0JhRi5+V0ujCUTu+ZKHvCrzTqeTpKPYbpqMeraAfRS5PjzFGeeHAPt3/7UY44ZgEDg70zfn/vNKGkkeFxgOKsYs0mla7mMXR4jqEgDBVEryFhmOIx1CY7kY+FxxC9BY4zR/n+59eTzxvHn7Gsofcnkgl656UYrxJKOjA8jgTzFvbMxsyqVPUYOr27anrSYyin9R5Dzj0Gx5mrWN44uG+Cpz1vJc980arp31CF3hpluEf2jDNvYU/Lnt4LI3otP7VfinVLKKmSx9BIjqEoDHV4DJl4JJ+jt8Bx5iDjYTfPhVW6mdZLrfkZDgyPM7CoNWEkmOyGmS17ss51uDAUQjmVvKGxkQwS9PbPvLuqewyO49SkGJKY5by+gTBULqh3YM848w9rTeIZJp+Ey0f1BjmGzhWG0uRzOWMjWXrnpWfUrThZQ2jKyWY8x+A4c5ZGYtWV6JufqtpddaRNHkN5HSDLW2cnn9O1Q0kzFfPJ+bHrST67x+A4c5ZirHq2wlAllDR+MMvEwWzLeiTBZMhl60PDxcmAxkYyPPnIvg4f4BbYXi35PJNRzzAzjyHnHoPjzF3Gm+UxDKTJjOcOuYltfzSokbTk6PmV3tYU+ucHvZ1u/uJ9/OeHfk0+l+cnX3oAmOxK24nUygnMtLIqzMxjyMxFj0HSBZI2SNoo6ZB5HCSdL2mvpDvD15XttM9x2kUhL9CMHENwvqlew7aNe5Fg+XGDszp/LY56ymG8+n1ncNK5R5LN5MlljbGRDMl0gvMuOaFl1201tcaHjDcgDMk6u6vm80Y+a7HoldQ2WZeUBD4NvAjYAtwu6UYzu6/s0FvN7GXtsstxoqCR3i2VKC2LUTpIbtvGYZYcvYCevtb9iyshlh27kG0PDwPBjc3yxoo1g8EscR1KrRHlYwcy9M5QzAvzY0/nMRT2Rz2tJ7TXYzgL2Ghmj5jZBPBVwOdycOYkYwcyM+7dUolKNzEzY/uj+1i+pnXeQimFHkj5XD7oqtrB+QWo7jFkJ3JkM/mGwn/JKoMBSykku9NzLJS0Ethcsr4l3FbOOZLukvRdSSdXOpGkyyStk7RuaGioFbY6TksZG5l575ZKFOeALumyOjaSIZvJM7hkdmMk6qXQAymfs47vqgrVR5TPpidZPfM+Z+aox1Dp11Jeyvs3wDFm9gzg/wI3VDqRmV1jZmeY2RlLly5trpWO02Isb+wdOjjj3i2VKIaSSp5uR/dOALS0q2opBQ8hEIbO7qpaoNKI8lkJQ5XZ7kop7J9rHsMW4OiS9aOYnCIUADPbZ2YHwuWbgLSkJe0z0XFaz83X3sfQpv30L5h9DaNKoaSRvUHxvHmDramRVM5kKMnCMQyd7TFA5W7AjZTDKFBtfuxSCqGkueYx3A6slXSspB7gEuDG0gMkLVc4o4iks0L7drXRRsdpOU8+spdkOsE5r1wz63OlehIkU4kpg9xGhkOPoe3CEOQYZps3iQOVRpQXe5K1yGMohJLi4DG0rVeSmWUlvRP4PpAEvmBm6yW9Ldx/NfBq4E8lZYGDwCVm5vNKO11DLpNn/64xTr9wNYctH5j1+STRN5CaGkraV/AY2hRKKssxJLvBY5ifYs+2kSnbZpdjqDw/dimF0iLJudRdFYrhoZvKtl1dsvwp4FPttMlx2snenQcxg0VHzGvaOfvmp8tCSRP09Kfa9uR5aI6hC4ShZihp5rfNavNjlxInjyF6aXKcOUShdMSiZU0UhrKb2OjweNvCSFASSsp3T/K50ojysZEMqZ5EceKdmVBPKGmu5hgcZ85TFIYjmteVtG8gPTXHsHeibWEkODT5rC7xGGBqUr+RchgFZtJddU6NfHacucKNn/gtu7aOVNw3cTBL/4J0U0cG981Ps+fJUX7ypft5/uufyui+8ZaWwijnkAFu3SAMFUaUz2bsSSpd/wC3RjySZuPC4DhNJDuRY/P9e1h27EIWr6xcwO7I45t70z753JWsv3Urm+7bDcDEWI6eWZbamAlTQ0ldknwuDBwcnfQYMmO5hkuMuMfgOHOYQujhqc9ewcnnVhrY33yWrlrAyeet5JHf7gCCJ8/CZDPtYGqvpC7JMRQ9hsmEcXYi1x6PwZPPjtNdNGsCnplSmtzMZfNtTWAWPIZcJg9G14xjgKk5hmB2tcZu2qmeyvNjl5KdyJFIKRa1plwYHKeJNGsCnpmS6kmQnchhYc+gdk72UhCCwhNvV+UYSoVhItdwmKfa/NilZCcaF55m48LgOE3k4CzKJsyGVDqJGUyMh4XY2hpKCoSgECPvBmFI9yRJpqeOKJ/NfMyp4pwM1fMMsxGeZhMPKxynS2jWzGwzpXBDKVy/ncKQTE6dIznZBTkGOHR8SHYi33D8v+AJ1BrLMBvhaTbxsMJxuoTIcgzhDWt8NEiWRpFjKHgM3ZBjgArCkJlNKKkej6Fx4Wk2LgyO00TGDmRJ9SbbPnq1cOMZG22/x9CNOQYISl8UhGFy2s1Zegw1eiZlMzn3GBynGwlGx7a/F3jhxlOYsCeZbt/NuSAE2S7KMcDUEeWznXYzVce8z+4xOE6XMpuyCbOhmGMIPYZUqn03mEJOoXDT64YBbjA1lDTbaTeLwlCjwqonnx2nS4lMGNIFYYgux1B4qu6GWkkQCMP4SBYzm/W0m8XuqtMln2PiMfjIZ8epE8sbv/nB44dM4FLK8I5RVj318DZaFXBI8jnVvptzQQgK8fNEojueN/vmp8nnjYmx3Kw9hoKg3PezrezacoDTXrKKvUMHuf/n24rzG48Mj7PkqMplVNqNC4Pj1Mme7aPcdsMjtUenSixfs6itdsGhoaRkGwdKTXoMXZZ8HpgspFcMkzXoMSw4rI8Fh/ex6b5dPHb3TladfDgP/mo7d/1482T4SOKI1QubYvtscWFwnDophEouuOxpHPv0eE1FXkw+R+AxFESyED/vOmEYyZDPzs5j6OlP8YZ/eDabH9jNjf9yJ9mJHJmJHPMGe3jzx57bNJubhQuD49RJNkbVL8s51GNoY3dVBR5U13kMJWUxEsFU9LOedrMgLJmJfJhsjkdOoZz4/cIdJ6YUbnxxqWdTSnmOod394ZVUSXfV7ritTAklZZoz7WZBsHMT+ViNdC7HPQbHqZOiMMTRY0gXBrgVQknttTGR1GTyuVs8hpJQUiFcNltPbNJjyLnH4DjdQOGpMY5Pecl0dKEkCIWhywa49cxLgQJhKH73s3woKHoMmXxYTTV+vyVwYXCcupn0GOL3lCeJVDpRknxutzBMzgcRh/kEmkEiIXrnpRgv6ZU02zCiewyO02U066mxVaR6khQ6xbfdY0iUhpLi2T6NUBj93KwwYiF5ncuEOYaY/pbiaZXjxJA4ewxQctNS+5/agxxDd4WSoEQYig8Fs/vuU6EnN+kxxPMWHE+rHCeGFLurtjlMUy+Fm1YqlUBqvzDks1Zc7hb65qcZG8mSncg3ZdpNJUQynSjplRTPh4x4/sIdJ4ZkM8FcynGdb6AQPmp3GAmmho+6ShjCCqtBSezm3MQL07AG1VTjeQuOp1WOE0Pi3IsEIB3eZNqdeIapoatuqZUEgTAcHMkwsme8aTfxVDpJNpNvqtg0m+75Bh2nxQQzeMXzHxkmQ0nReAyquNzpDCzqJTue4+HfDjWtam6qJ8HEWC6c+Ceet2Af4OY4dRJ3j2Hhkn5gTzQeQ5cKwynnrWTRsnlY3jh8xUBTzplKJyfnzYipx+DC4Dh1Eud+5wCLjpgH1J4MplV0qzCke5NNL5iY6kkUJwCKq8cQT6scJ4bEud85wKJl/QAc2DPe9mt3qzC0glRPojhlaFx/T/G0ynFiSJz7nQMsWhZ4DMWZX9rI1F5J8W2jOJDqSU56DDENJfk36Dh1EuQY4vmPDIUcQzQUvYQIBtd1Gql0ItYFGcGFwXHqJu6hpCiSzgUKYuBhpOkpzVPF9UHDk8+OUyfZifj2Oy9w8XtPJ93bfhsLguDewvSU9myL64OGC4Pj1EncPQaA5ccNRnLdQl7B8wvTM8VjiGkvN/8WHadO4t5dNUqKHoOHkqal9OEirg8abbVK0gWSNkjaKOmKCvsl6ZPh/rslndZO+xynFrmYD3CLEheG+ikNR0YxSr0e2maVpCTwaeClwEnAayWdVHbYS4G14esy4LPtss9xapHL5cnnzT2GKhSTz55jmJZSL2G2c0i3Cpm1p9OzpHOAq8zsJeH6+wHM7CMlx3wO+KmZfSVc3wCcb2bbqp33jDPOsHXr1s3Ynv/7h39MLt/+EaKO4zjNIplI8mf/8YWG3ivpDjM7o9K+dvoxK4HNJetbwm0zPQZJl0laJ2nd0NBQ0w11HMeZy7SzV1IlH7PcXannGMzsGuAaCDyGRoxpVGUdx3G6nXZ6DFuAo0vWjwK2NnCM4ziO00LaKQy3A2slHSupB7gEuLHsmBuBN4S9k84G9tbKLziO4zjNp22hJDPLSnon8H0gCXzBzNZLelu4/2rgJuBCYCMwCry5XfY5juM4AW0d+WxmNxHc/Eu3XV2ybMA72mmT4ziOM5V4jq5wHMdxIsOFwXEcx5mCC4PjOI4zBRcGx3EcZwptK4nRKiQNAY83+PYlwM4mmtMq3M7m0Qk2gtvZTDrBRmi/nceY2dJKOzpeGGaDpHXVaoXECbezeXSCjeB2NpNOsBHiZaeHkhzHcZwpuDA4juM4U5jrwnBN1AbUidvZPDrBRnA7m0kn2AgxsnNO5xgcx3GcQ5nrHoPjOI5ThguD4ziOM4U5KwySLpC0QdJGSVdEbMtjku6RdKekdeG2wyX9UNJD4d/DSo5/f2j3BkkvaaFdX5C0Q9K9JdtmbJek08PPt1HSJyU1dWLgKnZeJemJsE3vlHRhlHZKOlrSTyTdL2m9pHeF22PVnjXsjE17SuqT9GtJd4U2/l24PW5tWc3O2LRlVcxszr0Iyn4/DBwH9AB3ASdFaM9jwJKybf8buCJcvgL4WLh8UmhvL3Bs+DmSLbLrPOA04N7Z2AX8GjiHYIa+7wIvbYOdVwGXVzg2EjuBFcBp4fIC4MHQlli1Zw07Y9Oe4fnmh8tp4FfA2TFsy2p2xqYtq73mqsdwFrDRzB4xswngq8BFEdtUzkXAdeHydcArSrZ/1czGzexRgrkrzmqFAWZ2C7B7NnZJWgEsNLNfWvALv77kPa20sxqR2Glm28zsN+HyfuB+gvnMY9WeNeysRtvttIAD4Wo6fBnxa8tqdlYjsv+hcuaqMKwENpesb6H2j7/VGPADSXdIuizctszC2evCv0eE26O2faZ2rQyXy7e3g3dKujsMNRXCCpHbKWk18EyCJ8jYtmeZnRCj9pSUlHQnsAP4oZnFsi2r2AkxastKzFVhqBSfi7Lf7nPM7DTgpcA7JJ1X49i42V6gml1R2ftZYA1wKrAN+Kdwe6R2SpoPfAN4t5ntq3VoFXuisjNW7WlmOTM7lWBe+LMknVLj8MjasoqdsWrLSsxVYdgCHF2yfhSwNSJbMLOt4d8dwLcIQkPbQxeS8O+O8PCobZ+pXVvC5fLtLcXMtof/lHngX5kMt0Vmp6Q0wc32y2b2zXBz7Nqzkp1xbM/QrmHgp8AFxLAtK9kZ17YsZa4Kw+3AWknHSuoBLgFujMIQSQOSFhSWgRcD94b2vDE87I3Af4XLNwKXSOqVdCywliAx1S5mZFfo0u+XdHbYk+INJe9pGYUbRMgrCdo0MjvDc/4bcL+ZfbxkV6zas5qdcWpPSUslLQqX+4EXAg8Qv7asaGec2rIqrcxsx/kFXEjQ4+Jh4K8jtOM4gp4IdwHrC7YAi4EfAQ+Ffw8vec9fh3ZvoIW9E4CvELi6GYKnlksbsQs4g+DH/zDwKcIR9y2280vAPcDdBP9wK6K0E3gugft/N3Bn+Lowbu1Zw87YtCfwdOC3oS33Alc2+j/T4rasZmds2rLay0tiOI7jOFOYq6Ekx3EcpwouDI7jOM4UXBgcx3GcKbgwOI7jOFNwYXAcx3Gm4MLgOCVIWiTp7SXrR0r6eouu9QpJV1bZdyD8u1TS91pxfcephguD40xlEVAUBjPbamavbtG13gt8ptYBZjYEbJP0nBbZ4DiH4MLgOFP5KLAmrJP/j5JWK5znQdKbJN0g6duSHpX0Tkl/Kem3km6TdHh43BpJ3wuLIt4q6SnlF5F0AjBuZjvD9WMl/VLS7ZL+vuzwG4DXtfRTO04JLgyOM5UrgIfN7FQz+6sK+08B/pCgvs2HgVEzeybwS4JSBRBM6v5nZnY6cDmVvYLnAL8pWf8E8FkzOxN4suzYdcC5DX4ex5kxqagNcJwO4ycWzFOwX9Je4Nvh9nuAp4dVSZ8NfK1kkq3eCudZAQyVrD8HuDhc/hLwsZJ9O4Ajm2O+40yPC4PjzIzxkuV8yXqe4P8pAQxbUGq5FgeBwbJt1erT9IXHO05b8FCS40xlP8GUlg1hwdwFj0p6DQTVSiU9o8Kh9wPHl6z/nKDKLxyaTziByQqcjtNyXBgcpwQz2wX8XNK9kv6xwdO8DrhUUqFibqVpY28BnqnJeNO7CCZpup1DPYnnA//doC2OM2O8uqrjRISkTwDfNrObpznuFuAiM9vTHsucuY57DI4THf8AzKt1gKSlwMddFJx24h6D4ziOMwX3GBzHcZwpuDA4juM4U3BhcBzHcabgwuA4juNMwYXBcRzHmcL/B6gFAuQGjACWAAAAAElFTkSuQmCC\n", "text/plain": [ "
    " ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -587,18 +587,19 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'px' ()>\n",
    -       "array(0.)\n",
    +       "
    <xarray.DataArray 'px' (id: 16)>\n",
    +       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
            "Coordinates:\n",
    -       "    id       int64 101\n",
    -       "    time     float64 22.0
    " + " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", + " time float64 110.0
    " ], "text/plain": [ - "\n", - "array(0.)\n", + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", - " id int64 101\n", - " time float64 22.0" + " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", + " time float64 110.0" ] }, "execution_count": 13, @@ -607,7 +608,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=101).isel(time=2)" + "swiftdiff['px'].sel(id=tpidx).isel(time=10)" ] }, { diff --git a/examples/whm_gr_test/swiftest_relativity.ipynb b/examples/whm_gr_test/swiftest_relativity.ipynb index 53c4e5453..69bacdf51 100644 --- a/examples/whm_gr_test/swiftest_relativity.ipynb +++ b/examples/whm_gr_test/swiftest_relativity.ipynb @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -116,10 +116,10 @@ "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", "JPL Horizons : 571.3210506300043\n", "Swifter GR : 571.6183105524942\n", - "Swiftest GR : 571.6183105392645\n", + "Swiftest GR : 571.61831053222\n", "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : -0.29725990926022927\n", - "Swiftest - Swifter: -1.3229737305664457e-08\n" + "Obs - Swiftest : -0.29725990221562437\n", + "Swiftest - Swifter: -2.0274342205084395e-08\n" ] }, { diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index e35d6cad7..95d4ca4b4 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -97,10 +97,12 @@ subroutine discard_sun_tp(tp, system, param) tp%status(i) = DISCARDED_RMAX write(*, *) "Particle ", tp%id(i), " too far from sun at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then tp%status(i) = DISCARDED_RMIN write(*, *) "Particle ", tp%id(i), " too close to sun at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. else if (param%rmaxu >= 0.0_DP) then rb2 = dot_product(tp%xb(:, i), tp%xb(:, i)) vb2 = dot_product(tp%vb(:, i), tp%vb(:, i)) @@ -109,6 +111,7 @@ subroutine discard_sun_tp(tp, system, param) tp%status(i) = DISCARDED_RMAXU write(*, *) "Particle ", tp%id(i), " is unbound and too far from barycenter at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. end if end if end if @@ -193,6 +196,7 @@ subroutine discard_pl_tp(tp, system, param) call discard_pl_close(dx(:), dv(:), dt, radius**2, isp, r2min) if (isp /= 0) then tp%status(i) = DISCARDED_PLR + tp%lmask(i) = .false. pl%ldiscard(j) = .true. write(*, *) "Particle ", tp%id(i), " too close to massive body ", pl%id(j), " at t = ", t tp%ldiscard(i) = .true. diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 638ee9da4..79744c0f3 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -10,7 +10,7 @@ contains - module subroutine drift_body(self, system, param, dt, mask) + module subroutine drift_body(self, system, param, dt) !! author: David A. Minton !! !! Loop bodies and call Danby drift routine on the heliocentric position and velocities. @@ -23,7 +23,6 @@ module subroutine drift_body(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i integer(I4B), dimension(:), allocatable :: iflag @@ -31,7 +30,7 @@ module subroutine drift_body(self, system, param, dt, mask) associate(n => self%nbody) allocate(iflag(n)) iflag(:) = 0 - call drift_all(self%mu, self%xh, self%vh, self%nbody, param, dt, mask, iflag) + call drift_all(self%mu, self%xh, self%vh, self%nbody, param, dt, self%lmask, iflag) if (any(iflag(1:n) /= 0)) then where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR do i = 1, n diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index cd8bc2a23..0c0333907 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -43,6 +43,36 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) end subroutine gr_kick_getaccb_ns_body + module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of massive bodies + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:,:), intent(in) :: x !! Position vectors + logical, dimension(:), intent(in) :: lmask !! Logical mask indicating which bodies to compute + integer(I4B), intent(in) :: n !! Total number of bodies + real(DP), intent(in) :: inv_c2 !! Inverse speed of light squared: 1 / c**2 + real(DP), dimension(:,:), intent(out) :: agr !! Accelerations + ! Internals + integer(I4B) :: i + real(DP) :: beta, rjmag4 + + agr(:,:) = 0.0_DP + do concurrent (i = 1:n, lmask(i)) + rjmag4 = (dot_product(x(:, i), x(:, i)))**2 + beta = -mu(i)**2 * inv_c2 + agr(:, i) = 2 * beta * x(:, i) / rjmag4 + end do + + return + end subroutine gr_kick_getacch + + module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton !! diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index c5b86ee26..0e58a3ab6 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -16,11 +16,12 @@ module subroutine helio_coord_vb2vh_pl(self, cb) ! Internals integer(I4B) :: i - associate(npl => self%nbody, vbcb => cb%vb, xh => self%xh, vb => self%vb, & - vh => self%vh, Mcb => cb%Gmass, Mpl => self%Gmass) + if (self%nbody == 0) return + + associate(pl => self, npl => self%nbody) do i = 1, NDIM - vbcb(i) = -sum(Mpl(1:npl) * vb(i, 1:npl)) / Mcb - vh(i, 1:npl) = vb(i, 1:npl) - vbcb(i) + cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vb(i, 1:npl)) / cb%Gmass + pl%vh(i, 1:npl) = pl%vb(i, 1:npl) - cb%vb(i) end do end associate @@ -40,11 +41,13 @@ module subroutine helio_coord_vb2vh_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body - associate(ntp => self%nbody, vb => self%vb, vh => self%vh, status => self%status) - where (status(1:ntp) == ACTIVE) - vh(1, 1:ntp) = vb(1, 1:ntp) - vbcb(1) - vh(2, 1:ntp) = vb(2, 1:ntp) - vbcb(2) - vh(3, 1:ntp) = vb(3, 1:ntp) - vbcb(3) + if (self%nbody == 0) return + + associate(tp => self, ntp => self%nbody) + where (tp%lmask(1:ntp)) + tp%vh(1, 1:ntp) = tp%vb(1, 1:ntp) - vbcb(1) + tp%vh(2, 1:ntp) = tp%vb(2, 1:ntp) - vbcb(2) + tp%vh(3, 1:ntp) = tp%vb(3, 1:ntp) - vbcb(3) end where end associate @@ -67,12 +70,13 @@ module subroutine helio_coord_vh2vb_pl(self, cb) integer(I4B) :: i real(DP) :: msys - associate(npl => self%nbody, vbcb => cb%vb, vb => self%vb, vh => self%vh, & - Mcb => cb%Gmass, Mpl => self%Gmass) - msys = Mcb + sum(Mpl(1:npl)) + if (self%nbody == 0) return + + associate(pl => self, npl => self%nbody) + msys = cb%Gmass + sum(pl%Gmass(1:npl)) do i = 1, NDIM - vbcb(i) = -sum(Mpl(1:npl) * vh(i, 1:npl)) / msys - vb(i, 1:npl) = vh(i, 1:npl) + vbcb(i) + cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vh(i, 1:npl)) / msys + pl%vb(i, 1:npl) = pl%vh(i, 1:npl) + cb%vb(i) end do end associate @@ -92,11 +96,13 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body - associate(ntp => self%nbody, vb => self%vb, vh => self%vh, status => self%status) - where (status(1:ntp) == ACTIVE) - vb(1, 1:ntp) = vh(1, 1:ntp) + vbcb(1) - vb(2, 1:ntp) = vh(2, 1:ntp) + vbcb(2) - vb(3, 1:ntp) = vh(3, 1:ntp) + vbcb(3) + if (self%nbody == 0) return + + associate(tp => self, ntp => self%nbody) + where (tp%lmask(1:ntp)) + tp%vb(1, 1:ntp) = tp%vh(1, 1:ntp) + vbcb(1) + tp%vb(2, 1:ntp) = tp%vh(2, 1:ntp) + vbcb(2) + tp%vb(3, 1:ntp) = tp%vh(3, 1:ntp) + vbcb(3) end where end associate diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 30e17849e..e2a55e458 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -2,8 +2,7 @@ use swiftest contains - module subroutine helio_drift_body(self, system, param, dt, mask) - + module subroutine helio_drift_body(self, system, param, dt) !! author: David A. Minton !! !! Loop through bodies and call Danby drift routine on democratic heliocentric coordinates @@ -16,19 +15,20 @@ module subroutine helio_drift_body(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i !! Loop counter real(DP) :: rmag, vmag2, energy integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag real(DP), dimension(:), allocatable :: dtp, mu + if (self%nbody == 0) return + associate(n => self%nbody) allocate(iflag(n)) iflag(:) = 0 allocate(mu(n)) mu(:) = system%cb%Gmass - call drift_all(mu, self%xh, self%vb, self%nbody, param, dt, mask, iflag) + call drift_all(mu, self%xh, self%vb, self%nbody, param, dt, self%lmask, iflag) if (any(iflag(1:n) /= 0)) then where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR do i = 1, n @@ -41,7 +41,7 @@ module subroutine helio_drift_body(self, system, param, dt, mask) end subroutine helio_drift_body - module subroutine helio_drift_pl(self, system, param, dt, mask) + module subroutine helio_drift_pl(self, system, param, dt) !! author: David A. Minton !! !! Wrapper function used to call the body drift routine from a helio_pl structure @@ -51,15 +51,14 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. - call helio_drift_body(self, system, param, dt, mask) + call helio_drift_body(self, system, param, dt) return end subroutine helio_drift_pl - module subroutine helio_drift_tp(self, system, param, dt, mask) + module subroutine helio_drift_tp(self, system, param, dt) !! author: David A. Minton !! !! Wrapper function used to call the body drift routine from a helio_pl structure @@ -69,15 +68,14 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. - call helio_drift_body(self, system, param, dt, mask) + call helio_drift_body(self, system, param, dt) return end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) !! author: David A. Minton !! !! Perform linear drift of massive bodies due to barycentric momentum of Sun @@ -89,19 +87,20 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) class(helio_pl), intent(inout) :: self !! Helio massive body object class(helio_cb), intent(inout) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) if (npl == 0) return - pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), mask) - pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), mask) - pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), mask) + pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), self%lmask(1:npl)) + pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), self%lmask(1:npl)) + pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), self%lmask(1:npl)) pt(:) = pt(:) / cb%Gmass - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, self%lmask(i)) pl%xh(:,i) = pl%xh(:,i) + pt(:) * dt end do @@ -116,7 +115,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) !! author: David A. Minton !! !! Perform linear drift of test particles due to barycentric momentum of Sun @@ -129,11 +128,12 @@ module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) class(helio_tp), intent(inout) :: self !! Helio test particleb object class(helio_cb), intent(in) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) if (ntp == 0) return if (lbeg) then @@ -141,7 +141,7 @@ module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) else pt(:) = cb%ptend end if - where (mask(1:ntp)) + where (self%lmask(1:ntp)) tp%xh(1, 1:ntp) = tp%xh(1, 1:ntp) + pt(1) * dt tp%xh(2, 1:ntp) = tp%xh(2, 1:ntp) + pt(2) * dt tp%xh(3, 1:ntp) = tp%xh(3, 1:ntp) + pt(3) * dt diff --git a/src/helio/helio_gr.f90 b/src/helio/helio_gr.f90 new file mode 100644 index 000000000..4902c45b8 --- /dev/null +++ b/src/helio/helio_gr.f90 @@ -0,0 +1,111 @@ +submodule(helio_classes) s_helio_gr + use swiftest +contains + + module subroutine helio_gr_kick_getacch_pl(self, param) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of massive bodies + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: suma + real(DP), dimension(:, :), allocatable :: aj + real(DP) :: beta, rjmag4 + + if (self%nbody == 0) return + + associate(pl => self, npl => self%nbody) + call gr_kick_getacch(pl%mu, pl%xh, pl%lmask, npl, param%inv_c2, pl%agr) + pl%ah(:,1:npl) = pl%ah(:,1:npl) + pl%agr(:,1:npl) + end associate + + return + end subroutine helio_gr_kick_getacch_pl + + + module subroutine helio_gr_kick_getacch_tp(self, param) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of test particles + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_kick_getacch.f90 + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i + real(DP) :: rjmag4, beta + + if (self%nbody == 0) return + + associate(tp => self, ntp => self%nbody) + call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) + tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) + end associate + + return + end subroutine helio_gr_kick_getacch_tp + + + module pure subroutine helio_gr_p4_pl(self, param, dt) + !! author: David A. Minton + !! + !! Position kick to massive bodies due to p**4 term in the post-Newtonian correction + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_p4.f90 + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + ! Internals + integer(I4B) :: i + + if (self%nbody == 0) return + + associate(pl => self, npl => self%nbody) + do concurrent(i = 1:npl, pl%lmask(i)) + call gr_p4_pos_kick(param, pl%xh(:, i), pl%vb(:, i), dt) + end do + end associate + + return + end subroutine helio_gr_p4_pl + + module pure subroutine helio_gr_p4_tp(self, param, dt) + !! author: David A. Minton + !! + !! Position kick to test particles due to p**4 term in the post-Newtonian correction + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_p4.f90 + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + ! Internals + integer(I4B) :: i + + if (self%nbody == 0) return + + associate(tp => self, ntp => self%nbody) + do concurrent(i = 1:ntp, tp%lmask(i)) + call gr_p4_pos_kick(param, tp%xh(:, i), tp%vb(:, i), dt) + end do + end associate + + return + end subroutine helio_gr_p4_tp + +end submodule s_helio_gr \ No newline at end of file diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 2325c23ba..eebd17f53 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -17,6 +17,8 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current simulation time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + if (self%nbody == 0) return + associate(cb => system%cb, pl => self, npl => self%nbody) call pl%accel_int() if (param%loblatecb) then @@ -36,7 +38,7 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) end if end if if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) - !if (param%lgr) call pl%gr_accel(param) + if (param%lgr) call pl%accel_gr(param) end associate return @@ -58,6 +60,8 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + if (self%nbody == 0) return + associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) system%lbeg = lbeg if (system%lbeg) then @@ -67,14 +71,14 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) end if if (param%loblatecb) call tp%accel_obl(system) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) - !if (param%lgr) call tp%gr_accel(param) + if (param%lgr) call tp%accel_gr(param) end associate return end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -88,13 +92,13 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) - if (npl ==0) return pl%ah(:,:) = 0.0_DP call pl%accel(system, param, t, lbeg) if (lbeg) then @@ -102,7 +106,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) else call pl%set_beg_end(xend = pl%xh) end if - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, pl%lmask(i)) pl%vb(:, i) = pl%vb(:, i) + pl%ah(:, i) * dt end do end associate @@ -111,7 +115,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -125,16 +129,16 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp ==0) return tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg) - do concurrent(i = 1:ntp, mask(i)) + do concurrent(i = 1:ntp, tp%lmask(i)) tp%vb(:, i) = tp%vb(:, i) + tp%ah(:, i) * dt end do end associate diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index c6031b272..039884596 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -43,6 +43,7 @@ module subroutine helio_step_pl(self, system, param, t, dt) real(DP) :: dth !! Half step size if (self%nbody == 0) return + associate(pl => self) select type(cb => system%cb) class is (helio_cb) @@ -51,11 +52,13 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%vh2vb(cb) pl%lfirst = .false. end if - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE)) - call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%lindrift(cb, dth, lbeg=.true.) + call pl%kick(system, param, t, dth, lbeg=.true.) + if (param%lgr) call pl%gr_pos_kick(param, dth) + call pl%drift(system, param, dt) + call pl%kick(system, param, t + dt, dth, lbeg=.false.) + if (param%lgr) call pl%gr_pos_kick(param, dth) + call pl%lindrift(cb, dth, lbeg=.false.) call pl%vb2vh(cb) end select end associate @@ -92,11 +95,13 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%vh2vb(vbcb = -cb%ptbeg) tp%lfirst = .false. end if - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%lindrift(cb, dth, lbeg=.true.) + call tp%kick(system, param, t, dth, lbeg=.true.) + if (param%lgr) call tp%gr_pos_kick(param, dth) + call tp%drift(system, param, dt) + call tp%kick(system, param, t + dt, dth, lbeg=.false.) + if (param%lgr) call tp%gr_pos_kick(param, dth) + call tp%lindrift(cb, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) end select end associate diff --git a/src/io/io.f90 b/src/io/io.f90 index 8bd47c9a7..b424094eb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -260,10 +260,11 @@ 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, SYMBA) + 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 @@ -618,7 +619,7 @@ module subroutine io_read_body_in(self, param) case(ASCII_TYPE) open(unit = iu, file = infile, status = 'old', form = 'FORMATTED', iostat = ierr) read(iu, *, iostat = ierr) nbody - call self%setup(nbody) + call self%setup(nbody, param) if (nbody > 0) then do i = 1, nbody select type(self) @@ -645,15 +646,17 @@ module subroutine io_read_body_in(self, param) 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 + self%lmask(i) = .true. 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, err=100) nbody - call self%setup(nbody) + call self%setup(nbody, param) if (nbody > 0) then call self%read_frame(iu, param, XV, ierr) self%status(:) = ACTIVE + self%lmask(:) = .true. end if case default write(*,*) trim(adjustl(param%in_type)) // ' is an unrecognized file type' @@ -828,6 +831,12 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) !read(iu, iostat=ierr, err=100) self%name(1:n) select case (form) case (EL) + if (.not.allocated(self%a)) allocate(self%a(n)) + if (.not.allocated(self%e)) allocate(self%e(n)) + if (.not.allocated(self%inc)) allocate(self%inc(n)) + if (.not.allocated(self%capom)) allocate(self%capom(n)) + if (.not.allocated(self%omega)) allocate(self%omega(n)) + if (.not.allocated(self%capm)) allocate(self%capm(n)) 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) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index d686a4665..3945a91d0 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -20,13 +20,15 @@ module pure subroutine kick_getacch_int_pl(self) associate(pl => self, npl => self%nbody, nplpl => self%nplpl) do k = 1, nplpl associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - faci = pl%Gmass(i) * irij3 - facj = pl%Gmass(j) * irij3 - pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) - pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + if (pl%lmask(i) .and. pl%lmask(j)) then + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + end if end associate end do end associate @@ -54,7 +56,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) real(DP), dimension(NDIM) :: dx associate(tp => self, ntp => self%nbody) - do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) + do concurrent(i = 1:ntp, tp%lmask(i)) do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) r2 = dot_product(dx(:), dx(:)) diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 78d6c7d46..805264c2c 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -17,7 +17,8 @@ program swiftest_driver integer(I8B) :: iloop !! Loop counter integer(I8B) :: idump !! Dump cadence counter integer(I8B) :: iout !! Output cadence counter - integer(I8B), parameter :: LOOPMAX = huge(iloop) !! Maximum loop value before resetting + !integer(I8B), parameter :: LOOPMAX = huge(iloop) !! Maximum loop value before resetting + integer(I8B) :: nloops !! Number of steps to take in the simulation real(DP) :: start_wall_time !! Wall clock time at start of execution real(DP) :: finish_wall_time !! Wall clock time when execution has finished integer(I4B) :: iu !! Unit number of binary file @@ -51,6 +52,7 @@ program swiftest_driver iloop = 0 iout = istep_out idump = istep_dump + nloops = ceiling(tstop / dt) if (istep_out > 0) call nbody_system%write_frame(iu, param) !> Define the maximum number of threads nthreads = 1 ! In the *serial* case @@ -59,7 +61,7 @@ program swiftest_driver !$ write(*,'(a)') ' ------------------' !$ write(*,'(a,i3,/)') ' Number of threads = ', nthreads write(*, *) " *************** Main Loop *************** " - do iloop = 1, LOOPMAX + do iloop = 1, nloops !> Step the system forward in time call nbody_system%step(param, t, dt) @@ -85,7 +87,7 @@ program swiftest_driver idump = istep_dump end if end if - if (t > tstop) exit + !if (t >= tstop) exit end do !> Dump the final state of the system to file diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 22c39961c..89f4aa055 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -35,13 +35,15 @@ module helio_classes !! Helio massive body particle class type, extends(swiftest_pl) :: helio_pl contains - 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 + 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_gr => helio_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => helio_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + 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 !******************************************************************************************************************************** @@ -51,13 +53,15 @@ module helio_classes !! Helio test particle class type, extends(swiftest_tp) :: helio_tp contains - 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 + 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_gr => helio_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => helio_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + 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 @@ -87,54 +91,79 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body end subroutine helio_coord_vh2vb_tp - module subroutine helio_drift_body(self, system, param, dt, mask) + module subroutine helio_drift_body(self, system, param, dt) use swiftest_classes, only : swiftest_body, swiftest_nbody_system, swiftest_parameters implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_body - module subroutine helio_drift_pl(self, system, param, dt, mask) + module subroutine helio_drift_pl(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_pl - module subroutine helio_drift_tp(self, system, param, dt, mask) + module subroutine helio_drift_tp(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(helio_cb), intent(inout) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object class(helio_cb), intent(in) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp + module subroutine helio_gr_kick_getacch_pl(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine helio_gr_kick_getacch_pl + + module subroutine helio_gr_kick_getacch_tp(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine helio_gr_kick_getacch_tp + + module pure subroutine helio_gr_p4_pl(self, param, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_pl), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + end subroutine helio_gr_p4_pl + + module pure subroutine helio_gr_p4_tp(self, param, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_tp), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + end subroutine helio_gr_p4_tp + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none @@ -155,7 +184,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object @@ -163,11 +192,10 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object @@ -175,7 +203,6 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_tp diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index de4cdec4c..88e3ee217 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -131,10 +131,12 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine rmvs_kick_getacch_tp - module subroutine rmvs_setup_pl(self,n) + module subroutine rmvs_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine rmvs_setup_pl module subroutine rmvs_setup_initialize_system(self, param) @@ -144,10 +146,12 @@ module subroutine rmvs_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine rmvs_setup_initialize_system - module subroutine rmvs_setup_tp(self,n) + module subroutine rmvs_setup_tp(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parametere end subroutine rmvs_setup_tp module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index eff9f4077..913d678eb 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -143,6 +143,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: omega !! Argument of pericenter real(DP), dimension(:), allocatable :: capm !! Mean anomaly real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) + logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) !! 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 @@ -152,23 +153,22 @@ module swiftest_classes 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 :: 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) + 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 :: 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 !******************************************************************************************************************************** @@ -302,7 +302,7 @@ subroutine abstract_initialize(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine abstract_initialize - subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) + subroutine abstract_kick_body(self, system, param, t, dt, lbeg) import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -310,7 +310,6 @@ subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine abstract_kick_body @@ -388,13 +387,12 @@ module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) integer(I4B), dimension(:), intent(out) :: iflag !! Vector of error flags. 0 means no problem end subroutine drift_all - module subroutine drift_body(self, system, param, dt, mask) + module subroutine drift_body(self, system, param, dt) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine drift_body module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) @@ -417,6 +415,16 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_kick_getaccb_ns_body + module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + implicit none + real(DP), dimension(:), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:,:), intent(in) :: x !! Position vectors + logical, dimension(:), intent(in) :: lmask !! Logical mask indicating which bodies to compute + integer(I4B), intent(in) :: n !! Total number of bodies + real(DP), intent(in) :: inv_c2 !! Inverse speed of light squared: 1 / c**2 + real(DP), dimension(:,:), intent(out) :: agr !! Accelerations + end subroutine gr_kick_getacch + module pure subroutine gr_p4_pos_kick(param, x, v, dt) implicit none class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -669,34 +677,37 @@ module subroutine orbel_xv2el_vec(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine orbel_xv2el_vec - module subroutine setup_body(self,n) + module subroutine setup_body(self, n, param) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - integer, intent(in) :: n !! Number of particles to allocate space for + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_body module subroutine setup_construct_system(system, param) implicit none class(swiftest_nbody_system), allocatable, intent(inout) :: system !! Swiftest system object - type(swiftest_parameters), intent(in) :: param !! Swiftest parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_construct_system module subroutine setup_initialize_system(self, param) implicit none - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine setup_initialize_system - module subroutine setup_pl(self,n) + module subroutine setup_pl(self, n, param) implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - integer, intent(in) :: n !! Number of massive bodies to allocate space for + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_pl - module subroutine setup_tp(self, n) + module subroutine setup_tp(self, n, param) implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - integer, intent(in) :: n !! Number of bodies to allocate space for + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parametersr end subroutine setup_tp module subroutine tides_kick_getacch_pl(self, system) @@ -779,11 +790,6 @@ module subroutine util_peri_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine util_peri_tp - module subroutine util_reverse_status(self) - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - end subroutine util_reverse_status - module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 4bd154126..ff2f08dc5 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -87,6 +87,7 @@ module symba_classes type(symba_particle_info), dimension(:), allocatable :: info contains procedure :: discard => symba_discard_pl !! Process massive body discards + procedure :: drift => symba_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level 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 @@ -103,6 +104,7 @@ module symba_classes 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 + procedure :: drift => symba_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level 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 @@ -154,16 +156,19 @@ module symba_classes 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 + integer(I4B) :: irec !! System recursion level contains - 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 + 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 :: set_recur_levels => symba_step_set_recur_levels_system !! Sets recursion levels of bodies and encounter lists to the current system level + 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) + use swiftest_classes, only : swiftest_parameters 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 @@ -174,6 +179,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec end subroutine symba_collision_check_pltpenc module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) + use swiftest_classes, only : swiftest_parameters 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 @@ -191,6 +197,24 @@ 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_drift_pl(self, system, param, dt) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + end subroutine symba_drift_pl + + module subroutine symba_drift_tp(self, system, param, dt) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + end subroutine symba_drift_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 @@ -227,6 +251,7 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc end function symba_encounter_check_tp module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object @@ -236,6 +261,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) end subroutine symba_kick_getacch_pl module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object @@ -308,22 +334,24 @@ module subroutine symba_io_write_frame_info(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_frame_info - module subroutine symba_setup_pl(self,n) + module subroutine symba_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_pl), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_setup_pl module subroutine symba_setup_pltpenc(self,n) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_pltpenc module subroutine symba_setup_plplenc(self,n) implicit none class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_plplenc module subroutine symba_setup_initialize_system(self, param) @@ -333,10 +361,12 @@ module subroutine symba_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_setup_initialize_system - module subroutine symba_setup_tp(self,n) + module subroutine symba_setup_tp(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter end subroutine symba_setup_tp module subroutine symba_step_system(self, param, t, dt) @@ -357,7 +387,13 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system + module subroutine symba_step_set_recur_levels_system(self) + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system objec + end subroutine symba_step_set_recur_levels_system + module recursive subroutine symba_step_recur_system(self, param, t, ireci) + use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index c242d2521..5509a3afe 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -55,13 +55,12 @@ module whm_classes !! WHM test particle class 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 + !! component list, such as whm_util_spill_tp contains 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 @@ -98,14 +97,13 @@ module subroutine whm_coord_vh2vj_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body particle data structuree end subroutine whm_coord_vh2vj_pl - module subroutine whm_drift_pl(self, system, param, dt, mask) + module subroutine whm_drift_pl(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine whm_drift_pl module subroutine whm_util_fill_pl(self, inserts, lfill_list) @@ -138,7 +136,7 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine whm_kick_getacch_tp - module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_pl(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object @@ -146,11 +144,10 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine whm_kick_vh_pl - module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle object @@ -158,7 +155,6 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine whm_kick_vh_tp @@ -193,10 +189,12 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) end subroutine whm_gr_p4_tp !> Reads WHM massive body object in from file - module subroutine whm_setup_pl(self,n) + module subroutine whm_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body objectobject - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(whm_pl), intent(inout) :: self !! WHM massive body objectobject + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_setup_pl module subroutine whm_util_set_ir3j(self) @@ -231,13 +229,6 @@ module subroutine whm_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine whm_setup_initialize_system - !> Reads WHM test particle object in from file - module subroutine whm_setup_tp(self,n) - implicit none - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - integer, intent(in) :: n !! Number of test particles to allocate - end subroutine whm_setup_tp - module subroutine whm_step_pl(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 26b527680..91b20b62b 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -17,9 +17,11 @@ module subroutine obl_acc_body(self, system) integer(I4B) :: i real(DP) :: r2, irh, rinv2, t0, t1, t2, t3, fac1, fac2 + if (self%nbody == 0) return + associate(n => self%nbody, cb => system%cb) self%aobl(:,:) = 0.0_DP - do i = 1, n + do concurrent(i = 1:n, self%lmask(i)) r2 = dot_product(self%xh(:, i), self%xh(:, i)) irh = 1.0_DP / sqrt(r2) rinv2 = irh**2 @@ -52,13 +54,15 @@ module subroutine obl_acc_pl(self, system) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, cb => system%cb) call obl_acc_body(pl, system) do i = 1, NDIM - cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl)) / cb%Gmass + cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl), pl%lmask(1:npl)) / cb%Gmass end do - do i = 1, npl + do concurrent(i = 1:npl, pl%lmask(i)) pl%ah(:, i) = pl%ah(:, i) + pl%aobl(:, i) - cb%aobl(:) end do end associate @@ -83,6 +87,8 @@ module subroutine obl_acc_tp(self, system) real(DP), dimension(NDIM) :: aoblcb integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, cb => system%cb) call obl_acc_body(tp, system) if (system%lbeg) then @@ -91,7 +97,7 @@ module subroutine obl_acc_tp(self, system) aoblcb = cb%aoblend end if - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + tp%aobl(:, i) - aoblcb(:) end do diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index aaf94a233..f1ab88825 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -14,8 +14,8 @@ module subroutine orbel_el2xv_vec(self, cb) 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_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)) @@ -876,8 +876,14 @@ module subroutine orbel_xv2el_vec(self, cb) integer(I4B) :: i if (self%nbody == 0) return + call self%set_mu(cb) - !do concurrent (i = 1:self%nbody) + if (.not.allocated(self%a)) allocate(self%a(self%nbody)) + if (.not.allocated(self%e)) allocate(self%e(self%nbody)) + if (.not.allocated(self%inc)) allocate(self%inc(self%nbody)) + if (.not.allocated(self%capom)) allocate(self%capom(self%nbody)) + if (.not.allocated(self%omega)) allocate(self%omega(self%nbody)) + if (.not.allocated(self%capm)) allocate(self%capm(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)) diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 14613724e..551cdab92 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_discard use swiftest contains + module subroutine rmvs_discard_tp(self, system, param) !! author: David A. Minton !! @@ -16,6 +17,8 @@ module subroutine rmvs_discard_tp(self, system, param) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, pl => system%pl, t => param%t) do i = 1, ntp associate(iplperP => tp%plperP(i)) @@ -24,6 +27,7 @@ module subroutine rmvs_discard_tp(self, system, param) tp%status(i) = DISCARDED_PLQ write(*, *) "Particle ",tp%id(i)," q with respect to Planet ",pl%id(iplperP)," is too small at t = ",t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. end if end if end associate @@ -33,4 +37,5 @@ module subroutine rmvs_discard_tp(self, system, param) end associate end subroutine rmvs_discard_tp + end submodule s_rmvs_discard \ No newline at end of file diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 1e26107bb..e4c441472 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -23,6 +23,8 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) real(DP), dimension(system%pl%nbody) :: r2crit logical :: lflag + if (self%nbody == 0) return + select type(pl => system%pl) class is (rmvs_pl) associate(tp => self, ntp => self%nbody, npl => pl%nbody, rts => system%rts) @@ -30,7 +32,7 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) tp%plencP(:) = 0 do j = 1, npl do i = 1, ntp - if ((tp%status(i) /= ACTIVE).or.(tp%plencP(i) /= 0)) cycle + if ((.not.tp%lmask(i)).or.(tp%plencP(i) /= 0)) cycle xr(:) = tp%xh(:, i) - pl%xbeg(:, j) vr(:) = tp%vh(:, i) - pl%vbeg(:, j) r2 = dot_product(xr(:), xr(:)) diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 545258ddb..018ada8f3 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -18,11 +18,12 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals - type(swiftest_parameters) :: param_planetocen + class(swiftest_parameters), allocatable :: param_planetocen real(DP), dimension(:, :), allocatable :: xh_original real(DP) :: GMcb_original integer(I4B) :: i - real(DP), dimension(:, :), allocatable :: xhp + + if (self%nbody == 0) return associate(tp => self, ntp => self%nbody, ipleP => self%ipleP, inner_index => self%index) select type(system) @@ -34,43 +35,45 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) select type (cb => system%cb) class is (rmvs_cb) associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) - system_planetocen%lbeg = lbeg - if (system_planetocen%lbeg) then - allocate(xhp, source=pl%xbeg) - else - allocate(xhp, source=pl%xend) - end if - + ! Save the original heliocentric position for later allocate(xh_original, source=tp%xh) - param_planetocen = param - ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter + + ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter using a copy of the parameter list with all of the heliocentric-specific acceleration terms turned off + allocate(param_planetocen, source=param) param_planetocen%loblatecb = .false. param_planetocen%lextra_force = .false. param_planetocen%lgr = .false. - ! Now compute the planetocentric values of acceleration + + ! Compute the planetocentric values of acceleration call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t, lbeg) ! Now compute any heliocentric values of acceleration if (tp%lfirst) then - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index - 1)%x(:,1) end do else - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index )%x(:,1) end do end if + ! Swap the planetocentric and heliocentric position vectors and central body masses tp%xh(:,:) = tp%xheliocentric(:,:) GMcb_original = cb%Gmass cb%Gmass = tp%cb_heliocentric%Gmass + + ! If the heliocentric-specifc acceleration terms are requested, compute those now if (param%loblatecb) call tp%accel_obl(system_planetocen) if (param%lextra_force) call tp%accel_user(system_planetocen, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) + + ! Put everything back the way we found it tp%xh(:,:) = xh_original(:,:) cb%Gmass = GMcb_original + end associate end select end select diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 916109e39..778ba3714 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine rmvs_setup_pl(self,n) + module subroutine rmvs_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate RMVS test particle structure @@ -10,14 +10,15 @@ module subroutine rmvs_setup_pl(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine rmvs_setup.f90 implicit none ! Arguments - class(rmvs_pl), intent(inout) :: self !! RMVS test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(rmvs_pl), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals - integer(I4B) :: i,j + integer(I4B) :: i,j !> Call allocation method for parent class associate(pl => self) - call whm_setup_pl(pl, n) + call whm_setup_pl(pl, n, param) if (n <= 0) return allocate(pl%outer(0:NTENC)) @@ -35,13 +36,21 @@ module subroutine rmvs_setup_pl(self,n) do i = 0, NTPHENC allocate(pl%inner(i)%x(NDIM, n)) allocate(pl%inner(i)%v(NDIM, n)) - allocate(pl%inner(i)%aobl(NDIM, n)) - allocate(pl%inner(i)%atide(NDIM, n)) pl%inner(i)%x(:,:) = 0.0_DP pl%inner(i)%v(:,:) = 0.0_DP - pl%inner(i)%aobl(:,:) = 0.0_DP - pl%inner(i)%atide(:,:) = 0.0_DP end do + if (param%loblatecb) then + do i = 0, NTPHENC + allocate(pl%inner(i)%aobl(NDIM, n)) + pl%inner(i)%aobl(:,:) = 0.0_DP + end do + end if + if (param%ltides) then + do i = 0, NTPHENC + allocate(pl%inner(i)%atide(NDIM, n)) + pl%inner(i)%atide(:,:) = 0.0_DP + end do + end if end if end associate return @@ -92,8 +101,9 @@ module subroutine rmvs_setup_initialize_system(self, param) class is (rmvs_pl) cbenci%lplanetocentric = .true. plenci%lplanetocentric = .true. - call plenci%setup(npl) + call plenci%setup(npl, param) plenci%status(:) = ACTIVE + plenci%lmask(:) = .true. ! plind stores the heliocentric index value of a planetocentric planet ! e.g. Consider an encounter with planet 3. ! Then the following will be the values of plind: @@ -121,7 +131,7 @@ module subroutine rmvs_setup_initialize_system(self, param) end subroutine rmvs_setup_initialize_system - module subroutine rmvs_setup_tp(self,n) + module subroutine rmvs_setup_tp(self, n, param) !! author: David A. Minton !! !! Allocate WHM test particle structure @@ -129,11 +139,12 @@ module subroutine rmvs_setup_tp(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter - !> Call allocation method for parent class - call whm_setup_tp(self, n) + !> Call allocation method for parent class. In this case, whm does not have its own setup method, so we use the base method for swiftest_tp + call setup_tp(self, n, param) if (n <= 0) return allocate(self%lperi(n)) diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index be8ca0c2a..113b4d02f 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -36,7 +36,6 @@ module subroutine rmvs_step_system(self, param, t, dt) lencounter = tp%encounter_check(system, dt) if (lencounter) then lfirstpl = pl%lfirst - lfirsttp = tp%lfirst pl%outer(0)%x(:,:) = xbeg(:,:) pl%outer(0)%v(:,:) = vbeg(:,:) call pl%step(system, param, t, dt) @@ -44,13 +43,13 @@ module subroutine rmvs_step_system(self, param, t, dt) pl%outer(NTENC)%v(:,:) = pl%vh(:,:) call rmvs_interp_out(cb, pl, dt) call rmvs_step_out(cb, pl, tp, system, param, t, dt) - call tp%reverse_status() + tp%lmask(1:ntp) = .not. tp%lmask(1:ntp) call pl%set_beg_end(xbeg = xbeg, xend = xend) tp%lfirst = .true. call tp%step(system, param, t, dt) - where (tp%status(:) == INACTIVE) tp%status(:) = ACTIVE + tp%lmask(1:ntp) = .true. pl%lfirst = lfirstpl - tp%lfirst = lfirsttp + tp%lfirst = .true. if (param%ltides) call system%step_spin(param, t, dt) else call whm_step_system(system, param, t, dt) @@ -167,7 +166,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) associate(npl => pl%nbody, ntp => tp%nbody) dto = dt / NTENC where(tp%plencP(:) == 0) - tp%status(:) = INACTIVE + tp%lmask(:) = .false. elsewhere tp%lperi(:) = .false. end where @@ -177,7 +176,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) vbeg = pl%outer(outer_index - 1)%v(:, :), & xend = pl%outer(outer_index )%x(:, :)) system%rts = RHPSCALE - lencounter = tp%encounter_check(system, dt) + lencounter = tp%encounter_check(system, dto) if (lencounter) then ! Interpolate planets in inner encounter region call rmvs_interp_in(cb, pl, system, param, dto, outer_index) @@ -192,7 +191,10 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) end if do j = 1, npl if (pl%nenc(j) == 0) cycle - where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) tp%status(:) = ACTIVE + tp%lfirst = .true. + where((tp%plencP(:) == j) .and. (.not.tp%lmask(:))) + tp%lmask(:) = .true. + end where end do end do end associate @@ -242,21 +244,24 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) GMcb(:) = cb%Gmass xtmp(:, :) = pl%inner(0)%x(:, :) vtmp(:, :) = pl%inner(0)%v(:, :) - if (param%loblatecb) then - allocate(xh_original,source=pl%xh) + + if ((param%loblatecb) .or. (param%ltides)) then + allocate(xh_original, source=pl%xh) pl%xh(:, :) = xtmp(:, :) ! Temporarily replace heliocentric position with inner substep values to calculate the oblateness terms + end if + if (param%loblatecb) then call pl%accel_obl(system) pl%inner(0)%aobl(:, :) = pl%aobl(:, :) ! Save the oblateness acceleration on the planet for this substep - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(0)%atide(:, :) = pl%atide(:, :) ! Save the oblateness acceleration on the planet for this substep - end if + end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(0)%atide(:, :) = pl%atide(:, :) ! Save the oblateness acceleration on the planet for this substep end if do inner_index = 1, NTPHENC - 1 call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - dti(1:npl), iflag(1:npl)) + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + dti(1:npl), iflag(1:npl)) if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /=0) then @@ -279,8 +284,8 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) do inner_index = NTPHENC - 1, 1, -1 call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - -dti(1:npl), iflag(1:npl)) + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + -dti(1:npl), iflag(1:npl)) if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /=0) then @@ -301,10 +306,10 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(inner_index)%x(:, :) call pl%accel_obl(system) pl%inner(inner_index)%aobl(:, :) = pl%aobl(:, :) - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(inner_index)%atide(:, :) = pl%atide(:, :) - end if + end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(inner_index)%atide(:, :) = pl%atide(:, :) end if end do if (param%loblatecb) then @@ -312,13 +317,13 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(NTPHENC)%x(:, :) call pl%accel_obl(system) pl%inner(NTPHENC)%aobl(:, :) = pl%aobl(:, :) - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(NTPHENC)%atide(:, :) = pl%atide(:, :) - end if - ! Put the planet positions back into place - call move_alloc(xh_original, pl%xh) end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(NTPHENC)%atide(:, :) = pl%atide(:, :) + end if + ! Put the planet positions back into place + if (allocated(xh_original)) call move_alloc(xh_original, pl%xh) end associate return @@ -347,7 +352,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) associate(npl => pl%nbody) dti = dto / NTPHENC - call rmvs_make_planetocentric(cb, pl, tp) + call rmvs_make_planetocentric(param, cb, pl, tp) do i = 1, npl if (pl%nenc(i) == 0) cycle select type(planetocen_system => pl%planetocentric(i)) @@ -373,10 +378,10 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) if (param%loblatecb) then cbenci%aoblbeg = cbenci%inner(inner_index - 1)%aobl(:, 1) cbenci%aoblend = cbenci%inner(inner_index )%aobl(:, 1) - if (param%ltides) then - cbenci%atidebeg = cbenci%inner(inner_index - 1)%atide(:, 1) - cbenci%atideend = cbenci%inner(inner_index )%atide(:, 1) - end if + end if + if (param%ltides) then + cbenci%atidebeg = cbenci%inner(inner_index - 1)%atide(:, 1) + cbenci%atideend = cbenci%inner(inner_index )%atide(:, 1) end if call tpenci%step(planetocen_system, param, inner_time, dti) @@ -386,7 +391,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) inner_time = outer_time + j * dti call rmvs_peri_tp(tpenci, pl, inner_time, dti, .false., inner_index, i, param) end do - where(tpenci%status(:) == ACTIVE) tpenci%status(:) = INACTIVE + tpenci%lmask(:) = .false. end associate end select end select @@ -399,7 +404,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) end subroutine rmvs_step_in - subroutine rmvs_make_planetocentric(cb, pl, tp) + subroutine rmvs_make_planetocentric(param, cb, pl, tp) !! author: David A. Minton !! !! When encounters are detected, this method will call the interpolation methods for the planets and @@ -408,13 +413,14 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) !! implicit none ! Arguments + class(swiftest_parameters), intent(in) :: param !! Current run configuration paramete class(rmvs_cb), intent(inout) :: cb !! RMVS central body object class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object ! Internals - integer(I4B) :: i, j, inner_index, ipc2hc - logical, dimension(:), allocatable :: encmask + integer(I4B) :: i, j, inner_index, ipc2hc + logical, dimension(:), allocatable :: encmask associate (npl => pl%nbody, ntp => tp%nbody) do i = 1, npl @@ -432,10 +438,10 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) select type(tpenci => pl%planetocentric(i)%tp) class is (rmvs_tp) tpenci%lplanetocentric = .true. - call tpenci%setup(pl%nenc(i)) + call tpenci%setup(pl%nenc(i), param) tpenci%cb_heliocentric = cb tpenci%ipleP = i - tpenci%status(:) = ACTIVE + tpenci%lmask(:) = .true. ! Grab all the encountering test particles and convert them to a planetocentric frame tpenci%id(:) = pack(tp%id(:), encmask(:)) do j = 1, NDIM @@ -450,18 +456,25 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) do inner_index = 0, NTPHENC allocate(plenci%inner(inner_index)%x, mold=pl%inner(inner_index)%x) allocate(plenci%inner(inner_index)%v, mold=pl%inner(inner_index)%x) - allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) - allocate(plenci%inner(inner_index)%atide, mold=pl%inner(inner_index)%atide) allocate(cbenci%inner(inner_index)%x(NDIM,1)) allocate(cbenci%inner(inner_index)%v(NDIM,1)) - allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) - allocate(cbenci%inner(inner_index)%atide(NDIM,1)) cbenci%inner(inner_index)%x(:,1) = pl%inner(inner_index)%x(:, i) cbenci%inner(inner_index)%v(:,1) = pl%inner(inner_index)%v(:, i) - cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) - cbenci%inner(inner_index)%atide(:,1) = pl%inner(inner_index)%atide(:, i) plenci%inner(inner_index)%x(:,1) = -cbenci%inner(inner_index)%x(:,1) plenci%inner(inner_index)%v(:,1) = -cbenci%inner(inner_index)%v(:,1) + + if (param%loblatecb) then + allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) + allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) + cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) + end if + + if (param%ltides) then + allocate(plenci%inner(inner_index)%atide, mold=pl%inner(inner_index)%atide) + allocate(cbenci%inner(inner_index)%atide(NDIM,1)) + cbenci%inner(inner_index)%atide(:,1) = pl%inner(inner_index)%atide(:, i) + end if + do j = 2, npl ipc2hc = plenci%plind(j) plenci%inner(inner_index)%x(:,j) = pl%inner(inner_index)%x(:, ipc2hc) - cbenci%inner(inner_index)%x(:,1) @@ -488,25 +501,25 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) !! Adapted from David E. Kaufmann's Swifter routine rmvs_peri.f90 implicit none ! Arguments - class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object (planetocentric) - class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object (heliocentric) - real(DP), intent(in) :: t !! current time - real(DP), intent(in) :: dt !! step size - logical, intent(in) :: lfirst !! Logical flag indicating whether current invocation is the first - integer(I4B), intent(in) :: inner_index !! Outer substep number within current set - integer(I4B), intent(in) :: ipleP !! index of RMVS planet being closely encountered + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object (planetocentric) + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object (heliocentric) + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + logical, intent(in) :: lfirst !! Logical flag indicating whether current invocation is the first + integer(I4B), intent(in) :: inner_index !! Outer substep number within current set + integer(I4B), intent(in) :: ipleP !! index of RMVS planet being closely encountered class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, id1, id2 - real(DP) :: r2, mu, rhill2, vdotr, a, peri, capm, tperi, rpl - real(DP), dimension(NDIM) :: xh1, xh2, vh1, vh2 + integer(I4B) :: i, id1, id2 + real(DP) :: r2, mu, rhill2, vdotr, a, peri, capm, tperi, rpl + real(DP), dimension(NDIM) :: xh1, xh2, vh1, vh2 rhill2 = pl%rhill(ipleP)**2 mu = pl%Gmass(ipleP) associate(nenc => tp%nbody, xpc => tp%xh, vpc => tp%vh) if (lfirst) then do i = 1, nenc - if (tp%status(i) == ACTIVE) then + if (tp%lmask(i)) then vdotr = dot_product(xpc(:, i), vpc(:, i)) if (vdotr > 0.0_DP) then tp%isperi(i) = 1 @@ -517,7 +530,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) end do else do i = 1, nenc - if (tp%status(i) == ACTIVE) then + if (tp%lmask(i)) then vdotr = dot_product(xpc(:, i), vpc(:, i)) if (tp%isperi(i) == -1) then if (vdotr >= 0.0_DP) then @@ -570,8 +583,8 @@ subroutine rmvs_end_planetocentric(pl, tp) !! implicit none ! Arguments - class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object - class(rmvs_tp), intent(inout) :: tp !! RMVS test particle objec + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle objec ! Internals integer(I4B) :: i, j, inner_index integer(I4B), dimension(:), allocatable :: tpind @@ -596,6 +609,7 @@ subroutine rmvs_end_planetocentric(pl, tp) ! Copy the results of the integration back over and shift back to heliocentric reference tp%status(tpind(1:pl%nenc(i))) = tpenci%status(1:pl%nenc(i)) + tp%lmask(tpind(1:pl%nenc(i))) = tpenci%lmask(1:pl%nenc(i)) do j = 1, NDIM tp%xh(j, tpind(1:pl%nenc(i))) = tpenci%xh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%x(j, i) tp%vh(j, tpind(1:pl%nenc(i))) = tpenci%vh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%v(j, i) @@ -607,8 +621,8 @@ subroutine rmvs_end_planetocentric(pl, tp) do inner_index = 0, NTPHENC deallocate(plenci%inner(inner_index)%x) deallocate(plenci%inner(inner_index)%v) - deallocate(plenci%inner(inner_index)%aobl) - deallocate(plenci%inner(inner_index)%atide) + if (allocated(plenci%inner(inner_index)%aobl)) deallocate(plenci%inner(inner_index)%aobl) + if (allocated(plenci%inner(inner_index)%atide)) deallocate(plenci%inner(inner_index)%atide) end do end select end select diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 65122881c..27b6bd4b3 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -161,6 +161,8 @@ module subroutine rmvs_util_sort_rearrange_pl(self, ind) class(rmvs_pl), allocatable :: pl_sorted !! Temporary holder for sorted body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) @@ -188,6 +190,8 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) ! Internals class(rmvs_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) call util_sort_rearrange_tp(tp,ind) allocate(tp_sorted, source=self) @@ -219,7 +223,6 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) associate(keeps => self) select type(discards) class is (rmvs_pl) - discards%nenc(:) = pack(keeps%nenc(:), lspill_list(:)) if (count(.not.lspill_list(:)) > 0) then keeps%nenc(:) = pack(keeps%nenc(:), .not. lspill_list(:)) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 5e6933c6e..50da6ce1c 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -10,7 +10,7 @@ module subroutine setup_construct_system(system, param) implicit none ! Arguments class(swiftest_nbody_system), allocatable, intent(inout) :: system !! Swiftest system object - type(swiftest_parameters), intent(in) :: param !! Swiftest parameters + class(swiftest_parameters), intent(in) :: param !! Swiftest parameters select case(param%integrator) case (BS) @@ -78,7 +78,7 @@ module subroutine setup_initialize_system(self, param) !! implicit none ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters call self%cb%initialize(param) @@ -94,15 +94,17 @@ module subroutine setup_initialize_system(self, param) end subroutine setup_initialize_system - module subroutine setup_body(self,n) + module subroutine setup_body(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest particle class. Allocates space for all particles and !! initializes all components with a value. !! Note: Timing tests indicate that (NDIM, n) is more efficient than (NDIM, n) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - integer, intent(in) :: n !! Number of particles to allocate space for + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter self%nbody = n if (n <= 0) return @@ -117,93 +119,107 @@ module subroutine setup_body(self,n) allocate(self%xb(NDIM, n)) allocate(self%vb(NDIM, n)) allocate(self%ah(NDIM, n)) - allocate(self%aobl(NDIM, n)) - allocate(self%agr(NDIM, n)) allocate(self%ir3h(n)) - allocate(self%a(n)) - allocate(self%e(n)) - allocate(self%inc(n)) - allocate(self%capom(n)) - allocate(self%omega(n)) - allocate(self%capm(n)) allocate(self%mu(n)) + allocate(self%lmask(n)) self%id(:) = 0 self%name(:) = "UNNAMED" self%status(:) = INACTIVE + self%lmask(:) = .false. self%ldiscard(:) = .false. self%xh(:,:) = 0.0_DP self%vh(:,:) = 0.0_DP self%xb(:,:) = 0.0_DP self%vb(:,:) = 0.0_DP self%ah(:,:) = 0.0_DP - self%aobl(:,:) = 0.0_DP self%ir3h(:) = 0.0_DP - self%a(:) = 0.0_DP - self%e(:) = 0.0_DP - self%inc(:) = 0.0_DP - self%capom(:) = 0.0_DP - self%omega(:) = 0.0_DP - self%capm(:) = 0.0_DP - self%a(:) = 0.0_DP self%mu(:) = 0.0_DP + if (param%loblatecb) then + allocate(self%aobl(NDIM, n)) + self%aobl(:,:) = 0.0_DP + end if + if (param%ltides) then + allocate(self%atide(NDIM, n)) + self%atide(:,:) = 0.0_DP + end if + if (param%lgr) then + allocate(self%agr(NDIM, n)) + self%agr(:,:) = 0.0_DP + end if + return end subroutine setup_body - module subroutine setup_pl(self,n) + module subroutine setup_pl(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest massive body class. Allocates space for all particles and !! initializes all components with a value. implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - integer, intent(in) :: n !! Number of massive bodies to allocate space for + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter !> Call allocation method for parent class !> The parent class here is the abstract swiftest_body class, so we can't use the type-bound procedure - call setup_body(self, n) + call setup_body(self, n, param) if (n <= 0) return allocate(self%mass(n)) allocate(self%Gmass(n)) allocate(self%rhill(n)) - allocate(self%radius(n)) - allocate(self%density(n)) - allocate(self%rot(NDIM, n)) - allocate(self%Ip(NDIM, n)) - allocate(self%k2(n)) - allocate(self%Q(n)) - allocate(self%tlag(n)) self%mass(:) = 0.0_DP self%Gmass(:) = 0.0_DP self%rhill(:) = 0.0_DP - self%radius(:) = 0.0_DP - self%density(:) = 1.0_DP - self%rot(:,:) = 0.0_DP - self%Ip(:,:) = 0.0_DP - self%k2(:) = 0.0_DP - self%Q(:) = 0.0_DP - self%tlag(:) = 0.0_DP + self%nplpl = 0 + + if (param%lclose) then + allocate(self%radius(n)) + allocate(self%density(n)) + self%radius(:) = 0.0_DP + self%density(:) = 1.0_DP + end if + + if (param%lrotation) then + allocate(self%rot(NDIM, n)) + allocate(self%Ip(NDIM, n)) + self%rot(:,:) = 0.0_DP + self%Ip(:,:) = 0.0_DP + end if + + if (param%ltides) then + allocate(self%k2(n)) + allocate(self%Q(n)) + allocate(self%tlag(n)) + self%k2(:) = 0.0_DP + self%Q(:) = 0.0_DP + self%tlag(:) = 0.0_DP + end if + return end subroutine setup_pl - module subroutine setup_tp(self, n) + module subroutine setup_tp(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest test particle particle class. Allocates space for !! all particles and initializes all components with a value. implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - integer, intent(in) :: n !! Number of bodies to allocate space for + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter !> Call allocation method for parent class !> The parent class here is the abstract swiftest_body class, so we can't use the type-bound procedure - call setup_body(self, n) + call setup_body(self, n, param) if (n <= 0) return allocate(self%isperi(n)) diff --git a/src/symba/symba_drift.f90 b/src/symba/symba_drift.f90 new file mode 100644 index 000000000..ac06cbb6a --- /dev/null +++ b/src/symba/symba_drift.f90 @@ -0,0 +1,52 @@ + submodule (symba_classes) s_symba_drift + use swiftest +contains + + module subroutine symba_drift_pl(self, system, param, dt) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a symba_pl structure + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + + if (self%nbody == 0) return + + select type(system) + class is (symba_nbody_system) + self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + call helio_drift_body(self, system, param, dt) + self%lmask(:) = self%status(:) == ACTIVE + end select + + return + end subroutine symba_drift_pl + + + module subroutine symba_drift_tp(self, system, param, dt) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a symba_pl structure + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + + if (self%nbody == 0) return + + select type(system) + class is (symba_nbody_system) + self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + call helio_drift_body(self, system, param, dt) + self%lmask(:) = self%status(:) == ACTIVE + end select + + return + end subroutine symba_drift_tp + +end submodule s_symba_drift diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 282ed2276..ce3855e02 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -19,7 +19,9 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr logical, dimension(:), allocatable :: lencounter, loc_lvdotr - + + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, nplpl => self%nplpl) allocate(lencounter(nplpl), loc_lvdotr(nplpl)) lencounter(:) = .false. @@ -72,12 +74,14 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan lany_encounter = .false. if (self%nenc == 0) return + select type(self) class is (symba_plplenc) isplpl = .true. class is (symba_pltpenc) isplpl = .false. end select + select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -141,7 +145,9 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc integer(I4B) :: i, j real(DP), dimension(NDIM) :: xr, vr logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr - + + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, pl => system%pl, npl => system%pl%nbody) allocate(lencounter(ntp, npl), loc_lvdotr(ntp, npl)) lencounter(:,:) = .false. @@ -190,7 +196,6 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, integer(I4B), intent(in) :: irec logical, intent(out) :: lencounter, lvdotr ! Internals - integer(I4B) :: iflag real(DP) :: r2, v2, rcrit, r2crit, vdotr rcrit = (rhill1 + rhill2)*RHSCALE*(RSHELL**(irec)) @@ -198,8 +203,7 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, r2 = xr**2 + yr**2 + zr**2 v2 = vxr**2 + vyr**2 + vzr**2 vdotr = xr * vxr + yr * vyr + zr * vzr - iflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) - lencounter = (iflag /= 0) + lencounter = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) lvdotr = (vdotr < 0.0_DP) return diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 70f3fa54d..975288462 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -21,6 +21,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) real(DP) :: irij3, rji2, rlim2, faci, facj real(DP), dimension(NDIM) :: dx + if (self%nbody == 0) return select type(system) class is (symba_nbody_system) associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) @@ -62,7 +63,8 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) integer(I4B) :: k real(DP) :: rji2, fac, rlim2 real(DP), dimension(NDIM) :: dx - + + if (self%nbody == 0) return select type(system) class is (symba_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) @@ -70,7 +72,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) - if (tp%status(j) == ACTIVE) THEN + if (tp%lmask(j)) THEN if (lbeg) then dx(:) = tp%xh(:,j) - pl%xbeg(:,i) else @@ -109,6 +111,8 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) real(DP), dimension(NDIM) :: dx logical :: isplpl, lgoodlevel + if (self%nenc == 0) return + select type(self) class is (symba_plplenc) isplpl = .true. @@ -119,6 +123,10 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) + + if (pl%nbody > 0) pl%lmask(:) = pl%status(:) == ACTIVE + if (tp%nbody > 0) tp%lmask(:) = tp%status(:) == ACTIVE + irm1 = irec - 1 if (sgn < 0) then irecl = irec - 1 @@ -181,7 +189,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) end associate end do else - where(tp%status(self%index2(1:self%nenc)) == ACTIVE) + where(tp%lmask(self%index2(1:self%nenc))) tp%vb(1,self%index2(:)) = tp%vb(1,self%index2(:)) + sgn * dt * tp%ah(1,self%index2(:)) tp%vb(2,self%index2(:)) = tp%vb(2,self%index2(:)) + sgn * dt * tp%ah(2,self%index2(:)) tp%vb(3,self%index2(:)) = tp%vb(3,self%index2(:)) + sgn * dt * tp%ah(3,self%index2(:)) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 4ddc23ebd..e240be778 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -2,7 +2,42 @@ use swiftest contains - module subroutine symba_setup_pl(self, n) + 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. + !! This subroutine will also sort the massive bodies in descending order by mass + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j + + ! Call parent method + associate(system => self) + call whm_setup_initialize_system(system, param) + call system%mergeadd_list%setup(1, param) + call system%mergesub_list%setup(1, param) + call system%pltpenc_list%setup(0) + call system%plplenc_list%setup(0) + 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 + pl%nplm = count(pl%lmtiny(:)) + end select + end select + end associate + + return + end subroutine symba_setup_initialize_system + + + module subroutine symba_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate SyMBA test particle structure @@ -10,16 +45,19 @@ module subroutine symba_setup_pl(self, n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine symba_setup.f90 implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals - integer(I4B) :: i + integer(I4B) :: i - !> Call allocation method for parent class - call setup_pl(self, n) + !> Call allocation method for parent class. In this case, helio_pl does not have its own setup method so we use the base method for swiftest_pl + call setup_pl(self, n, param) if (n <= 0) return + allocate(self%lcollision(n)) allocate(self%lencounter(n)) + allocate(self%lmtiny(n)) allocate(self%nplenc(n)) allocate(self%ntpenc(n)) allocate(self%levelg(n)) @@ -32,6 +70,7 @@ module subroutine symba_setup_pl(self, n) self%lcollision(:) = .false. self%lencounter(:) = .false. + self%lmtiny(:) = .false. self%nplenc(:) = 0 self%ntpenc(:) = 0 self%levelg(:) = -1 @@ -53,10 +92,11 @@ module subroutine symba_setup_pltpenc(self, n) implicit none ! Arguments class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for self%nenc = n if (n == 0) return + if (allocated(self%lvdotr)) deallocate(self%lvdotr) if (allocated(self%status)) deallocate(self%status) if (allocated(self%level)) deallocate(self%level) @@ -72,11 +112,12 @@ module subroutine symba_setup_pltpenc(self, n) self%level(:) = -1 self%index1(:) = 0 self%index2(:) = 0 + return end subroutine symba_setup_pltpenc - module subroutine symba_setup_plplenc(self,n) + module subroutine symba_setup_plplenc(self, n) !! author: David A. Minton !! !! A constructor that sets the number of encounters and allocates and initializes all arrays @@ -84,10 +125,11 @@ module subroutine symba_setup_plplenc(self,n) implicit none ! Arguments class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for call symba_setup_pltpenc(self, n) if (n == 0) return + if (allocated(self%xh1)) deallocate(self%xh1) if (allocated(self%xh2)) deallocate(self%xh2) if (allocated(self%vb1)) deallocate(self%vb1) @@ -100,45 +142,12 @@ module subroutine symba_setup_plplenc(self,n) self%xh2(:,:) = 0.0_DP self%vb1(:,:) = 0.0_DP self%vb2(:,:) = 0.0_DP - return - end subroutine symba_setup_plplenc - - - 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. - !! This subroutine will also sort the massive bodies in descending order by mass - !! - implicit none - ! Arguments - class(symba_nbody_system), intent(inout) :: self !! SyMBA system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i, j - ! Call parent method - associate(system => self) - 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) - 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 - pl%nplm = count(pl%lmtiny(:)) - end select - end select - end associate return - end subroutine symba_setup_initialize_system + end subroutine symba_setup_plplenc - module subroutine symba_setup_tp(self,n) + module subroutine symba_setup_tp(self, n, param) !! author: David A. Minton !! !! Allocate WHM test particle structure @@ -146,12 +155,14 @@ module subroutine symba_setup_tp(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter - !> Call allocation method for parent class - call setup_tp(self, n) + !> Call allocation method for parent class. In this case, helio_tp does not have its own setup method so we use the base method for swiftest_tp + call setup_tp(self, n, param) if (n <= 0) return + allocate(self%nplenc(n)) allocate(self%levelg(n)) allocate(self%levelm(n)) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index d976e8b8f..73319033c 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -65,25 +65,26 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) + system%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(:) == -1)) + call pl%lindrift(cb, dth, lbeg=.true.) + call pl%kick(system, param, t, dth, lbeg=.true.) + call pl%drift(system, param, dt) 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(:) == -1)) + call tp%lindrift(cb, dth, lbeg=.true.) + call tp%kick(system, param, t, dth, lbeg=.true.) + call tp%drift(system, param, dt) call system%recursive_step(param, t, 0) - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%kick(system, param, t, dth, lbeg=.false.) call pl%vb2vh(cb) - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%lindrift(cb, dth, lbeg=.false.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%kick(system, param, t, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%lindrift(cb, dth, lbeg=.false.) end select end select end select @@ -93,6 +94,49 @@ module subroutine symba_step_interp_system(self, param, t, dt) end subroutine symba_step_interp_system + module subroutine symba_step_set_recur_levels_system(self) + !! author: David A. Minton + !! + !! Resets pl, tp,and encounter structures at the start of a new step + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + ! Internals + integer(I4B) :: i, irecp + + associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + select type(pl => self%pl) + class is (symba_pl) + select type(tp => self%tp) + class is (symba_tp) + 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)) + + irecp = system%irec + 1 + + do i = 1, plplenc_list%nenc + if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = system%irec + if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = system%irec + end do + do i = 1, pltpenc_list%nenc + if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = system%irec + if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = system%irec + end do + end associate + + where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = system%irec + where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = system%irec + end select + end select + end associate + + return + end subroutine symba_step_set_recur_levels_system + + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! @@ -118,6 +162,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) class is (symba_pl) select type(tp => self%tp) class is (symba_tp) + system%irec = ireci dtl = param%dt / (NTENC**ireci) dth = 0.5_DP * dtl IF (dtl / param%dt < VSMALL) THEN @@ -134,6 +179,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) end if do j = 1, nloops lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) + call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then @@ -141,9 +187,11 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) 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)) + call pl%drift(system, param, dtl) + call tp%drift(system, param, dtl) + if (lencounter) call system%recursive_step(param, t+dth,irecp) + system%irec = ireci call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) @@ -151,25 +199,14 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) 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), & - plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & - tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) - do i = 1, plplenc_list%nenc - if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = ireci - if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = ireci - end do - do i = 1, pltpenc_list%nenc - if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = ireci - if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = ireci - end do - 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 + + call self%set_recur_levels() + end do end select end select @@ -195,25 +232,28 @@ module subroutine symba_step_reset_system(self) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - pl%lcollision(:) = .false. - pl%kin(:)%parent = [(i, i=1, pl%nbody)] - pl%kin(:)%nchild = 0 - do i = 1, pl%nbody - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do - pl%nplenc(:) = 0 - pl%ntpenc(:) = 0 - pl%levelg(:) = 0 - pl%levelm(:) = 0 - pl%lencounter = .false. - pl%lcollision = .false. - - tp%nplenc(:) = 0 - tp%levelg(:) = 0 - tp%levelm(:) = 0 - - plplenc_list%nenc = 0 + if (pl%nbody > 0) then + pl%lcollision(:) = .false. + pl%kin(:)%parent = [(i, i=1, pl%nbody)] + pl%kin(:)%nchild = 0 + do i = 1, pl%nbody + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do + pl%nplenc(:) = 0 + pl%ntpenc(:) = 0 + pl%levelg(:) = 0 + pl%levelm(:) = 0 + pl%lencounter = .false. + pl%lcollision = .false. + plplenc_list%nenc = 0 + end if + + if (tp%nbody > 0) then + tp%nplenc(:) = 0 + tp%levelg(:) = 0 + tp%levelm(:) = 0 pltpenc_list%nenc = 0 + end if mergeadd_list%nbody = 0 mergesub_list%nbody = 0 diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c97913e05..10fb36a2d 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -89,6 +89,8 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) integer(I4B), dimension(self%nbody) :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -137,6 +139,8 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) integer(I4B), dimension(self%nbody) :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -181,6 +185,7 @@ module subroutine symba_util_sort_rearrange_pl(self, 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%lmtiny(1:npl) = pl_sorted%lmtiny(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)) diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index ae503e082..f0bf64cc7 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_tides_kick_getacch use swiftest contains + module subroutine tides_kick_getacch_pl(self, system) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! @@ -59,6 +60,6 @@ module subroutine tides_kick_getacch_pl(self, system) end associate return - end subroutine tides_kick_getacch_pl + end submodule s_tides_kick_getacch \ No newline at end of file diff --git a/src/util/util_reverse_status.f90 b/src/util/util_reverse_status.f90 deleted file mode 100644 index c416e60e1..000000000 --- a/src/util/util_reverse_status.f90 +++ /dev/null @@ -1,22 +0,0 @@ -submodule (swiftest_classes) s_util_reverse_status - use swiftest -contains - - module subroutine util_reverse_status(self) - !! author: David A. Minton - !! - !! Reverses the active/inactive status of all particles in a structure - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - - where (self%status(:) == ACTIVE) - self%status(:) = INACTIVE - elsewhere (self%status(:) == INACTIVE) - self%status(:) = ACTIVE - end where - - return - end subroutine util_reverse_status - -end submodule s_util_reverse_status \ No newline at end of file diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 92d785773..0c3161ae2 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -21,9 +21,9 @@ function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) real(DP), parameter :: DTFAC = 0.95_DP !! Step size reduction safety factor (Value just under 1.0 to prevent adaptive step size control from discarding steps too aggressively) integer(I4B), parameter :: RKS = 6 !! Number of RK stages real(DP), dimension(RKS, RKS - 1), parameter :: rkf45_btab = reshape( & !! Butcher tableau for Runge-Kutta-Fehlberg method - (/ 1./4., 1./4., 0., 0., 0., 0.,& + (/ 1./4., 1./4., 0., 0., 0., 0.,& 3./8., 3./32., 9./32., 0., 0., 0.,& - 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& + 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& 1., 439./216., -8., 3680./513., -845./4104., 0.,& 1./2., -8./27., 2., -3544./2565., 1859./4104., -11./40./), shape(rkf45_btab)) real(DP), dimension(RKS), parameter :: rkf4_coeff = (/ 25./216., 0., 1408./2565. , 2197./4104. , -1./5., 0. /) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 6c9e51665..59f44c003 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -170,17 +170,19 @@ module subroutine util_sort_rearrange_body(self, ind) 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)) + self%lmask(1:n) = body_sorted%lmask(ind(1:n)) + + if (allocated(self%a)) self%a(1:n) = body_sorted%a(ind(1:n)) + if (allocated(self%e)) self%e(1:n) = body_sorted%e(ind(1:n)) + if (allocated(self%inc)) self%inc(1:n) = body_sorted%inc(ind(1:n)) + if (allocated(self%capom)) self%capom(1:n) = body_sorted%capom(ind(1:n)) + if (allocated(self%omega)) self%omega(1:n) = body_sorted%omega(ind(1:n)) + if (allocated(self%capm)) self%capm(1:n) = body_sorted%capm(ind(1:n)) + if (allocated(self%aobl)) self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) + if (allocated(self%atide)) self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) + if (allocated(self%agr)) self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) deallocate(body_sorted) end associate @@ -205,16 +207,17 @@ module subroutine util_sort_rearrange_pl(self, ind) 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)) + if (allocated(pl%xbeg)) pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) + if (allocated(pl%xend)) pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) + if (allocated(pl%vbeg)) pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) + if (allocated(pl%radius)) pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) + if (allocated(pl%density)) pl%density(1:npl) = pl_sorted%density(ind(1:npl)) + if (allocated(pl%Ip)) pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) + if (allocated(pl%rot)) pl%rot(:,1:npl) = pl_sorted%rot(:,ind(1:npl)) + if (allocated(pl%k2)) pl%k2(1:npl) = pl_sorted%k2(ind(1:npl)) + if (allocated(pl%Q)) pl%Q(1:npl) = pl_sorted%Q(ind(1:npl)) + if (allocated(pl%tlag)) pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) + deallocate(pl_sorted) end associate diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 0d90cd573..8ea85f654 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -21,43 +21,79 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%id(:) = pack(keeps%id(:), lspill_list(:)) discards%name(:) = pack(keeps%name(:), lspill_list(:)) discards%status(:) = pack(keeps%status(:), lspill_list(:)) - discards%a(:) = pack(keeps%a(:), lspill_list(:)) - discards%e(:) = pack(keeps%e(:), lspill_list(:)) - discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) - discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) - discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) discards%mu(:) = pack(keeps%mu(:), lspill_list(:)) + discards%lmask(:) = pack(keeps%lmask(:), lspill_list(:)) do i = 1, NDIM discards%xh(i, :) = pack(keeps%xh(i, :), lspill_list(:)) discards%vh(i, :) = pack(keeps%vh(i, :), lspill_list(:)) discards%xb(i, :) = pack(keeps%xb(i, :), lspill_list(:)) discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) - discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) - discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) - discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) end do - if (count(.not.lspill_list(:)) > 0) then + + if (allocated(keeps%a)) discards%a(:) = pack(keeps%a(:), lspill_list(:)) + if (allocated(keeps%e)) discards%e(:) = pack(keeps%e(:), lspill_list(:)) + if (allocated(keeps%capom)) discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) + if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) + if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) + + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%agr)) then + do i = 1, NDIM + discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%atide)) then + do i = 1, NDIM + discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) + end do + end if + + if (count(.not.lspill_list(:)) > 0) then keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) - keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) - keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) - keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) - keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) - keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) - keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) keeps%mu(:) = pack(keeps%mu(:), .not. lspill_list(:)) + keeps%lmask(:) = pack(keeps%lmask(:), .not. lspill_list(:)) + do i = 1, NDIM keeps%xh(i, :) = pack(keeps%xh(i, :), .not. lspill_list(:)) keeps%vh(i, :) = pack(keeps%vh(i, :), .not. lspill_list(:)) keeps%xb(i, :) = pack(keeps%xb(i, :), .not. lspill_list(:)) keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) - keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) - keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) - keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) end do + + if (allocated(keeps%a)) keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) + if (allocated(keeps%e)) keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) + if (allocated(keeps%inc)) keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) + if (allocated(keeps%capom)) keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) + if (allocated(keeps%omega)) keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) + if (allocated(keeps%capm)) keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) + end do + end if + end if ! This is the base class, so will be the last to be called in the cascade. ! Therefore we need to set the nbody values for both the keeps and discareds @@ -104,6 +140,12 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%ldiscard(:) = unpack(keeps%ldiscard(:), .not.lfill_list(:), keeps%ldiscard(:)) keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) + keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) + keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) + + keeps%lmask(:) = unpack(keeps%lmask(:), .not.lfill_list(:), keeps%ldiscard(:)) + keeps%lmask(:) = unpack(inserts%lmask(:), lfill_list(:), keeps%ldiscard(:)) + do i = 1, NDIM keeps%xh(i, :) = unpack(keeps%xh(i, :), .not.lfill_list(:), keeps%xh(i, :)) keeps%xh(i, :) = unpack(inserts%xh(i, :), lfill_list(:), keeps%xh(i, :)) @@ -119,39 +161,59 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%ah(i, :) = unpack(keeps%ah(i, :), .not.lfill_list(:), keeps%ah(i, :)) keeps%ah(i, :) = unpack(inserts%ah(i, :), lfill_list(:), keeps%ah(i, :)) - - keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) - keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + end do - keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) - keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) + keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + end do + end if - keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) - keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) - end do - - keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) - keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) - - keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) - keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) - - keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) - keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) - - keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) - keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) - - keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) - keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) - - keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) - keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) - - keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) - keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) - + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) + keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) + end do + end if + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) + keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + end do + end if + + if (allocated(keeps%a)) then + keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) + keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) + end if + + if (allocated(keeps%e)) then + keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) + keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) + end if + + if (allocated(keeps%inc)) then + keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) + keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) + end if + + if (allocated(keeps%capom)) then + keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) + keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) + end if + + if (allocated(keeps%omega)) then + keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) + keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) + end if + + if (allocated(keeps%capm)) then + keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) + keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) + end if + ! This is the base class, so will be the last to be called in the cascade. keeps%nbody = size(keeps%id(:)) end associate @@ -181,21 +243,83 @@ module subroutine util_spill_pl(self, discards, lspill_list) discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) - discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) - discards%density(:) = pack(keeps%density(:), lspill_list(:)) - discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) - discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) - discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) - do i = 1, NDIM - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - end do + + if (allocated(keeps%radius)) discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) + if (allocated(keeps%density)) discards%density(:) = pack(keeps%density(:), lspill_list(:)) + if (allocated(keeps%k2)) discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) + if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) + if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) + + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + discards%xbeg(i, :) = pack(keeps%xbeg(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + discards%xend(i, :) = pack(keeps%xend(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + discards%vbeg(i, :) = pack(keeps%vbeg(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + discards%rot(i, :) = pack(keeps%rot(i, :), lspill_list(:)) + end do + end if + if (count(.not.lspill_list(:)) > 0) then keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) - keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) - keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + if (allocated(keeps%radius)) keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) + if (allocated(keeps%density)) keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + if (allocated(keeps%k2)) keeps%k2(:) = pack(keeps%k2(:), .not. lspill_list(:)) + if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) + if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) + + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i,:) = pack(keeps%xbeg(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + keeps%xend(i,:) = pack(keeps%xend(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i,:) = pack(keeps%vbeg(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + keeps%rot(i,:) = pack(keeps%rot(i,:), .not. lspill_list(:)) + end do + end if + end if call util_spill_body(keeps, discards, lspill_list) @@ -234,29 +358,67 @@ module subroutine util_fill_pl(self, inserts, lfill_list) keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - - keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) - keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) - - keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) - keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + + if (allocated(keeps%radius) .and. allocated(inserts%radius)) then + keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) + keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) + end if + + if (allocated(keeps%density) .and. allocated(inserts%density)) then + keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) + keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + end if - keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) - keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + if (allocated(keeps%k2) .and. allocated(inserts%k2)) then + keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) + keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + end if - keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) - keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + if (allocated(keeps%Q) .and. allocated(inserts%Q)) then + keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) + keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + end if - keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) - keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + if (allocated(keeps%tlag) .and. allocated(inserts%tlag)) then + keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) + keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + end if - do i = 1, NDIM - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + if (allocated(keeps%xbeg) .and. allocated(inserts%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i, :) = unpack(keeps%xbeg(i, :), .not.lfill_list(:), keeps%xbeg(i, :)) + keeps%xbeg(i, :) = unpack(inserts%xbeg(i, :), lfill_list(:), keeps%xbeg(i, :)) + end do + end if + + if (allocated(keeps%xend) .and. allocated(inserts%xend)) then + do i = 1, NDIM + keeps%xend(i, :) = unpack(keeps%xend(i, :), .not.lfill_list(:), keeps%xend(i, :)) + keeps%xend(i, :) = unpack(inserts%xend(i, :), lfill_list(:), keeps%xend(i, :)) + end do + end if + + if (allocated(keeps%vbeg) .and. allocated(inserts%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i, :) = unpack(keeps%vbeg(i, :), .not.lfill_list(:), keeps%vbeg(i, :)) + keeps%vbeg(i, :) = unpack(inserts%vbeg(i, :), lfill_list(:), keeps%vbeg(i, :)) + end do + end if + + if (allocated(keeps%Ip) .and. allocated(inserts%Ip)) then + do i = 1, NDIM + keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) + keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + end do + end if + + if (allocated(keeps%rot) .and. allocated(inserts%rot)) then + do i = 1, NDIM + keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) + keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) + end do + end if - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) - end do keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) call util_fill_body(keeps, inserts, lfill_list) diff --git a/src/whm/whm_coord.f90 b/src/whm/whm_coord.f90 index 23f1c11d7..e7aa63e1f 100644 --- a/src/whm/whm_coord.f90 +++ b/src/whm/whm_coord.f90 @@ -20,9 +20,10 @@ module subroutine whm_coord_h2j_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumx, sumv, cap, capv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, eta => self%eta, xh => self%xh, vh => self%vh, & xj => self%xj, vj => self%vj) - if (npl == 0) return xj(:, 1) = xh(:, 1) vj(:, 1) = vh(:, 1) sumx(:) = 0.0_DP @@ -60,9 +61,10 @@ module subroutine whm_coord_j2h_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumx, sumv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, eta => self%eta, xh => self%xh, vh => self%vh, & xj => self%xj, vj => self%vj) - if (npl == 0) return xh(:, 1) = xj(:, 1) vh(:, 1) = vj(:, 1) sumx(:) = 0.0_DP @@ -97,8 +99,9 @@ module subroutine whm_coord_vh2vj_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumv, capv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, vh => self%vh, vj => self%vj, eta => self%eta) - if (npl == 0) return vj(:, 1) = vh(:, 1) sumv(:) = 0.0_DP do i = 2, npl diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index b205f0828..f68fcaeb7 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_drift_pl(self, system, param, dt, mask) + module subroutine whm_drift_pl(self, system, param, dt) !! author: David A. Minton !! !! Loop through planets and call Danby drift routine @@ -15,19 +15,21 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift ! Internals integer(I4B) :: i integer(I4B), dimension(:), allocatable :: iflag - associate(pl => self, npl => self%nbody) - if (npl == 0) return + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) allocate(iflag(npl)) iflag(:) = 0 - call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, mask, iflag) + call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, pl%lmask, iflag) if (any(iflag(1:npl) /= 0)) then - where(iflag(1:npl) /= 0) pl%status(1:npl) = DISCARDED_DRIFTERR + where(iflag(1:npl) /= 0) + pl%status(1:npl) = DISCARDED_DRIFTERR + pl%lmask(1:npl) = .false. + end where do i = 1, npl if (iflag(i) /= 0) then write(*, *) " Planet ", pl%id(i), " is lost!!!!!!!!!!!!" diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index e4d92e53c..bfba5c6a2 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -2,7 +2,8 @@ use swiftest contains - module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton + module subroutine whm_gr_kick_getacch_pl(self, param) + !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies !! Based on Saha & Tremaine (1994) Eq. 28 @@ -18,19 +19,15 @@ module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton real(DP), dimension(:, :), allocatable :: aj real(DP) :: beta, rjmag4 + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, inv_c2 => param%inv_c2) - if (npl == 0) return - allocate(aj, mold = pl%ah) - do i = 1, npl - rjmag4 = (dot_product(pl%xj(:, i), pl%xj(:, i)))**2 - beta = -pl%muj(i)**2 * inv_c2 - aj(:, i) = 2 * beta * pl%xj(:, i) / rjmag4 - end do + call gr_kick_getacch(pl%muj, pl%xj, pl%lmask, npl, param%inv_c2, pl%agr) suma(:) = 0.0_DP - pl%ah(:, 1) = pl%ah(:, 1) + aj(:, 1) + pl%ah(:, 1) = pl%ah(:, 1) + pl%agr(:, 1) do i = 2, npl - suma(:) = suma(:) + pl%Gmass(i) * aj(:, i) / pl%eta(i) - pl%ah(:, i) = pl%ah(:, i) + aj(:, i) + suma(:) + suma(:) = suma(:) + pl%Gmass(i) * pl%agr(:, i) / pl%eta(i) + pl%ah(:, i) = pl%ah(:, i) + pl%agr(:, i) + suma(:) end do end associate @@ -53,13 +50,11 @@ module subroutine whm_gr_kick_getacch_tp(self, param) integer(I4B) :: i real(DP) :: rjmag4, beta + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, inv_c2 => param%inv_c2) - if (ntp == 0) return - do i = 1, ntp - rjmag4 = (dot_product(tp%xh(:, i), tp%xh(:, i)))**2 - beta = - tp%mu(i)**2 * inv_c2 - tp%ah(:, i) = tp%ah(:, i) + beta * tp%xh(:, i) / rjmag4 - end do + call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) + tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) end associate return @@ -83,7 +78,7 @@ module pure subroutine whm_gr_p4_pl(self, param, dt) associate(pl => self, npl => self%nbody) if (npl == 0) return - do i = 1, npl + do concurrent(i = 1:npl, pl%lmask(i)) call gr_p4_pos_kick(param, pl%xj(:, i), pl%vj(:, i), dt) end do end associate @@ -108,7 +103,7 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) associate(tp => self, ntp => self%nbody) if (ntp == 0) return - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) call gr_p4_pos_kick(param, tp%xh(:, i), tp%vh(:, i), dt) end do end associate diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 7678a5602..2da00c332 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -20,8 +20,9 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) integer(I4B) :: i real(DP), dimension(NDIM) :: ah0 + if (self%nbody == 0) return + associate(cb => system%cb, pl => self, npl => self%nbody) - if (npl == 0) return call pl%set_ir3() ah0(:) = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) @@ -80,13 +81,13 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) if (lbeg) then ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) @@ -145,7 +146,7 @@ pure subroutine whm_kick_getacch_ah1(cb, pl) real(DP), dimension(NDIM) :: ah1h, ah1j associate(npl => pl%nbody) - do i = 2, npl + do concurrent (i = 2:npl, pl%lmask(i)) ah1j(:) = pl%xj(:, i) * pl%ir3j(i) ah1h(:) = pl%xh(:, i) * pl%ir3h(i) pl%ah(:, i) = pl%ah(:, i) + cb%Gmass * (ah1j(:) - ah1h(:)) @@ -176,7 +177,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) ah2(:) = 0.0_DP ah2o(:) = 0.0_DP etaj = cb%Gmass - do i = 2, npl + do concurrent(i = 2:npl, pl%lmask(i)) etaj = etaj + pl%Gmass(i - 1) fac = pl%Gmass(i) * cb%Gmass * pl%ir3j(i) / etaj ah2(:) = ah2o + fac * pl%xj(:, i) @@ -189,7 +190,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) end subroutine whm_kick_getacch_ah2 - module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_pl(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick heliocentric velocities of massive bodies @@ -203,7 +204,6 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i @@ -223,7 +223,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) call pl%accel(system, param, t, lbeg) call pl%set_beg_end(xend = pl%xh) end if - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, pl%lmask(i)) pl%vh(:, i) = pl%vh(:, i) + pl%ah(:, i) * dt end do end associate @@ -232,7 +232,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) end subroutine whm_kick_vh_pl - module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick heliocentric velocities of test particles @@ -246,23 +246,31 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp == 0) return if (tp%lfirst) then - tp%ah(:,:) = 0.0_DP + where(tp%lmask(1:ntp)) + tp%ah(1,1:ntp) = 0.0_DP + tp%ah(2,1:ntp) = 0.0_DP + tp%ah(3,1:ntp) = 0.0_DP + end where call tp%accel(system, param, t, lbeg=.true.) tp%lfirst = .false. end if if (.not.lbeg) then - tp%ah(:,:) = 0.0_DP + where(tp%lmask(1:ntp)) + tp%ah(1,1:ntp) = 0.0_DP + tp%ah(2,1:ntp) = 0.0_DP + tp%ah(3,1:ntp) = 0.0_DP + end where call tp%accel(system, param, t, lbeg) end if - do concurrent(i = 1:ntp, mask(i)) + do concurrent(i = 1:ntp, tp%lmask(i)) tp%vh(:, i) = tp%vh(:, i) + tp%ah(:, i) * dt end do end associate diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 4cdcbc63e..0de03ec2c 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_setup_pl(self,n) + module subroutine whm_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate WHM planet structure @@ -10,10 +10,12 @@ module subroutine whm_setup_pl(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(whm_pl), intent(inout) :: self !! Swiftest test particle object - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(whm_pl), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + !> Call allocation method for parent class - call setup_pl(self, n) + call setup_pl(self, n, param) if (n <= 0) return allocate(self%eta(n)) @@ -32,24 +34,6 @@ module subroutine whm_setup_pl(self,n) end subroutine whm_setup_pl - module subroutine whm_setup_tp(self,n) - !! author: David A. Minton - !! - !! Allocate WHM test particle structure - !! - !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 - implicit none - ! Arguments - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - integer, intent(in) :: n !! Number of test particles to allocate - !> Call allocation method for parent class - call setup_tp(self, n) - if (n <= 0) return - - return - end subroutine whm_setup_tp - - module subroutine whm_util_set_mu_eta_pl(self, cb) !! author: David A. Minton !! @@ -92,7 +76,7 @@ module subroutine whm_setup_initialize_system(self, param) call self%pl%sort("ir3h", ascending=.false.) ! Make sure that the discard list gets allocated initially - call self%tp_discards%setup(self%tp%nbody) + call self%tp_discards%setup(self%tp%nbody, param) call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) if (param%lgr) then diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ee1a0c780..d194e2c02 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -48,13 +48,13 @@ module subroutine whm_step_pl(self, system, param, t, dt) associate(pl => self, cb => system%cb) dth = 0.5_DP * dt - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%kick(system, param, t, dth,lbeg=.true.) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) + call pl%drift(system, param, dt) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) - call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%kick(system, param, t + dt, dth, lbeg=.false.) end associate return @@ -84,11 +84,11 @@ module subroutine whm_step_tp(self, system, param, t, dt) class is (whm_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl) dth = 0.5_DP * dt - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, lbeg=.true.) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE)) + call tp%drift(system, param, dt) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%kick(system, param, t + dt, dth, lbeg=.false.) end associate end select diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index e8815a8ea..779480b3f 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -171,6 +171,8 @@ module subroutine whm_util_sort_rearrange_pl(self, ind) class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self)