From f0bbc818397ad477c1e1b0abc19a0e07ec2cac80 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 11:06:50 -0400 Subject: [PATCH 01/71] Started updating disruption examples with the new code and added rotation variables to cb reader --- examples/symba_energy_momentum/cb.in | 6 ++++ .../disruption_headon.in | 13 +++++++ .../disruption_off_axis.in | 13 +++++++ examples/symba_energy_momentum/escape.in | 13 +++++++ .../param.disruption_headon.in | 32 +++++++++++++++++ .../param.disruption_off_axis.in | 32 +++++++++++++++++ .../symba_energy_momentum/param.escape.in | 34 +++++++++++++++++++ examples/symba_energy_momentum/param.sun.in | 34 +++++++++++++++++++ .../param.supercatastrophic_headon.in | 32 +++++++++++++++++ .../param.supercatastrophic_off_axis.in | 32 +++++++++++++++++ examples/symba_energy_momentum/sun.in | 13 +++++++ .../supercatastrophic_headon.in | 13 +++++++ .../supercatastrophic_off_axis.in | 13 +++++++ examples/symba_energy_momentum/tp.in | 1 + src/io/io.f90 | 4 +++ 15 files changed, 285 insertions(+) create mode 100644 examples/symba_energy_momentum/cb.in create mode 100644 examples/symba_energy_momentum/disruption_headon.in create mode 100644 examples/symba_energy_momentum/disruption_off_axis.in create mode 100644 examples/symba_energy_momentum/escape.in create mode 100644 examples/symba_energy_momentum/param.disruption_headon.in create mode 100644 examples/symba_energy_momentum/param.disruption_off_axis.in create mode 100644 examples/symba_energy_momentum/param.escape.in create mode 100644 examples/symba_energy_momentum/param.sun.in create mode 100644 examples/symba_energy_momentum/param.supercatastrophic_headon.in create mode 100644 examples/symba_energy_momentum/param.supercatastrophic_off_axis.in create mode 100644 examples/symba_energy_momentum/sun.in create mode 100644 examples/symba_energy_momentum/supercatastrophic_headon.in create mode 100644 examples/symba_energy_momentum/supercatastrophic_off_axis.in create mode 100644 examples/symba_energy_momentum/tp.in diff --git a/examples/symba_energy_momentum/cb.in b/examples/symba_energy_momentum/cb.in new file mode 100644 index 000000000..467352e46 --- /dev/null +++ b/examples/symba_energy_momentum/cb.in @@ -0,0 +1,6 @@ +0 +39.47841760435743 +0.4 0.4 0.4 !Ip +0.0 0.0 0.0 !rot !11.2093063 -38.75937204 82.25088158 ! rot (radian / year) +0.0 ! J2 +0.0 ! J4 \ No newline at end of file diff --git a/examples/symba_energy_momentum/disruption_headon.in b/examples/symba_energy_momentum/disruption_headon.in new file mode 100644 index 000000000..e1a5316bc --- /dev/null +++ b/examples/symba_energy_momentum/disruption_headon.in @@ -0,0 +1,13 @@ +2 +2 1e-07 0.0009 +7e-06 +1.0 -4.20E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 6.0e4 !rot +3 7e-10 0.0004 +3.25e-06 +1.0 4.20E-05 0.0 +0.00 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1.0e5 !rot diff --git a/examples/symba_energy_momentum/disruption_off_axis.in b/examples/symba_energy_momentum/disruption_off_axis.in new file mode 100644 index 000000000..b6bc29c26 --- /dev/null +++ b/examples/symba_energy_momentum/disruption_off_axis.in @@ -0,0 +1,13 @@ +2 +2 1e-07 0.0009 +7e-06 +1.0 -4.20E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 6.0e4 !rot +3 7e-10 0.0004 +3.25e-06 +1.0 4.20E-05 0.0 +-0.80 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1.0e5 !rot diff --git a/examples/symba_energy_momentum/escape.in b/examples/symba_energy_momentum/escape.in new file mode 100644 index 000000000..b8308af87 --- /dev/null +++ b/examples/symba_energy_momentum/escape.in @@ -0,0 +1,13 @@ +2 +2 1e-07 0.0009 +7e-05 +99.9 0.0 0.0 +100.00 10.00 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1000.0 !rot +3 1e-08 0.0004 +3.25e-05 +1.0 4.20E-05 0.0 +0.00 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 0.0 !rot diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in new file mode 100644 index 000000000..de3c83bea --- /dev/null +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -0,0 +1,32 @@ +T0 0.0e0 +TSTOP 0.000100 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds +CB_IN cb.in +PL_IN disruption_headon.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.disruption_headon.dat +PARTICLE_FILE particle.disruption_headon.dat +OUT_TYPE REAL8 ! double precision real output +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e6 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.disruption_headon.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT yes ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in new file mode 100644 index 000000000..b6f29564b --- /dev/null +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -0,0 +1,32 @@ +T0 0.0e0 +TSTOP 0.000100 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds +CB_IN cb.in +PL_IN disruption_off_axis.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.disruption_off_axis.dat +PARTICLE_FILE particle.disruption_off_axis.dat +OUT_TYPE REAL8 ! double precision real output +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e6 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.disruption_off_axis.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT yes ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/param.escape.in b/examples/symba_energy_momentum/param.escape.in new file mode 100644 index 000000000..2b84eb719 --- /dev/null +++ b/examples/symba_energy_momentum/param.escape.in @@ -0,0 +1,34 @@ +T0 0.0e0 +TSTOP 1e2 ! simulation length in seconds = 100 years +DT 1.00 ! stepsize in seconds +CB_IN cb.in +PL_IN escape.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.escape.dat +PARTICLE_FILE particle.escape.dat +OUT_TYPE REAL8 ! double precision real output +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +J2 0.0 ! no J2 term +J4 0.0 ! no J4 term +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.00465047 ! check for close solar encounters in AU +CHK_RMAX 10000.0 ! discard outside of +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.escape.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT no ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/param.sun.in b/examples/symba_energy_momentum/param.sun.in new file mode 100644 index 000000000..65365b120 --- /dev/null +++ b/examples/symba_energy_momentum/param.sun.in @@ -0,0 +1,34 @@ +!Parameter file for the SyMBA-RINGMOONS test +T0 0.0 +TSTOP 3.0e-2 +DT 1e-3 +CB_IN cb.in +PL_IN sun.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.sun.dat +PARTICLE_FILE particle.sun.dat +OUT_TYPE REAL8 +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e2 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.escape.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT no ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in new file mode 100644 index 000000000..19b15de7b --- /dev/null +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -0,0 +1,32 @@ +T0 0.0e0 +TSTOP 0.000030 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds +PL_IN supercatastrophic_headon.in +CB_IN cb.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.supercatastrophic_headon.dat +PARTICLE_FILE particle.supercatastrophic_headon.dat +OUT_TYPE REAL8 ! double precision real output +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e6 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.supercatastrophic_headon.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT yes ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in new file mode 100644 index 000000000..9cd214534 --- /dev/null +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -0,0 +1,32 @@ +T0 0.0e0 +TSTOP 0.000030 ! simulation length in seconds = 100 years +DT 0.0000001 ! stepsize in seconds +CB_IN cb.in +PL_IN supercatastrophic_off_axis.in +TP_IN tp.in +IN_TYPE ASCII +ISTEP_OUT 1 ! output cadence every year +BIN_OUT bin.supercatastrophic_off_axis.dat +PARTICLE_FILE particle.supercatastrophic_off_axis.dat +OUT_TYPE REAL8 ! double precision real output +OUT_FORM XV ! osculating element output +OUT_STAT REPLACE +ISTEP_DUMP 1 ! system dump cadence +CHK_CLOSE yes ! check for planetary close encounters +CHK_RMIN 0.005 +CHK_RMAX 1e6 +CHK_EJECT -1.0 ! ignore this check +CHK_QMIN -1.0 ! ignore this check +!CHK_QMIN_COORD HELIO ! commented out here +!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here +ENC_OUT enc.supercatastrophic_off_axis.dat +EXTRA_FORCE no ! no extra user-defined forces +BIG_DISCARD no ! output all planets if anything discarded +RHILL_PRESENT yes ! Hill's sphere radii in input file +MTINY 1.0e-16 +FRAGMENTATION yes +MU2KG 1.98908e30 +TU2S 3.1556925e7 +DU2M 1.49598e11 +ENERGY yes +ROTATION yes diff --git a/examples/symba_energy_momentum/sun.in b/examples/symba_energy_momentum/sun.in new file mode 100644 index 000000000..7117d93c3 --- /dev/null +++ b/examples/symba_energy_momentum/sun.in @@ -0,0 +1,13 @@ +2 +2 2e-08 +3e-04 +5e-2 0.0 0.0 +0.00 10.00 0.0 +0.4 0.4 0.4 !Ip +100.0 100000.0 -2300.0 !rot +3 2e-08 +3e-06 +1.0 0.00E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 2300.0 !rot diff --git a/examples/symba_energy_momentum/supercatastrophic_headon.in b/examples/symba_energy_momentum/supercatastrophic_headon.in new file mode 100644 index 000000000..7b420c9a0 --- /dev/null +++ b/examples/symba_energy_momentum/supercatastrophic_headon.in @@ -0,0 +1,13 @@ +2 +2 1e-07 0.0009 +7e-06 +1.0 -4.20E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 -6.0e4 !rot +3 1e-08 0.0004 +3.25e-06 +1.0 4.20E-05 0.0 +0.00 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1.0e5 !rot diff --git a/examples/symba_energy_momentum/supercatastrophic_off_axis.in b/examples/symba_energy_momentum/supercatastrophic_off_axis.in new file mode 100644 index 000000000..a464d037e --- /dev/null +++ b/examples/symba_energy_momentum/supercatastrophic_off_axis.in @@ -0,0 +1,13 @@ +2 +2 1e-07 0.0009 +7e-06 +1.0 -4.20E-05 0.0 +0.00 6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 -6.0e4 !rot +3 1e-08 0.0004 +3.25e-06 +1.0 4.20E-05 0.0 +1.00 -6.28 0.0 +0.4 0.4 0.4 !Ip +0.0 0.0 1.0e5 !rot diff --git a/examples/symba_energy_momentum/tp.in b/examples/symba_energy_momentum/tp.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_energy_momentum/tp.in @@ -0,0 +1 @@ +0 diff --git a/src/io/io.f90 b/src/io/io.f90 index d7b899475..252f08350 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -866,6 +866,10 @@ module subroutine io_read_cb_in(self, param) read(iu, *, iostat = ierr) self%radius read(iu, *, iostat = ierr) self%j2rp2 read(iu, *, iostat = ierr) self%j4rp4 + if (param%lrotation) then + read(iu, *, iostat = ierr) self%Ip + read(iu, *, iostat = ierr) self%rot + end if else open(unit = iu, file = param%incbfile, status = 'old', form = 'UNFORMATTED', iostat = ierr) call self%read_frame(iu, param, XV, ierr) From f79e61a26232f4f3660212c40f55971f513f12b0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 12:18:41 -0400 Subject: [PATCH 02/71] Fixed initial conditions reader for rotation --- examples/symba_energy_momentum/cb.in | 9 +++++---- src/io/io.f90 | 12 +++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/symba_energy_momentum/cb.in b/examples/symba_energy_momentum/cb.in index 467352e46..d4c7fe1f7 100644 --- a/examples/symba_energy_momentum/cb.in +++ b/examples/symba_energy_momentum/cb.in @@ -1,6 +1,7 @@ 0 -39.47841760435743 -0.4 0.4 0.4 !Ip -0.0 0.0 0.0 !rot !11.2093063 -38.75937204 82.25088158 ! rot (radian / year) +39.47841760435743 ! G*Mass +0.005 ! Radius 0.0 ! J2 -0.0 ! J4 \ No newline at end of file +0.0 ! J4 +0.4 0.4 0.4 !Ip +0.0 0.0 0.0 !rot !11.2093063 -38.75937204 82.25088158 ! rot (radian / year) \ No newline at end of file diff --git a/src/io/io.f90 b/src/io/io.f90 index 2a54cab12..612e16ec0 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -794,6 +794,13 @@ module subroutine io_read_body_in(self, param) end if self%Gmass(i) = real(val, kind=DP) self%mass(i) = real(val / param%GU, kind=DP) + class is (swiftest_tp) + read(iu, *, iostat=ierr, err=100) self%id(i) + end select + 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) + select type (self) + class is (swiftest_pl) if (param%lclose) read(iu, *, iostat=ierr, err=100) self%radius(i) if (param%lrotation) then read(iu, iostat=ierr, err=100) self%Ip(:, i) @@ -803,11 +810,7 @@ module subroutine io_read_body_in(self, param) read(iu, iostat=ierr, err=100) self%k2(i) read(iu, iostat=ierr, err=100) self%Q(i) end if - class is (swiftest_tp) - read(iu, *, iostat=ierr, err=100) self%id(i) end select - 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 @@ -885,7 +888,6 @@ module subroutine io_read_cb_in(self, param) end subroutine io_read_cb_in - function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) !! author: David A. Minton From 46caf9e7f7d1d73b91c4d38207d0288ccb705696 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 12:20:09 -0400 Subject: [PATCH 03/71] Fixed order in which radius is read in --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 612e16ec0..a7d278b2b 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -794,6 +794,7 @@ module subroutine io_read_body_in(self, param) end if self%Gmass(i) = real(val, kind=DP) self%mass(i) = real(val / param%GU, kind=DP) + if (param%lclose) read(iu, *, iostat=ierr, err=100) self%radius(i) class is (swiftest_tp) read(iu, *, iostat=ierr, err=100) self%id(i) end select @@ -801,7 +802,6 @@ module subroutine io_read_body_in(self, param) read(iu, *, iostat=ierr, err=100) self%vh(1, i), self%vh(2, i), self%vh(3, i) select type (self) class is (swiftest_pl) - if (param%lclose) read(iu, *, iostat=ierr, err=100) self%radius(i) if (param%lrotation) then read(iu, iostat=ierr, err=100) self%Ip(:, i) read(iu, iostat=ierr, err=100) self%rot(:, i) From 68142e25cc359908ef5b5a033c5ab87d5fd03c7c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 12:29:48 -0400 Subject: [PATCH 04/71] Fixed reading in Ip and rot arrays --- src/io/io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index a7d278b2b..63251d013 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -803,8 +803,8 @@ module subroutine io_read_body_in(self, param) select type (self) class is (swiftest_pl) if (param%lrotation) then - read(iu, iostat=ierr, err=100) self%Ip(:, i) - read(iu, iostat=ierr, err=100) self%rot(:, i) + read(iu, iostat=ierr, err=100) self%Ip(1, i), self%Ip(2, i), self%Ip(3, i) + read(iu, iostat=ierr, err=100) self%rot(1, i), self%rot(2, i), self%rot(3, i) end if if (param%ltides) then read(iu, iostat=ierr, err=100) self%k2(i) From 67dd3aa040e3f39187ba90b68687d72db359988b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 12:33:30 -0400 Subject: [PATCH 05/71] Fixed reading in Ip and rot arrays for cb --- src/io/io.f90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 63251d013..e7c1c4a68 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -803,12 +803,12 @@ module subroutine io_read_body_in(self, param) select type (self) class is (swiftest_pl) if (param%lrotation) then - read(iu, iostat=ierr, err=100) self%Ip(1, i), self%Ip(2, i), self%Ip(3, i) - read(iu, iostat=ierr, err=100) self%rot(1, i), self%rot(2, i), self%rot(3, i) + read(iu, *, iostat=ierr, err=100) self%Ip(1, i), self%Ip(2, i), self%Ip(3, i) + read(iu, *, iostat=ierr, err=100) self%rot(1, i), self%rot(2, i), self%rot(3, i) end if if (param%ltides) then - read(iu, iostat=ierr, err=100) self%k2(i) - read(iu, iostat=ierr, err=100) self%Q(i) + read(iu, *, iostat=ierr, err=100) self%k2(i) + read(iu, *, iostat=ierr, err=100) self%Q(i) end if end select self%status(i) = ACTIVE @@ -870,8 +870,8 @@ module subroutine io_read_cb_in(self, param) read(iu, *, iostat = ierr) self%j2rp2 read(iu, *, iostat = ierr) self%j4rp4 if (param%lrotation) then - read(iu, *, iostat = ierr) self%Ip - read(iu, *, iostat = ierr) self%rot + read(iu, *, iostat = ierr) self%Ip(1), self%Ip(2), self%Ip(3) + read(iu, *, iostat = ierr) self%rot(1), self%rot(2), self%rot(3) end if else open(unit = iu, file = param%incbfile, status = 'old', form = 'UNFORMATTED', iostat = ierr) From 41510b3d1a477510b4f86c5f77472d10560a02c3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 12:34:34 -0400 Subject: [PATCH 06/71] Put id back in cb reader --- src/io/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e7c1c4a68..097c6eb5a 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -862,7 +862,7 @@ module subroutine io_read_cb_in(self, param) is_ascii = (param%in_type == 'ASCII') if (is_ascii) then open(unit = iu, file = param%incbfile, status = 'old', form = 'FORMATTED', iostat = ierr) - !read(iu, *, iostat = ierr) self%id + read(iu, *, iostat = ierr) self%id read(iu, *, iostat = ierr) val self%Gmass = real(val, kind=DP) self%mass = real(val / param%GU, kind=DP) From 9413e6127d8add650e773b0b3fea76e9fb9b538b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 16:39:40 -0400 Subject: [PATCH 07/71] Fixed inconsistent io between Python and Fortran codes --- python/swiftest/swiftest/io.py | 4 ++-- src/io/io.f90 | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index ce8b800ce..491376739 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -470,8 +470,7 @@ def swiftest_stream(f, param): npl = f.read_ints() ntp = f.read_ints() iout_form = f.read_reals('c') - #cbid = f.read_ints() - cbid = np.array([0]) + cbid = f.read_ints() Mcb = f.read_reals(np.float64) Rcb = f.read_reals(np.float64) J2cb = f.read_reals(np.float64) @@ -495,6 +494,7 @@ def swiftest_stream(f, param): p5 = f.read_reals(np.float64) p6 = f.read_reals(np.float64) Mpl = f.read_reals(np.float64) + Rhill = f.read_reals(np.float64) Rpl = f.read_reals(np.float64) if param['RHILL_PRESENT'] == 'YES': Rhill = f.read_reals(np.float64) diff --git a/src/io/io.f90 b/src/io/io.f90 index 097c6eb5a..a0dd69995 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1350,12 +1350,12 @@ module subroutine io_write_frame_body(self, iu, param) write(iu) pl%rhill(1:n) write(iu) pl%radius(1:n) if (param%lrotation) then - write(iu) pl%rot(1, 1:n) - write(iu) pl%rot(2, 1:n) - write(iu) pl%rot(3, 1:n) write(iu) pl%Ip(1, 1:n) write(iu) pl%Ip(2, 1:n) write(iu) pl%Ip(3, 1:n) + write(iu) pl%rot(1, 1:n) + write(iu) pl%rot(2, 1:n) + write(iu) pl%rot(3, 1:n) end if if (param%ltides) then write(iu) pl%k2(1:n) @@ -1389,12 +1389,12 @@ module subroutine io_write_frame_cb(self, iu, param) write(iu) cb%j2rp2 write(iu) cb%j4rp4 if (param%lrotation) then - write(iu) cb%rot(1) - write(iu) cb%rot(2) - write(iu) cb%rot(3) write(iu) cb%Ip(1) write(iu) cb%Ip(2) write(iu) cb%Ip(3) + write(iu) cb%rot(1) + write(iu) cb%rot(2) + write(iu) cb%rot(3) end if if (param%ltides) then write(iu) cb%k2 From 883f152056295736adda631786c3ea9f4c01f7c1 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 16:49:34 -0400 Subject: [PATCH 08/71] Fixed bug inolving passing a mask array from inside the tp object to spill --- .../helio_swifter_comparison/param.swifter.in | 2 +- .../param.swiftest.in | 1 + .../helio_swifter_comparison/pl.swifter.in | 48 ++++----- .../helio_swifter_comparison/pl.swiftest.in | 48 ++++----- .../swiftest_vs_swifter.ipynb | 99 ++++++------------- .../helio_swifter_comparison/tp.swifter.in | 16 +-- .../helio_swifter_comparison/tp.swiftest.in | 16 +-- examples/whm_swifter_comparison/pl.swifter.in | 48 ++++----- .../whm_swifter_comparison/pl.swiftest.in | 48 ++++----- examples/whm_swifter_comparison/tp.swifter.in | 16 +-- .../whm_swifter_comparison/tp.swiftest.in | 16 +-- src/discard/discard.f90 | 7 +- 12 files changed, 166 insertions(+), 199 deletions(-) diff --git a/examples/helio_swifter_comparison/param.swifter.in b/examples/helio_swifter_comparison/param.swifter.in index 5cf0cb8b9..417c3ab04 100644 --- a/examples/helio_swifter_comparison/param.swifter.in +++ b/examples/helio_swifter_comparison/param.swifter.in @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/helio_swifter_comparison/param.swiftest.in b/examples/helio_swifter_comparison/param.swiftest.in index 73818e198..13fdad2ec 100644 --- a/examples/helio_swifter_comparison/param.swiftest.in +++ b/examples/helio_swifter_comparison/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/helio_swifter_comparison/pl.swifter.in b/examples/helio_swifter_comparison/pl.swifter.in index e0ef4e881..7f71ec655 100644 --- a/examples/helio_swifter_comparison/pl.swifter.in +++ b/examples/helio_swifter_comparison/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751243077781048702 +1 6.5537098095653139645e-06 0.0014751244276585862212 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 -2 9.663313399581537916e-05 0.006759104275397271956 +-0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 +-7.636449781071190374 -8.230711833761744002 0.027897889786567415562 +2 9.663313399581537916e-05 0.006759070712609563929 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 -3 0.000120026935827952453094 0.010044787321379672528 +-0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 +4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 +3 0.000120026935827952453094 0.01004490423927810557 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 -4 1.2739802010675941456e-05 0.007246743835971885302 +0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 +4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 +4 1.2739802010675941456e-05 0.0072466832516755644343 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 -5 0.037692251088985676735 0.35527126534549128905 +-1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 +-1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 +5 0.037692251088985676735 0.35527077279847234866 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 -6 0.011285899820091272997 0.4376527512949726007 +4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 +1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 +6 0.011285899820091272997 0.43765804755160246957 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 -7 0.0017236589478267730203 0.4695362423191493196 +6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 +1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 +7 0.0017236589478267730203 0.46959835521706382437 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 -8 0.0020336100526728302319 0.7812870996943599397 +14.795764797253550427 13.071447820107550797 -0.14316267052797140846 +-0.9602974676407360823 1.012024061970291078 0.016146735322636888151 +8 0.0020336100526728302319 0.7813622435281695686 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 +0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 diff --git a/examples/helio_swifter_comparison/pl.swiftest.in b/examples/helio_swifter_comparison/pl.swiftest.in index 9d49cc3da..06c393c46 100644 --- a/examples/helio_swifter_comparison/pl.swiftest.in +++ b/examples/helio_swifter_comparison/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 +1 6.5537098095653139645e-06 0.0014751244276585862212 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 -2 9.663313399581537916e-05 +-0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 +-7.636449781071190374 -8.230711833761744002 0.027897889786567415562 +2 9.663313399581537916e-05 0.006759070712609563929 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 -3 0.000120026935827952453094 +-0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 +4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 +3 0.000120026935827952453094 0.01004490423927810557 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 -4 1.2739802010675941456e-05 +0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 +4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 +4 1.2739802010675941456e-05 0.0072466832516755644343 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 -5 0.037692251088985676735 +-1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 +-1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 +5 0.037692251088985676735 0.35527077279847234866 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 -6 0.011285899820091272997 +4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 +1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 +6 0.011285899820091272997 0.43765804755160246957 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 -7 0.0017236589478267730203 +6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 +1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 +7 0.0017236589478267730203 0.46959835521706382437 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 -8 0.0020336100526728302319 +14.795764797253550427 13.071447820107550797 -0.14316267052797140846 +-0.9602974676407360823 1.012024061970291078 0.016146735322636888151 +8 0.0020336100526728302319 0.7813622435281695686 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 +0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 9a4c22cb1..22e1403d8 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -42,11 +42,24 @@ "name": "stdout", "output_type": "stream", "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.000e+00\n", - "Creating Dataset\n", - "Successfully converted 1462 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" + "Reading Swiftest file param.swiftest.in\n" + ] + }, + { + "ename": "ValueError", + "evalue": "all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 4 and the array at index 5 has size 1", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\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 609\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcbid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclab\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 610\u001b[0m \u001b[0mnpl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplab\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 611\u001b[0;31m \u001b[0mntp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtlab\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mswiftest_stream\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\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[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 612\u001b[0m \u001b[0;31m# Prepare frames by adding an extra axis for the time coordinate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0mcbframe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\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;36mswiftest_stream\u001b[0;34m(f, param)\u001b[0m\n\u001b[1;32m 526\u001b[0m \u001b[0mplid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 527\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mntp\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 528\u001b[0;31m \u001b[0mtvec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt6\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 529\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mtvec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\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<__array_function__ internals>\u001b[0m in \u001b[0;36mvstack\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.7/site-packages/numpy/core/shape_base.py\u001b[0m in \u001b[0;36mvstack\u001b[0;34m(tup)\u001b[0m\n\u001b[1;32m 281\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\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 282\u001b[0m \u001b[0marrs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 283\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_nx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\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 284\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mconcatenate\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 4 and the array at index 5 has size 1" ] } ], @@ -57,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -75,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -85,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -95,22 +108,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAElCAYAAADDUxRwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAiXUlEQVR4nO3dfbxVZZ338c+3A4QKigrIwwFBQwFREQjUzNQGBswyFBtRS80iTZsa9VaqmUznnrSa8iEthsyn7JYcK0XDJ0BvC2UUBVQkEhHjCAiixJMEHH73H2vhvT3tc84+e6/zsNnf9+t1Xuy91rWu9Vug+3uutde6liICMzOzUn2otQswM7PdgwPFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDHLQ9J3Jd2dvu4raZOkqiL6mSLp37Kv0KztcaDYbknSckn/UGfZeZL+2NS+IuIvEdEpImqL2PbCiPj3QtpKukPS/27qPrJS7N+P2S4OFLMKIKnd7rAPa9scKFaxJPWS9BtJayW9Lumf62nXT1Ls+sBMt5su6R1JSyV9uYF9vD/qkHSCpBpJl0laI2mVpPPTdZOAs4Er0tNrDzZWo6Q9JN0p6V1JiyVdIakmZ/1ySVdKehHYLKmdpMmSXpO0UdIrksanbQcBU4Bj0v2vT5fvI+mudP9vSPpXSR9K150naY6k6yW9A3y32H8L2z34NwqrSOmH4oPAA8BEoBqYKWlJRDzayOb3AIuAXsBA4HFJyyJiVgG77gHsA/QGRgP3Sbo/IqZKOhaoiYh/LbDGq4B+wEHAXsCMPPubCHwKeDsidkh6Dfg4sBo4A7hb0kciYrGkC4EvRcRxOdv/JK33IGB/4DFgFfCLdP0oYBrQHWhfwPHbbswjFNud3S9p/a4f4Kc56z4KdIuIayJiW0QsA34OnNlQh5L6AMcBV0bE1ohYANwKfL7AmrYD10TE9oiYAWwCDq2nbWM1fg74XkS8GxE1wE15+rgpIlZExHsAEfHfEbEyInZGxK+BV4GR9RxrFfBPwDcjYmNELAd+VOdYV0bETyJix659WOXyCMV2Z5+NiJm73kg6D/hS+vZAoNeuUzupKuAPjfTZC3gnIjbmLHsDGFFgTesiYkfO+y1Ap3raNlZjL2BFzrrc13mXSfoCcCnJyIZ0313r2X9XoAPJ8e3yBsnoqqF9WoVyoFilWgG8HhEDmrjdSmA/SZ1zQqUv8GYGNdWd+ruxGleRnAZ7JX3fp6E+JR1IMsL5JPBMRNRKWgConv2/TTKiOjBnH3WP1dOV2/t8yssq1bPAhvRL6z0kVUkaIumjDW0UESuAp4FrJXWUdARwAfCrDGp6i+S7ikJrvBf4pqR9JfUGLmmk/71IAmAtQHpBwJA6+6+W1AEgvUz6XuA/JHVOA+lS4O7SDtN2Vw4Uq0jph+WngaHA6yS/jd9K8gV0YyaSnDJaCfwOuCoiHs+grF8Ag9PvfO4voMZrgJp03UzgPuBv9XUeEa+QfAfyDEl4HA7MyWkym+Rig9WS3k6XfQ3YDCwD/gj8H+C2Ug/Udk/yA7bMdg+SLgLOjIhPtHYtVpk8QjErU5J6SvqYpA9JOhS4jGTEZNYq/KW8WfnqAPwX0B9YT3I/yE8b2sCsOfmUl5mZZcKnvMzMLBMOFLMmyDeL8e6i7pxlZk3lQDGrI/1Q3ZxOkvimpB+riGehZFDDR1pyn2alcqCY5XdkRHQiuav8LKDeGYXNLOFAMWtARPyJZO6sIXXXSRop6Zn0RsRVkm7edZd5uj4kXSjp1XSK+VskKWf9F9Np59+V9Gh6JzqSnkqbLExHSf8kqaukh9J9vSPpD7umkc9T17GSnpP01/TPY3PWPSnp39Np5zdKekzS383lJekMSc/XWXaZpPub9jdolcSBYtYASYNJpnufn2d1LfAvJJMoHkMymvlqnTankMwafCTJ7MD/mPb7WeBbwGlAN5LQugcgIo5Ptz0yfVLkr0nuMalJ2x6Qbvt3l2hK2g/4PcnMw/sDPwZ+L2n/nGZnAeeTTDnfAbg8z7FNB/qnz0nZ5Rzgl3namgEOFLP6vCDpXZLnkdwK3F63QUQ8HxFz06nbl5PcE1L3LvXrImJ9RPwFeIJkGhWArwDXRsTidPbh7wFDd41S8tgO9AQOTKe+/0Pkv+b/U8CrEfHLtK57gD+RTOGyy+0R8ed0uvl7c2rKPba/Ab8mCREkHUYy3cxD9dRn5kAxq8ewiNg3Ig6OiH+NiJ11G0g6JD0NtVrSBpJQqHv6aHXO69yp6g8Ebsx5Vss7JLP+9ia/HwJLgcckLZM0uZ52vfjgdPPw91PO11dTXXcCZ6Wn6T4P3JsGjVleDhSz4v2M5Lf/ARGxN8lpKDW8yftWAF+JiC45P3tExNP5GqcPuLosIg4iGW1cKumTeZquJAmrXEVNrx8Rc4FtJKf8zsKnu6wRDhSz4nUGNgCbJA0ELmrCtlNIpp4/DN5/dvsZOes/MJW9pFMkfSQdLWwg+f6mNk+/M4BDJJ2l5Bny/wQMpvhTVXcBNwM7IuKPRfZhFcKBYla8y0l+c99I8uCqXxe6YUT8Dvg+MC09XfYyMC6nyXeBO9NTYp8DBpBMUb+JZPr5n0bEk3n6XUdyIcBlwDrgCuCUiHi7btsC/ZLkCjePTqxRnsvLzOolaQ9gDcl3Sq+2dj3WtnmEYmYNuQh4zmFihfCcPWaWl6TlJBcZfLZ1K7Fy4VNeZmaWCZ/yMjOzTFT0Ka+uXbtGv379WrsMM7Oy8vzzz78dEd3qLq/oQOnXrx/z5s1r7TLMzMqKpLqzMQA+5WVmZhlxoJiZWSYcKGZmlomK/g7FzKw1bN++nZqaGrZu3drapTSoY8eOVFdX0759+4LaO1DMzFpYTU0NnTt3pl+/fuQ8xLNNiQjWrVtHTU0N/fv3L2gbn/IyM2thW7duZf/992+zYQIgif33379JoygHiplZK2jLYbJLU2t0oJiZWSYcKGZmZerYY4/Nu/y8887jvvvua+FqHChmZmXr6afzPjG61fgqLzOzMtWpUyc2bdpERPC1r32N2bNn079/f1prFnmPUMzMytzvfvc7lixZwksvvcTPf/7zVhu5OFDMzMrcU089xcSJE6mqqqJXr16cdNJJrVKHA8XMbDfQFi5DdqCYmZW5448/nmnTplFbW8uqVat44oknWqUOfylvZlbmxo8fz+zZszn88MM55JBD+MQnPtEqdThQzMzK1KZNm4DkdNfNN9/cytX4lJeZmWXEgWJmZplwoJiZWSYcKGZmlgkHipmZZcKBYmZmmXCgmJlVqC9+8Yt0796dIUOGZNKfA8XMrEKdd955PPLII5n116YCRdJYSUskLZU0Oc96SbopXf+ipGF11ldJmi/poZar2sysPB1//PHst99+mfXXZu6Ul1QF3AKMBmqA5yRNj4hXcpqNAwakP6OAn6V/7vJ1YDGwd4sUbWZWoqsfXMQrKzdk2ufgXntz1acPy7TPQrSlEcpIYGlELIuIbcA04NQ6bU4F7orEXKCLpJ4AkqqBTwG3tmTRZmaWaDMjFKA3sCLnfQ0fHH3U16Y3sAq4AbgC6NzQTiRNAiYB9O3bt6SCzcxK1RojiebSlkYo+Sbzr/scy7xtJJ0CrImI5xvbSURMjYgRETGiW7duxdRpZmZ5tKVAqQH65LyvBlYW2OZjwGckLSc5VXaSpLubr1Qzs/I3ceJEjjnmGJYsWUJ1dTW/+MUvSuqvLZ3yeg4YIKk/8CZwJnBWnTbTgUskTSM5HfbXiFgFfDP9QdIJwOURcU4L1W1mVpbuueeeTPtrM4ESETskXQI8ClQBt0XEIkkXpuunADOAk4GlwBbg/Naq18zMPqjNBApARMwgCY3cZVNyXgdwcSN9PAk82QzlmZlZA9rSdyhmZlbGHChmZpYJB4qZmWXCgWJmZplwoJiZVaAVK1Zw4oknMmjQIA477DBuvPHGkvtsU1d5mZlZy2jXrh0/+tGPGDZsGBs3bmT48OGMHj2awYMHF92nRyhmZhWoZ8+eDBuWPAGkc+fODBo0iDfffLOkPj1CMTNrTQ9PhtUvZdtnj8Nh3HUFN1++fDnz589n1Ki68/E2jUcoZmYVbNOmTZx++unccMMN7L13aY+S8gjFzKw1NWEkkbXt27dz+umnc/bZZ3PaaaeV3J9HKGZmFSgiuOCCCxg0aBCXXnppJn06UMzMKtCcOXP45S9/yezZsxk6dChDhw5lxowZjW/YAJ/yMjOrQMcddxzJfLvZ8QjFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDEzs0w4UMzMKtDWrVsZOXIkRx55JIcddhhXXXVVyX36PhQzswr04Q9/mNmzZ9OpUye2b9/Occcdx7hx4zj66KOL7tMjFDOzCiSJTp06AcmcXtu3b0dSSX16hGJm1oq+/+z3+dM7f8q0z4H7DeTKkVc22q62tpbhw4ezdOlSLr74Yk9fb2ZmxamqqmLBggXU1NTw7LPP8vLLL5fUn0coZmatqJCRRHPr0qULJ5xwAo888ghDhgwpuh+PUMzMKtDatWtZv349AO+99x4zZ85k4MCBJfXpEYqZWQVatWoV5557LrW1tezcuZPPfe5znHLKKSX16UAxM6tARxxxBPPnz8+0T5/yMjOzTDhQzMwsE20qUCSNlbRE0lJJk/Osl6Sb0vUvShqWLu8j6QlJiyUtkvT1lq/ezKyytZlAkVQF3AKMAwYDEyUNrtNsHDAg/ZkE/CxdvgO4LCIGAUcDF+fZ1szMmlGbCRRgJLA0IpZFxDZgGnBqnTanAndFYi7QRVLPiFgVES8ARMRGYDHQuyWLNzOrdG0pUHoDK3Le1/D3odBoG0n9gKOA/8m+RDMzq09bCpR8s5JFU9pI6gT8BvhGRGzIuxNpkqR5kuatXbu26GLNzHYHtbW1HHXUUSXfgwIF3IciqW+Bfa2v70O8QDVAn5z31cDKQttIak8SJr+KiN/Wt5OImApMBRgxYkTdwDIzqyg33ngjgwYNYsOGUj6+E4Xc2HgnySigoXmNA7gDuKuEWp4DBkjqD7wJnAmcVafNdOASSdOAUcBfI2KVkjmXfwEsjogfl1CDmVnFqKmp4fe//z3f/va3+fGPS//obDRQIuLEussk9YiI1SXv/YP72SHpEuBRoAq4LSIWSbowXT8FmAGcDCwFtgDnp5t/DPg88JKkBemyb0XEjCxrNDPL2urvfY+/Lc52+voPDxpIj299q9F23/jGN/jBD37Axo0bM9lvsVOvfAH4QSYV5EgDYEadZVNyXgdwcZ7t/kjDIygzM8vx0EMP0b17d4YPH86TTz6ZSZ/FBsqpkrYAj0fEkkwqMTOrQIWMJJrDnDlzmD59OjNmzGDr1q1s2LCBc845h7vvvrvoPou9yus0ktNO4yXdWvTezcysVVx77bXU1NSwfPlypk2bxkknnVRSmECRI5SIeAt4JP0xMzMrboQi6RZJd6Svx2RakZmZtagTTjiBhx56qOR+ij3ltQ1Ylr4+qeQqzMys7BUbKFuAfdKbCQu98dHMzHZjxV7l9Q7wHsnswHOyK8fMzMpVk0YokrpIuh04PV10FzAi86rMzKzsNGmEEhHrJV0H9APeBo4A6p03y8zMKkcxp7wuAF6PiEeB5zOux8zMylQxgfIucKGkQ4GFwIKImJ9tWWZm1tz69etH586dqaqqol27dsybN6+k/pocKBFxraRZwJ+BocDxgAPFzKwMPfHEE3Tt2jWTvpocKJKuIZkNeAHJ6OTJTCoxM7OyVswI5TuSDiB5zO7pkg6OiC9nX5qZ2e7vD/f+mbdXbMq0z659OvHxzx3SaDtJjBkzBkl85StfYdKkSSXtt9j7UL4C/FdEeC4vM7MyNWfOHHr16sWaNWsYPXo0AwcO5Pjjjy+6v2ID5TbgIkl7kTxyd0HRFZiZVbBCRhLNpVevXgB0796d8ePH8+yzz5YUKMVOvfLPJGHUDrip6L2bmVmr2Lx58/tPaty8eTOPPfYYQ4YMKanPYkcorwEDgAci4l9KqsDMzFrcW2+9xfjx4wHYsWMHZ511FmPHji2pz2IDZRGwArhA0g8j4qMlVWFmZi3qoIMOYuHChZn2WWygHAKsBaaS3OhoZmYVrtjvUAaS3Mx4OVDadWZmZrZbKDZQugBXAlcAWzOrxszMylaxp7yuAQZGxBJJO7MsyMzMylNBIxRJVZJWSfoSQETURMTM9PXk5izQzMzKQ0GBEhG1wMvAwc1bjpmZlaumfIeyJ3CFpHmSpqc/DzRXYWZm1rzWr1/PhAkTGDhwIIMGDeKZZ54pqb+mfIdyTPrnsPQHIErau5mZtZqvf/3rjB07lvvuu49t27axZcuWkvprSqD0L2lPZmbWZmzYsIGnnnqKO+64A4AOHTrQoUOHkvosOFAi4o2S9mRmZn/niTumsuaNZZn22f3AgzjxvIZvEVy2bBndunXj/PPPZ+HChQwfPpwbb7yRvfbaq+j9FnsfipmZlbEdO3bwwgsvcNFFFzF//nz22msvrrvuupL6LPY+FDMzy0BjI4nmUl1dTXV1NaNGjQJgwoQJJQdKk0cokj5d0h4b7nuspCWSlkr6u/tblLgpXf+ipGGFbmtmZv9fjx496NOnD0uWLAFg1qxZDB48uKQ+ixmh/AfwYEl7zUNSFXALMBqoAZ6TND0iXslpNo5k2vwBwCjgZ8CoArc1M7McP/nJTzj77LPZtm0bBx10ELfffntJ/RUTKCppj/UbCSyNiGUAkqYBpwK5oXAqcFdEBDBXUhdJPYF+BWybmTsu+x7vdWjfHF2bWQUY/umPs6ZmdavW0L5KDB06lHnz5mXWZzGB0lz3nvQmecbKLjUko5DG2vQucFsAJE0inSG5b9++RRW6U1W81662qG3NzEKwU617G1/szH7/belL+Xwjn7pHXF+bQrZNFkZMJXmOCyNGjCjqb/SL/3llMZuZmQGwePFievTu2dplZK4tBUoN0CfnfTWwssA2HQrY1szMmlEx96G8lXkVieeAAZL6S+oAnAlMr9NmOvCF9Gqvo4G/RsSqArc1M7Nm1OQRSkSMbo5CImKHpEuAR4Eq4LaIWCTpwnT9FGAGcDKwFNgCnN/Qts1Rp5mZ5deWTnkRETNIQiN32ZSc1wFcXOi2ZmbWcjz1iplZBVqyZAlDhw59/2fvvffmhhtuKKnPokYoki6NiB+nrw+NiCUlVWFmZi3q0EMPZcGCBQDU1tbSu3dvxo8fX1KfTQoUSV2A64GBkrYCLwIXkH6XYWZm5WfWrFkcfPDBHHjggSX106RAiYj1wPmSPgWsBsYAvy2pAjOzCrb+wdfYtnJzpn126LUXXT5d+BPbp02bxsSJE0veb7HfoXyC5PLho0nmzzIzszK0bds2pk+fzhlnnFFyX8Ve5dUFuBK4guSUl5mZFaEpI4nm8PDDDzNs2DAOOOCAkvsqNlCuAQZGxBJJO0uuwszMWsU999yTyekuKPKUV0TURMTM9LWfPWJmVoa2bNnC448/zmmnnZZJf0UFiqRbJN2Rvh6TSSVmZtai9txzT9atW8c+++yTSX/Ffim/DViWvj4pk0rMzKysFRsoW4B9JLUHinuoiJmZ7VaK/VL+HeA9ksfuzsmuHDMzK1dNGqGkj9y9HTg9XXQXMCLzqszMrOw0+U55SdeRPMP9beAIfKe8mZlR3CmvC4DXI+JR4PmM6zEzszJVzJfy7wIXSrpB0vmSjsq6KDMza37XX389hx12GEOGDGHixIls3bq1pP6aHCgRcS3wZeC7wOvA8SVVYGZmLe7NN9/kpptuYt68ebz88svU1tYybdq0kvps8ikvSdeQPGZ3AbAgIp4sqQIzM2sVO3bs4L333qN9+/Zs2bKFXr16ldRfMc+U/46k75CMbk6XdHBEfLmkKszMKtTDDz/M6tWrM+2zR48ejBs3rsE2vXv35vLLL6dv377ssccejBkzhjFjSpv4pNgbG28DBgH7Az8tqQIzM2tx7777Lg888ACvv/46K1euZPPmzdx9990l9VnsjY3/TDL9SjvgRvw9iplZURobSTSXmTNn0r9/f7p16wbAaaedxtNPP80555xTdJ/FjlBeAzoCD0SEw8TMrMz07duXuXPnsmXLFiKCWbNmMWjQoJL6LDZQFgGzgQskPVdSBWZm1uJGjRrFhAkTGDZsGIcffjg7d+5k0qRJJfVZ7Cmvg0nuR5ma/mlmZmXm6quv5uqrr86sv2IDZUVEzJbUE1iTWTVmZla2ij3lNVZSNTAFuD7DeszMrEwVGyhdgCuBK4C/ZVaNmVmFiIjWLqFRTa2x2EC5huQKryVAbZF9mJlVpI4dO7Ju3bo2HSoRwbp16+jYsWPB2xT0HYqkKqAG+LeIuDUiatL3RMTkYoo1M6tU1dXV1NTUsHbt2tYupUEdO3akurq64PYFBUpE1Ep6meTqLjMzK0H79u3p379/a5eRuaac8toTuELSPEnT058HsihC0n6SHpf0avrnvvW0GytpiaSlkibnLP+hpD9JelHS7yR1yaIuMzMrXFMC5RhAwDDglJyfLEwGZkXEAGBW+v4D0tNutwDjgMHAREmD09WPA0Mi4gjgz8A3M6rLzMwK1JT7UJpzfHYqcEL6+k7gSZKryHKNBJZGxDIASdPS7V6JiMdy2s0FJjRjrWZmlkejgSKpb/oy7+UIOevXR8SGIus4ICJWAUTEKknd87TpDazIeV8DjMrT7ovAr4usw8zMilTICOVOkjBRA20CuAO4q74GkmYCPfKs+nYBNVDP/j8QcpK+DewAftVAHZOASZBMjmZmZtloNFAi4sQsdhQR/1DfOklvSeqZjk7qm86lBuiT874aWJnTx7kk3+l8Mhq4uDsippLMQcaIESPa7kXgZmZlptgbG7M2HTg3fX0ukO/qseeAAZL6S+oAnJluh6SxJN+5fCYitrRAvWZmVkdbCZTrgNGSXgVGp++R1EvSDICI2AFcAjwKLAbujYhF6fY3A52BxyUtkDSlpQ/AzKzSFTvbcKYiYh3wyTzLVwIn57yfAczI0+4jzVqgmZk1qq2MUMzMrMw5UMzMLBMOFDMzy4QDxczMMuFAMTOzTDhQzMwsEw4UMzPLhAPFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDEzs0w4UMzMLBMOFDMzy4QDxczMMuFAMTOzTDhQzMwsEw4UMzPLhAPFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDEzs0w4UMzMLBMOFDMzy4QDxczMMuFAMTOzTDhQzMwsEw4UMzPLRJsIFEn7SXpc0qvpn/vW026spCWSlkqanGf95ZJCUtfmr9rMzHK1iUABJgOzImIAMCt9/wGSqoBbgHHAYGCipME56/sAo4G/tEjFZmb2AW0lUE4F7kxf3wl8Nk+bkcDSiFgWEduAael2u1wPXAFEM9ZpZmb1aCuBckBErAJI/+yep01vYEXO+5p0GZI+A7wZEQsb25GkSZLmSZq3du3a0is3MzMA2rXUjiTNBHrkWfXtQrvIsywk7Zn2MaaQTiJiKjAVYMSIER7NmJllpMUCJSL+ob51kt6S1DMiVknqCazJ06wG6JPzvhpYCRwM9AcWStq1/AVJIyNidWYHYGZmDWorp7ymA+emr88FHsjT5jlggKT+kjoAZwLTI+KliOgeEf0ioh9J8AxzmJiZtay2EijXAaMlvUpypdZ1AJJ6SZoBEBE7gEuAR4HFwL0RsaiV6jUzszpa7JRXQyJiHfDJPMtXAifnvJ8BzGikr35Z12dmZo1rKyMUMzMrcw4UMzPLhAPFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDEzs0w4UMzMLBMOFDMzy4QDxczMMuFAMTOzTDhQzMwsEw4UMzPLhAPFzMwy4UAxM7NMOFDMzCwTDhQzM8uEA8XMzDLhQDEzs0w4UMzMLBMOFDMzy4QDxczMMuFAMTOzTCgiWruGViNpLfBGkZt3Bd7OsJxy4GOuDD7mylDKMR8YEd3qLqzoQCmFpHkRMaK162hJPubK4GOuDM1xzD7lZWZmmXCgmJlZJhwoxZva2gW0Ah9zZfAxV4bMj9nfoZiZWSY8QjEzs0w4UMzMLBMOlEZIGitpiaSlkibnWS9JN6XrX5Q0rDXqzFIBx3x2eqwvSnpa0pGtUWeWGjvmnHYflVQraUJL1pe1Qo5X0gmSFkhaJOn/tnSNWSvgv+t9JD0oaWF6zOe3Rp1ZknSbpDWSXq5nfbafXxHhn3p+gCrgNeAgoAOwEBhcp83JwMOAgKOB/2ntulvgmI8F9k1fj6uEY85pNxuYAUxo7bqb+d+4C/AK0Dd93721626BY/4W8P30dTfgHaBDa9de4nEfDwwDXq5nfaafXx6hNGwksDQilkXENmAacGqdNqcCd0ViLtBFUs+WLjRDjR5zRDwdEe+mb+cC1S1cY9YK+XcG+BrwG2BNSxbXDAo53rOA30bEXwAiohKOOYDOkgR0IgmUHS1bZrYi4imS46hPpp9fDpSG9QZW5LyvSZc1tU05aerxXEDyG045a/SYJfUGxgNTWrCu5lLIv/EhwL6SnpT0vKQvtFh1zaOQY74ZGASsBF4Cvh4RO1umvFaT6edXu5LL2b0pz7K611kX0qacFHw8kk4kCZTjmrWi5lfIMd8AXBkRtckvsGWtkONtBwwHPgnsATwjaW5E/Lm5i2smhRzzPwILgJOAg4HHJf0hIjY0c22tKdPPLwdKw2qAPjnvq0l+e2lqm3JS0PFIOgK4FRgXEetaqLbmUsgxjwCmpWHSFThZ0o6IuL9FKsxWof9dvx0Rm4HNkp4CjgTKNVAKOebzgesi+XJhqaTXgYHAsy1TYqvI9PPLp7wa9hwwQFJ/SR2AM4HpddpMB76QXi1xNPDXiFjV0oVmqNFjltQX+C3w+TL+jTVXo8ccEf0jol9E9APuA75apmEChf13/QDwcUntJO0JjAIWt3CdWSrkmP9CMiJD0gHAocCyFq2y5WX6+eURSgMiYoekS4BHSa4SuS0iFkm6MF0/heSKn5OBpcAWkt9yylaBx/wdYH/gp+lv7DuijGdqLfCYdxuFHG9ELJb0CPAisBO4NSLyXnpaDgr8N/534A5JL5GcCroyIsp6SntJ9wAnAF0l1QBXAe2heT6/PPWKmZllwqe8zMwsEw4UMzPLhAPFzMwy4UAxM7NMOFDMzCwTDhSzjEjqIumrOe97Sbqvmfb1WUnfaaTNf0o6qTn2b5aPLxs2y4ikfsBDETGkBfb1NPCZhu6TkHQg8POIGNPc9ZiBRyhmWboOODh9hsgPJfXb9RwKSedJuj993sbrki6RdKmk+ZLmStovbXewpEfSCRn/IGlg3Z1IOgT4W0S8Lalz2l/7dN3ekpZLah8RbwD7S+rRgn8HVsEcKGbZmQy8FhFDI+J/5Vk/hGRa+JHAfwBbIuIo4Blg12y+U4GvRcRw4HLgp3n6+RjwAkBEbASeBD6VrjsT+E1EbE/fv5C2N2t2nnrFrOU8kQbARkl/BR5Ml78EHCGpE8nDy/47Z0bjD+fppyewNuf9rcAVwP0kU2d8OWfdGqBXVgdg1hAHilnL+VvO650573eS/L/4IWB9RAxtpJ/3gH12vYmIOenptU8AVXXm3OqYtjdrdj7lZZadjUDnYjdOn7vxuqQz4P3nfR+Zp+li4CN1lt0F3APcXmf5IUDZTupo5cWBYpaR9LkwcyS9LOmHRXZzNnCBpIXAIvI/ivgp4Ch98ElfvwL2JQkVANIv6j8CzCuyFrMm8WXDZmVI0o3AgxExM30/ATg1Ij6f02Y8MCwi/q2VyrQK4+9QzMrT90geeoWknwDjSJ5rkasd8KMWrssqmEcoZmaWCX+HYmZmmXCgmJlZJhwoZmaWCQeKmZllwoFiZmaZ+H+yd8uFZ3nA5gAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['dr'].sel(id=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -122,22 +122,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['dr'].sel(id=tpidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -148,22 +135,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['dv'].sel(id=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -174,22 +148,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['dv'].sel(id=tpidx).plot.line(x=\"time (y)\", ax=ax)\n", diff --git a/examples/helio_swifter_comparison/tp.swifter.in b/examples/helio_swifter_comparison/tp.swifter.in index b37f04011..e91b52c9c 100644 --- a/examples/helio_swifter_comparison/tp.swifter.in +++ b/examples/helio_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 --2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 +2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 +-2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 102 -3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 -0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 +3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 +0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 103 --0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 -3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 +-0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 +3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 104 --2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 -1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 +-1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 +2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 diff --git a/examples/helio_swifter_comparison/tp.swiftest.in b/examples/helio_swifter_comparison/tp.swiftest.in index b37f04011..e91b52c9c 100644 --- a/examples/helio_swifter_comparison/tp.swiftest.in +++ b/examples/helio_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 --2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 +2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 +-2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 102 -3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 -0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 +3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 +0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 103 --0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 -3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 +-0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 +3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 104 --2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 -1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 +-1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 +2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 diff --git a/examples/whm_swifter_comparison/pl.swifter.in b/examples/whm_swifter_comparison/pl.swifter.in index 946ff123b..7f71ec655 100644 --- a/examples/whm_swifter_comparison/pl.swifter.in +++ b/examples/whm_swifter_comparison/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751242768086609319 +1 6.5537098095653139645e-06 0.0014751244276585862212 1.6306381826061645943e-05 --0.21794225400065470044 0.24570059548519398995 0.040069659678364698274 --9.768342370075118952 -6.4098488749322373205 0.37225116289830816995 -2 9.663313399581537916e-05 0.0067590742435367571566 +-0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 +-7.636449781071190374 -8.230711833761744002 0.027897889786567415562 +2 9.663313399581537916e-05 0.006759070712609563929 4.0453784346544178454e-05 --0.60413504586259936247 -0.39527613440541492507 0.029436881824798030033 -3.992938767473374092 -6.2169034295501688922 -0.3157349287333398891 -3 0.000120026935827952453094 0.010044891628501106769 +-0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 +4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 +3 0.000120026935827952453094 0.01004490423927810557 4.25875607065040958e-05 -0.6475137988388671717 -0.78146344078682306034 3.4954277703126252982e-05 -4.7364737841481480227 3.9858178826605781494 -0.000206181980282845843 -4 1.2739802010675941456e-05 0.0072466933032545104062 +0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 +4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 +4 1.2739802010675941456e-05 0.0072466832516755644343 2.265740805092889601e-05 --1.6060166552595489531 0.43262604649099911658 0.048461907252935247647 --1.1388942318608360441 -4.4988235352611598648 -0.066344559364066134143 -5 0.037692251088985676735 0.3552707368190505097 +-1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 +-1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 +5 0.037692251088985676735 0.35527077279847234866 0.00046732617030490929307 -4.1359946230316175786 -2.8610749953481979801 -0.08065244615734604161 -1.536603427793050461 2.399023353553466048 -0.044342472584791124157 -6 0.011285899820091272997 0.4376572328164372643 +4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 +1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 +6 0.011285899820091272997 0.43765804755160246957 0.00038925687730393611812 -6.3788284394924916754 -7.635463758938534795 -0.121111501730720202974 -1.4521392831727842248 1.3041738917825064364 -0.08044788317293871613 -7 0.0017236589478267730203 0.46959013246222981483 +6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 +1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 +7 0.0017236589478267730203 0.46959835521706382437 0.00016953449859497231466 -14.803649648126269156 13.063133279359290029 -0.14329526741228329478 --0.9596636872292902537 1.0125665712568530355 0.016140607193432704789 -8 0.0020336100526728302319 0.78135207839715916734 +14.795764797253550427 13.071447820107550797 -0.14316267052797140846 +-0.9602974676407360823 1.012024061970291078 0.016146735322636888151 +8 0.0020336100526728302319 0.7813622435281695686 0.000164587904124493665 -29.566779964594630314 -4.5668176855665958414 -0.58741108465859714904 -0.16916723445783939828 1.142713652049310879 -0.027397346380668001207 +29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 +0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 diff --git a/examples/whm_swifter_comparison/pl.swiftest.in b/examples/whm_swifter_comparison/pl.swiftest.in index c13f0640d..06c393c46 100644 --- a/examples/whm_swifter_comparison/pl.swiftest.in +++ b/examples/whm_swifter_comparison/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 0.0014751242768086609319 +1 6.5537098095653139645e-06 0.0014751244276585862212 1.6306381826061645943e-05 --0.21794225400065470044 0.24570059548519398995 0.040069659678364698274 --9.768342370075118952 -6.4098488749322373205 0.37225116289830816995 -2 9.663313399581537916e-05 0.0067590742435367571566 +-0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 +-7.636449781071190374 -8.230711833761744002 0.027897889786567415562 +2 9.663313399581537916e-05 0.006759070712609563929 4.0453784346544178454e-05 --0.60413504586259936247 -0.39527613440541492507 0.029436881824798030033 -3.992938767473374092 -6.2169034295501688922 -0.3157349287333398891 -3 0.000120026935827952453094 0.010044891628501106769 +-0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 +4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 +3 0.000120026935827952453094 0.01004490423927810557 4.25875607065040958e-05 -0.6475137988388671717 -0.78146344078682306034 3.4954277703126252982e-05 -4.7364737841481480227 3.9858178826605781494 -0.000206181980282845843 -4 1.2739802010675941456e-05 0.0072466933032545104062 +0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 +4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 +4 1.2739802010675941456e-05 0.0072466832516755644343 2.265740805092889601e-05 --1.6060166552595489531 0.43262604649099911658 0.048461907252935247647 --1.1388942318608360441 -4.4988235352611598648 -0.066344559364066134143 -5 0.037692251088985676735 0.3552707368190505097 +-1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 +-1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 +5 0.037692251088985676735 0.35527077279847234866 0.00046732617030490929307 -4.1359946230316175786 -2.8610749953481979801 -0.08065244615734604161 -1.536603427793050461 2.399023353553466048 -0.044342472584791124157 -6 0.011285899820091272997 0.4376572328164372643 +4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 +1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 +6 0.011285899820091272997 0.43765804755160246957 0.00038925687730393611812 -6.3788284394924916754 -7.635463758938534795 -0.121111501730720202974 -1.4521392831727842248 1.3041738917825064364 -0.08044788317293871613 -7 0.0017236589478267730203 0.46959013246222981483 +6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 +1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 +7 0.0017236589478267730203 0.46959835521706382437 0.00016953449859497231466 -14.803649648126269156 13.063133279359290029 -0.14329526741228329478 --0.9596636872292902537 1.0125665712568530355 0.016140607193432704789 -8 0.0020336100526728302319 0.78135207839715916734 +14.795764797253550427 13.071447820107550797 -0.14316267052797140846 +-0.9602974676407360823 1.012024061970291078 0.016146735322636888151 +8 0.0020336100526728302319 0.7813622435281695686 0.000164587904124493665 -29.566779964594630314 -4.5668176855665958414 -0.58741108465859714904 -0.16916723445783939828 1.142713652049310879 -0.027397346380668001207 +29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 +0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 diff --git a/examples/whm_swifter_comparison/tp.swifter.in b/examples/whm_swifter_comparison/tp.swifter.in index 22ca5a6ca..e91b52c9c 100644 --- a/examples/whm_swifter_comparison/tp.swifter.in +++ b/examples/whm_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.1437140623725170485 1.8307543455088179929 -0.33710883085786358393 --2.5169991736250634084 2.6269266483088493027 0.54674712095669365287 +2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 +-2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 102 -3.0507953356624089025 -0.9309107058567914761 0.38209550228666327998 -0.45214249601424874418 2.5995875558304815747 -1.8388641770977671949 +3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 +0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 103 --0.30288545144121659103 -3.139125526168093927 0.7252151132548391166 -3.0919425994019995516 0.13633790246363267858 -0.15665049243950410883 +-0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 +3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 104 --1.9314729940131600827 -1.0389307897540689396 0.26607157142831372454 -2.2775049779995786108 -3.7157836040053666307 -0.16601542341215017115 +-1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 +2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 diff --git a/examples/whm_swifter_comparison/tp.swiftest.in b/examples/whm_swifter_comparison/tp.swiftest.in index 22ca5a6ca..e91b52c9c 100644 --- a/examples/whm_swifter_comparison/tp.swiftest.in +++ b/examples/whm_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.1437140623725170485 1.8307543455088179929 -0.33710883085786358393 --2.5169991736250634084 2.6269266483088493027 0.54674712095669365287 +2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 +-2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 102 -3.0507953356624089025 -0.9309107058567914761 0.38209550228666327998 -0.45214249601424874418 2.5995875558304815747 -1.8388641770977671949 +3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 +0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 103 --0.30288545144121659103 -3.139125526168093927 0.7252151132548391166 -3.0919425994019995516 0.13633790246363267858 -0.15665049243950410883 +-0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 +3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 104 --1.9314729940131600827 -1.0389307897540689396 0.26607157142831372454 -2.2775049779995786108 -3.7157836040053666307 -0.16601542341215017115 +-1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 +2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index be377e49e..c71790c2d 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -57,6 +57,8 @@ module subroutine discard_tp(self, system, param) class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameter + ! Internals + logical, dimension(:), allocatable :: ldiscard associate(tp => self, ntp => self%nbody, cb => system%cb, pl => system%pl, npl => system%pl%nbody) if ((ntp == 0) .or. (npl ==0)) return @@ -70,7 +72,10 @@ module subroutine discard_tp(self, system, param) if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) call discard_cb_tp(tp, system, param) if (param%qmin >= 0.0_DP) call discard_peri_tp(tp, system, param) if (param%lclose) call discard_pl_tp(tp, system, param) - if (any(tp%ldiscard)) call tp%spill(system%tp_discards, tp%ldiscard, ldestructive=.true.) + if (any(tp%ldiscard)) then + allocate(ldiscard, source=tp%ldiscard) + call tp%spill(system%tp_discards, ldiscard, ldestructive=.true.) + end if end associate return From 730753e547d1b904d5ac7f4f880550169844847a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 11:46:52 -0400 Subject: [PATCH 09/71] Added checks for rhill and radius during io operations --- src/io/io.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index a0dd69995..05313275c 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -984,7 +984,7 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) read(iu, iostat=ierr, err=100) pl%Gmass(:) pl%mass(:) = pl%Gmass(:) / param%GU if (param%lrhill_present) read(iu, iostat=ierr, err=100) pl%rhill(:) - read(iu, iostat=ierr, err=100) pl%radius(:) + if (param%lclose) read(iu, iostat=ierr, err=100) pl%radius(:) if (param%lrotation) then read(iu, iostat=ierr, err=100) pl%rot(1, :) read(iu, iostat=ierr, err=100) pl%rot(2, :) @@ -1347,8 +1347,8 @@ module subroutine io_write_frame_body(self, iu, param) select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body write(iu) pl%Gmass(1:n) - write(iu) pl%rhill(1:n) - write(iu) pl%radius(1:n) + if (param%lrhill_present) write(iu) pl%rhill(1:n) + if (param%lclose) write(iu) pl%radius(1:n) if (param%lrotation) then write(iu) pl%Ip(1, 1:n) write(iu) pl%Ip(2, 1:n) From 823a3ed6154fee701c412af8a73f0c9e98cba557 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 6 Aug 2021 11:54:32 -0400 Subject: [PATCH 10/71] Removed duplicate read of rhill in the swiftest_stream --- python/swiftest/swiftest/io.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 491376739..db00655e3 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -494,10 +494,9 @@ def swiftest_stream(f, param): p5 = f.read_reals(np.float64) p6 = f.read_reals(np.float64) Mpl = f.read_reals(np.float64) - Rhill = f.read_reals(np.float64) - Rpl = f.read_reals(np.float64) if param['RHILL_PRESENT'] == 'YES': Rhill = f.read_reals(np.float64) + Rpl = f.read_reals(np.float64) if param['ROTATION'] == 'YES': Ipplx = f.read_reals(np.float64) Ipply = f.read_reals(np.float64) From 42909d4cc72938b9080f34a4c77213e77462ceb2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 11:59:16 -0400 Subject: [PATCH 11/71] Updated example Notebook after testing --- .../swiftest_vs_swifter.ipynb | 99 +++++++++++++------ 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 22e1403d8..cb6b9ecd7 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -42,24 +42,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Reading Swiftest file param.swiftest.in\n" - ] - }, - { - "ename": "ValueError", - "evalue": "all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 4 and the array at index 5 has size 1", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\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 609\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcbid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclab\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 610\u001b[0m \u001b[0mnpl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplab\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 611\u001b[0;31m \u001b[0mntp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtlab\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mswiftest_stream\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\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[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 612\u001b[0m \u001b[0;31m# Prepare frames by adding an extra axis for the time coordinate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0mcbframe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcvec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\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;36mswiftest_stream\u001b[0;34m(f, param)\u001b[0m\n\u001b[1;32m 526\u001b[0m \u001b[0mplid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 527\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mntp\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 528\u001b[0;31m \u001b[0mtvec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt6\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 529\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mtvec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\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<__array_function__ internals>\u001b[0m in \u001b[0;36mvstack\u001b[0;34m(*args, **kwargs)\u001b[0m\n", - "\u001b[0;32m~/.local/lib/python3.7/site-packages/numpy/core/shape_base.py\u001b[0m in \u001b[0;36mvstack\u001b[0;34m(tup)\u001b[0m\n\u001b[1;32m 281\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\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 282\u001b[0m \u001b[0marrs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 283\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_nx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\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 284\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mconcatenate\u001b[0;34m(*args, **kwargs)\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 4 and the array at index 5 has size 1" + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.000e+00\n", + "Creating Dataset\n", + "Successfully converted 1462 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" ] } ], @@ -70,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -79,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -88,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -108,9 +95,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "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['dr'].sel(id=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -122,9 +122,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "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['dr'].sel(id=tpidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -135,9 +148,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "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['dv'].sel(id=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -148,9 +174,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "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['dv'].sel(id=tpidx).plot.line(x=\"time (y)\", ax=ax)\n", From a0c085875ec56d27ea623554c3584877b353b106 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 12:08:05 -0400 Subject: [PATCH 12/71] Fixed WHM gr sim initial conditions --- examples/whm_gr_test/init_cond.py | 1 + examples/whm_gr_test/param.swifter.in | 2 +- examples/whm_gr_test/param.swiftest.in | 1 + examples/whm_gr_test/pl.swifter.in | 48 +++++++++---------- examples/whm_gr_test/pl.swiftest.in | 48 +++++++++---------- .../whm_gr_test/swiftest_relativity.ipynb | 8 ++-- 6 files changed, 55 insertions(+), 53 deletions(-) diff --git a/examples/whm_gr_test/init_cond.py b/examples/whm_gr_test/init_cond.py index 8d197c6f4..09feca135 100755 --- a/examples/whm_gr_test/init_cond.py +++ b/examples/whm_gr_test/init_cond.py @@ -24,6 +24,7 @@ sim.param['CHK_EJECT'] = 1000.0 sim.param['OUT_FORM'] = "EL" sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['RHILL_PRESENT'] = "YES" sim.param['GR'] = 'YES' bodyid = { diff --git a/examples/whm_gr_test/param.swifter.in b/examples/whm_gr_test/param.swifter.in index 789250f41..f1574759a 100644 --- a/examples/whm_gr_test/param.swifter.in +++ b/examples/whm_gr_test/param.swifter.in @@ -21,7 +21,7 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES C 63241.07708426628 J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/whm_gr_test/param.swiftest.in b/examples/whm_gr_test/param.swiftest.in index ace6f3cad..00b2c2546 100644 --- a/examples/whm_gr_test/param.swiftest.in +++ b/examples/whm_gr_test/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/whm_gr_test/pl.swifter.in b/examples/whm_gr_test/pl.swifter.in index 782e57140..0b02f19c8 100644 --- a/examples/whm_gr_test/pl.swifter.in +++ b/examples/whm_gr_test/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751234419554511911 +1 6.5537098095653139645e-06 0.001475124456355905224 1.6306381826061645943e-05 -0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 --11.331978934667442676 4.8184460126705647045 1.4332264599878684131 -2 9.663313399581537916e-05 0.00675908960945781479 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 0.006759069616556246028 4.0453784346544178454e-05 --0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 -1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 -3 0.000120026935827952453094 0.010044837538502923644 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 0.010044908171483009529 4.25875607065040958e-05 -0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 -5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 -4 1.2739802010675941456e-05 0.0072467236860282326973 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 0.0072466797341124641736 2.265740805092889601e-05 --1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 --1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 -5 0.037692251088985676735 0.35527094075555771578 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.35527079166215922855 0.00046732617030490929307 -4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 -1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 -6 0.011285899820091272997 0.43765464106459166412 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.43765832419088212185 0.00038925687730393611812 -6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 -1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 -7 0.0017236589478267730203 0.46956055286931676728 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.46960112247450473807 0.00016953449859497231466 -14.832516206189200858 13.032608531076540714 -0.14378102535616668622 --0.9573374666934839659 1.014553546383260322 0.016118112341773867214 -8 0.0020336100526728302319 0.7813163071687303693 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.78136567314580814177 0.000164587904124493665 -29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 -0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/whm_gr_test/pl.swiftest.in b/examples/whm_gr_test/pl.swiftest.in index 10d425453..84cae57a2 100644 --- a/examples/whm_gr_test/pl.swiftest.in +++ b/examples/whm_gr_test/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 +1 6.5537098095653139645e-06 0.001475124456355905224 1.6306381826061645943e-05 -0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 --11.331978934667442676 4.8184460126705647045 1.4332264599878684131 -2 9.663313399581537916e-05 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 0.006759069616556246028 4.0453784346544178454e-05 --0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 -1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 -3 0.000120026935827952453094 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 0.010044908171483009529 4.25875607065040958e-05 -0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 -5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 -4 1.2739802010675941456e-05 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 0.0072466797341124641736 2.265740805092889601e-05 --1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 --1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 -5 0.037692251088985676735 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.35527079166215922855 0.00046732617030490929307 -4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 -1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 -6 0.011285899820091272997 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.43765832419088212185 0.00038925687730393611812 -6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 -1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 -7 0.0017236589478267730203 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.46960112247450473807 0.00016953449859497231466 -14.832516206189200858 13.032608531076540714 -0.14378102535616668622 --0.9573374666934839659 1.014553546383260322 0.016118112341773867214 -8 0.0020336100526728302319 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.78136567314580814177 0.000164587904124493665 -29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 -0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/whm_gr_test/swiftest_relativity.ipynb b/examples/whm_gr_test/swiftest_relativity.ipynb index 69bacdf51..bbc87d783 100644 --- a/examples/whm_gr_test/swiftest_relativity.ipynb +++ b/examples/whm_gr_test/swiftest_relativity.ipynb @@ -116,15 +116,15 @@ "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", "JPL Horizons : 571.3210506300043\n", "Swifter GR : 571.6183105524942\n", - "Swiftest GR : 571.61831053222\n", + "Swiftest GR : 571.5670367229116\n", "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : -0.29725990221562437\n", - "Swiftest - Swifter: -2.0274342205084395e-08\n" + "Obs - Swiftest : -0.2459860929071831\n", + "Swiftest - Swifter: -0.05127382958278304\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] From 5511bea222e4544ca477f9829c5190cce9567332 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 6 Aug 2021 12:15:34 -0400 Subject: [PATCH 13/71] Put RHILL_PRESENT check back into the swiftest io python routine --- python/swiftest/swiftest/io.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index db00655e3..01edfbf53 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -781,7 +781,6 @@ def swifter_xr2infile(ds, param, framenum=-1): RSun = np.double(cb['Radius']) param['J2'] = np.double(cb['J_2']) param['J4'] = np.double(cb['J_4']) - param['RHILL_PRESENT'] = "YES" if param['IN_TYPE'] == 'ASCII': # Swiftest Central body file @@ -1228,7 +1227,6 @@ def swifter2swiftest(swifter_param, plname="", tpname="", cbname="", conversion_ swiftest_param.pop('C', None) swiftest_param.pop('J2', None) swiftest_param.pop('J4', None) - swiftest_param.pop('RHILL_PRESENT', None) swiftest_param['DISCARD_OUT'] = conversion_questions.get('DISCARD_OUT', '') if not swiftest_param['DISCARD_OUT']: @@ -1279,7 +1277,6 @@ def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): tmp = swifter_param.pop(key, None) swifter_param['J2'] = J2 swifter_param['J4'] = J4 - swifter_param['CHK_CLOSE'] = "YES" if swifter_param['OUT_STAT'] == "REPLACE": swifter_param['OUT_STAT'] = "UNKNOWN" swifter_param['! VERSION'] = "Swifter parameter file converted from Swiftest" From cd7a607e5fc566a9d6401f0e3295cd91b32b2aeb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 12:21:03 -0400 Subject: [PATCH 14/71] Fixed initial conditions file for Helio gr test, and tested turning RHILL_PRESENT=NO input --- examples/helio_gr_test/init_cond.py | 1 + examples/helio_gr_test/param.swifter.in | 2 +- examples/helio_gr_test/param.swiftest.in | 1 + examples/helio_gr_test/pl.swifter.in | 48 +++++++++---------- examples/helio_gr_test/pl.swiftest.in | 32 ++++++------- .../helio_gr_test/swiftest_relativity.ipynb | 8 ++-- 6 files changed, 47 insertions(+), 45 deletions(-) diff --git a/examples/helio_gr_test/init_cond.py b/examples/helio_gr_test/init_cond.py index 8d197c6f4..5b378da74 100755 --- a/examples/helio_gr_test/init_cond.py +++ b/examples/helio_gr_test/init_cond.py @@ -24,6 +24,7 @@ sim.param['CHK_EJECT'] = 1000.0 sim.param['OUT_FORM'] = "EL" sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['RHILL_PRESENT'] = "NO" sim.param['GR'] = 'YES' bodyid = { diff --git a/examples/helio_gr_test/param.swifter.in b/examples/helio_gr_test/param.swifter.in index 789250f41..acca6f7aa 100644 --- a/examples/helio_gr_test/param.swifter.in +++ b/examples/helio_gr_test/param.swifter.in @@ -21,7 +21,7 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT NO 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 index ace6f3cad..f5a748693 100644 --- a/examples/helio_gr_test/param.swiftest.in +++ b/examples/helio_gr_test/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT NO FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/helio_gr_test/pl.swifter.in b/examples/helio_gr_test/pl.swifter.in index 782e57140..f39e7af56 100644 --- a/examples/helio_gr_test/pl.swifter.in +++ b/examples/helio_gr_test/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751234419554511911 +1 6.5537098095653139645e-06 1.6306381826061645943e-05 -0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 --11.331978934667442676 4.8184460126705647045 1.4332264599878684131 -2 9.663313399581537916e-05 0.00675908960945781479 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 -1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 -3 0.000120026935827952453094 0.010044837538502923644 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 4.25875607065040958e-05 -0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 -5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 -4 1.2739802010675941456e-05 0.0072467236860282326973 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 --1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 -5 0.037692251088985676735 0.35527094075555771578 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.00046732617030490929307 -4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 -1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 -6 0.011285899820091272997 0.43765464106459166412 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.00038925687730393611812 -6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 -1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 -7 0.0017236589478267730203 0.46956055286931676728 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.00016953449859497231466 -14.832516206189200858 13.032608531076540714 -0.14378102535616668622 --0.9573374666934839659 1.014553546383260322 0.016118112341773867214 -8 0.0020336100526728302319 0.7813163071687303693 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.000164587904124493665 -29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 -0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/helio_gr_test/pl.swiftest.in b/examples/helio_gr_test/pl.swiftest.in index 10d425453..b624d25ba 100644 --- a/examples/helio_gr_test/pl.swiftest.in +++ b/examples/helio_gr_test/pl.swiftest.in @@ -1,33 +1,33 @@ 8 1 6.5537098095653139645e-06 1.6306381826061645943e-05 -0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 --11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 -1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 3 0.000120026935827952453094 4.25875607065040958e-05 -0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 -5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 --1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 5 0.037692251088985676735 0.00046732617030490929307 -4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 -1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 6 0.011285899820091272997 0.00038925687730393611812 -6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 -1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 7 0.0017236589478267730203 0.00016953449859497231466 -14.832516206189200858 13.032608531076540714 -0.14378102535616668622 --0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 8 0.0020336100526728302319 0.000164587904124493665 -29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 -0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/helio_gr_test/swiftest_relativity.ipynb b/examples/helio_gr_test/swiftest_relativity.ipynb index 03948cdf7..db7a4926e 100644 --- a/examples/helio_gr_test/swiftest_relativity.ipynb +++ b/examples/helio_gr_test/swiftest_relativity.ipynb @@ -116,15 +116,15 @@ "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", + "Swiftest GR : 571.5701928436062\n", "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : -0.2947248211246545\n", - "Swiftest - Swifter: -0.0025351013653107657\n" + "Obs - Swiftest : -0.2491422136018948\n", + "Swiftest - Swifter: -0.04811770888807132\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] From d8bea375b7879fa55a5ba4484e0c1562888e5aa6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 12:25:22 -0400 Subject: [PATCH 15/71] Fixed WHM swiftest vs swifter initial conditions and test results --- examples/whm_swifter_comparison/init_cond.py | 1 + .../whm_swifter_comparison/param.swifter.in | 2 +- .../whm_swifter_comparison/param.swiftest.in | 2 +- examples/whm_swifter_comparison/pl.swifter.in | 48 +++++++++---------- .../whm_swifter_comparison/pl.swiftest.in | 48 +++++++++---------- examples/whm_swifter_comparison/tp.swifter.in | 16 +++---- .../whm_swifter_comparison/tp.swiftest.in | 16 +++---- 7 files changed, 67 insertions(+), 66 deletions(-) diff --git a/examples/whm_swifter_comparison/init_cond.py b/examples/whm_swifter_comparison/init_cond.py index cc86e7635..9f9b3f98d 100755 --- a/examples/whm_swifter_comparison/init_cond.py +++ b/examples/whm_swifter_comparison/init_cond.py @@ -20,6 +20,7 @@ sim.param['OUT_FORM'] = "XV" sim.param['OUT_STAT'] = "UNKNOWN" sim.param['GR'] = 'NO' +sim.param['RHILL_PRESENT'] = 'NO' bodyid = { "Sun": 0, diff --git a/examples/whm_swifter_comparison/param.swifter.in b/examples/whm_swifter_comparison/param.swifter.in index 417c3ab04..8ea0e8771 100644 --- a/examples/whm_swifter_comparison/param.swifter.in +++ b/examples/whm_swifter_comparison/param.swifter.in @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES -RHILL_PRESENT YES +RHILL_PRESENT NO J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 diff --git a/examples/whm_swifter_comparison/param.swiftest.in b/examples/whm_swifter_comparison/param.swiftest.in index 13fdad2ec..d6b863f5d 100644 --- a/examples/whm_swifter_comparison/param.swiftest.in +++ b/examples/whm_swifter_comparison/param.swiftest.in @@ -25,7 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES -RHILL_PRESENT YES +RHILL_PRESENT NO FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/whm_swifter_comparison/pl.swifter.in b/examples/whm_swifter_comparison/pl.swifter.in index 7f71ec655..f39e7af56 100644 --- a/examples/whm_swifter_comparison/pl.swifter.in +++ b/examples/whm_swifter_comparison/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751244276585862212 +1 6.5537098095653139645e-06 1.6306381826061645943e-05 --0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 --7.636449781071190374 -8.230711833761744002 0.027897889786567415562 -2 9.663313399581537916e-05 0.006759070712609563929 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 -4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 -3 0.000120026935827952453094 0.01004490423927810557 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 4.25875607065040958e-05 -0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 -4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 -4 1.2739802010675941456e-05 0.0072466832516755644343 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 --1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 -5 0.037692251088985676735 0.35527077279847234866 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.00046732617030490929307 -4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 -1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 -6 0.011285899820091272997 0.43765804755160246957 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.00038925687730393611812 -6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 -1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 -7 0.0017236589478267730203 0.46959835521706382437 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.00016953449859497231466 -14.795764797253550427 13.071447820107550797 -0.14316267052797140846 --0.9602974676407360823 1.012024061970291078 0.016146735322636888151 -8 0.0020336100526728302319 0.7813622435281695686 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.000164587904124493665 -29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 -0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/whm_swifter_comparison/pl.swiftest.in b/examples/whm_swifter_comparison/pl.swiftest.in index 06c393c46..b624d25ba 100644 --- a/examples/whm_swifter_comparison/pl.swiftest.in +++ b/examples/whm_swifter_comparison/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 0.0014751244276585862212 +1 6.5537098095653139645e-06 1.6306381826061645943e-05 --0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 --7.636449781071190374 -8.230711833761744002 0.027897889786567415562 -2 9.663313399581537916e-05 0.006759070712609563929 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 -4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 -3 0.000120026935827952453094 0.01004490423927810557 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 4.25875607065040958e-05 -0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 -4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 -4 1.2739802010675941456e-05 0.0072466832516755644343 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 --1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 -5 0.037692251088985676735 0.35527077279847234866 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.00046732617030490929307 -4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 -1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 -6 0.011285899820091272997 0.43765804755160246957 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.00038925687730393611812 -6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 -1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 -7 0.0017236589478267730203 0.46959835521706382437 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.00016953449859497231466 -14.795764797253550427 13.071447820107550797 -0.14316267052797140846 --0.9602974676407360823 1.012024061970291078 0.016146735322636888151 -8 0.0020336100526728302319 0.7813622435281695686 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.000164587904124493665 -29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 -0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/whm_swifter_comparison/tp.swifter.in b/examples/whm_swifter_comparison/tp.swifter.in index e91b52c9c..8a66912f4 100644 --- a/examples/whm_swifter_comparison/tp.swifter.in +++ b/examples/whm_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 --2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 +2.1159283340247889704 1.8593322968487970837 -0.33108647801775120678 +-2.557303042640355446 2.5920133227445458545 0.5530693963730075664 102 -3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 -0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 +3.055528708824450046 -0.9023759798915096386 0.36193041623852567623 +0.4122422441588732561 2.6115158464246720372 -1.8437451126910543971 103 --0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 -3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 +-0.26900389298636068203 -3.1374127668516589296 0.7234488489303841918 +3.0956076496295565968 0.17648254651685860603 -0.16591700615421532186 104 --1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 -2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 +-1.9061083760262669262 -1.0793924233562111059 0.26419511130887440853 +2.3545884478521155142 -3.673223720899393644 -0.17666743480430943436 diff --git a/examples/whm_swifter_comparison/tp.swiftest.in b/examples/whm_swifter_comparison/tp.swiftest.in index e91b52c9c..8a66912f4 100644 --- a/examples/whm_swifter_comparison/tp.swiftest.in +++ b/examples/whm_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 --2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 +2.1159283340247889704 1.8593322968487970837 -0.33108647801775120678 +-2.557303042640355446 2.5920133227445458545 0.5530693963730075664 102 -3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 -0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 +3.055528708824450046 -0.9023759798915096386 0.36193041623852567623 +0.4122422441588732561 2.6115158464246720372 -1.8437451126910543971 103 --0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 -3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 +-0.26900389298636068203 -3.1374127668516589296 0.7234488489303841918 +3.0956076496295565968 0.17648254651685860603 -0.16591700615421532186 104 --1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 -2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 +-1.9061083760262669262 -1.0793924233562111059 0.26419511130887440853 +2.3545884478521155142 -3.673223720899393644 -0.17666743480430943436 From 9df7f4b95240b3dde92a0a04c159f69bdfe326d2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 12:37:01 -0400 Subject: [PATCH 16/71] Fixed RMVS 1pl_1tp test initial conditions --- .../1pl_1tp_encounter/init_cond.py | 10 ++++++---- .../1pl_1tp_encounter/param.swiftest.in | 1 + .../1pl_1tp_encounter/pl.swifter.in | 2 +- .../1pl_1tp_encounter/pl.swiftest.in | Bin 160 -> 176 bytes .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 8 ++++---- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py index b292ed42f..a700466b1 100755 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -43,7 +43,7 @@ tpid = 100 radius = np.double(4.25875607065041e-05) -mass = np.double(0.00012002693582795244940133) +Gmass = np.double(0.00012002693582795244940133) apl = np.longdouble(1.0) atp = np.longdouble(1.01) vpl = np.longdouble(2 * np.pi) @@ -55,7 +55,7 @@ p_tp = np.array([atp, 0.0, 0.0], dtype=np.double) v_tp = np.array([0.0, vtp, 0.0], dtype=np.double) -Rhill = apl * 0.0100447248332378922085 +Rhill = np.double(apl * 0.0100447248332378922085) #Make Swifter files plfile = open(swifter_pl, 'w') @@ -63,7 +63,7 @@ print(1,GMSun,file=plfile) print('0.0 0.0 0.0',file=plfile) print('0.0 0.0 0.0',file=plfile) -print(plid,"{:.23g}".format(mass),Rhill, file=plfile) +print(plid,"{:.23g}".format(Gmass),Rhill, file=plfile) print(radius, file=plfile) print(*p_pl, file=plfile) print(*v_pl, file=plfile) @@ -125,7 +125,8 @@ plfile.write_record(v_pl[0]) plfile.write_record(v_pl[1]) plfile.write_record(v_pl[2]) -plfile.write_record(mass) +plfile.write_record(Gmass) +plfile.write_record(Rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(swiftest_tp, 'w') @@ -156,6 +157,7 @@ print(f'OUT_TYPE REAL8') print(f'OUT_FORM XV') print(f'OUT_STAT REPLACE') +print(f'RHILL_PRESENT yes') print(f'CHK_CLOSE yes') print(f'CHK_RMIN {rmin}') print(f'CHK_RMAX {rmax}') diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/param.swiftest.in b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/param.swiftest.in index 36937896f..d9c20a3be 100644 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -12,6 +12,7 @@ BIN_OUT bin.swiftest.dat OUT_TYPE REAL8 OUT_FORM XV OUT_STAT REPLACE +RHILL_PRESENT yes CHK_CLOSE yes CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swifter.in b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swifter.in index 95513c9fd..17d461561 100644 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swifter.in +++ b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swifter.in @@ -2,7 +2,7 @@ 1 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -2 0.00012002693582795244940133 0.010044724833237891545 +2 0.00012002693582795244940133 0.010044724833237892 4.25875607065041e-05 1.0 0.0 0.0 0.0 6.283185307179586 0.0 diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in index 6f4bc1337f56833a126ada00c5685c950d805447..c94c6ae61581655ba2acb43d632ec99b4c8d1cc3 100644 GIT binary patch delta 35 lcmZ3$xPfuP6q(ga>{UZ1wb*koFff3ykokl{#t=3z9{{*62kQU; delta 19 acmdnMxPWoO6dob-35ARyZ1x-s3=9A{sswKU diff --git a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 29dcf43aa..20122244c 100644 --- a/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/rmvs_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAERCAYAAAB/4wAeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAZLklEQVR4nO3de5ScdZng8e/T3SERCehykcQGEw1gEmAQekHQ5Q4jOAMDDBxYVmTBYfG6s6w7yw5nR1lXxUVGnJWZPUFhgUWyCyNkRS6KkIUDghPuAWSCEqFDlBBFyCC35Nk/qrqp6vSluuvyVld9P+f06a56bw9F6nnqeX/v763ITCRJGtJTdACSpPZiYZAkVbEwSJKqWBgkSVUsDJKkKhYGSVKVaVcYIuKyiHg+IlY2aH+3RMSLEXHjiOfvioiHyj/PRcQNjTieJLW7aVcYgP8JfKSB+7sQ+NjIJzPzX2TmXpm5F/AT4HsNPKYkta1pVxgy807gN5XPRcT7yp/87y9/0n//JPb3Y+DlsZZHxGzgUOCGKYYsSdNKX9EBNMgS4OzMXBUR+wF/SymZN8JxwI8z86UG7U+S2tq0LwwRsRVwAHBtRAw9PbO87Hjgv4yy2ZrM/MMaD3EK8O1645Sk6WLaFwZKp8NeLI8FVMnM71HH2EBEbAvsS6lrkKSuMO3GGEYqn+J5OiJOBIiSP2jQ7k8EbszMVxu0P0lqe9OuMETENZSuEtotIgYj4kzgVODMiHgYeAw4dhL7uwu4FjisvL/KU0wnA9c0LnpJan/hbbclSZWmXccgSWquaTX4vN122+W8efOKDkOSppX777//hczcvtb1p1VhmDdvHitWrCg6DEmaViLil5NZ31NJkqQqFgZJUhULgySpioVBklTFwiBJqlJoYYiIj0TEkxHxVEScW2QskqSSwgpDRPQClwBHAYuAUyJiUVHxSJJKipzHsC/wVGb+AiAillK6x9HjjT7Qd69awha/fnD48XN9O3H32w6Z8v7mvvksH/r9csDbiUhqrnW9O7J8yyNZNHdrvvDHi1tyzCILw7uBZyseDwL7jVwpIs4CzgLYeeedp3SgBS/dy8CG0t23e0g20cM9sw4iY2oN01H/dANHvvIDNhETryxJdXh8iz1ZvuWRLT1mkYVhtKy62UfwzFxC6RvaGBgYmNJH9H0/fRlwWenBXX9Nz4/PZ+mZ+8CMWVPZHSy7Gn7+bnrOaXhzI0lVdgf+d4uPWeTg8yCwU8XjfuC5ph+1b2bp95t1fMVCJqPXNUma/oosDP8A7BIR8yNiC0rfffB/m37U4cLw2tT3kZtgiqehJKndFXYqKTPfjIjPALcCvcBlmflY0w/cVz59VFfHsAnCjkFSZyr07qqZeRNwU0sPOlwY7BgkaTTdl90aMsZgYZDUubovu9kxSNK4ui+72TFI0ri6L7sNdQwb7RgkaTTdl928XFWSxtV92a0hl6umhUFSx+q+7NawjsF5DJI6UxcWhkZNcOu+l05Sd+i+7OYYgySNq/uymx2DJI2r+7Jbrx2DJI2n+7JbTw/0bmHHIElj6M7s1jfLjkGSxtCd2a1vpvMYJGkM3ZndGtIxOI9BUmfq0sJQb8fgqSRJnas7s5tjDJI0pu7MbnYMkjSm7sxudgySNKbuzG52DJI0pu7Mbn2zLAySNIbuzG59M+s8leQ8BkmdqzuzW0M6BucxSOpMXVoY6u0YPJUkqXN1Z3ZzjEGSxtSd2c2OQZLG1J3ZbahjyJza9hYGSR2skOwWESdGxGMRsSkiBloewNDXe258fWrbWxgkdbCisttK4HjgzkKOPvwtblMcZ7AwSOpgfUUcNDOfAIiiLvnsq/PrPZ3HIKmDtX12i4izImJFRKxYt25dY3baN6v0245BkjbTtI4hIm4Ddhxl0XmZuazW/WTmEmAJwMDAwBRHi0cYLgxT7Ric4CapczWtMGTm4c3ad936HGOQpLF0Z3ZrSMfQnS+dpM5X1OWqx0XEILA/8IOIuLWlAdQ9+GxhkNS5iroq6Xrg+iKODTj4LEnj6M7sZscgSWPqzuxWd8fgPAZJnas7s5sdgySNqTuzW0PGGJzHIKkzdWlhsGOQpLF0Z3bzqiRJGlN3ZrehjuGV9fD6K5Pf3sIgqYN1Z3br6YUZW8I9fwN//X54Y5Kdg4VBUgfr3ux2yjWw+5/Cq7+D116a3LYWBkkdrHuz23sPhvcdUvp7MmMNmYDzGCR1ru7OblO5md7Q90RbGCR1qO7OblO5/XZuKv22MEjqUN2d3abUMQwVBie4SepMXV4Y7BgkaaTuzm5TmujmGIOkztbd2W0qt8awY5DU4bo7u02lY7AwSOpw3Z3d7BgkaTPdnd3sGCRpM92d3abUMTj4LKmzdXd2q6tjcB6DpM7U3YWh1zEGSRqpu7NbTw/0buEYgyRVMLv1zbJjkKQKZre+mXYMklTB7GbHIElVCsluEXFhRPwsIh6JiOsj4h1FxAHYMUjSCEVltx8Bu2fmnsA/Av+poDjsGCRphEKyW2b+MDPfLD+8F+gvIg5gCh2DE9wkdbZ2yG5nADePtTAizoqIFRGxYt26dY0/+pQ7Bie4SepMTSsMEXFbRKwc5efYinXOA94Erh5rP5m5JDMHMnNg++23b3ygjjFIUpW+Zu04Mw8fb3lEfBz4I+CwzKHzMwXonQlvTqITsTBI6nBNKwzjiYiPAP8ROCgzXykihmF9Mx18lqQKRWW3bwGzgR9FxEMR8T8KiqM8xuCpJEkaUkjHkJkLijjuqOwYJKmK2c2OQZKqmN3sGCSpitltaB5DrRdGOcFNUoczu/XNBBI2vlHb+k5wk9ThLAyT/XpPTyVJ6nBmt75Jfr2nhUFShzO72TFIUhWz23BhsGOQJLAwVJxKsmOQJLAw2DFI0ghmNzsGSapidpv04LMT3CR1NrPblC9XdYKbpM5kYfByVUmqYnZzgpskVTG72TFIUhWzmx2DJFUxu9kxSFIVs5sdgyRVmTC7RcQOozy3W3PCKUBPL/TMcB6DJJXVkt3uioiThh5ExL8Hrm9eSAUY+ha3WjiPQVKH66thnYOBJRFxIvAu4Alg32YG1XJ9M+HJH8Cbv4ejLoTecV4WTyVJ6nATZrfMXAvcAuwPzAOuzMwNTY6rtRb/Cbz5Oqy4DH67evx1LQySOlwtYww/AvYDdgeOBr4REV9vdmAt9dGL4A//a+nv3Dj+uhYGSR2ulux2M/CXmfliZq4EDgB+19ywCtBTPn206c3x17MwSOpwtWS32cCtEXFXRHwa2DYzv9TkuFrPwiBJQG1jDOdn5mLg08Bc4P9FxG1Nj6zVLAySBExugtvzwK+A9cBmcxsmIyK+FBGPRMRDEfHDiJhbz/4aoqe39HuTYwySulstg8+fjIjlwI+B7YA/y8w96zzuhZm5Z2buBdwI/FWd+6tfzR2DE9wkdbZa5jG8B/jzzHyoUQfNzJcqHr4dyEbte8omfSrJCW6SOtOEhSEzz23GgSPiy8BplK5wOmSc9c4CzgLYeeedmxFKiWMMkgQ08SZ6EXFbRKwc5edYgMw8LzN3Aq4GPjPWfjJzSWYOZObA9ttv36xwKwpDrWMMdgySOlMtp5KmJDMPr3HV7wI/AL7QrFhqMjz4bMcgqbsVkt0iYpeKh8cAPysijiqeSpIkoIkdwwQuKN+6exPwS+DsguJ4i4VBkoCCCkNmnlDEccc16TEGC4OkzmR2G+IYgyQBFoa3OMFNkgALw1scY5AkwMLwFmc+SxJgYXjLZAaf7RYkdTAz3JDJDD5bGCR1MDPckMmcSrIwSOpgZrghFgZJAiwMb3GMQZIAC8NbhpJ9LfMYLAySOpgZbkhEqWvwVJKkLmeGq1RzYXAOg6TOZWGo1NPnGIOkrmeGq9TT66kkSV3PDFfJMQZJsjBUsTBIkoWhioVBkiwMVXp6HXyW1PXMcJVq6hic4Caps5nhKjmPQZIsDFUcY5AkC0MVxxgkycJQxY5BkiwMVSwMkmRhqGJhkCQLQxVvoidJFoYqNd1Ez3kMkjpboRkuIj4fERkR2xUZxzDnMUhScYUhInYCjgCeKSqGzTjGIEmFdgzfAP4CyAJjqOYYgyQVUxgi4hhgTWY+XMO6Z0XEiohYsW7duuYG5hf1SBJ9zdpxRNwG7DjKovOAvwSOrGU/mbkEWAIwMDDQ3O7CU0mS1LzCkJmHj/Z8ROwBzAcejtIgbj/wQETsm5m/alY8NbEwSFLzCsNYMvNRYIehxxGxGhjIzBdaHctmHGOQJOcxVIke5zFI6not7xhGysx5RccwzFNJkmTHUMUJbpJkYajiGIMkWRiq+EU9kmRhqOIYgyRZGKpYGCTJwlClpw9yY+mS1LFYGCR1uMIvV20rPeWXY9NG6B3jpbEwSG3rjTfeYHBwkFdffbXoUAoxa9Ys+vv7mTFjRl37sTBU6ukt/d705jiFwQluUrsaHBxk9uzZzJs3j+iyy8ozk/Xr1zM4OMj8+fPr2pcZrtJwxzDOOIPzGKS29eqrr7Ltttt2XVEAiAi23XbbhnRLFoZKNRcGXzapXXVjURjSqP92M1ylyjGGsVgYJHU4M1ylyjGGsVgYJFU44IADRn3+9NNP57rrrmtxNI1hhqvkqSRJk3TPPfcUHULDeVVSpZoKg1clSXrLVlttxYYNG8hMPvvZz3L77bczf/58crz5UG3ODFfJjkHSFF1//fU8+eSTPProo1x66aXTupMww1UaHmMYb/DZjkHS5u68805OOeUUent7mTt3LoceemjRIU2ZGa6S8xgk1aFTLpW1MFTyVJKkKTrwwANZunQpGzduZO3atdxxxx1FhzRlDj5XsjBImqLjjjuO22+/nT322INdd92Vgw46qOiQpszCUMkJbpImacOGDUDpNNK3vvWtgqNpDDNcJSe4SZKFoYqnkiTJwlDFwiBJFoYqNY0xOI9BUmczw1VyjEGSLAxVnOAmScUUhoj4YkSsiYiHyj9HFxHHZhxjkFSnZ599lkMOOYSFCxeyePFivvnNb262Tmbyuc99jgULFrDnnnvywAMPFBDp2Iqcx/CNzPx6gcffnIVBUp36+vq46KKL2HvvvXn55ZfZZ599OOKII1i0aNHwOjfffDOrVq1i1apV3HfffXzyk5/kvvvuKzDqak5wq1TTTfQsDNJ0cP73H+Px515q6D4Xzd2aL/zx4nHXmTNnDnPmzAFg9uzZLFy4kDVr1lQVhmXLlnHaaacREXzwgx/kxRdfZO3atcPbFa3IDPeZiHgkIi6LiHeOtVJEnBURKyJixbp165obkR2DpAZavXo1Dz74IPvtt1/V82vWrGGnnXYaftzf38+aNWtaHd6YmtYxRMRtwI6jLDoP+DvgS0CWf18EnDHafjJzCbAEYGBgoLnffGFhkDrGRJ/sm23Dhg2ccMIJXHzxxWy99dZVy0b7Ep92ujNr0wpDZh5ey3oRcSlwY7PimJSJCkMm4DwGSeN74403OOGEEzj11FM5/vjjN1ve39/Ps88+O/x4cHCQuXPntjLEcRV1VVLlibTjgJVFxLGZiSa4DVV5C4OkMWQmZ555JgsXLuScc84ZdZ1jjjmGK6+8kszk3nvvZZtttmmb8QUobvD5v0XEXpROJa0G/k1BcVSbaIJbbir9bqOWT1J7ufvuu7nqqqvYY4892GuvvQD4yle+wjPPPAPA2WefzdFHH81NN93EggUL2HLLLbn88ssLjHhzhRSGzPxYEced0ISnkoYKgx2DpNF9+MMfHnUMoVJEcMkll7Qooskzw1WyMEiShaHKhGMMFgZJnc8MV6nmMQZfNkmdywxXKQKi18IgqauZ4Ubq6bMwSOpqZriRLAySupwZbqSePie4SZqyM844gx122IHdd999+Lnf/OY3HHHEEeyyyy4cccQR/Pa3vx1e9tWvfpUFCxaw2267ceutt466z/G2bwYz3Eg9tYwxOMFN0uhOP/10brnllqrnLrjgAg477DBWrVrFYYcdxgUXXADA448/ztKlS3nssce45ZZb+NSnPsXGjZt/MB1r+2bxttsjeSpJ6gw3nwu/erSx+9xxDzhq/KR84IEHsnr16qrnli1bxvLlywH4+Mc/zsEHH8zXvvY1li1bxsknn8zMmTOZP38+CxYs4Kc//Sn7779/Tds3ixluJAuDpAb79a9/PXwvpDlz5vD8888Dtd9+e6ztm8WOYaRxxxgsDNK0McEn+3bQrrffNsONVNMYgy+bpNq9613vYu3atQCsXbuWHXbYAaj99ttjbd8sZriRPJUkqcGOOeYYrrjiCgCuuOIKjj322OHnly5dymuvvcbTTz/NqlWr2HfffWvevlk8lTRSTx+s+hFcst/myza+Xv6j+FZPUns65ZRTWL58OS+88AL9/f2cf/75nHvuuZx00kl85zvfYeedd+baa68FYPHixZx00kksWrSIvr4+LrnkEnp7S7fm+cQnPsHZZ5/NwMDAmNs3S0x0e9h2MjAwkCtWrGjuQR64Ep66bezlvTPh8C/ANv3NjUPSpD3xxBMsXLiw6DAKNdprEBH3Z+ZArfuwYxhp79NKP5LUpTxZLkmqYmGQ1FGm0+nxRmvUf7uFQVLHmDVrFuvXr+/K4pCZrF+/nlmzZtW9L8cYJHWM/v5+BgcHWbduXdGhFGLWrFn099d/YYyFQVLHmDFjBvPnzy86jGnPU0mSpCoWBklSFQuDJKnKtJr5HBHrgF9OcfPtgBcaGE4rGHNrGHNrGHNrjBbzezJz+1p3MK0KQz0iYsVkpoS3A2NuDWNuDWNujUbE7KkkSVIVC4MkqUo3FYYlRQcwBcbcGsbcGsbcGnXH3DVjDJKk2nRTxyBJqoGFQZJUpSMKQ0R8JCKejIinIuLcUZZHRPxNefkjEbF3rdu2W8wRsVNE3BERT0TEYxHxb9s53orlvRHxYETc2Ip46405It4REddFxM/Kr/X+0yDmf1f+N7EyIq6JiPpvs9mYmN8fET+JiNci4vOT2bbdYi7q/VdPzBXLa38PZua0/gF6gZ8D7wW2AB4GFo1Y52jgZkpf1vxB4L5at23DmOcAe5f/ng38Y7NjrifeiuXnAN8Fbmz3fxflZVcAnyj/vQXwjnaOGXg38DTwtvLj/wOc3iYx7wD8c+DLwOcns20bxtzy91+9MVcsr/k92Akdw77AU5n5i8x8HVgKHDtinWOBK7PkXuAdETGnxm3bKubMXJuZDwBk5svAE5SSQlvGCxAR/cBHgW83Oc6GxBwRWwMHAt8ByMzXM/PFdo65vKwPeFtE9AFbAs+1Q8yZ+Xxm/gPwxmS3bbeYC3r/1RUzTP492AmF4d3AsxWPB9n8f9RY69SybTPUE/OwiJgHfAC4r/EhTi6WCda5GPgLYFOT4htNPTG/F1gHXF5uvb8dEW9vZrATxDPhOpm5Bvg68AywFvhdZv6wibGOG08Ltq1HQ47bwvcf1B/zxUziPdgJhSFGeW7kNbhjrVPLts1QT8ylhRFbAX8P/HlmvtTA2EYz5Xgj4o+A5zPz/saHNa56XuM+YG/g7zLzA8A/Aa04/13P6/xOSp8g5wNzgbdHxL9qcHyjqec91M7vv/F30Nr3H9QR81Teg51QGAaBnSoe97N5Cz3WOrVs2wz1xExEzKD0j/LqzPxeE+OcMJYa1vkQcExErKbU/h4aEf+reaFOGE8t6wwCg5k59EnwOkqFotnqiflw4OnMXJeZbwDfAw5oYqwTxdPsbetR13ELeP9BfTFP/j3Y7EGTZv9Q+nT3C0qflIYGZRaPWOejVA/Y/bTWbdsw5gCuBC6eDq/xiHUOpnWDz3XFDNwF7Fb++4vAhe0cM7Af8BilsYWgNHj+2XaIuWLdL1I9kNu2779xYm75+6/emEcsq+k92LL/sCa/aEdTujrg58B55efOBs6u+J95SXn5o8DAeNu2c8zAhym1kI8AD5V/jm7XeKfyj7IdYgb2AlaUX+cbgHdOg5jPB34GrASuAma2Scw7UvrE+xLwYvnvrcfatp1jLur9V+/rXLGPmt6D3hJDklSlE8YYJEkNZGGQJFWxMEiSqlgYJElVLAySpCoWBnWt8h1UP1XxeG5EXNekY/1JRPzVBOt8PSIObcbxpcnwclV1rfK9bm7MzN1bcKx7gGMy84Vx1nkPcGlmHtnseKTx2DGom10AvC8iHoqICyNiXkSsBIiI0yPihoj4fkQ8HRGfiYhzyjfVuzci/ll5vfdFxC0RcX9E3BUR7x95kIjYFXgtM1+IiNnl/c0oL9s6IlZHxIzM/CWwbUTs2MLXQNqMhUHd7Fzg55m5V2b+h1GW7w78S0q3PP4y8EqWbqr3E+C08jpLKN16Yh/g88DfjrKfDwGVt2peTunWFgAnA3+fpfsbUV7vQ3X+d0l16Ss6AKmN3VFO5C9HxO+A75effxTYs3yHzQOAayOGb345c5T9zKF0G+8h36Z0C+QbgH8N/FnFsucp3R1VKoyFQRrbaxV/b6p4vInSe6cHeDEz95pgP78Hthl6kJl3l09bHQT0ZubKinVnldeXCuOpJHWzlyl9PeOUZOk+/E9HxIkw/H3MfzDKqk8AC0Y8dyVwDXD5iOd3pXQTPKkwFgZ1rcxcD9wdESsj4sIp7uZU4MyIeJjSba9H+2rKO4EPRMX5JuBq4J2UigMwfJ//BZTu6ioVxstVpRaIiG8C38/M28qP/xQ4NjM/VrHOcZS+aP4/FxSmBDjGILXKVyh9mQ4R8d+BoyjdX79SH3BRi+OSNmPHIEmq4hiDJKmKhUGSVMXCIEmqYmGQJFWxMEiSqvx/wtUxbYbYMtUAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -103,7 +103,7 @@ } ], "source": [ - "swiftdiff['px'].plot.line(x=\"time (y)\")" + "swiftdiff['vx'].plot.line(x=\"time (y)\")" ] }, { From 9f4d0713fdd9bcb152eff8d846637a446b6f7430 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 12:43:18 -0400 Subject: [PATCH 17/71] Fixed initial conditions for RMVS 8pl_8tp test case --- .../8pl_16tp_encounters/cb.swiftest.in | 4 +- .../8pl_16tp_encounters/init_cond.py | 1 + .../8pl_16tp_encounters/param.swifter.in | 4 +- .../8pl_16tp_encounters/pl.in | 48 ++++++------- .../8pl_16tp_encounters/pl.swifter.in | 48 ++++++------- .../8pl_16tp_encounters/pl.swiftest.in | 48 ++++++------- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 26 +++---- .../8pl_16tp_encounters/tp.in | 68 +++++++++---------- 8 files changed, 124 insertions(+), 123 deletions(-) diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in index 2e8d49f62..81c636655 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 0.00029591220819207774 0.004650467260962157 -0.0 -0.0 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py index 094b261f0..49d017b86 100755 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -37,6 +37,7 @@ sim.param['OUT_STAT'] = "UNKNOWN" sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' +sim.param['RHILL_PRESENT'] = 'YES' sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in index 6a283276e..36dd2060f 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in +++ b/examples/rmvs_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 0.0 -J4 0.0 +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in index 86a616119..207dd84f6 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-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 index 595cdc169..3179473c0 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in @@ -2,35 +2,35 @@ 0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-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 index 86a616119..207dd84f6 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-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 index 124ae2910..86a6d8098 100644 --- 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 @@ -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": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABHOElEQVR4nO29d7wcdbn4/362nJYKSShJCAmhhCJEiEEUEVQQFAtFIOhVFIjYu6jf+7L+FMSCeC1cREBAyfV6LREDKO2GSw/SSzBAIIcQSELq2VO2PL8/ZmYzZ8/u7Mz2s+d5v17nlZ2Zz8w8Oyfn88xTP6KqGIZhGIZHrNkCGIZhGK2FKQbDMAxjGKYYDMMwjGGYYjAMwzCGYYrBMAzDGIYpBsMwDGMYphiMoojIN0XkWvfzLBHZLiLxZssVhIi8SURWNvieKiJ7V3mNx0Xk6NpINOLaJX+PIrKriCwXkW0i8iNxuFJENonIffWQxxgdmGJoU0RktYi8rWDfWSLyf1GvpaovqOp4Vc3WTsJohJmAVfUOVd2vUTLVClU9UFVvh+ETeR3uU/h7XAxsACaq6heAI4FjgZmqurAeMhijA1MMRlsgIolmyzAK2RN4QndUue4JrFbVvqgXsuffXphiGMOIyHQR+R8RWS8iz4nIp0uMm+2+sSd85y0VkVdFZJWInOsbGxeRr4nIM66L4gER2cM9Nk9E/uGet1JETvOdd5WI/FxE/uaed6+IzHWPLXeHPey6Qk4XkaNFpFdEzheRdcCV3j7fNfcQkT+632+jiPysxDPoF5GdffteKyIbRCTpbn9ERJ50XSw3icieJZ7TJBG52r3f8yLy7yIS8x0/173ONhF5QkQOdfevFpG3icjxwNeA093v+bCIvE9EHii4zxdE5M8lZJgjIv/r3uMfwNRiv0cRuQr4EPBl914fBS4HjnC3v+Wec6KIPCQim0XkLhE52He91e7zfwToc6/7enfcZlf+o33jbxeR74jIna58fxcRv3xH+s5dIyJnufs7ReSHIvKCiLwsIpeKSLd7bKqIXO+e86qI3OF/5kaFqKr9tOEPsBp4W8G+s4D/cz/HgAeArwMdwF7As8Db3ePfBK51P88GFEi42/8L/ALoAuYD64G3use+BDwK7AcIcAgwBRgHrAE+DCSAQ3HcGAe6510FvAosdI//Fljik12BvX3bRwMZ4PtAJ9Dt7ut1j8eBh4GL3Xt3AUeWeFa3Auf6tn8AXOp+fi+wCtjflevfgbuKyQVcDfwFmOA+s6eBs91j7wNeBF7nPpe9gT0Lf1f+5+5ud7rPZX/fvgeBU0p8l7uBH7vnHQVsC/g9XgX8f8X+f7jbhwKvAIe7z/NDrqydPrkfAvZwn/8MYCPwDpz/X8e629Pc8bcDzwD7uuNvBy50j81yZV0EJHH+z8x3j/0EWArs7D7bvwIXuMcuAC51z0kCbwKk2X9/o/2n6QLYT51+sc4f7XZgs+8nxQ7FcDjwQsE5XwWudD/nJyj/hOJOAllggu+8C4Cr3M8rgfcUked04I6Cff8JfMP9fBVwue/YO4CnfNvFFMMQ0FWwz1MMR+AorESIZ3UOcKv7WXAU2FHu9g24k7u7HXOf455+uXAmzkHgAN/YjwK3u59vAj4T8Lsqqhjcfb8Evut+PhDYhDs5F4ybhaMsx/n2/a7Y79H3zIMUwy+B7xTcYyXwZp/cH/EdOx+4pmD8TcCH3M+3A//uO/Zx4Ebf/70/FflOAvQBc337jgCecz9/G0cZ7114rv1U/mMmV3vzXlWd7P3g/CF67AlMd03wzSKyGceNsWuZa04HXlXVbb59z+O8LYKjOJ4pct6ewOEF93s/sJtvzDrf5xQwvows61V1oMSxPYDnVTVT5hoAf8BxoUzHectW4A6f3Jf4ZH4VZ7KaUXCNqTiW1/O+fWGeSxh+A5wpIgL8G/B7VR0sMm46sEmHxwieLzIuLHsCXyj4ne3h3sdjTcH49xWMPxLY3Tem1O+41POZBvQAD/iueaO7HxzrbhXwdxF5VkS+Ev1rGoVYwGjssgbnrWufiOetBXYWkQk+5TALx03iXXcu8FiR+/2vqh5bqcBFCGoNvAaYJSKJcspBVTeLyN+B03BcRtep+zrqXue7qvrbMrJsANK4AV13X7HnUo4R30lV7xGRIRw3yZnuTzFeAnYSkXE+5TCr2DVD4n3374aUdw2OxXBuqcFl7lUsE2oD0I/jcnyx8KD7f/ALOArsQOA2EblfVW+pQAbDxSyGsct9wFY3eNgtTtD4IBF5XdBJqroGuAu4QES63GDk2TgxAXACmN8RkX3E4WARmQJcD+wrIv8mIkn353Uisn9IeV/GiYNE+X4vAReKyDhX1jcGjP8d8EHgFPezx6XAV91Jxwswv6/wZHVSQH8PfFdEJogToP484KWeXg58UUQOc5/L3lI8iP0yMLtIAPVq4GdARlWLphyr6vPACuBbItIhIkcC7wr4zuX4FXCeiBzuyjxORN4pIhNKjL8WeJeIvN39/9QlTkLAzBD3+i3wNhE5zQ1iTxGR+aqac+W4WER2ARCRGSLydvfzie6zFGArjpuzaWnV7YIphjGKO5G9Cyd4/BzOm9nlwKQQpy/C8VevBf6EEyf4h3vsxzgT5N9x/lB/DXS7b3bHAWe4561jR+A4DN8EfuO6E04rN9j3/fYGXgB6ceIcpVgK7AO8rKoP+67zJ1fOJSKyFccSOqHENT6F4w9/Fvg/HAVzhXud/wa+6+7bBvwZJ5hayH+7/24UkX/69l8DHOT+G8SZOPGjV4Fv4CiUilDVFcC5OAppE47L5qyA8WuA9+C4JNfjWAFfIsQ8o6ov4MSVvuDK/hBO4gI4sYtVwD3u7+BmnOQGcH5nN+PE0+4GfqFuTYhRObLDYjYMo1Vx0zNfAQ5V1X81Wx6jvTGLwTBGBx8D7jelYDQCCz4bRosjIqtxMqHe21xJjLGCuZIMwzCMYZgryTAMwxiGKQZjzCFFOs+2C1LQ18owKsEUg9GWuJNjnzgN4V4UkR9Lg9eTkBqs1WAYzcAUg9HOHKKq44G34uT3V1KRaxhjDlMMRtujqk/h9D46qPCYiCwUkbvdwrmXRORnItLhO64icp6I/Euctts/d6tsveNFW3JL8VbhoVtEi8gbROR+Edni/vsG37HA9tW+cZFadhuGhykGo+0RkQNw+gw9WORwFvgcThO8I3Csi48XjDkRp132ITj9lLx2DO/FqfI9Gaep2x3AdQCqepR77iHqrJr2XzhVvb3u2F3dc0ekBYqzNsTfgJ/itJ/+MfA3t7WIx5k4Lcx3wWne98Ui320pMKeg7cgHKF89bYxx2kIxiMgVIvKKiBQ2bqvkWvPdN8jHReQRETndd+yT4ixMo8Xe0IyW458isgmnf//lwJWFA1T1AVW9R1UzqroapxX4mwuGXaiqm922DbfhtBEBp632Bar6pNuo73vA/BI9kMBpsrc7TsvutDpLkRbLF38n8C9VvcaV6zrgKYb3PbpSVZ9W1X6cFiTzCy/idmD9LxxlgNvvaTZO3yrDKElbKAacvvLH1+haKeCDqnqge82fiMhk99idwNuorpWx0TgOVdWdVHWuqv6725BtGCKyr+veWef24fkevlXPXEq1ig7bktsjbIvo6Yz8P+Zv4R0kUyFhW3YbRp62UAyquhznjzKPiMwVkRvFWVryDhGZF/JaT3ttB1R1LU5/mmnu9oPuW6XRPvwS5218H1WdiOPekeBT8qwBPupf80JVu1X1rmKDVXWbqn5BVffCefv/vIi8tcjQtThKx4+/hXdoVPUenAWNvJbd5kYyytIWiqEElwGfUtXDcPyvv4h6ARFZiOO/rXSBFaP1mYDTBXa7+/LwsQjnlmvJPaxVeIQW0ctwWpSf6bagPh04gMpdQGVbdhuGn7YsghGR8cAbgP/2JZB0usdOxlkOsJAXVfXtvmvsjvN29aFiLgijbfgizkvEl3GC0/8FvCXMiar6J/f/2hI3rrAF+Ac7Wmd/E6dVeDewGMcV9DMcC3QTJVpEq+pGETkRuATHolkFnKiqGyr8jtcA33F/DKMsbdMrSURmA9er6kEiMhFYqaq7lzmt1LUm4qxPe4HbR7/w+GpgQRV/qIbRMKxltxGVtnQlqepW4DnPrBeHQ8qchju2A2fxmauLKQXDGIVYy24jEm2hGETkOpzVm/YTkV4RORtnofmzReRh4HGclaXCcBrOgvBnichD7s989z6fFpFeYCbwiIhcXuvvYhi1xLVuP4NTQ2EYoWgbV5JhGIZRG9rCYjAMwzBqx6jPSpo6darOnj272WIYhmGMKh544IENqjqt2LGGKQYRuQKn58wrqlqsmdn7gfPdze3Ax1T14XLXnT17NitWrKiprIZhGO2OiJTs4NBIV9JVBLeteA54s6oejJNvfVkjhDIMwzCG0zCLQVWXu7UGpY772wjcg5P5YxiGYTSYVg0+nw3cUOqgiCwWkRUismL9+vUNFMswDKP9abngs4gcg6MYjiw1RlUvw3U1LViwYES+bTqdpre3l4GBgbrJWQu6urqYOXMmyWSy2aIYhmHkaSnFICIH4/TNP0FVN1Z6nd7eXiZMmMDs2bPx9UpqKVSVjRs30tvby5w5c5otjmEYRp6WcSWJyCzgj8C/qerT1VxrYGCAKVOmtKxSABARpkyZ0vJWjWEYY49GpqteBxwNTHXbSnwDSAKo6qXA13GWMfyFO6FnVHVBFferVuS6MxpkNAxj7NHIrKRFZY6fA5zTIHEMwzBallQ6xe+e+h0DGcejEJMY7577bmZOaEyyZkvFGFqNN7zhDdx118jFuM466yxOPPFETj311CZIZRhGu3P3S3dzyT8vAUAQFGUgM8DnF3y+IfdvmRhDK1JMKRiGYdSbvnQfAMtOWsYjH3qEXXp2YfPg5obd3yyGAMaPH8/27dtRVT71qU9x6623MmfOHKwjrWEY9SSVTgHQnewGYGLHRLYMbmnY/c1iCMGf/vQnVq5cyaOPPsqvfvUrsyQMw6grqYyjGHoSPYCjGLYObW3Y/U0xhGD58uUsWrSIeDzO9OnTectbQi0JbBiGURGpdApB6Ep0ATCpc5IphlbEUksNw2gUqUyK7kQ3MXGmaHMltSBHHXUUS5YsIZvN8tJLL3Hbbbc1WyTDMNqY/kw/Pcme/PbEzsa6kiz4HIKTTjqJW2+9lde85jXsu+++vPnNb262SIZhtDGpdCofXwDHYujP9JPOpknG699bzRRDANu3bwccN9LPfvazJktjGMZYIZVJDbMYJnVOAmDL0Bamdk+t+/3NlWQYhtFi9Kf7R1gMQMPcSaYYDMMwWgwv+OyRVwyDphgMwzDGJKl0akTwGcxiMAzDGLOUshgalbJqisEwDKPFSGWGZyWNS44DnDTWRmCKwTAMo8UodCV51oMphlHORz7yEXbZZRcOOuigZotiGMYoIp1Nk86lh1kMnmLweijVG1MMdeKss87ixhtvbLYYhmGMMvIN9HwWQyKWIBlLmsUw2jnqqKPYeeedmy2GYRijjP9a+V8AwywGcBRFf7oxiqHtK5+/9dfHeWJtbVO8Dpg+kW+868CaXtMwDAPgPx78DwD23mnvYfu7E91mMRiGYYw1cpoD4OPzP84h0w4ZdqyRiqHtLQZ7szcMY7SQyWUASMZGNsrrTnRb8NkwDGOskc6lgdKKwVxJo5xFixZxxBFHsHLlSmbOnMmvf/3rZotkGEaLk86WVgw9iR5zJY12rrvuumaLYBjGKCNvMRRZc8EsBsMwjDHImHMlicgVIvKKiDxW4riIyE9FZJWIPCIihzZKNsMwjFZgzCkG4Crg+IDjJwD7uD+LgV82QCbDMIyWISjG0J3sbliBW8MUg6ouB14NGPIe4Gp1uAeYLCK7N0Y6wzCM5hNkMfQkehjKDeVTWutJK8UYZgBrfNu97r4RiMhiEVkhIivWr1/fEOEMwzDqjacYErGReUGN7LDaSopBiuzTYgNV9TJVXaCqC6ZNm1ZnsQzDMBpDuawkGHuKoRfYw7c9E1jbJFmqZs2aNRxzzDHsv//+HHjggVxyySXNFskwjBanXPAZxp5iWAp80M1Oej2wRVVfarZQlZJIJPjRj37Ek08+yT333MPPf/5znnjiiWaLZRhGCxNY4Oa24U6l698Wo2EFbiJyHXA0MFVEeoFvAEkAVb0UWAa8A1gFpIAPN0q2erD77ruz++5O7HzChAnsv//+vPjiixxwwAFNlswwjFYlqFfShOQEALant9ddjoYpBlVdVOa4Ap+o+Y1v+Aqse7S219ztNXDChaGHr169mgcffJDDDz+8tnIYhtFWBLmSxneMB2Db0La6y9FKrqS2ZPv27Zxyyin85Cc/YeLEic0WxzCMFiYo+Dyhw7EYGqEY2r9XUoQ3+1qTTqc55ZRTeP/738/JJ5/cNDkMwxgdBFkMEzucF8tGuJLMYqgTqsrZZ5/N/vvvz+c///lmi2MYxiggSDGMS44DYOtQbVekLIYphjpx5513cs0113Drrbcyf/585s+fz7Jly5otlmEYLUxQVlIilqAn0WOupNHMkUceiRNPNwzDCEdQjAGcOIMFnw3DMMYQQa4kMMVgGIYx5gjqlQROANoUg2EYxhginU2TkAQxKT41m8VgGIYxxsjkMiXjC+AUuZliMAzDGEOkc+mSbiRw2mJsS5tiMAzDGDOkc+mSgWfY4Uqqd8ajKYY6MTAwwMKFCznkkEM48MAD+cY3vtFskQzDaHHKWQyTOieR01zdi9ysjqFOdHZ2cuuttzJ+/HjS6TRHHnkkJ5xwAq9//eubLZphGC1KOhtsMUztngrAxoGNTOqcVDc5zGKoEyLC+PFON8R0Ok06nUak2CJ1hmEYDuVcSVO6pwCwsX9jXeVoe4vh+/d9n6defaqm15y38zzOX3h+2XHZbJbDDjuMVatW8YlPfMLabhuGEUg6lw7MSpra5VoMdVYMZjHUkXg8zkMPPURvby/33Xcfjz32WLNFMgyjhcnkMqFcSRv6N9RVjra3GMK82debyZMnc/TRR3PjjTdy0EEHNVscwzBalHKupImdE0nEEnVXDGYx1In169ezefNmAPr7+7n55puZN29ec4UyDKOlKacYYhJj566d2ThgMYZRyUsvvcSHPvQhstksuVyO0047jRNPPLHZYhmG0cKks2m6E92BY6Z2TzVX0mjl4IMP5sEHH2y2GIYxZrj68atZvXV14JiFuy3k+DnH11WOm1bfxL0v3Tts32G7HsY793pn2XPTuTQT48FLAE/tnsr61PqqZCyHKQbDMEY96VyaH6z4Ad2JbnoSPUXHbE9v5661d9VdMVz68KW8sPWF/BrNfek+lvcuD60YglxJ4HRYfWbzMzWRtRSmGAzDGPV4K5+dd8h5fOSgjxQd88P7f8jvn/49qlrXmqJ0Ls1b93wrFx11EQAXP3AxVz9xdaj7hlEMiViCrGZrJm8xLPhsGMaop9wCN+AUh/Vn+kllUvWVpaB6eWr3VDK5TKg2FuUqnwHiEiebM8VgGIYRSBjF0KgagMK3/ij3LVfgBmYxGIZhhCKTywDlLQaof9VwYZFaZMUQwmLwvm+9KBtjEJFZIa+1WVUDbSUROR64BIgDl6vqhQXHJwHXArNc2X6oqleGvL9hGGOUvMUQ1E6ikRaDT44oCimUYojF624xhAk+/wZQIChqosBVwNWlBohIHPg5cCzQC9wvIktV9QnfsE8AT6jqu0RkGrBSRH6rqkMh5GxJstksCxYsYMaMGVx//fXNFscw2pJWdiVN6ZoS+r6ZXCaw7TZAQhJ1jzGUVQyqekzhPhHZTVXXRbzXQmCVqj7rXmMJ8B7ArxgUmCBO6H488CpQX5upzlxyySXsv//+bN1a3/7phjGW8bKSghTD5M7JxCXecMUwsWMiyViSDQMhXEkhgs8xiZHR+k6LlcYYPljBOTOANb7tXnefn58B+wNrgUeBz6hqrvBCIrJYRFaIyIr16+tb6FENvb29/O1vf+Occ85ptiiG0daEiTE0op1ENpclp7lhcogIU7unlnUl5TRHRoOb6IHrSmq2xVCC94hICviHqq4MeU4xV1Th+nRvBx4C3gLMBf4hIncUxi5U9TLgMoAFCxYErnG37nvfY/DJ2rbd7tx/Hrt97Wtlx332s5/loosuYtu2+q/RahhjmTCuJHBWQNs6WD/r3ZOj0B20U9dOvDrwauC5eeVWLitJEihKTnPEpD75Q5Ve9WRgFXCSiFwe8pxeYA/f9kwcy8DPh4E/qsMq4DlgVHaeu/7669lll1047LDDmi2KYbQ9YYLP4CgOb2xd5ShQUBM6JrB9aHtF5xYSj8UB6mo1VGQxqOrLwI3uT1juB/YRkTnAi8AZwJkFY14A3grcISK7AvsBz1Yio0eYN/t6cOedd7J06VKWLVvGwMAAW7du5QMf+ADXXnttU+QxjHbGizGUC9x2xDsYytYvl6WUgprYMZFnU8FTmWcxlPsOcXEUQ0YzJAlWIpVSkcUgIj8Xkavcz8eFOUdVM8AngZuAJ4Hfq+rjInKeiJznDvsO8AYReRS4BThfVesbKaoTF1xwAb29vaxevZolS5bwlre8xZSCYdSJsG/bHfEOhnJ1VAwlguATOiawbSjYpRz2O3iKo+UsBmAIeNn9/Bbg72FOUtVlwLKCfZf6Pq8FQikawzAMj7CTajKWLOvSqYccE5IT2JYuoxhCZFbBDouhnrUMlSqGFDBJRJI4xWhGAEcffTRHH310s8UwjLYltMUQq7PFUEKO8R3j6c/0BxawhY2TeDGGelY/Vxp8fhV4Bqdg7c7aiWMYhhGd0BZDPJl/M6+rHPGRriQg0FoJHXxugMUQSTGIyGQRuRI4xd11NbCg5lIZhmFEIO+GKfO2XfcYQ4nJfWKHs/hOUJxh1MYYVHWziFwIzAY2AAcDf6yDXIZhGKEpVT9QSDKWrG9WUkDwGcoohlEeYzgbeE5VbwIeqLE8hmEYkYkSY2hWHQMQuCZD1BhDqymGTcB5IrIf8DDwkKra4saGYTSNSOmqTahjCGUxhHUlSYu5kgBU9QIRuQV4GpgPHAWYYjAMo2mEbSeRjNe38rlUz6YJydophnxWUh0b6UVWDCLybZz1FB7CsRZur7FMbcPs2bOZMGEC8XicRCLBihUrmi2SYbQl+RiDlKl8jjkWQ73WfS4XY9ieDshKihpjaDGL4esi8nWcjKZTRGSuqp5be9Hag9tuu42pU6c2WwzDaGu8dtXlJvtkLImiTjsJqX07iVJv/T3JHmISCxVjKLseg5eV1Crpqj6uwGmPPQX4Re3EMQzDiE6Ylc/AiTEAdatlKKUYYhKjM97JQGYg8rmF5Hsl1bHArdLK50/jtMVI4CzVeVTNJKoxd/z+aTasqW0J/NQ9xvOm0/YtO05EOO644xARPvrRj7J48eKaymEYhkPhcpql8BTDUHaInmRPXeSA4rGOzngng9nBis7106pZSeBUPe8D/EVVP1dDedqKO++8k+nTp/PKK69w7LHHMm/ePI46qmV1qGGMWsJaDN6YegWgg7q8hlYMozHG4PI4zmpsZ4vID1T1dTWUqaaEebOvF9OnTwdgl1124aSTTuK+++4zxWAYdSDMkpiwY9KtV/WzlylUTJbOeCeDmQDFEDL47CmdemYlVRpjmIujVC7DWVzHKKCvry+/cltfXx9///vfOeigg5oslWG0J1FjDPWqZQia3DsT7W8xrFHVW0Vkd+CVWgrULrz88sucdNJJAGQyGc4880yOP/74JktlGO1JyyiGgMm9K94VqBjC1mK0cozheBF5Gqe76vM4wWjDx1577cXDDz/cbDEMY0yQzqXLpnmCU8fgja+XHFA8xtAR72AgWz4rqVwtRiMqnyt1JU0Gzge+DJRWgYZhGA0gdPA5Xufgs6ugitVTdMW7Ai2VdC5NXOJ5i6AU/qU960WlFsO3gXmqulJE6qe2DMMwQpDJZkKlq+aDz3WMMZRSUJ3xzrIWQxjllncltYLFICKHeJ9VtVdVb3Y/f6UeghmGYYSllWIMQYoh0GIImVmVdyW1SOXzgyLyiIh8WUT2qJtEhmEYEQmtGNwYQ73SVQMVQ6J85XMYq6fVlvb8ETAOuBB4TkRuE5GP1EcswzCM8LRSS4xSk3u5ArdMLhMqgN5SC/Wo6peAL4nIocBi4FzgTTh9kwzDGIP0Z/q56P6L2D60nX122ofFB1fW9mV573L++sxf89uTOyfz5YVfDjXZg+uGiRBjCAo+3/ninfx51Z+LHnvX3Hdx1MzSRarlXEnl6hhaJcYQWjGIyBTgJOBU4BhAgBfqJFdbsHnzZs455xwee+wxRIQrrriCI444otliGUbNuH/d/fzh6T/Qk+jhptU3ce5rzq2onfWSp5Zw70v3Mn38dPrSfazvX8+ieYvYa/Jeoc4Pna4aIsbwP//6H25fczszxs8Ytn/t9rX0pfsCFUMml8m/0RfiKYZSLb+jxhhaJStpHY7raRNwJXCtqv5fXaRqEz7zmc9w/PHH84c//IGhoSFSqVSzRTKMmvL0pqcBWDRvEb9+7NcMZAfoTnRHvk4qk+LgaQdz5fFXcvPzN/O52z8XKaU0k8vUrCVGOptm78l78/t3/X7Y/rNvOjtwPQWAnOZKKoauRBc5zTmyFrFuosYYWsJiAP4EXAvcoKr1WwKpTdi6dSvLly/nqquuAqCjo4OOjo7mCmUYNWblqyuZMX4Gu47bFYBUOlWZYkinmNYzDais0V0ts5JKXWtCxwSe3/p84PWzuSyxWPHQbWe8E4DB7GBJxVCuuA1aL8ZwWrU3E5Hjcdp0x4HLVfXCImOOBn4CJIENqvrmau5521WX8crzz1ZziRHssudeHHNWsC/12WefZdq0aXz4wx/m4Ycf5rDDDuOSSy5h3LhxNZXFMJrJU68+xX477UdPwmlh3Z/pr+g6/Zn+/DUaoRiCrl3KLTWhY0Lg0pwQbDF4imEgO8B4xhe9bxiLoZUX6omMiMRxWmicABwALBKRAwrGTMZZ+Ofdqnog8L5GyVdrMpkM//znP/nYxz7Ggw8+yLhx47jwwhF60DBGLUPZIV7Y9gL77rxvfm2DVKYyd2kqk8pfI1+dHCFzKOykGqbArdS1wiiGrGaJSXmLoeR9wwSfW3GhHhF5l6r+tfzIESwEVqnqs+51lgDvAZ7wjTkT+KOqvgCgqlU36Cv3Zl8vZs6cycyZMzn88MMBOPXUU00xGG3Fhv4N5DTH7uN2z7/tp9KVKYb+dJUWQ8jAbUxiJGPJ4OygbJpxyZGW/YTkBFKZVGBaaRiLoaRiyKbpSnSV+wp5xdNqFsN3K7zXDJw1HDx63X1+9gV2EpHbReQBEflgsQuJyGIRWSEiK9avX1+hOPVlt912Y4899mDlypUA3HLLLRxwwAFlzjKM0cOG/g0ATOmaUpXFoKqkMjtiE1EVg6qGftuG8l1Og2IMAH3pvpLnBloMCVcxlFiTIex3EBESkmiZ4LNH9Fy00udpwXYCOAx4K9AN3C0i96jq08NOUr0MZy0IFixYUHiNluE//uM/eP/738/Q0BB77bUXV155ZbNFMoyasbF/IwBTu6fmM2X609FjDEO5IbKazSsX7208rGLIahZFQyuGjnhHVYph69BWJnVOKnpuVRZDBOUWk1jLpKt6VDoR9wL+VhozgbVFxmxQ1T6gT0SWA4cATzMKmT9/PitWrGi2GIYRSH+mn589+DMWH7y45IRXjA0DrsXQPSXvs6/EYvDcT3mLIWKMIexayR5dia7gldQCYgxAYJyhmhhDqTTWYsRj8dZoolcD7gf2EZE5ItIBnAEsLRjzF+BNIpIQkR7gcODJBspoGGOOPzz9B65+4mquffLaSOcVdSVVEGPwMpkKYwxh34jDrnzmUc5iKFUTEUYxBNYxxJ34QS0shoQkWiNdtVpUNSMinwRuwklXvUJVHxeR89zjl6rqkyJyI/AIkMNJaX2sUTIaxlhk7XbHcA87KXls7N/I5M7JJOPJHcHnKiyGfFZSLKLFEHKtZI9KYwwTOyYClVsMXqpsLRRDPBZvrawk4OVKb6aqy4BlBfsuLdj+AfCDSu9hGEY01vWtA6LXIGzs38iUrikA+WyaSuoYPGVSaVZS0Kppxah0XYRQFkMuV7LAzXtGpTqshs2sAidltaWyklT12HoIYhhGc/DaWnjB5LBs6N/A1O6pgBMM7U50V+RKyiuGwjqGiIoh7KRa6boIYWMMVQWfI8QYcpoLNbYSGhljMAyjxRjIDPDCNqcXphczCMsrqVeY0j0lv92T6KnOlVSlxRBaMVS4LsK45DjiEmfT4KaS5+Y0V/cCN3BiDK2yHoNhGG3GpoEdk1wUxbB9aDtr+9ay9+S98/u6E92VKYZCi6HSGEPIt+2g9tdBNRExiTF74mxWbV5V8tpVWwwRYgwt5UoCEJHP+z7vVztx2oeVK1cyf/78/M/EiRP5yU9+0myxDGMYmwc3A46bJIoryXM/7bfzjj//nmRPZa6kAovBm1jDWgzem3MUV1LJlFE3E6pUvGLfnfdl5asrS147lMVQJFVWVUN3iAU3xtAqBW5uL6OLgXkiMoCTPXQ28OHaiza62W+//XjooYcAyGazzJgxg5NOOqm5QhlGAVuGtgCw9+S9eXT9o4ETm5+nXn0KgP128imGCl1JXsDaq2MQEZKxZF1jDEFtKYKutd9O+3HDczewZXBL0ZqPoHTVeCxOIpYoeu+8cgtp9SRiLZSuqqqbgQ+LyNuBDcDBwB/rIFdbccsttzB37lz23HPPZotiGMPwLIa5k+fy4CsP8ulbP01c4py+3+m8YcYbRoxfu30tFz9wMU9sfIKdOndil55d8sd6kj1sHwper6CQdX3r+OGKHwIMa9ddT8UQVOBW7lrzdp4HOO3GF+6+cMTxoHRVKJ0qG/U7xKX10lUB0qr6gIisBapudFdPNv/1GYbWlu5tUgkd08cx+V1zQ49fsmQJixYtqqkMhlELtgw4FsOxex7LUxuf4qW+l3huy3N0xjuLKoZ7XrqHG1ffyF6T9uL0eacPW4msJ9HDK6lo08Hda+8G4HW7vS7fVgOcN+d6VT4HFbiVm6BnT5oNQO/2XhYyUjEEWQzevYulykZNuY1JrHUsBh/Hi8jTOG20nwc+XTuR2ouhoSGWLl3KBRdc0GxRDGMEnsXwul1fx3UnXgfAaX89rWQ9ghcPuPqEq0e4UiqJMXiupx+9+UfD9kexGKLGGLriXQzlhoq6zcq5dLy6jVLxmKxmA5c27Yp3FU2VrcRiaEXFMBk4H/gycE7NpKkDUd7s68ENN9zAoYceyq677tpUOQyjGJsHN9OT6Bk2EQZlFxUWo/npTnRHLnDzOpUWtrmO5EqKWPnsr0AuXG2u3LW6El1MSE4omcFVzmIolSob9TvEYjFyufrVMVSqGL4N7KeqK0WkfmqrDbjuuuvMjWS0LFsGtzC5c/Kwfd3J7ryLqZBUOkUilij6Rt2TjB587kv3kYgl8pO1R11jDG7PoqHs0EjFEOJaU7qnBCqGoBhDqeK6qK6kuLRmgdtXgX9zP99WI1najlQqxT/+8Q9OPvnkZotiGEXZPLh5pEsoILsolUkVtRbAsRgGs4ORgqJ96b6ii+IkY8nQ16mkwA2Kt6YIqxg2DhR3JZW1GEq044gaJ6l3jKFSxTAEeAspH1MjWdqOnp4eNm7cyKRJ4VsZG0YjKWYxBCqG9I4lOAupZN3nVDrFuEQRxVDH4LNXTxDo6w+41tTuqYExhkZlJbWixZACJolIEphVQ3kMw2ggmwc3j1QMyZ6Sk3t/pr+kxVBJ6+2+dF9RRVNJjCFKEz2g4uygqd1TS7uScrlh2VWFlMqIihxjaFGL4RvAMzhZSb+tnTiGYTSSvnQf4zqGv7H3JEpnFwW5kippvd2XabwrKWhdhDAZTlO7p7I9vb2oK6qsxVCihsKruB7tFsOnVfUXqroYKN04xDCMlmYgOzAiANuT7CGdSxd15YRxJUVRDKl0qqRiqFfwOWhdhDBv7l7K6r/f+e+oDl/QsuIYw2i2GERksohcB5wqIh8XkTcCX6mPaIZh1BNVpT/Tn3+D9gia4OvhSiqmGBLxRHTFEGFpTyjesyjMtQ7b9TAAblp9Uz7d1qOcxVAuKyl02+1Wshjclhi9wDXAPcC+WEsMwxiVpHNpcpobYQF4FkSxOEMqk6I72T1iP1QWfO5L9xVVNJVYDAmpXYwh6M191sRZfO/I7wEjO9JWnZU0Gi0Gl43AecAH3e3e2oljGEaj8CbwERZDwJt/Kh2crgo1dCVFaLudjCUDK479hMpKKjNBewsUFaathrEYAi2VCG2361ngVskKbhcC5wLfBJ4D3lRjmdqGiy++mAMPPJCDDjqIRYsWMTBQenEQw2g0hV1NPYJcSalMasT4/HmuQulPh7MYVJVUprhiSMSiuZLCZiRB9VlJQH6BIr/F4Ll2ylU+D+WGRsQmRnWMAUBEvg28BzgWeFFVf1pzqdqAF198kZ/+9KesWLGCxx57jGw2y5IlS5otlmHkyVsMiXAWg6rWNPg8mB0kq9nq01UjLHADwesihJ2gPYvBrxi8ibqcxQAjA9+VFLi1TIwBQFW/DvwU2AacIiK/qrlUbUImk6G/v59MJkMqlWL69OnNFskw8pSzGApjBQPZARStWfC5VJ8kqLNiSJReSS2sS2dy52TiEh9W6Ja3GALqGMoqhlHeRO+jwH+q6o21FKYe3HDDDaxbt66m19xtt9044YQTAsfMmDGDL37xi8yaNYvu7m6OO+44jjvuuJrKYRjV4OXhF1oMXnC58M3fUxSlLIZkLElCEqEtBk+BVK0YssXXaC5FUB1D2Df3mMTYuWvnYTEGb0W1qiyGCK6klrIYXK4APiYiPxCR+TWUp23YtGkTf/nLX3juuedYu3YtfX19XHvttc0WyzDy5Cf6Agsg7xIqePMvXIKzEBGhO9kd3mLIuBZDDVpiRLEYkrEkglSdHVRYAR0mxlAqVTZq9XarWgyfxumXlMBxKx1VM4lqTLk3+3px8803M2fOHKZNmwbAySefzF133cUHPvCBpshjGIV4FkOxAjeAq5+4mn++8k+++YZvkowld7TcLmExAHTHu/ndU7/jvXu/l/2n7B94f8+VVCrG0J/p57ybz+P0fU/nmFnFW7I9sv4Rlj23jDmT5gTey4+IjKgn+MH9P+CZLc/Qu603f/9yTOmewvrU+vx2mBhDqeK6drEYngG6gL+oassqhWYya9Ys7rnnHlKpFKrKLbfcwv77B/+hGEYj8Sb6QlfS+OR4Tph9AkPZIZY+s5R12x1XbDmLAeDEuScCsLx3edn7B8UY3jj9jbxm2mtYsW4F1z97fclr3LbGae78zjnvLHs/P/51EXKa4+onruZfm/7FxI6JvHvuuwPf+j0mdEwYVuDmTdSBrqSY60rKVR9jaEXF8DhwK3C2iNwf9iQROV5EVorIKhEpWTEtIq8TkayInFqhfE3n8MMP59RTT+XQQw/lNa95DblcjsWLFzdbLMPIUyr4HJMYF735Ij7x2k8AO96EPUVSKl0V4LOHfhbY0fsniKAYw8LdF/Lbd/yWPSfuGdgzaTA7yLjkOD56yEfL3s9PZ8xJG4Ud3+/0/U7nd+/8Hd898ruhaiIK+zl51wlSKl7sovA7pXNpYhILDFz7adWlPecCm4DL3H/LIiJxnKZ7x+IUxd0vIktV9Yki474P3FShbC3Dt771Lb71rW81WwzDKEqp4LOHN8F5b6ZefUKQK0lEQhenBVkMHuWC0EPZoXxANwp+i8ELGoexEoJkC2MxeBZB4fOJGieJSX1XcKvUYlijqktxGug9GfKchcAqVX1WVYeAJTj1EIV8CvgfINqq4oZhRKKUxeDhTXCFFkOQKwnCZxQFxRjCXmswOzhi9bcwdMY7835+7/tFKZIrJluY4HNeMRR8J696OywxiZGj9RTD8SIyE7gUuDjkOTOANb7tXndfHhGZAZzkXrckIrJYRFaIyIr169cHDTUMowQD2QESkig5IRVaDPkYQ8BEDm5GURjF4GYlBSmactcazA5WZjH4FIPn1olsMRTIFib4XFIxRLQYWjXGMBk4H/gyMDIZuDjFnHZasP0T4HzVYOeZql6mqgtUdYGX9VNkTEixmsdokNFoX/oz/YHxgnpbDKl0iq54V+CbehhXUq0shrD+/WGy+VxCnmsn6DpejKHwO2VymWgWQyyWd4HVg9C2k4gcoqoPu5vfBuap6koRCStdL7CHb3smsLZgzAJgiRv4mQq8Q0QyqvrnsHICdHV1sXHjRqZMmRK6sVajUVU2btxIV1dx/65h1JuBzEDJ+AIUiTGUaKFRSJQYQ1nro8y1BrOD+UyfKHQlutg+tB2oPsagqohI9RZDhCK9elsMUZxqD4rIY8C1wHWqejOAqoZdj+F+YB8RmQO8CJwBnOkfoKr5ZGQRuQq4PqpSAJg5cya9vb20upupq6uLmTNnNlsMY4wS1BAPilgMaWd80MQH0WIM1VoflVoM/iU2q4kxKEpWsyQkES3GUIPgc6tkJf0IOBm4EPieiNwBXKOqV4Q5WVUzIvJJnGyjOHCFqj4uIue5xwPjClFIJpPMmRO+4MUwxiL9mf5IFkPQsp5+oriSgjKSwJmsy6WrBim3UnTFu2oSY4Ad3V2jWAyF3ymTy0RSTHGJo2jeWqk1oSVR1S8BXxKRQ4HFOK2334TTHiPsNZYBywr2FVUIqnpW2OsahhGdwczgiLUY/MRirsWQ2xFjKOf6gWjB53KKIYzFMLlzctl7FdIR78i3xKgmxgCOYuimO5TF4E3+tchKAvLWSq2JEmOYgpMxdCpwDE4w+YWaS2QYRkMYyg3lO40Wo1hWUpi38yiupJ27dg6+VpmeSZWmq3bFu/ItMTzFF3WCLXQLeQom6A2+ljEGoG5xhihPYh1OFtMm4ErgWlX9v7pIZRhG3RnKDjGxc2LJ48WyksK6kjLZcJXPe0zYI3BMmDqGagvcvCrtaiwG2JFlGKbyuRYxBqBucYYoiuFPOIHnG1Q1XNtDwzBalnIZPcUqn8d3jC973SgWQy1cSZXWMRRaDFFjDIVuoWqzkqJ8j6ZbDCIyy/34Rfff3UuYSptVdWutBDMMo76Um1SLWQy79OxS9rqJeLg1GWqRlVRN5XNGM2RymaqykmDHJB8lxjCiV1I2zfhkeaXr0QoWw2/YUYhWynmmwFXA1TWQyTCMBlBuUi0WYwgVfJZkYCaRd83+TH/VWUmVWgz+xXqqzkrKhrcYYhIjISPXs466brXn9qpXv6Sykqhq8UbohmGMasr55wvfSstVSnuEyUoayDjLhJZ1JcWTZDVLNpcdEQNQ1YotBv+6CNVmJXmKJYzFAMWfT6vFGCptiWEYxiinXHGYN/kMq2MIYTEkYiPfiAsJ01kVfJNvkTbeGc2gaGUWg28ltWoqnyFajAGKP5/RnJVkGEYbUc5i8CafrGbJ5DIMZgfDF7iVaYkRprOqdy1w3DWPb3icXzz0C46ccSRnHXRWPnhcafAZnEaCntKpOsYQoleSd94Nz93A05ueJkaMj83/WMtZDKYYDGMMktNc2UwYr8Atl8uVbdHtJ0xWUtB6z4XXAmfyvX3N7dy77l429G/grIPOylcuV1TH4FoMA5mByi2GCmIM4Hynl1Mv07+hn4HMAAf2Hhi5wK3eFoO5kgxjDOK9bQe5L/wWQ9iW2xBOMQSt3jbsWr62E16mkzcBV2MxeJZPKpOqSeUzRIgxuOftPXlvuhJdeSXdShaDKQbDGIN4y1oGWgzsiDGEbbkN4YLPUWMM6Vw6r0y8a1djMXgKLpVOVV/5HDHG4Cm7nkQPcYmTyWUqVgwWYzAMo2aEedvOu5KiKoY6xRg8d5aXBeQphmoshv5MP0r5iuVA2Sq0GLqT3cRjcbKarTj4bBaDYRg1I8zbdrWupKCFqCqyGGroSvJiJanMDouh2nTVKFlJMNxiqGShHqhfHYMpBsMYg4R52/a7K7y39bAWg7dOQSlCxxiKuJIKLYYoE6rHMFeSVuhKildnMfQke0hIoqLvYRaDYRg1x3vbDlPHkNXsDldSyLbbMLIfkB8vK6lcllOx4HMtXUmpTGpH5XNEiyHfK6mCrCRPhngsnm/m10oxBlMMhjEGCTOp+lMi+9PRLAYooxjcPklhJ9F0dqTFUG0dQ0xiwyyGRsUYPAXUk3RcSd66EK1U4GaKwTDGIKGCz1Ik+BwyxgAjW0v7CbN627Br+S0GHW4xVJKVJCL0JHroz/RXHWPIZyW51/H8/6XwJvPuRDeJWKIqi8EK3AzDqBlRgs85zeUnr7AFblDeYoiqGPxZSaqatyAqWdoTHOsnlUntWI+hiqU9IbzF4ClML/hsriTDMFqCKMFnL8aQkESoyStUjCHdFyleMZgdpD/TP0ymbUPbAAIXGwqiJ9kzrI4hcoxBoq/H4B/fk3RiDP1ZR+FFaclhisEwjJoTJvicb+2sOWdZz2R3qIXn62ExbB/aDsDEDkcJZHIZtqUdxVCurUYpuhPdjiupwqwkERlWs+FN0qEVQ6HFYHUMhmE0k0gWQy4bellPGJnfX4xUJhVqQveutXXIWQPMUwyexTA+OT7ym75HT7KnqpYYnnyFFkNZV5JPMQyLMYi5kgzDaCJhgs/+GEPYRXognMXgWSBhr7VlcAsAEzomAK7FMLQtv10J3Ynu4a6kiDEGGN7+I7TFkPW5ksxiMAyjVaikjiGqxRCUlTSQGQjddwl2KAbPYkjn0lUrBi/4XGm6Kgy3GEIHn93x3YluizEYhtE6hC0Oi0s8X/kc2mIIEXweyA6Eqj/IWwxDrmLo9MUYqlUMbvA5k8sQl3io+Ekx+aIWuHkuNq/y2du2ttuGYTSVvMUQC64BiEks3yspssUQpBgyA/k1EcJcqx6uJL/FUIm14Mk3wmIoE6sotBj81wqLVyvhucFqTUPrGETkeOASIA5crqoXFhx/P3C+u7kd+JiqPtxIGQ2jHchpjq/e8VVe3P7isP1xifPFBV9kMDtIMpYs+5bstxjC1gt4E9yF912Yd/3EJc7nDvsc83eZT05zDOWG6IqHVwyPrH8E2KEYvODzvsl9Q8lUjJ5kD/3pfsdiqDCAnYwl6Uv38dU7vppXdOUsBu+Zdye6hymkVqp8bphiEJE48HPgWKAXuF9ElqrqE75hzwFvVtVNInICcBlweKNkNIx2YevgVpY9t4w5k+awW89uAOTIce9L93LvunsZyA6Empg9iyGs6wdgzqQ5HLfncfk6A4C7X7qbu9bexfxd5ueDrWEshkQswaJ5i1i9ZTWTOyez9+S9gR3pqtVaDBnNMJAZiJyq6tER7+B/e/93uMxlrvXr437NjatvzPdK8hirlc8LgVWq+iyAiCwB3gPkFYOq3uUbfw8ws4HyGUbb4LWP+PCBH+akfU4CHLfD/Gvm5zuVhokZeBZDOht+vYCeZA8/OvpHw/Yt/O3CfKVylOZ3IsLXDv9afvvm528GHFfY9qHtVccYALYNbasq5dVPQhJlrbD9dt6P/XbeLz/eY6zGGGYAa3zbve6+UpwN3FDsgIgsFpEVIrJi/fr1NRTRMNqDfLsIX0poPBYnJjGnIV0mnGKIxWJkc9nIK4wV0p3oziurKBZDIV7mzpahLShatcUAsC29reIYQ2HcJYo7CIa7nVrJYmikYiimRouu5CEix+AohvOLHVfVy1R1gaoumDZtWg1FNIz2oNSKa8lYkkwuEzqYnLcYqlQMXqAXyHcTDePKKiYPwOaBzcCO9NVK8GImNbUYIqScAhW7ktomxoBjIezh254JrC0cJCIHA5cDJ6jqxgbJZhhthTcJFwaMvSya0BaDG2OoWjG4qaGww2LoTERvl+1NvJsHNwPlF/opJxM4iqHSGEMxxRuFYa6kCNZGO1kM9wP7iMgcEekAzgCW+geIyCzgj8C/qerTDZTNMNqKUktxeoqhP9MfymKISYyc5pylJyO6Sfz4LQYvxtAdj94V1VMM29NO76RKO6v6z62lxRBVMYx5i0FVMyLySeAmnHTVK1T1cRE5zz1+KfB1YArwCzeAk1HVBY2S0TDahVJLceYthnSKngnhXEnVLKHp0ZPsyU/mnmyVWAyeDF7GUyVxCr9M3rUqtTyKWWRRGJau2kIxhobWMajqMmBZwb5LfZ/PAc5ppEyG0Y6UjDHEk/ngc5heRTGJ1UYxJHp4JfUKUF3w2ZtI+9LO0qCVxCn8MoET84gaGyi8hkdUq8p/30gWg9f5Njf6s5IMw2gQZV1J6XCupGFLT1ZpMXiWgqdoKpnUC11JlVgdeZl837/irKRqXUnufWMSi+TOaqcYg2EYDaJU8DkRSzCUHXIshhD++ZjEGMxUbzF4nUxhhyupmnTVviHHYqgkTuHhn9QrjjFUGXz27lupQmmHOgbDMBpEf7qfznjnCBdJMpakL9NHVrOhC9zyrqQaB5/DVlL78b6Pt0hPNRaDXzFWmpVU6I6rNCspqivLLAbDMCJTqk12Mp5k66Cz6E2orKRYrCaupO5kN4PZQTK5TKT1owvJWwxejKGK4HMilsg3EayZxRBReZrFYBhGwyjV8iIZS+ZXQwttMdTAleRNoP2Z/ryiqchicN+wvaU+qwk+w45nULPK5won+KjnmcVgGEZkSnVDTcYiWgyyw2KoNHMHdkzAqXTKaVoXS1R0Pb/FEJNYVcoKdjyDSi2Gal1JZjEYhtEwSrqSYsm8fz5U5TO1S1f15BrMDlb8pu+PMXTFuypaXGeYXO4zaHblc6U9lsxiMAwjNKXWVPZPXGFjDLV2JfVn+iuODXiKIZPLVBVfKJRrtGUl2dKehmFEJij47BEm+FuzrCSfK2kwO1hRfMGTx6Pa+ALscAXVrI4havC5whiDiCBI3VZwM8VgGG1IUPDZI2wTPXWbIFdbxwCOwhrIhFskqBh+GapJVfXIWwwVKoZqW2J4FlAlzzYu8fzvptaYYjCMNqSUxeAP+IatfPaoVYyhP9MfSikVwy9/LSyGk/Y+iaNnHs275767Ynk+/dpPs1PnTiPkC4P3fCsJxB+9x9HMnjg78nlhaGivJMMwGkOp7qmVWAwetchK6k/3h+7sWgwRIS5xspqtSYzhmFnHcMysY6q6xrkHn8tD6x9iee/yymMMFbjpLj7m4sjnhMUsBsNoM3KaK/lW7p+4wrxxV7pYfSF+iyFsO45yMtXCYqgV3nON3ERPKncl1RNTDIbRZniVxUEWQ3eiO1QmTqVLTxbiDz6XypgKi2e51CLGUCvyiqHC7CJTDIZh1JVSDfRgxxtt2Df2WsUYkrEkCUnkLYZKXUmwQzFU00Cv1njPptKlPU0xGIZRV0q13IYdE1DYiblWFoOI0J3spj/TXzJjKiwtaTHEK7MYKi1wqzemGAyjzSi1SA/4XEkhXTnDlp6scvLqSfTQl+6rKvgMOybTlowxNKjArd6YYjCMNsOzGIIqnxttMYDjvto0sAlFa2Ix1CIrqVZUrBgqLHCrN6YYDKPNCLQY4s1TDD3JHjb0b4h0/2J4b9mVVk/Xg4qzkmKVrcdQb1pLGsMwqiZUjCHkG7s/+FxpdbBHT6KHNdvWRLp/MT54wAe5b919vG3Pt1UlTy2ptIK5VS0GUwyG0WZ4S2cGxRiiWgzJWLImnUw39m+MdP9inDHvDM6Yd0ZVstQaizEYhtHS5F1JRd7KvTfbqBZDLSaunkQPGc3kP7cTlWYl5Z+vZSUZhlFP8q6kGsYYajFx+ZVRNa6kVqRSi6GaJnr1xBSDYbQZqUyKmMSKBmcjp6vW2GLwqKYlRiuSn+Ab1Ha73phiMIw2I5V2ehEViwlUE2OoFr8yaDtXksUYKkdEjheRlSKySkS+UuS4iMhP3eOPiMihjZTPMNqBoAIyf6+kMNRy4vK7j6rpldSKVOxKGutN9EQkDvwcOAE4AFgkIgcUDDsB2Mf9WQz8slHyGUa7ENRyImq6qlkM4Wi34LOo1mcFoBE3EjkC+Kaqvt3d/iqAql7gG/OfwO2qep27vRI4WlVfKnXdBQsW6IoVKyLLc/mXL6K/I/JphmEYLUPPkHD2RV+q6FwReUBVFxQ71khX0gxgjW+7190XdQwislhEVojIivXr19dcUMMwjLFMIwvcilXHFJorYcagqpcBl4FjMVQizDkXfbmS0wzDMNqeRloMvcAevu2ZwNoKxhiGYRh1pJGK4X5gHxGZIyIdwBnA0oIxS4EPutlJrwe2BMUXDMMwjNrTMFeSqmZE5JPATUAcuEJVHxeR89zjlwLLgHcAq4AU8OFGyWcYhmE4NLSJnqouw5n8/fsu9X1W4BONlMkwDMMYjlU+G4ZhGMMwxWAYhmEMwxSDYRiGMQxTDIZhGMYwGtYSo16IyHrg+QpPnwpsqKE49cLkrB2jQUYwOWvNaJCz0TLuqarTih0Y9YqhGkRkRaleIa2EyVk7RoOMYHLWmtEgZyvJaK4kwzAMYximGAzDMIxhjHXFcFmzBQiJyVk7RoOMYHLWmtEgZ8vIOKZjDIZhGMZIxrrFYBiGYRRgisEwDMMYxphVDCJyvIisFJFVIvKVJsuyWkQeFZGHRGSFu29nEfmHiPzL/Xcn3/ivunKvFJG311GuK0TkFRF5zLcvslwicpj7/VaJyE9FpNiCTLWW85si8qL7TB8SkXc0U04R2UNEbhORJ0XkcRH5jLu/pZ5ngJyt9jy7ROQ+EXnYlfNb7v6WeZ4BMrbUsyyKqo65H5y2388AewEdwMPAAU2UZzUwtWDfRcBX3M9fAb7vfj7AlbcTmON+j3id5DoKOBR4rBq5gPuAI3BW6LsBOKEBcn4T+GKRsU2RE9gdONT9PAF42pWlpZ5ngJyt9jwFGO9+TgL3Aq9vpecZIGNLPctiP2PVYlgIrFLVZ1V1CFgCvKfJMhXyHuA37uffAO/17V+iqoOq+hzO2hUL6yGAqi4HXq1GLhHZHZioqner8z/8at859ZSzFE2RU1VfUtV/up+3AU/irGfeUs8zQM5SNEtOVdXt7mbS/VFa6HkGyFiKpv0NFTJWFcMMYI1vu5fg//z1RoG/i8gDIrLY3beruqvXuf/u4u5vtuxR5Zrhfi7c3wg+KSKPuK4mz6XQdDlFZDbwWpw3yJZ9ngVyQos9TxGJi8hDwCvAP1S15Z5nCRmhxZ5lIWNVMRTzzzUzb/eNqnoocALwCRE5KmBsq8nuUUquZsn7S2AuMB94CfiRu7+pcorIeOB/gM+q6tagoSXkaZacLfc8VTWrqvNx1oZfKCIHBQxvipwlZGy5Z1nIWFUMvcAevu2ZwNomyYKqrnX/fQX4E45r6GXXhMT99xV3eLNljypXr/u5cH9dUdWX3T/KHPArdrjbmianiCRxJtvfquof3d0t9zyLydmKz9NDVTcDtwPH04LPs1DGVn6WHmNVMdwP7CMic0SkAzgDWNoMQURknIhM8D4DxwGPufJ8yB32IeAv7uelwBki0ikic4B9cAJTjSKSXK45v01EXu9mUnzQd07d8CYHl5NwnmnT5HSv+WvgSVX9se9QSz3PUnK24POcJiKT3c/dwNuAp2ih51lKxlZ7lkWpZ2S7lX+Ad+BkXDwD/L8myrEXTibCw8DjnizAFOAW4F/uvzv7zvl/rtwrqWN2AnAdjqmbxnlrObsSuYAFOP/5nwF+hltxX2c5rwEeBR7B+YPbvZlyAkfimP+PAA+5P+9otecZIGerPc+DgQddeR4Dvl7p30295AyQsaWeZbEfa4lhGIZhDGOsupIMwzCMEphiMAzDMIZhisEwDMMYhikGwzAMYximGAzDMIxhmGIwDB8iMllEPu7bni4if6jTvd4rIl8vcWy7++80EbmxHvc3jFKYYjCM4UwG8opBVdeq6ql1uteXgV8EDVDV9cBLIvLGOslgGCMwxWAYw7kQmOv2yf+BiMwWd50HETlLRP4sIn8VkedE5JMi8nkReVBE7hGRnd1xc0XkRrcp4h0iMq/wJiKyLzCoqhvc7TkicreI3C8i3ykY/mfg/XX91obhwxSDYQznK8AzqjpfVb9U5PhBwJk4/W2+C6RU9bXA3TitCsBZ1P1TqnoY8EWKWwVvBP7p274E+KWqvg5YVzB2BfCmCr+PYUQm0WwBDGOUcZs66xRsE5EtwF/d/Y8CB7tdSd8A/Ldvka3OItfZHVjv234jcIr7+Rrg+75jrwDTayO+YZTHFINhRGPQ9znn287h/D3FgM3qtFoOoh+YVLCvVH+aLne8YTQEcyUZxnC24SxpWRHqrF3wnIi8D5xupSJySJGhTwJ7+7bvxOnyCyPjCfuyowOnYdQdUwyG4UNVNwJ3ishjIvKDCi/zfuBsEfE65hZbNnY58FrZ4W/6DM4iTfcz0pI4BvhbhbIYRmSsu6phNAkRuQT4q6reXGbccuA9qrqpMZIZYx2zGAyjeXwP6AkaICLTgB+bUjAaiVkMhmEYxjDMYjAMwzCGYYrBMAzDGIYpBsMwDGMYphgMwzCMYZhiMAzDMIbx/wNpuT+ZymKivgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -230,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -588,26 +588,26 @@ " fill: currentColor;\n", "}\n", "
<xarray.DataArray 'px' ()>\n",
-       "array(0.)\n",
+       "array(-9.71445147e-15)\n",
        "Coordinates:\n",
-       "    id       int64 105\n",
-       "    time     float64 1.09e+03
" + " id int64 101\n", + " time float64 1.14e+03" ], "text/plain": [ "\n", - "array(0.)\n", + "array(-9.71445147e-15)\n", "Coordinates:\n", - " id int64 105\n", - " time float64 1.09e+03" + " id int64 101\n", + " time float64 1.14e+03" ] }, - "execution_count": 13, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['px'].sel(id=105).isel(time=109)" + "swiftdiff['px'].sel(id=101).isel(time=114)" ] }, { diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in index c8cc418b0..c1e239467 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in @@ -1,49 +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 +-0.30947664140174180325 0.16192347328838543885 0.041620272188990829754 +-0.01621725604493672035 -0.023743802865467341506 -0.00021385162925667799668 102 --0.09863667837052235432 0.29748290865203008693 0.03335708456145129036 --0.034957182012873608268 -0.0078122718370876240157 0.0023293874953380202045 +-0.30952276281440505024 0.16187735187572213635 0.041620272188990829754 +-0.021424354988955021661 -0.023743802865467341506 -0.00021385162925667799668 103 --0.6439245854659476631 -0.32479782779646521051 0.032702713983447248558 -0.0153169432007213678765 -0.018153139924556138673 -0.0007667345025597138231 +-0.55665652353468386693 -0.46068452244605162527 0.02580196630219121906 +0.019100355212014374223 -0.015678149412530151263 -0.0009510907726656827677 104 --0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 -0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 +-0.5567709441156283301 -0.4607989430269959774 0.02580196630219121906 +0.0064058878013235863447 -0.015678149412530151263 -0.0009510907726656827677 +105 +0.6979392465946233637 -0.7360158052852626698 3.261671020506711323e-05 +0.019099571043071944532 0.0117727888369263504476 -6.0385404652521189453e-07 106 -0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 -0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 +0.6978187907827443359 -0.73613626109714169754 3.261671020506711323e-05 +0.005310690574524194567 0.0117727888369263504476 -6.0385404652521189453e-07 107 --1.5926895092930311026 0.48169594448240382611 0.049163460846716633412 --0.00044929323243133797994 -0.01219974682608557931 -0.00016910795626524249315 +-1.6176294307533440886 0.38317575049123231423 0.04771055403546069218 +0.00037580012182093606998 -0.012421968497550240837 -0.00019400613558421780209 108 --1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 --0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 +-1.6176935155808518374 0.38311166566372467646 0.04771055403546069218 +-0.005783158074626849887 -0.012421968497550240837 -0.00019400613558421780209 +109 +4.1534063578978459574 -2.834088304936593694 -0.081136554176388195336 +0.041050613953966016978 0.0065946899141205552256 -0.00012065009272080269359 110 -4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 --0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 +4.152084559881651593 -2.8354101029527880584 -0.081136554176388195336 +-0.032713820449328842588 0.0065946899141205552256 -0.00012065009272080269359 111 -6.3634605491076454697 -7.64917730379279881 -0.12023019299387090186 -0.026096616095614821179 0.0035613826786502411278 -0.00022039988214595340028 +6.395266446455758924 -7.620612254932671803 -0.121992225877669294154 +0.026081181967058334609 0.0035798698934692090544 -0.00022010758050265331019 112 -6.3623595643973844815 -7.650278288503059798 -0.12023019299387090186 --0.01812972167145235694 0.0035613826786502411278 -0.00022039988214595340028 +6.394165461745497936 -7.621713239642932791 -0.121992225877669294154 +-0.01814515580000884351 0.0035798698934692090544 -0.00022010758050265331019 113 -14.814394441298382787 13.052280053388562564 -0.14347198499748289868 -0.010469662145386185101 0.0027742356008832688187 4.416821810149910185e-05 +14.793375114914683266 13.074458101351583039 -0.14311846037737518955 +0.0104650340723796142495 0.0027702756265410048361 4.4212949669357180555e-05 114 -14.813914925323977911 13.051800537414157688 -0.14347198499748289868 --0.015719864931937603536 0.0027742356008832688187 4.416821810149910185e-05 +14.79289559894027839 13.073978585377178163 -0.14311846037737518955 +-0.015724493004944172653 0.0027702756265410048361 4.4212949669357180555e-05 115 -29.565157420731857485 -4.579098772788029237 -0.5871109926822926095 -0.014900134286357700347 0.003128345390031967918 -7.5036135696161668576e-05 +29.568862657342247502 -4.5540701367497931074 -0.58771107137394917874 +0.0148974462162825404404 0.0031288137434451902125 -7.498349850432879627e-05 116 -29.564691895839423808 -4.5795642976804593616 -0.5871109926822926095 --0.0139711373401985618214 0.003128345390031967918 -7.5036135696161668576e-05 +29.568397132449813824 -4.554535661642223232 -0.58771107137394917874 +-0.013973825410273721728 0.0031288137434451902125 -7.498349850432879627e-05 From 3ef41539557f9a652b6c4427c5ee67a7c1116fa5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 13:33:34 -0400 Subject: [PATCH 18/71] Fixed discard particle number issue and added new checks for discards --- docs/src/io.f90 | 22 +++++++++------ .../mars_ejecta/param.swifter.in | 2 +- .../mars_ejecta/param.swiftest.in | 3 ++ src/discard/discard.f90 | 28 +++++++++++++------ src/modules/swiftest_classes.f90 | 1 + src/util/util_spill.f90 | 2 +- src/whm/whm_setup.f90 | 2 +- 7 files changed, 40 insertions(+), 20 deletions(-) diff --git a/docs/src/io.f90 b/docs/src/io.f90 index 42cc8ddd9..de1226951 100644 --- a/docs/src/io.f90 +++ b/docs/src/io.f90 @@ -1211,16 +1211,20 @@ module subroutine io_write_discard(self, param) associate(tp_discards => self%tp_discards, nsp => self%tp_discards%nbody, pl => self%pl, npl => self%pl%nbody) if (nsp == 0) return - select case(param%out_stat) - case('APPEND') + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) + case('NEW', 'REPLACE', 'UNKNOWN') + open(unit = LUN, file = param%discard_out, status = param%out_stat, form = 'FORMATTED', iostat = ierr) + case default + write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + lfirst = .false. + else open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) - case('NEW', 'REPLACE', 'UNKNOWN') - open(unit = LUN, file = param%discard_out, status = param%out_stat, form = 'FORMATTED', iostat = ierr) - case default - write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select - lfirst = .false. + end if if (param%lgr) call tp_discards%pv2v(param) write(LUN, HDRFMT) param%t, nsp, param%lbig_discard diff --git a/examples/rmvs_swifter_comparison/mars_ejecta/param.swifter.in b/examples/rmvs_swifter_comparison/mars_ejecta/param.swifter.in index f4035c4c0..3ffb6a2ee 100644 --- a/examples/rmvs_swifter_comparison/mars_ejecta/param.swifter.in +++ b/examples/rmvs_swifter_comparison/mars_ejecta/param.swifter.in @@ -14,7 +14,7 @@ IN_TYPE ASCII BIN_OUT bin.swifter.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output -OUT_STAT NEW +OUT_STAT UNKNOWN J2 0.0 ! no J2 term J4 0.0 ! no J4 term CHK_CLOSE yes ! check for planetary close encounters diff --git a/examples/rmvs_swifter_comparison/mars_ejecta/param.swiftest.in b/examples/rmvs_swifter_comparison/mars_ejecta/param.swiftest.in index 7df10c4d0..943e45ca3 100644 --- a/examples/rmvs_swifter_comparison/mars_ejecta/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/mars_ejecta/param.swiftest.in @@ -24,3 +24,6 @@ GR no MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 86400.0000 +RHILL_PRESENT no +DISCARD_OUT discard.swiftest.out +BIG_DISCARD yes ! output all planets if anything discarded diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index c71790c2d..3d65a235d 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -12,15 +12,27 @@ module subroutine discard_system(self, param) class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - logical :: lany_discards + logical :: lany_discards, lpl_discards, ltp_discards, lpl_check, ltp_check - associate(system => self, tp => self%tp, pl => self%pl) - lany_discards = .false. - call pl%discard(system, param) - call tp%discard(system, param) - if (tp%nbody > 0) lany_discards = lany_discards .or. any(tp%ldiscard(:)) - if (pl%nbody > 0) lany_discards = lany_discards .or. any(pl%ldiscard(:)) - if (lany_discards) call system%write_discard(param) + lpl_check = allocated(self%pl_discards) + ltp_check = allocated(self%tp_discards) + + associate(system => self, tp => self%tp, pl => self%pl, tp_discards => self%tp_discards, pl_discards => self%tp_discards) + lpl_discards = .false. + ltp_discards = .false. + if (lpl_check) then + call pl%discard(system, param) + lpl_discards = (pl_discards%nbody > 0) + end if + + if (ltp_check) then + call tp%discard(system, param) + ltp_discards = (tp_discards%nbody > 0) + end if + + if (lpl_discards .or. ltp_discards) call system%write_discard(param) + if (lpl_check) call pl_discards%setup(0,param) + if (ltp_check) call tp_discards%setup(0,param) end associate return diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 2455e77f2..25c18295a 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -275,6 +275,7 @@ module swiftest_classes class(swiftest_pl), allocatable :: pl !! Massive body data structure class(swiftest_tp), allocatable :: tp !! Test particle data structure class(swiftest_tp), allocatable :: tp_discards !! Discarded test particle data structure + class(swiftest_pl), allocatable :: pl_discards !! Discarded massive body particle data structure real(DP) :: Gmtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion real(DP) :: ke_orbit = 0.0_DP !! System orbital kinetic energy real(DP) :: ke_spin = 0.0_DP !! System spin kinetic energy diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 9acc6ae93..9c76ff5e9 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -183,7 +183,7 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) ! 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 discards%nbody = count(lspill_list(:)) - keeps%nbody = count(.not.lspill_list(:)) + keeps%nbody = keeps%nbody - discards%nbody if (keeps%nbody > size(keeps%status)) keeps%status(keeps%nbody+1:size(keeps%status)) = INACTIVE end associate diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index cbf36cc90..eaed16c14 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -82,7 +82,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, param) + call self%tp_discards%setup(0, param) call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) if (param%lgr) then From 7dc73e93b3c13b1cefc04f512fb0d31c0b4084c5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 13:47:30 -0400 Subject: [PATCH 19/71] Updated example Notebook --- .../mars_ejecta/swiftest_rmvs_vs_swifter_rmvs.ipynb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/rmvs_swifter_comparison/mars_ejecta/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/mars_ejecta/swiftest_rmvs_vs_swifter_rmvs.ipynb index c0ae7eec3..5a26d4104 100644 --- a/examples/rmvs_swifter_comparison/mars_ejecta/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/mars_ejecta/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -45,9 +45,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 6.001e+03\n", + "Reading in time 6.000e+03\n", "Creating Dataset\n", - "Successfully converted 6002 output frames.\n", + "Successfully converted 6001 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -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": "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\n", "text/plain": [ "
" ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABzRElEQVR4nO2dd3hj1Zm4309dlnvvY09v9KGFDiG0AGkkkAJpEDZ1N5u++8umkd4TCBA2IRWWkNAJhCS0JJQZ2jSm2p5x70WW1XV+f9wrj2zLtiTLHns47/PosXTvufecI9vnu+eropRCo9FoNJo4lsM9AI1Go9EsLrRg0Gg0Gs0EtGDQaDQazQS0YNBoNBrNBLRg0Gg0Gs0EtGDQaDQazQS0YNAkRUS+JCK/Nd/Xi8ioiFgP97hmQkTOEJHdC9ynEpGVc7zHDhE5OzsjmnLvaX+PIlIhIk+JiFdEvicGvxSRQRF5fj7Go1kaaMFwhCIiLSLy+knH3isi/0j3Xkqpg0qpXKVUNHsjTI9UFmCl1NNKqTULNaZsoZTaoJR6AiYu5PPQz+Tf43VAH5CvlPpP4HTgfKBWKXXSfIxBszTQgkFzRCAitsM9hiXIMmCnOhTlugxoUUr50r2R/v6PLLRgeA0jItUi8kcR6RWRZhH5+DTtGswndlvCdfeLyICI7BORaxPaWkXkCyKy31RRvCAidea5tSLymHndbhF5e8J1t4vIjSLykHndcyKywjz3lNnsFVMV8g4ROVtE2kTksyLSBfwyfizhnnUi8idzfv0i8tNpvgO/iBQnHDtORPpExG5+fr+IvGqqWB4VkWXTfE8FIvJrs78DIvLfImJJOH+teR+viOwUkePN4y0i8noRuRD4AvAOc56viMgVIvLCpH7+U0TunWYMjSLypNnHY0Bpst+jiNwOXAN8xuzrQ8BtwKnm5y+b17xRRF4WkSER+ZeIHJ1wvxbz+98K+Mz7nmK2GzLHf3ZC+ydE5Ksi8k9zfH8RkcTxnZ5wbauIvNc87hSR74rIQRHpFpGbRcRtnisVkQfNawZE5OnE71yTIUop/ToCX0AL8PpJx94L/MN8bwFeAL4IOIDlQBNwgXn+S8BvzfcNgAJs5ucngZsAF3As0AucZ577NLANWAMIcAxQAniAVuB9gA04HkONscG87nZgADjJPP874M6EsStgZcLns4EI8C3ACbjNY23meSvwCvADs28XcPo039XfgWsTPn8HuNl8/yZgH7DOHNd/A/9KNi7g18B9QJ75ne0BPmCeuwJoB040v5eVwLLJv6vE79387DS/l3UJx14C3jrNXJ4Bvm9edybgneH3eDvwtWR/H+bn44Ee4GTz+7zGHKszYdwvA3Xm918D9AMXY/x9nW9+LjPbPwHsB1ab7Z8AvmmeqzfHehVgx/ibOdY890PgfqDY/G4fAL5hnvsGcLN5jR04A5DD/f+31F+HfQD6NU+/WOOfdhQYSniNcUgwnAwcnHTN54Ffmu/HF6jEBcVcBKJAXsJ13wBuN9/vBi5PMp53AE9POnYL8D/m+9uB2xLOXQzsSvicTDCEANekY3HBcCqGwLKl8F19EPi7+V4wBNiZ5uc/Yy7u5meL+T0uSxwXxsIZBNYntP0Q8IT5/lHgEzP8rpIKBvPYz4AbzPcbgEHMxXlSu3oMYelJOPb7ZL/HhO98JsHwM+Crk/rYDZyVMO73J5z7LPCbSe0fBa4x3z8B/HfCuQ8DjyT87d2TZE4C+IAVCcdOBZrN91/BEMYrJ1+rX5m/9JbryOZNSqnC+AvjHzHOMqDa3IIPicgQhhqjYpZ7VgMDSilvwrEDGE+LYAiO/UmuWwacPKm/dwGVCW26Et6PAbmzjKVXKRWY5lwdcEApFZnlHgB3Y6hQqjGeshXwdMK4f5Qw5gGMxapm0j1KMXZeBxKOpfK9pMKvgHeKiADvAe5SSgWTtKsGBtVEG8GBJO1SZRnwn5N+Z3VmP3FaJ7W/YlL704GqhDbT/Y6n+37KgBzghYR7PmIeB2N3tw/4i4g0icjn0p+mZjLaYPTapRXjqWtVmtd1AMUikpcgHOox1CTx+64Atifp70ml1PmZDjgJM6UGbgXqRcQ2m3BQSg2JyF+At2OojO5Q5uOoeZ8blFK/m2UsfUAY06BrHkv2vczGlDkppZ4VkRCGmuSd5isZnUCRiHgShEN9snumSHzuN6Q43laMHcO10zWepa9knlB9gB9D5dg++aT5N/ifGAJsA/C4iGxWSv0tgzFoTPSO4bXL88CIaTx0i2E03igiJ850kVKqFfgX8A0RcZnGyA9g2ATAMGB+VURWicHRIlICPAisFpH3iIjdfJ0oIutSHG83hh0knfl1At8UEY851tNmaP974Grgreb7ODcDnzcXnbiB+YrJFyvDBfQu4AYRyRPDQP1JIO56ehvwKRE5wfxeVkpyI3Y30JDEgPpr4KdARCmV1OVYKXUA2AJ8WUQcInI6cOkMc56NnwPXi8jJ5pg9InKJiORN0/63wKUicoH59+QSwyGgNoW+fge8XkTebhqxS0TkWKVUzBzHD0SkHEBEakTkAvP9G83vUoARDDXnYXOrPlLQguE1irmQXYphPG7GeDK7DShI4fKrMPTVHcA9GHaCx8xz38dYIP+C8Y/6v4DbfLJ7A3CleV0XhwzHqfAl4FemOuHtszVOmN9K4CDQhmHnmI77gVVAt1LqlYT73GOO804RGcHYCV00zT0+hqEPbwL+gSFgfmHe5w/ADeYxL3AvhjF1Mn8wf/aLyIsJx38DbDR/zsQ7MexHA8D/YAiUjFBKbQGuxRBIgxgqm/fO0L4VuBxDJdmLsQv4NCmsM0qpgxh2pf80x/4yhuMCGLaLfcCz5u/grxjODWD8zv6KYU97BrhJmTEhmsyRQztmjUazWDHdM3uA45VSew/3eDRHNnrHoNEsDf4N2KyFgmYh0MZnjWaRIyItGJ5Qbzq8I9G8VtCqJI1Go9FMQKuSNBqNRjMBLRg0mnlERN5lxkjM1m7esqpmghi5q752uMehOTxowaBZNMihegHxlxIRX8LnMzK455T045POny0iMfP+XjGS+70vw/FPSDYIoJT6nVLqDZncT6M5XGjjs2bRYPqyj6fBEBEFHKOU2jfPXXcopWrNIKnLgbtF5Dml1M7ZLowjOu205ghC7xg0SwLJIPWyiPwGIyXEA+aO4DMz9aEM7sUI5lpvRvm+JCIjYqSB/lLCeOK7gw+IyEGMDK3x9OBDZn+nyqTiSCKyQQ6lHu8WkS9MM9+Z0le/V4y8QF4x0qW/a4bv7Ici0mG+figiTvNcPG35f4pIj4h0TrdTEpHtInJpwme7GGnJj53p+9QsXbRg0CwVvoWRrvlYjGjmGoyU4WBEy7ZhJFarwIi8VUqp92BEPV+qjMpl356pA1OYvBkoxEgd7sNIk1EIXAL8m4i8adJlZ2HkV7oAIwEfQKHZ3zOT7p+HEaX7CEYiupXAlJw+IlIDPAR8DSM6+lPAH0WkTEQ8wI+Bi5RSecDrMKKEk/FfwCkY39kxGLmI/jvhfCVGpHsNRlqTG0WkKMl9fg28O+HzxUCnUmq6fjVLnCNCMIjIL8ynnsmJ2zK93yPmk9qD05z/iYiMZqMvzeyYKp5rgf9QSsUzu34dI70GGMnrqjBSYYeVUeIzHT/sajGydvZhpJF4j1Jqt1LqCaXUNqVUTCm1FbgDQxAk8iWllE8p5U+hnzcCXUqp7ymlAkopr1LquSTt3g08rJR62Oz7MYwcSBeb52PARhFxK6U6lVI7punvXcBXlFI9Sqle4MsY2VnjhM3zYaXUwxhpJZKVRv0tcLGI5Juf38PsqTk0S5gjQjBg5JW/MIv3+w4T/4HGEZFNGE+QmoVjvlMvd5ipyYuVUscqpe4EECN53ONiVGQbBq4noSKaSeuUu01Pqqm3p01fbWZNfYc5lk4xKt6tneY+1UxNA56YMrt/UubZpKnOlVIdwD+Bt4pIIUauqNmyzWqWMEeEYFBKPYWReGscEVlhPvm/YOqcp/vnSXa/v2EkOpuAiFgxFqEZddWarJOYejleX6JAKZULRuplpdR/KqWWYyTO+6SInGdeO5cIzt9jJNerU0oVYGRalUlt1DTvk5Fq6u14+urChJdHKfVNAKXUo2b68ipgF0b20WR0YAiZOPXmsUz4FcZO5grgmWQpsDVHDkeEYJiGW4GPKaVOwNDR3pSFe34UuF8p1ZmFe2lSZI6pl9NN151IHkZRooCInMT0dRDi9GKoeabr70GgUkT+3TQM54nIyUnaTZu+WkQqROQy09YQxFD/TJdm+g7gv03bRCmGTSbTWIl7MUp9foI5ZGzVLA2OSMEgIrkYRrk/iMjLGCUkq8xzbzG9LCa/Hp3lntUYT0s/mefha5KTaerlb2AsjkMi8qk0+/ww8BUR8WIsqnfN1FgpNYaRWvufZn+nTDrvxaiDfClG2vG9wDlJ7jNT+moLhrG9A2OXfBYTK/Ml8jUM28RWDGP6i+axtDFtKH8EGoE/ZXIPzdLhiMmVJCINwINKqY2mkWy3Uqpqlstmut/ZwKeUUm80P1+CUVsgXkqyHmhSSq2cy7g1mqWCiHwRWK2UevesjTVLmiNyx6CUGgGaxay0JQbHzHLZbPd8SClVqZRqUEo1AGNaKGheK4hIMYZL662Heyya+eeIEAwicgeGCmGNGbTzAQxXvQ+IyCvADoytear3exqjktZ55v0umI9xazRLARG5FkOd9WfT0UNzhHPEqJI0Go1Gkx2OiB2DRqPRaLLHkk/8VVpaqhoaGg73MDQajWZJ8cILL/QppcqSnVvygqGhoYEtW7Yc7mFoNBrNkkJEDkx3TquSNBqNRjMBLRg0Go1GMwEtGDQajUYzAS0YNBqNRjMBLRg0Go1GM4EFEwyzFdMx01b8WET2ichWETl+ocam0Wg0mkMs5I7hdmYupnMRRpbMVcB1wM8WYEwajUajmcSCCYZkxXQmcTnwa7Mg+7NAoYhknB1Vo9FojkRiwSADv/ktkb6+eetjMdkYaphYJrHNPDYFEblORLaIyJbe3t4FGZxGo9EsBvpu+hndN9xA11e+Om99LCbBMLlkIkxTKlEpdatSapNSalNZWdKIbo1Gozki8T72GACjTzxBLBiclz4Wk2BowyiWHqeWzOvTajQazRFHpL+fUFMTOZs2oUIhAlu3zks/i0kw3A9cbXonnQIM69rKGo1Gc4jg/v0AFL79CgACr746L/0sWBI9s5jO2UCpiLQB/wPYAZRSNwMPAxdj1PUdA963UGPTaDSapUDIFAw5J56IY+UKVDg8L/0smGBQSl01y3kFfGSBhqPRaDRLjmBTM5acHGyVlax48MF562cxqZI0Go1GMwPh9nbstbWIJPPVyR5aMGg0Gs0SIdLVha2qct770YJBo9Folgjhri7sFVowaDQajQYj4jk6MIBd7xg0Go1GAxDp7gbApncMGo1GowEId3YB6B2DRqPRaAwiZl44W3n5vPelBYNGo9EsAaKDgwBYi4vnvS8tGDQajWYJEB0cABGs+fnz3pcWDBqNRrMEiAwOYi0sRKzWee9LCwaNRqNZAkQHBhdEjQRaMGg0Gs2SIDo4iLWocEH60oJBo9FolgDRwQFsRXrHoNFoNBqTyOAQ1qKiBelLCwaNRqNZ5KhYzFAlFWvBoNFoNBog5vVCNIpN7xg0Go1GAxAZGAAWJrgNtGDQaDSaRc941HOh3jFoNBrNokIpxehTTxH1ehe030PpMLRg0Gg0mkXF0J130nrdh+j41KcXtN+4KknbGDQajWaRMXzvfQCMPvkkYbM+wkIQHRwC0O6qGo1Gs5iIer34t23Dc8YZAPi3bl24vgcGELcbi9u9IP1pwaDRaDQpENy7D2IxCt/6FrBaCezcuWB9RwcHF0yNBFowaDQaTUoE9+8DwLVhA87lyxdUMEQGBxZMjQRaMGg0Gk1KhPbtR1wu7DU1ONeuJbh7z4L1HR0cWrAYBtCCQaPRaFIi2NSEY3kjYrHgqK8n0t1NLBhckL6jAwMLllkVtGDQaDSalIj09GCvrALAUV8HShFu71iQvg0bg94xaDQazaIi0teHrbQUAHtdHQDh9rZ57zcWDBIbG9M2Bo1Go1lMqGjUeGqPC4baWgBCra3z3vdCRz2DFgwajUYzK9GBAYjFsJaWAGArK0NcLsIHF0AwxBPoHak7BhG5UER2i8g+EflckvMFIvKAiLwiIjtE5H0LOT6NRqNJRqSvD2B8xyAi2CsqCHd3zX/f5o7BdiR6JYmIFbgRuAhYD1wlIusnNfsIsFMpdQxwNvA9EXEs1Bg1Go0mGZG+fuCQYACwVVYS6e6Z976jA6Yq6QjdMZwE7FNKNSmlQsCdwOWT2iggT0QEyAUGgMgCjlGj0WimMHnHAGCrKCfSNf87hnEbwxEqGGqARIVcm3kskZ8C64AOYBvwCaVUbGGGp9FoNMmJ9PUCYCspGT9mr6gk3NuLis3vEhUZHACLBWtBwbz2k8hCCgZJckxN+nwB8DJQDRwL/FRE8qfcSOQ6EdkiIlt6e3uzPU6NRqOZQLSvH8nJweLxjB+zVVRAODxuHJ63vgcHsRYWIpaFW64XUjC0AXUJn2sxdgaJvA/4kzLYBzQDayffSCl1q1Jqk1JqU1lZ2bwNWKPRaGBiDEMce2UFwLyn344ODC6oGgkWVjBsBlaJSKNpUL4SuH9Sm4PAeQAiUgGsAZoWcIwajUYzhUh//xTBYKswBENkvgXDAmdWhQUUDEqpCPBR4FHgVeAupdQOEbleRK43m30VeJ2IbAP+BnxWKdW3UGPUaDSaZET6eifYFwBs5eXGuZ759UyKDA4saAI9ANtCdqaUehh4eNKxmxPedwBvWMgxaTQazWxEe/uwnXTShGO2khIQIdIzv3bO6ODQEa1K0mg0miWHCoWIDg9jnaRKEpsNa0kJkXl0gFGxGNGhoQVNhwFaMGg0Gs2MREyvI1tJ6ZRztrKyeRUMsZERiEaPXBuDRqPRLEUivWZwW1kywVA6rzaGyHjU88LaGLRg0Gg0mhmI9JuCYZLxGeZ/xxAdWvioZ9CCQaPRaGYkmiQdRhxbWRmR/n5UNDo/fcfVWNrGoNFoNIuHeJ6kycZnMF1WY7F5i36OHIY8SaAFg0aj0cxIpK8fS14eFqdzyjmbmXkhPE92hsORWRW0YNBoNJoZSZYOI47dFAzzZWeIDvRj8XiwuFzzcv/p0IJBo9FoZiA6g2CwzbNgiPQPYE1i9J5vtGDQaDSaGYj09Y2X9JyMdd4FQ19Sb6j5RgsGjUajmQFDlZQ8i7PF4cBaWDh/qqT+AawlCxvDAFowaDQazbTEAgFio6PTqpLAdFmdp3xJkYEBbMV6x6DRaDSLhkO1nqdfnOcryE1Fo0QHBmbse77QgkGj0WimIRov6TnbjmEeBEN0eBhiMayHYccwa9ptEalP8V5DSqmROY5Ho9FoFg2RfmPHYE2SQC+OrbyMSF8fSilEklUwzoyo2bftMNgYUqnH8CuM2swzzVgBtwO/zsKYNBqNZlEwUwK9OLayMqP289BQVrOgjgulxbhjUEqdM/mYiFQqpbrmZ0gajUazOBhPoDdDBbXESm7zIRiWko3h6qyOQqPRaBYhkb4+rIWFiN0+bZvxILcseyZF+438Swtd1hMyL+15uYiMAY8ppXZnc0AajUazWIj29c2oRoL5i36O9PeD1Yq1oCCr902FTHcMbwH2AW8WkduyOB6NRqNZNET6+pNmVU1kvgRDdKAfW3ExYll459GMdgxKqW7gEfOl0Wg0RySRvj7cxxwzYxuL240lN3cedgyHJ08SZLhjEJEbReR28/0bsjoijUajWSTMlFk1EVt5edZLfEb7+2c0es8nme5RQkCT+f7cLI1Fo9FoFg0xnw/l96fkFTQfQW6R/v6ltWMAxoACEbEDqQbAaTQazZJhpsptk5kXwTAwcFgyq0LmXkkDgB+4Efhn9oaj0Wg0i4NDcQTJM6smEhcM2Yp+jo2NocbGDktmVUhzxyAihSLyS+Ct5qFfA5uyPiqNRqM5zIxHPaeoSlLBIDGvNzt9mzWkD0dmVUhzx6CUGhKRbwINQB9wNPCneRiXRqPRHFYiKSTQi5MY/WzNz59736YhO37fhSYTVdIHgGal1KPAC1kej0aj0SwKov39YLFgTSHNRWIsg3Plyjn3HenuNu5bsXQEwyBwvYisAV4BXlZKvZTdYWk0Gs3hJdLbi7WkGLFaZ22b7SC3sCkY7BUVWblfuqQtGJRS3xCRvwF7gGOBMwEtGDQazRFFpHf6kp6TsZVnVzBEunsQpxNLFtRSmZC2YBCRrwBW4GWM3cITWR6TRqPRHHZSDW4DsHg8iNudtUR6ke5ubBUVWa3vkA5pxzEopb4IBM1r3yoiP0/1WhG5UER2i8g+EfncNG3OFpGXRWSHiDyZ7vg0Go0mG0R6e8dVRLMhIqbLanain8M93dgPk+EZMg9w+wWwDigBbkrlAhGxYsQ9XASsB64SkfWT2hSa97tMKbUBuCLD8Wk0Gk3GqFiMSH9/yjsGAHt5OeHu7AiGSHcPtsNkX4DMBcPHMdRQNuBHKV5zErBPKdWklAoBdwKXT2rzTuBPSqmDAEqp7CYf0Wg0mhSIDg9DJJKWYLBVVxHu7Jhz30qpcVXS4SJTwbAfcAH3KaXOTPGaGqA14XObeSyR1UCRiDwhIi+ISNKCQCJynYhsEZEtvfNQhFuj0SQnFlML1tdIv5+HbtrK/pcOPR/6nn2W0X/Of7KFuK0gblROBXtNDZGublQ4PKe+Y8PDqFAI+2FyVYXMBcMO4O/AB0Rkc4rXJLOiTP4rswEnAJcAFwD/T0RWT7lIqVuVUpuUUpvKUtQBajSaudG2e5Cff+JJnrln34L099x9TbRs7eOvt79KOBTF99zzHHzv+2j9wAcJ7Nw5r32nE9wWx15dDbHYnNVJ8euX4o5hBcYifivwvhSvaQPqEj7XApP3XW3AI0opn1KqD3gKmDkZukajWRCeu28/kXCMl/5ykIBvbk/FsxGLxjiwvR93voNIMEp30zCDd94BZtGawf+7a177j7udpmp8BlMwAOGO9rn13WMGt5UvPcHQqpS6H6OK26spXrMZWCUijSLiAK4E7p/U5j7gDBGxiUgOcHIa99doNPOE3xuiq3mE+g0lKAWtrw7Ma389B70ExyKcctlyRKB99yC+p56m8K1vJe/CCxl9/HGUmj+1VrQvnicpzR0DEO6Ym51hPOp5CXolXSgitcDNwA9SuUApFQE+CjyKsdjfpZTaISLXi8j1ZptXMarCbQWeB25TSm3PcIwajSZL9BzwgoLj31CPM8c274Kh94CRjK5ufTEltbl07Ogk5vORc9KJ5J5xOpGeHkL75k+lFentQ3JysHg8KV8zLhja57ZjCLW3g8VyWG0MmabdLgQ+C3wG+GCqFymlHgYennTs5kmfvwN8J8NxaTSaeaCvzVioS+vzKF+WR1/r6Pz21z6KM8dGbpGT0ppcWl40Flv3ccejQkEA/Nt34Fy1al76N2IYUt8tAFicTqxlpXPeMYTb2rFXViJ2+5zuMxcy3TF8BcMjaTcQzeJ4NBrNIqS/bZS8YhdOt42SmlwGOnzEorF57a+kJhcRobgml0DISqSoEntNNY5ly5CcHAI7dsxb/0bUc/qOLfbq6iwIhjbstbVzusdcSVkwiMi4EVgp1aaU+qv5PmkEs0ajOXLoaxulpDYXgNLaXKKRGEM9/nnpSynFYKePkmpDjVNSY/wMrTgeEUGsVlzr1s2rZ1Kktzct+0Ice3U14fbXkGAAXhKRrSLyGRGpm725RqM5EohFDSEQX6iLqoyfQ91j89JfcCxCKBAlv8wNQGF5DgCByhXjbVzr1xPYtQsVzb7CQilFuLsbe2X6XkGO2lrCnZ2oSCSjvmOBAJHeXuy1k0O8FpZ0BMP3AA/wTaBZRB4XkffPz7A0Gs1iwTccQsUUeSUuAArMBXt4nnYM3v4AAHnFRn8u8SOxKMG8qvE2rvXrUWNjhFpastp3OBglOjKCGhvDVlGZ9vWOhgYIhzNWJ4U7Oo37LJUdg1Lq00qpFRilPG/DSLd963wNTKPRLA5GB4yFOtdcqJ05dlweO8O987Nj8Jr9xQVRpLkJV6Afv71wvI1ztWF0Du7NnmdS664B/vdTT/P0nbsBMtsxNDQAEGpuzmgM4fY2o++aJbJjEJESEfkg8HWMoDZhYooLjUZzBOIdNBfqItf4sYJyN8O987tjyC8xdibB5mbcgT5Gw47xNs7GRgBCzU1Z6/e5+5qIhmPsfGkUv6sEW2XV7BdNwhEfV4Y7mXCbKRiWyo4B6AJuwdgx/BI4UynVOC+j0mg0i4bRAcM9NLfYOX6soMw9b6qkkX4/NqcVp8fwpg+3t+MO9OMdPmRPsOTkYK+uJrg/O4LBNxyku3mEtacY6qPBwtUZ7RisRUVYCgoIZigYQm1tiN2eVsT1fJCOYLgHeDNQpZS6Xin1j3kak0ajWUR4BwI4c2w4XIfCnvLL3HgHA0Qj2XdZ9fYHyC9xjRepCbe147GHCI5FJqTicCxfTrBpf1b6bN8zCMDR59bhsEYYLlyR0eIsIjgalhFqbsloHKHmFhwNyxBLppEE2SEdG8PblVL3K6XmN0mKRqNZVIwOBMbtC3HyS1ygYHQwmPX+vAOBccMzGDuGvHxjqRrpO7RLca5YTqi5BRWbu3DqPTiK1WahuMZDsWWQkaKVGQeYORsaM1YlhZqacDQuz+jabHJ4xZJGo1n0eAeDExZqOGSIjhuKs9pff2Dc8AyGYMgvyxk/F8exfAXK7yfS2TnnPvtavRRXe7BaLeQHOvE5SoiGMxM4jsYGIl1dxMbSM86rUIhQayuO5YdfQ5+2YBCRS+djIBqNZnEyOhAgr8g54VhcUCQu1Nkg6I8QHIuMC4ZYMEikp4eC2kIARhL6c5oLaLBpbnYGpRR9raOU1RkBfK6hNhBLxsZ1R4NpgD5wIK3rQgcPQjSKc8WK2RvPM5nsGG7I+ig0Gs2iJBQwFurJqqS4h1K2dwyTYxji8QC5y6pxuG14E1RJjuWGyiVT19A4gdEwAV+Y4upclFK4OvcAmQfwORobMhpXXMAtBlVSJkn0khXc0Wg0RyDJPJIArHYLOQWO8RiHbBEXNHFX1Xh6CXtNDfmlMUYS+rMWF2PJzyc4R8EwbAqb/DI3sZERXIOGF/5QT4aCYdkyEEl7XCFTMDhNwXI4yWTHsHC1/TQazWElWQxDnLxi1zzsGIxFOq5KGvfrr6kx+ktQJYkIjsaGjD2A4sQN2gWlbkJtbdiiAdwuxWCGOwaLy4W9vo7grt1pXRfctx9bVVVaqb7nC2181mg00zI56jmRyQt1NhjpD2CzW3DnGR5B4fZ2sNuxlZeTX+JmpM8/oUCPs3H5+JN2xn32msKv1EW41RBEBSVOhueQC8q1bj2BV9OrMRbYsQPXunUZ95lNtGDQaDTTMjoYRCyCp8Ax5VxesYvRwSAqlj0lwqjpkTQew9Dejr2qCrFaySt1EQnFCIwmxDI0NhLp6SE66su4z5E+PzkFDuwO63hKiqLagox3DACudesIt7URHRlJqX10dJRQSwuujRsy7jObZCIYurM+Co1GsyjxDgTwFDqwWKcuFXklLqKRGGPeUNb6G+mfGMMQam/DXmNURss31UsjfQkuq3FD7xyS6Q33+ikoNWwaobY2LAUFFNUUjBulM8G13njyD+xMbdcQ2LkTlMK9cWNG/WWbtAWDUur8+RiIRqNZfBiuqlPVSJDgsppFO8PUGIaO8UyjeaZBeqQ/Icht3DMpc3XSSJ+ffFMwhFvbcNTWjmeQzVRV5jIXeP/WrSm1D2w3ig65NizdHYNGo3mN4E0S9RwnvoBny84QChgpL8ZjGPx+on1945lG85P0Z6+vB4slY5fVaDjG6FBwvPZDvEhOfpnRV6axDLaiIhyNjfhffDGl9oEdO7BVVWErKcmov2yjBYNGo0mKiilGB4PkTXJVjZPtILfJ6bbjMQxxweBw23B6bBOC3CwOB/baWoJNmQkG70AAFBSUulCxmGHTqK0Zd5dNTMGRLu4TjmfspZdSStnh37YN14b1GfeVbTISDCLyyYT3a7I3HI1Gs1gY84aIRRW506iSHG4bzhxb9gTDpHTb4fZ2AOw1h1JQ55e4x11a4zgbGzPeMYzHMJS6iXR3o8JhHHV1ONw2XB77nARDznHHExsentVrKtzVRfjgQXI2bcq4r2yTlmAQkUIR+SVwhYh8WEROB3TNZ43mCGT8CX4aVRIYT/fZsjGMRz2bO4ZQ29SiNfklU11kHY1G0rpMkumN9B4KbpsceZxf6pqwO0mXnE0nAOB79rkZ2409/zwAnpNOyrivbJOWYFBKDSml3gd8CXgOWAX8aR7GpdFoZmGgw8e//rhv3movH4p6nl4w5Je457R4JuLtD2CxCTl5hmtsuL0dcTiwlZWOt8krMRbrxFgGx/JGVDA4vsNIh+E+Pza7hZx8ByFTHRXPwZRf5h4XHJngWLYMx/LljP79bzO28z33HJaCApxr12bcV7bJ1MYQVkq9ADwCPJzF8Wg0mhRQSvHYL3fw0mMHeeTn2ycslNliNB71PI2NwTjnwtvvz0r/8XTbYonHMHRgr66eUJsgr8RNNBxjbOSQi6xr9WoAgnv3pt3nSK+f/DI3IkKwaT+W/HyspYYgMtRWAWJziNPIO+88fM9vJjo8nPS8ikQYffwJck973WGvwZBIpiO5UERqgZuBH2RxPBqNJgUGOn1GRtD6PPrbRuluTi2QKh28AwHsTisO9/Qp1fJKzKCzDP39Exnp80+sw9DWNqX2cX7pVIO3Y6VZ/3l3eikojD4D466qoaZmnI2N48F1+aUuYjE1LiAzIe/150EkwuhTTyU9P7blBaIDA+S94YKM+5gPMhUMhcBngc8A2a/UodFoZuTAtn4AznvvOkTgwI7+rPcxOhAkt/hQFHIysumyOtIXGI8fADPqeVLt43h/ibEM1lwP9ro6Arv3pNWfUsqMYTDuGWzajyMh5XXchdXbl/ncXEcdha2sDO9fHkt6fvi++xC3m9wzz8i4j/kgU8HwFeBepdRuIDpbY41Gk1069g5RVOWhpDqX0ro8OvYMZb0PQ7UzvRoJEhbqOSyeYNRhCPjC40/vMZ+P6ODglB3DdC6yzjWrCe5JTzAERsOEg1HyS91ER0aI9vaN2xfgkHfU8Bw8k8RiIf/ii/E+/jjh7p4J5yK9vYw8+CCFb34TlpycjPuYDzIVDJ8H3mO+fzxLY9FoNCmglKLnwAgVDXkA1Kwpoqt5mHAou89oo4PTB7fFGQ86m6Nn0kiC2yhAyDQkO2onCgaHy4Y7zz7F4O1avZpQSwuxQOrjiAevFZS5Ce43akfHazyAkWpcLDInl1WAondeBbEY/bfdNuF4+6/v5sV1H2JP7SVzuv98kKlgCAFx59xzsjQWjUaTAt6BAH5vmPJl+QBUrywgFlH0t41mrY9IKIrfG542HUYcZ47dKKAzR1XSeOrrsskxDDVT2uYVuyYU7AFwrl4DsRjBffvT7jO/1D2eCTUxu6nVaiGv2Dnn3ZBj2TIK3/Y2Bu+4Y7yfYFMzL/5ziMHidWx7fpjeg9459ZFtMhUMY0CBiNiB+iyOR6PRzEJfqyEAypYZO4aSWqMkZV8WBcPooGE6nE2VZLRxTQk6S5d46utDqSlMwTDJxgCGZ9LkHYMz7pmUhjppXDCUuAi++irWwkJslZUT2uSXuue8YwAo+/dPYCsp4eC119H74x9z4Nrr6Ck+imVr87A7rbzy99Y595FNMhUM/wPsB24Efpe94Wg0mtmIxy0UVxoFXfKKXThzbFkVDPEdwGyqJDgUWzAXhvv8OD02nKYHVLi9HXG5sBYXT2mbX2oE1SWm+3Ysq0fcbiNLaap99vrxFDiwOawEduzEtX7dFEN7fokrK4LBVlxM/f/ehq20lL6bfsZw/nIithzWnbWMxmNKObhzYF5cjjMlU8HwcaXUTUqp64B9qV4kIheKyG4R2Sci00ZMi8iJIhIVkbdlOD6N5ohlsMuHp8Ax7kYqIpTU5NLflj11RNzrJ67zn4l8M/p5LgvbSN+h1NcA4XbDVTWZR1R+iYtYROEbPhTLIFYr7o0b8b/8csp9DpsxDCoUIrh3L671U3MV5Ze58XvDhAKR9CaUBOfKlTTe8yfWvPQikWs+g8Ui1K0rpmplIf6RUMYJ++aDTFJi3AG8zUyJcRoppsQQESvGDuMiYD1wlYhM+U2Y7b4FPJrO2DSa1wqDXWMUVk4s/1hSk0t/uy9rT50jfQEsVsFTmIIqqcRFOBAl6Mt88Rzp9U8QQiEzmV3y/uIpsScupO5jjyWwa1fKBui4e2xw/35UOIwzSfW0+JiylQ9KRLC43fQe9FJc48HhslG1sgCArv3Jg+AOB2mnxADagN8AzwKrST0lxknAPqVUk1IqBNwJXJ6k3ceAPwI9Sc5pNK9plFIMdY9RVDHRvbG42kM4GB23DcyVkX4/ucUuLJbpYxjixA3GQ72ZpeaIxRTe/sAEwRBu78CRxPAMh4LcJquv3McdB5EIge3bZ+0zEoriGwqSX+rGv3WbcX2SWgjZyLI6GaUUvQe8lNUbNqKiSg82uyWrqsC5kokqqR+4Hrja/NyW4nU1QKKFpc08No6I1ABvxoionhYRuU5EtojIlt7e3hS712iWPn5vmOBYhMLKSYKhythBDHRkXuIykZG+wLgr6mwUmkIq0xrJo4NG2om4gImOjBAbHp6QVTWRQ7EMk3cMxwCkpE6KC5WCMjdjL2zBWlqKfdmyKe3idRnm6pmUyOhgkIAvTFmdIRgsFqGoykN/+xIWDEqpbwLXYiTSawZSDdlL9ugxed/7Q+CzSqkZHbKVUrcqpTYppTaVlZWl2L1Gs/QZ7DIW/qLJgqE6u4LB2+9Pyb4AhrpFBIZ6Mnuqji+68Z1A6MABABwNUxdqAJvDijvfMWXHYCsuxrFsGWMvvTx7n72HbChjW7aQs2lTUnuGy2PH7rLOKchtMnG34lJTMIDhWdafpd9dNkhbMIjIVzBUQOcD7UqpH6d4aRtQl/C5FuiY1GYTcKeItABvA24SkTelO0aN5khlsMt4Ki+aZGNweezkFDgY6Jj7U2coEMHvDY8v1LNhtVnIK3Ex1JPZjiFxkYZD9ZsdDQ3TXpMs/TaAe9MJjG3ejIrMbO+IL/Tu8BCRjs5payGISNZcVuMMdBoCoLjqkHAvqfbgHwlNSA54OMlkx/BF4MeAF3iriPw8xUs3A6tEpFFEHMCVwP2T7t2olGpQSjUAdwMfVkrdm+4YNZojlaGuMWwOC7lJjMLFVZ7xRWcuTC6YkwqFFTkMZ7hjGO71Y7EIuUXGnELNzWCxYK+rm/aa6dxIc08/ndjICP5t22bsc6TXj91pJfriMwB4Tjl5lr6yp0oa6DS8ypw59vFjJdW54+cWA5m6q34IeEkp9U2l1LWpXKCUigAfxfA2ehW4Sym1Q0SuF5HrMxyHRvOaYrDbR2FFznhq6kSKqw3BoOaQJhoO6d/zUtwxABSU5zDUPZaRV9Rgl4+CcjcWq7EchVpasNfWYnE4pr0mr8TN6EBwSkpsz6mngsWC7+l/zNjnUI+fgnI3o088jr2ubkLyvMnklxk7hmx5fA10+MZVf3HiNqP5qq2RLpkKhl8A/yYi3xGRY1O9SCn1sFJqtVJqhVLqBvPYzUqpKcZmpdR7lVJ3Zzg+jeaIZLBrbIoaKU5xlYdIKJa9vEVp7BiKKnIIB6P4htJXhQx2jVFUdWhOwZaWae0LceIpsX1DE72wrIWFuI86itF/zCYYxigscTD2zLPknXvOjBlkC0qn1oDIFBVTDHb5JswXILfQic1hGbchHW4yDnADbOYrVRuDRqOZA+FQFO9AYIrhOU5xXB0xRyOmty+AzWHBnWefvbFJSY2x0PWnaeOIhmMM94yNe1UppQi1HJjRvgCJWV2TqJPOPovAtm2EOzun7dPb58cd6EOFQuSec26Kfc1dneQdCBAJxcbnG0csQmFFzpLfMewHXMB9SqkzszgejUYzDcM9Y6AOuYdOZtwzaY566hHTI2mmp+ipfRtCKV2Xy6GeMZSCItMQG+npQY2NzSoY4rumZEIw/5JLQClGHnoo6bXDfX6UAvvel7AWFpJzwvEz9hV3o82GAfqQ4Xnqrq+oImfcueBwk6lg2AH8HfiAiGzO4ng0Gs00HPJISi4YnG4buUXOtJ/aJzNTDMN0enaXx46n0MlAe3pCKb5Qxhf6UHMLAM7GxukuASC3yInDbUvq4umor8d97LEM3/9A0mvjT+WWLY9T8Na3IPaZd0Yz7U7SJS7IJquSAAorPeaO4vCXuMlUMKzAUCPdCrwve8PRaDTTMdg1BmIYeqejuMozJ1WSiimGesYomLQrUeEwbR/7OLs2HkXPD3+Y9NqSmlz60twxDHT6QBiP5A61NAMzu6pCPD+Uh4Fp+iu4/DKCe/Yw9uKLU84ZuxpFzmgHRW9/+6xjtNmteAqd4261c2Gw00dOgQOXZ6owKqrIAZV5PEg2yVQwtCql7sdIoPdqFsej0WimYah7jLxiF3aHddo2RdUeBrvGMi5g7x0IEA3HxjO3jvd99914H3sMR0MD/TffwtiLL025tqTGw2CXj2g0lnJ/fa2jFFXkYDPnFGpuQVwubBUVs15r5IcaTbqLKbj8cqwlJfT+5CdTzvXu78cd6Kfg9JNxJIl2TkZ+6dwzyIIhCJOpkWBxeSZlKhguFJFajNQVP8jieDQazTQMdvmmVSPFKa7yEA3HMlZ7xNVVk1NuDP7+97iOOorGP9yFpaCAwd/+Zsq1JTW5xCKKoTT05H2t3gkRwMG9e3CuWIFYZl+aSmpyCQWiSb2wLDk5lFz7QcaeeRbfs89NONfzage5vnYqP//5lMeZjSA3FVMMdPjGYxYmU2juBBeDZ1KmgqEQ+CzwGSA7Wbs0Gs20qFg8eV7yp804JXP0TIovSok7htCBAwT37qPgssuw5ORQcOmleB/7K9GhoQnXlpuFg7pbRlLqy+8NMToYHM8ZBBDYvQfnmjUpXV8SN7ZPY9couvJK7NXVdHzuc4QOHgSg53d34YvlULGhZlZ1VSL5pW5Gh4JEwpnr/0f6/UTCMYprkv8O7U4rucXORWGATlkwiMgxCR+/guGRtBs4/JYSjeYIZ3QoSCQUm/IkP5m4d0/mgmEMV64dV+4hHfjok08ChhsoGPp7FQ4z+vTTE64tLM/BmWOjuzk1wdDbatSPKKs3hFmkr49ofz+uNatTur64ZubKdRaXi9obf0rM76fp0stoestbaPrRL0Es1L0x1RRvBvmlLlBzS7/dbwqwycFtiRQtEpfVdHYML4nIVhH5DCBKqb8CKKVSqseg0WgyZ7rkeZNxuGzkFbsydllNpq7yPfscjmXLcJgpKlwbNmAtKWH0yacmtBOLUNGYT3dzanUF4nWO46qkwO7dACnvGJxuG4UVOTPuUFzr1tH4x7sNm4MnF7n8GqPPhsKU+ogTz+M0FztDXFhPZ2MAwzMp0wjybJKOYPge4AG+CTSLyOMi8v75GZZGo0lkXPc/TQxDIsXVmXkmKaUY7JwaWR3YsQPX0UePfxaLhdwzzsD39NOo6ESFQUVjAQMdPoJj4Vn769w/TGFFzriHTnC3Ua85VcFg9GcIopkWUkdtLVVf+TLLfvNrxhqOxeG2jbugpkq8utxcPJMGOkbJL3XhcNmmbXMogvzwauhTFgxKqU8rpVZgZEC9DTgTw11Vo9HMM0NdYzjcNnLyp88fFKe4ysNgt49YGt5BAL4ho05ASc0h42ikr49IdzeuDROLLeaedSbR4WH8W7dOOF67pgiloH330Ix9xWKKzr1DVK8qHD8W3L0bW3k5tqKilMdc0ZCP3xtOWcXTuW+YyuUFaQXvAeQUOHC4rHNyBe7v8I0HAk5HfLd2uO0M6dgYSkTkg8DXMWIXhImFdzQazTwx2G2oeFJZ0IprPMQiKu0awnHVTtyIDMZuAaZWN/O87nVgtTL61ER1UsXyfOxOK62vDszYV3/bKKFAdIJgCOzciXNt6rsFMHYMAF0pqK8Co2EGO33jpTTTQUQoqc3NuMpaNBJjqGtsRvsCHAp8O9xZVtNRJXUBt2DsGH4JnKmUmjk8UaPRZIWhrqnlPKejtNZY2HsOeNPqo/egFxEm7Bj8O3aACM51E3cM1oIC3Mcdi2+SncFqtVCzpoiDswiG1l3G+ZrVhQBER30E9+3DfdTRM1w1ldLaXBxuG+27Bmdt27l/CIDqlYVp9THeV10efe2jGWWvHeo2YktKZhEMOfkOnB7bkhIM92CU3axSSl2vlJo5faFG8xojFlPse6GHvZu7s2o8DPkj+IZDs3okxSmu9uBw2+jYN5RWP72toxRWerA7DwXQBXbsxNHYiDV36oKWe+ZZBHbuJNwzsTx73boiRnr9DM9QA7r55T5K63LJLXKZ/ewApXAfk55gsFgt1KwupPXVwVm/8859w1hsQnlD3oztpqO0NpdIMJr2TgwSDM+zqJJExFAFLnbBICL1IlIPfAp4GaiKH5v0yp/vwWo0i5nn7tvPoz/fzl/+dwd7t3Rn7b6D3cmrtk2HxSJUrSigc+9Qyn0YBepHKKubuHAFtm/HNUmNFCf3LCN/5uTaBw1HlQKw74WeKdcA+IaDdDUPs/zYQ2V5/VtfAcB11FEpjzlO/fpivAOBWQsFte8ZpGJZPjb79JHjMxGPt8hEndTfMWrUdk5BuMfTmhxOz6RUdgy/Am43X7+a5nU78KZ5GJ9GsyQIjoV55e9trDi+jKLKHLY81DLngjlxhlJ0VU2kamUBg11j+EdTqyHg7Q/gGw5RufyQ/n06w3Mc5+rV2CoqxuMc4uSXuqlcns/eLckFw74XekAxQTAEtm7FXl+fluE5Tt36EgCat/ZN28Y3FKTngJf6jSVp3z9OUVUOFovQ15aeig6MGIaCihysttmX3KIqD8GxyGEt8znrKJVS5yilzjVf50zzOlcp9euFGLBGsxhpermPaDjGcW9YxomXNDLYNTarATZVBjp9WKwy7kufCnE9eue+1GIKOszdxQRj8DSG5zgiQu6ZZ+L75z9R4YnuqatPqqS/bZSupon9K6XY8VQ75Q3547YMFYsxtnkLOccdl9JYJ1NQ5qZ8WR57N0+/S2vZZgiNxmNKM+oDjGR6RVU5ae8YlFL0tIxMMOrPRLbSp8+FTFNiaDSaBDr3D+Hy2ClflsfyY8uwu6zsfzH5E3O69B70UlztSelpM075snysNgudKdoZOvYN4cyxTQi+ms7wnEjuWWcS8/mmJNVbe2oVLo+dzQ+1TDje/Eofg11jHH12zfix4O7dRIeGyDn1lJTGmoxVJ1bQe9A7bZ6h/S/1kl/qmjG4LBXK6vLoaRlJS83jGwoyNhKifFlq2vYy03mgN03ngWyiBYNGkwW6m0eoaMxHRLDaLTQcVUrTy31pxxJMRilF78FRyurTM5ha7RbKG/LoSGPHULWycEIt6cCOnTgaGpIanuPknHIq2O2MPjVRnWR3WjnuDfUc3NHPq/8yKqkF/RH++cd9FFbksOrEQ9lTfc88C5j1mjNk1YkViEXY+Y+OKeeGe43d25pTqtKOX5hM1cpC/N5wWmkrelpMN+AUjd6uXDsFZe6UU4vMB1owaDRzJOSPMNDpG/epB1hxXBkBXzjlhXk6RgeNoLPERHOpUr2ykL6DXsLBmdOZjfT5Ge7xj7uOxgns2DGt4TmONddDzqYT8E2KZwA49vV11K4t4onf7eLJ3+/mj9/awmh/gHPevRaL9dDS43vmGRzLl2NPIdX2dHgKnKw8vowd/+jA752om9/2eDsiwvrTqjO+f5x4DESqKjqA7gMjWCxCae3MHkmJpJNaZD7QgkGjmSPdB0ZAMUEw1K0vxmITDmyb3iCaCvGgs3R3DADVqwuJxRTte2b28Y8bbePeRACR/n4iXV2zCgYw3FaDe/cRbm+fcNxitXDBtRtZflwZO//RgVJw8UeOnmDHiAUCjG3ZMqfdQpxNlzQSCcX45937xlU9g10+tj3ZxpqTK8gtcs65j8KKHNx59rRcgTv3DVFal5uWN1RFYz6+4RCjg3OvAZEJWjBoNHOku8nY8lc0HBIMDpeNmtVFtGzrn9u9m4exWI2o23SpWV2Ew22b1dbRsrWPosqcCXmY4obn6TySEom7rU7OtgpGyc8LPriRf7vpHN715VNYtmGiV5DvX8+g/H5yzzln1n5mo7jKwwkXLWP3c11sfrCZ3lYvj/58O3anlVPfvHLO9wfD4F61spD2PbPHTQCEg1G6m0eoWZOet1VFg7EzOVzqJC0YNJo50t08TFFlDs6cieUaG44qYah7bE5plDv3D1NWnzdj1bbpsNosNB5TSvMrfUQjyW0d3oEAbbsHWXF8+YTj/u3bAXCtn10wOBobsdfWTsm2mgrDD9yPtaAAz0knpn1tMk66pJGVJ5Sz+aEW7rphM8O9fi64dmNKOaZSpX59MaMDwZTyJnXuHyIWVdSmKRhKa3Ox2EQLBo1mKaKUoqt5hIrlU/PvLNtoqGYObM9s1xANx+hp8VK1Iv3cPnFWnlBOcCxC8yvJVVq7njEMw+teVzXh+CHD8+w7FREh96yz8D3zDNHR1F05I4ODeP/6N/IvvwxxZGfhFotw/gc2cNknjuWsq1bzri+fSt264qzcO046v9f23UNYLEJlmr9Dq91CaW1eykWPso0WDBrNDESV4ptNnVy3o4W2wNSAo5G+AIHR8AQ1UpyCMjdFVZ5xH/p06TnoJRqJUbWiMKPrAeo3lJBX4mLr41PzXUZCUXY81U7d2qIpMRKpGJ4TKXjT5ahAgJEHH0z5mpH774dwmMK3vi3la1LBYhHq1hWz8azarNgVJpNb5KS0Ljel32vLtj4qlufPmGp7Oioa8+k5MDJnz7ZM0IJBo5mBHx/o5ocHunmgZ4j3b28mNkmvHPccqVye3Ee94agSOvYOEfJH0u47HoOQ7tNmIhaLcMy5dXTuGx5PXBfnlb+34hsOccJFDROOh3t6iHR14T469fQUro0bca5dy+Bdd6Wke1dKMXT3H3EddVTKFdsWEw1Hl9K1fzhpvek4A50+Bjp8rDyhfNo2M1HRkE8kFDssgW5aMGg00+CNRPnpwR4uKSvgp+vq2er185e+iVv7ruYRbE7rtIFTDUeVEouqjKKg2/cMUViRM2f9+IYzq8krcfHUHXsI+IwI5a6mYZ5/oJnGY0qpWT1R/x2I2xfSyHQqIhRddRXBna/i+8fs+TX9L71McO9eCt+W3d3CQrHu1CqUYjxGIxn7X+wBgRXHZSgYTC+3w2Fn0IJBo5mGR/qG8UVjfLiunMvLiyi12/hTz0TXz+7mEcrr8yb45SdSuTwfZ44tbXVSOBSlfc8g9evnrh+32a2cd806Rvr8/Ok7L7D5oWYe/tlWcoucnHv1uint/Vu3gtWKa/3UczNR+OY3Ya+tpef7P0DFpld/KKXo/f73sRYXk3/JJWnPZzGQX+qmbn0xr/6zg1iSnFixmGLXM53UrCrEU5iZOqugzI3LY6dLCwaNJnV6Q2FuPNjDC8Pzs9V+tG+YSoed4/JzsFmEi8sKeKxvhDFT5xsJR+lr9U6rRgLDl79+QwkHtvfPmlRvLEGX3L5rkGg4NiG2YC7UrC7ijR87hmhU8fwDzeTkO3njR48ZL6uZSGDrNpxrVmNxpVf+UhwOyj7xcYKvvsrIn/88bbvRv/2NsS1bKPvYR2eMql7sbDyjhtHBIPuSZNJteaWPkb4AG8+qzfj+ImKkFN/Rv+CZVrVg0CxJwjHFO17ez1f3d/Dml/bxije7pRCDsRiPD3h5Q2k+FjONwmXlhfhjMf7WbzzB9bWOEosqKhpntgE0HFWC3xs2AuGm4eaDPax4aivX72ghHFO0bOvD7rROCAabK3Vri3n3V07hgz84k3f894lJ03irWAz/9u1pF8yJk3/JJTjXrKHnu98j0j/Vayfc00Pnl76Mc9VKCq+4IqM+FguNx5RSUpvLs/c1TbAhxaIxnr2/iYJyN8uPnZtgbzi6FN9waDzQcaFYUMEgIheKyG4R2Scin0ty/l0istV8/UtEjlnI8WmWDr/p6GOnL8B319SRa7PwneaurN7/X4Oj+KIxzi85tBs4tTCXUruN+3uGAMYzhyZGPCejfkMJIsZTZDKeHxrly/s7qHLaubdniFsPdLP/xV6WHVWC1Z7df1ERwem2TZszKHTgALGRkbQMzxPub7FQdcMNRAcGaPvwR4gMHlK9xXw+2v/jk8R8Pmq+/33Elr6nzmJCLMKZV65mdDDIX2/fSTQSQynF03ftZbDTx+vevHJaFWOqLNto/O3MlFJ8PlgwwSAiVuBG4CJgPXCViEyOnmkGzlJKHQ18Fbh1ocanWVrc1TXI0blu3lVVzAdry/hr/wj7x7KXPuDR/hHcFgunFx1KRWEV4YLSfJ4YGCEcU3S3jJBb7MRTMLMO2eWxU7uumN3PdSV1PfxeSzflDhtPn7yWc4rzePjZdgK+MGtOrszafFIlsG0bAK6NmQkGAPfGDVR/59sEdu6k+S1vpf+22+i79ec0XXY5/pdeovqGr+FctSpbQz6sVK8s5PQrVtL8Sh+///Jz3PPdF9n+ZDvHnV/P8uPKZr/BLLjzHFSuKGD/i70Lqk5ayB3DScA+pVSTUioE3AlcnthAKfUvpVT8EeNZIHMFneaIpSsY5mXvGBeXFSAivLOqBAvwh67Z6/6mglKKv/QNc3ZxHu5JT3znluTjjcbYMuKju2mEylnUSHHi+uiWrRPVKx2BEE8NenlPdSkeq5UP1Jaxcu8YFo+NuiwYntNlbPMWLHl5OFeumNN98t/wBpb99jfYysro+e736P3+97GVlrLsV7eTf/HFWRrt4uDoc+q45CNHk1fsJBSIcPoVqzj1zXP7/hJZc3Ilg52+tGt4z4WF3MvVAIlRNm3AyTO0/wCQ1IIlItcB1wHU19dna3yaJcKjfYYK58IyY1GudNo5qziPP3QN8JnGynGbQKZsH/XTEQzz6SQqojOL8rAJ/P3AAIUDAY4+N7Vnl4ajS8gtcvLy3w5OeJL8U/cgCnhrheEyerRf2N0R5uCJhVjnqIZIhlKK7lCEUrsNm2Xq9zT2/PPkbNqEWDMrf5mI+5hjaPi/O4kODIDFklF1tqVCw1GlWXMUmMzKTRU8fddedj7dnjSQcj5YyB1Dsv/WpHsjETkHQzB8Ntl5pdStSqlNSqlNZWVz365plhaP9A3T4HawJueQ18wVlcW0B8M8M5R+Pd7JPNo3ggCvL5n6T5hns3JSQS479xhP/rMZnuNYrBaOPb+ezn3DtO02djZKKe7uHmRTfg6NOYY66uVHD6Lswt21gjcyc7rsdInEFO/a2sSx/9rBJS/uwTfp/uGeHkIHDpBzYnbyFoFh07CVlBzRQmG+cbptrD21il3PdS1YttWFFAxtQF3C51pgSlUNETkauA24XCk1t9SUmiMObyTKPwdHuaC0YIIB9cLSAnKsFu41DcNz4S99w2zK91DmmOrKCXBeST60+xGrUFaXetbTDWdUk1vk5Kk79xAJRdnpC7DLF+CtlYbKqH3PIHs3d1N1WiVeh/DEQHZVB7/r7OfvA14uLy/kFa+fnx6cmHV1bPNmgKwKBk12OP6CeojBv/60f0H6W0jBsBlYJSKNIuIArgTuT2wgIvXAn4D3KKX2LODYNEuEvw+MEFKKi0onPqnnWC1cUJLPQ71DhGeJF5iJ1kCIraN+3lA6/Zb9DSX51PVGoMqNLY2spza7lXPevZbBTh9P3rmHP3T2YxO4vLyQsZEQf/vVq+SXurj48lUU263jKrNs8bvOfjbkurhlQwOXlxdya1vvhF3J2LPPYsnNxbVubVb71cyd/BI3my5pYO/m7qRV6rLNggkGpVQE+CjwKPAqcJdSaoeIXC8i15vNvgiUADeJyMsismWhxqdZGjzaN0Kx3cqJBVN98C8vL2IgHOUfg5k/aT/SayzGl5QVTtumwWanZiDCruL0/33qN5Sw6eIGdv2rE/+dLbxt2ErHM9384Rub8Y+EeMMHNuJ22zivJJ+/9Y8QMYWcCoUINjWjwuGM5rVz1M9Wr5+rqox6CB+qK8MXjXF3t6nWisXwPvEEntNPX/JupEcqJ1y4jJo1RTz+2108css2Hrl1O3s2Z9dNO86CxjEopR5WSq1WSq1QSt1gHrtZKXWz+f6DSqkipdSx5mvTQo5Ps7gJxxR/6x/h/JICrEkMzOeU5FFgs3JXV/p5ieI81DvEWo+L5TnTu6B2NQ9jUfBCobHgpstJlzZSeUkd5T1hVv25lyd/vxunx87lnzxuPCbigpICBiNRNo/4CLW2sv+ii2m6+GKa3ngp4c7p8/NMx52dAzhEeItp5D4uL4eNuW7u7DS0tYEdO4j29pF3ztlp31uzMFisFi796DEc8/o6upqGads1QGA0sweF2dCPBpolw7NDowxHolw4jZrHabFwRWURv27vpz8UocSR3p93byjMc8M+/qNh5trDHXuHEIGuMjv/1zXAl1fWpNWPiPDESgd/yy3m0WXLyM2xU1iRM8FmcnZxHg4RHu0ZpPK/P0XU66Xi85+j9yc/5eD73k/jPX/C4nbP0MshQrEYd3cPcEFpAcV22/gYLi8v5IamTloDIVyPPwEWC54zz0xrLpqFxWq3cPrbVnH62+Y3DkSnxNDMCwf8Qf7cOzQh/89c+XPfMG6LcFbx9Pr/d1eXEFKK/8tg13Bv9xAKuHQGNRJAx54hSuvyOKuykD91D46re1LFF4nyUO8wF1UVUbe8kKJKz5RI5FybldOKcun9y2MEtm6l4gufp/iaa6j9yY8JtbTQ//PbUu7vL30jDISjXFU1MS7i0vJCAB7qHmTkkUfIOf547T2kAbRg0MwDm4d9nLd5N+/b3sLlL+4lOEOmzVRRSvFo3zBnFueRM4N//1qPm5MKPPy2I73EY0opftPRz3F5OazLnf5JPBqO0d08QvXqQt5eWUxvKMLjA+llv7zfFJhXVpXM2O6C0gLOe/BPUF9PwaWXAuA59VTyLrqQ/ttvJ9KXWpqEOzoHqDJjPRJpcDs5KtfNK8+9QKipifzLL0trHpojFy0YNFnFH43xge3NlDlsfHllNdtG/dza2jvn+24f9dMeDHNB6exxA++pLqHJH+SfacQ0bB72sWcswHuqZ16s2/cOEo3EqFldxLkleRTbrdyVRsS1UorfdvSzMsfJpvycGdu+fqCbdS372XrRZRMCzso+/nFUMEjfTT+btb+uYJjHB0Z4e2VxUrvMRWUFrHj0QXC5yL/wwpTnoTmy0YJBk1X+2D1ITyjCd9fU8aG6ci4szecHB7rpDE4ti5kOD/YOYxV4Q8nsguGNZYUU2qz8qj31MJjb2vvIs1q4vKJwxnZNL/dhc1qpW1uEw2LhLRVFPNo3TE8wNSPgc8M+XhgZ4/01pdMmsotje+A+IjYbP91wAtGE3Y+zsZHCK97G4F13EWxqnvEef+gaIAZcWZk8vcZFlijnP/cPes6/AGteXtI2moWjNRDihv0d/KCli44kpWQXCi0YNFnl7q4BVuU4eV2hEfj15ZU1hGOKHx3omeXK6YkpxT3dg5xemEdpCgZlt9XCe6pLeLB3iK0ppON+ddRvlO6sLcMzQyoIFVM0v9LLsvXF4/ELH6gpQwE3NM3uKaSU4htNnZTYbbOqkVQoxMgDDxI4/Qz22l08OSnYreyjH8XicNDz/e/N2N8dnQOcUuAZj6yeTOn99+CIhPnDuRfNOn7N/LJz1M/5m3dz48EevtXcxRnP7+KxLMeypIoWDJqs0RoI8eywj7dVFI8/DS9zO3l7ZRF3dPbTleJT9WT+0jfCwUBoivF0Jj62rIIiu5Uv7Gmb8LQ9GaUUX9nfgcdq4fq6mdOrdLeMMDYcovHYQ+0ac5x8qK6M/+saYMssBYPu7x3iuWEfn1teOaOdBGD0qaeIDg6y8h1XUGy3ckfnRGO6rbSUkuuuY/SvfxuPWJ7MP4dGafIHx2MXJhPz+Rj8/R20n3gK97kLGQ6nX5dakx2UUnxhTxt2i/CvU9bx3CnrWOF2cvW2Zu7tTq6qDERjU2qQZwstGDRZ4x7zD/jNk9QxH19WQUQpfnpwaqWrVLiptYc6l4M3zuItlEi+zcpXV9awZWSMnxyYvt+7ugZ5fMDL55dXUWSfeTfS9HIvFovQcNTEhfY/llVQ7bTzkZ0HGJpmcW3xB/nc7jY25rp55yy7BYChe+/FWlpK4RlnjKurBibdu/iaq7FVVtL97e8kLaX587Zeiu1WLje9jybTf/vtRAcGKLv+esJK8UDv4Xk61RhC/NlhH59YVkGD28kyt5N7jlvJiQUe/m3nAX56oHuC99t27xhv2LInK/a7ZGjBoMkKSinu7hrk5AIP9e6Jagtj11DMbzrS3zVsGfbx/LCPD9WVJc0GOhNvqSjizeWFfKeliz8leep6esDLZ/e0cnKBh/fVzJwZUylF00u91KwtwpkzMYeSx2bl1g0NdATDvGdr8xR7SvNYkPdsbUIBt21sSGoETiQyMMDoE09ScOmliM3GVVWGC+4fJrngWtxuyv79EwS2bWPorj9MONfiD/KXvhGuqS7FlWR3Eu7uZuAXvyTv/PM5+nUnsSrHyd1zCAzUzI3vtXRR4bDx7oSHBo/Nyv8ds4KLywr4WlMnpz//Kh/ZeYCrXtnP+Vv2MBSJsDY3vfKrqaIFgyYr7Bj1s2csMB5ZO5l/X1ZB1NSxp8PPWnsotFm5ahrj6UyICN9eU8emfA8f3nmAd29t4sURH32hCLe29nD1tiYa3U5+sbFx1lTd7XuGGO71s/qk5MFvmwo83Lh+GTt8fl6/eQ83Hezhr/0jfH1/B+du3kV3KMxtGxtocM9eGH7kwYcgEqHgTW8CYEOum1MKPNx4sAdfdGJG1ILLLsNz2ml0f/3r+LfvGD/+v229WAWuSSLwVDRK5+c/j4pGKf/UfyIiXFFZzLPDPlr8wVnHp8kuzwyN8syQj4/WV0wR4m6rhds2NPCroxqpctrZMuyjLRDiA7WlPH7iWs6eIaZnLmjBoMkKd3cPYhcZD5qazDK3k3+rK+f/ugb412BqbqRNY0Ee7h3mvTWleGyZ1QfIs1n5w7Er+O/lVWwZ9nHxC3vZ+M/tfHFfBycV5HLXsStSipDe/mQbTo+NlceXT9vmsvJCHjlhNcvdTr6yv4N3b23ipwd7OKc4nydPWjuhGtxMDN17D64NG3CtWT1+7AvLq+gJRbhpUkZUsVio/u53sJaW0P7xjxMZHKQ7GOa3HQO8qbyISufE3Y1Siq4vfRnfv56h8r//C8eyZQBcUVmEVeBX7QtbQlIDt7YaKr93T+MqLSJcUFrAPcet4rlT1/P0yev42qratCP700GnxNDMmajpNXReSd54yoVk/EdDJff1DPHZPa08tmlNUhVHHKUUX9vfgcMivH8WNc9MRMJR7DYLH11WwTU1pdzbM4g/GmNTvofj8nNmdRkFGO710/xyH0edWztrNtXVHhcPnLCKtkCIzmCYRrczJU+qOIHduwnufJWK//qvCcdPKszlzeWF/OhANxeWFnBU3qEYCFtREbU/+hEH3vVuDl7zXn7xha8QUfCpxomlQVUsRs/3vsfQH/5AyYc+ROHb3jZ+rsrp4KLSAu7oHODTjVWzGsc12aEjEOLRvmE+XF8+pVrg4WTxjESzZHl60Et3KMLbKmZW9+RYLXxrdS17x4J8anfrjJHJv+8c4OG+YT7bWEW5M3ldhJmIhKI8/ttd3PLxJ/nlZ/7B1sfbyLVaeE91KdfVlXN8wdQ0FNPx/ANNWKzCca9PvVpgrcvBiQWetIQCwPA994LdTv4bL5ly7uuraymx27huRwv9oYmGaPdRR1F3y834Dx7koo9/iK/u3Exd1GijlGLsxZc4+L73M/C/v6Dwqisp+/dPTLn/+2vKGIpEM0onosmMOzqNOJPZAisXGi0YNHPmjs4BCmxWzp+hhkGcc0ry+XRDJXd3D/K5PW1J8wz9tX+E/9rbxplFubO6kCZDKcVfb9/Jzn92sOGMGkpqcnn6//bw1B170i6o3tfmZc/mbo4+tw5P4ez2gbmgwmGGH3iAvLPPSpqzqMhu47aNjXQEw7x3W/MU4fD0yvV89NNfwVdcwsk//h57Tj2VvWefw55NJ3Lgne8kuHs3lV/5MpVf/GJSoXhqoYeTCzz8+EA3gSzmuNIkJ6oUv+/s56yiPJalYHtaSLQq6TWELxrl4V7D7fGtFcVpP80moyMQ4sHeIa6tLcNpSe0545MNFfiiMW5q7WHPWICP1FewMddNayDEH7sH+VV7H0flufnZ+oaM6jfv3dzN/hd7OfXNKzj+gmWomOKZe/bz0mMHsTosnPbWlSntFmIxxVN37MHptnHcG+a/trj3iSeI9vePG52TcWKBhxvXLePDOw9wyrM7Oackn1K7jZdGxnjJO8ZRq1dz7H33kLttK6NPPU2ktxeLx4Nr3TryL7wAi2dqHYs4IsKnGyt528v7ubm1h39vqJy2rWbu/LV/hPZgmP9JMzvvQqAFw2uEg/4gb39lPy1+w5XyltZe7j525Yx1B1Lh9vY+lCItO4CI8MWV1azyOPnKPsNIG8cmcHV1Cf9vRTW5GRicA74w//jDXsob8jn2fGMxF4tw6ltWEInEeOWvrTjdNk68pHHWe734SAud+4d5/fvW4/Kkr85KB6UU/bf+HHtdHblnnTVj2zeWF7Iix8ktrb08PejFF41R47LztVU1XF1dgsNigU2byNmUfjmT04vyuKy8kO+2dHFuST5H582cz2k6WgMh7use5Lj8HE4tzM1IwB/JKKX4yYFu6lyOKdUIFwNaMLwGiCrFR3YeZCAc4Y6jl1Not/Gurft577ZmHtm0OmND41g0xm86+rmwtGBK7EIqXFVVwlsrinh6cJQD/iB1LgfH5udMW2s5FZ67v4nAaJjLPnEsloS4BxHhjCtWEfJHeP6BZhxuG8ecWzftffZs7uK5B5pZdWIFK9Z7GHvhBey1ddgrpvdKmgujjz9OYNs2Kr/y5ZQqqK3LdfPDdfOzi/nW6lo2D/v4yM4D/GXTmrSMolGl+GZTJze39hI21XbH5+dw64YGal2OeRnvUuTpwVG2jIzxzdW12NOMz1kItI3hNcD/tvWyecTHDatqOackn+Pyc/jZ+gb2jAX40r72jO/7m44+BiNRPlibvh0gjsNi4bySfN5fW8b5pQVzEgq9B73seKqdjWfVUlo71TVULMK571lL4zGl/OOuvWx9vBU1ycYRDkV57v4m/vqLnVSvLGRTZTtNF1zIgXe9m31nnUXrRz5KuCu75RRVOEzPt7+DY/lyCt/ylqzeOxOK7DZ+uLaevWNBbmhKvb5wIBrjQzta+MnBHt5SUcQ/T17L99fUsccX4PIX96acaPBIJxJT/L997dS7HNMmNzzc6B3DEU53MMy3m7s4pziPtyUEn51VnMeH6sq4pbWXi0oLOKckvUCZ5rEg32wy7ntq4fR664VCxRRP3rEbV66dky6dXk1ksVq44IMbefjmrTz9f3vZ83w3x5xXhzvPwVCXjxcfPYh3IMDqkys4ceUInf/2n7jWraPyS/9DcNcuBm7/FS1XXkX9bT/HuXJlVsbee+ONhFpaqLvl5kVTb/ms4jw+WFvKbW19VDsd/Ftd2Yx2meFwhPdub+aZIR9fWlHN9fXGzmpFjov1uW7e/NJertnWzN3Hrsg4JiVbBAKdDA1vYXj4BUZGthEODRBTIUCwWJzYbLl4PCvxeFaT61lNbt46XM7s2Vtu7+hjty/A7RsbZ3TZPpxIul4ai41NmzapLVu2HO5hLFqu29HCo33DPHHi2ikZNgPRGG/YsofhSIS/n7g25YCZmFK85aV97PT5eeLEtVQvAhXBq//q4O+/3sV516xj7alVs7ZXMcWuZ7t45p59+L2HnmRLajyc8Y7VlNqHaHnHldjKy2i4447xlNSBXbs4eO21qFCYup/9jJzjj5vTuMe2bOHA1ddQ8KY3Uf31G+Z0r2wTjMX46M6DPNA7xFsqirhhVU3SfFJ7fAE+tKOFfWNBfrKunjcliX5/pHeY929v5oyiPH59dGPKjgqzoZSi2R+i0G6dNoYmEvEyPPwyAwNP0z/wND7fHgCs1hzy8o7C6SjDYnWDihJTYcLhIXy+vQSDh3aGeXlHUVb6esrK3oDHsyplV+fJ9IbCnPbcqxyf5+GOY5ZnfJ9sICIvKKWSGqK0YDiC+UvfMFdva+YzjZV8choPk+3eMS5+YS9nFOXxq6MaU8pH9KOWbr7R3MmP1tbzjhQzngZ8Yf5591469hplMTeeUUPd+uxso8dGQtz51ecoKHPzlk+dgKShs41GYwy0+wgFIngKnRSUuSEWo+XKqwi3ttJw9x9w1NZOuCbU1kbrBz5IuLubmu9/n7xzz8lo3IHduzlw9TXYCgtp+OMfseYe/p3XZGJK8ZMDPXyruZNcm4U3lRdxXkk+azwuOgJhHuod4vaOPjxWC7dtaOTM4umju+/s7Offd7VySVkBt6xvSOlvLRaLEIv58fsPEgh0EFNhLOJgWLm4szvA08NR2kIWHAQ5NQ/eV+VimSNCINiJd2QbI95tjI0Zzg0iDgoLT6Ck5GyKCk8mN3cdFsv0D0Ph8Ag+3x42d/yTnt6/UBndBUDQXk9j5QVUlJ5FjrsBp7Ny1gVeKUWX38sHt26nNzDMLzc2sLqgGpst/7AJBy0YXoP0hsKc8/xuKpw2Hj5h9YxPaLe39/G5PW1cWlbITeuXTWsMU0rx7eYufnCgm8vKC7ll/bKU/qh9w0Ee+PHLDHaNUb+hhN4DI/iGQ2w4s4Yz3r4Kqy3zp8dYTHH/j16mq2mYKz63iZKa3IzvFaf/F7+k59vfpvp736XgkqmBZmAkumu97kMEXn2V8k9+kuL3XjOhytps+HfsoPXa6xCHg2W//S2O2sXnspjIq6N+fnygm0f7RybU8bZg1Nn+TGNVSu7Pt7b28MV9HVxSVsCP19YnVSt5R3fR1/c3hgafZ3jkRaLR2WtqJMPprCQvbyP5eUeRn380hYWbsFpT97KKxBRfb+rkptYeVuY4eZ1nDMvIk1QG/sF6tmPFyFtltXpwOEqw2fKwWnIQiw0RG+HwIH5/KyBEoqOgpmbeFXHgclbiyV1NedmFlJdfhNU6P4nxpvatBcNriphSXLOtmacGvTy6aTVrPdPXMI7zs4M9fHl/B2cU5fKjtfVT1EP9oQhf2t/OH7oGuaqqmO+srkvpic87EOC+H76EbyjIxf92NHXriomGYzx3fxMvPXaQqpUFXHDtRjwFmbnNPnPPPl589CDnXr2Wda+rzugeiQT37qX5rW/Dc9pp1N5044yCL+bz0f6ZzzL6t7/hWr+e8s98Gs8pp8x4/+ioj4Ff3U7fzbdgKy2l/hf/i7NxdtfZxYI/GmOrd4z9/iCVDjtH5bnTdhi4pbWHL+/roN7t4Dur6zijOI9o1E9X9/20tf2W0dGdAOR61lBYeBIudw0uZxX7ouX8+MAAB/w+Ts2DD1Z7KLGFiUX9WCwuAuLhpnYfjw8pji6q5Vsbjsk4VqczGOLfdhzg2WEfV1eX8NVVNeMPV88NjfLF3btRvq2c5Rnkgnwvrtgg0YiPSNSHUhGUimG1unHnLKdpLMDTI+BTObyzto7G3FJAEQr1Ewr14Q+0MjKylUCgDZstn9raq1lWfy0229wfcmZCC4YlQFsgxBMDXupdDs4oyp3T9vKbTZ388EA3X1tVk5bH0B2d/XxhTzsKxRvLCmlwO7GL8MKIj38MjRKMxfjEsgo+3TD71hnA7w1xz/dfwjcY4I0fO5aqFRP9tfds7uLxX+/ClWvnwg8dRUVD6gZwpRRbHm7h+Qea2XBGNWe/a23K1057z1CI5ndcSaS7m+X334etdPbYDKUUIw8/TM/3vkekoxPPaadRcPlluI8/AXtFOWK3EwsECGzbhveJJxj6w93ERkbIv/giKv7f/0sa4fxa4JmhUf791YMM+bt5t+MxTo78GWtshNzcdVRXv52K8ouJWIt5asDLttExnhsy/gZrnHa+sqqGi0sLkv4NKqX4ZXsfX97fQaHNyo3rl6WcvDDOI73DfHL3QfxRxXfW1PK2JJ5D4ZjitrZevtPSRUwp3lxRxFlFeZTYbQSVoicYZqfPP15k6uhcNz9eXz/tQ5pSiqGh52ht+w29vY9gtxfT2PhxaqqvxGKZnxgaLRgWMT3BMP9vXzv39wwR/02cWujhm6vrWONJb0uplOI7LV18v6Wbd1UV8901dWkLmAP+ID850MPDfUMMhI2t8jKXg7OL83h/bVnKY/J7Q9z7g5cY6fVzyUePoXZN8gWw96CXh2/eythwiOMvWMZx59fjcM/8lOcfDfHEb3fT9HIva0+p5Jyr102IWciUrhu+zuBvfkPtTTeSd+65aV0bCwYZ+PWvGfzNb4n0HMqAKna7kYYjEgGrlbzzzqPkgx/AffTRcx7vUsbvb2d/y410df4RiLKZk3mUSxh1HY1C8EVjeKNRogoEIznh5eWFXF9XnlLczY5R/7hB/C0VRXywppRj8nOmrYUxFo2xedjHLa09/H3Ay4ZcFzevb2DVLH/vHYEQ32ju5NG+YUYiE9OIuCzCaYV5vL2qiEvLClMO8hsZ2crefd9kaOg53O4G1q79GsVFp6Z0bTpowbBI6QqGeetL++gIhvhgbZmRE39olG80deKPxfj66tqUqn2Boer5wt427usZ4srKYr63tm7WgjCzEVWKQDSWtntholC4+CNHU7d2ZiNzwBfmqTt2s3dLDy6PnWPOq2P5sWUUVR3KfqqUoq9tlH0v9LD9yXYioSinvGkFx55Xl5axeTqG/nQPnV/4AkVXv4fKL3wh4/uoaJTAq7sIbN9GdHCQ2NgYWK24jzmGnOOOw1pYOOexLmXGxlo4cPDndHb+ERCqq99OXe01HFRVPNw7TJM/iEUg12qlwGbl9KJcjsvPmbEW93T4olF+2NLNbW29+GOKfJuFUwtzqXE6yLFayLFa6AtF2DLiY8eon6iCYruVj9ZXcG1tWVqBZ5GYYpfPz2g0hk2ESqedMoctY+8rpRT9/U+wZ+/X8PtbqKp8CytXfhaHI/NMw5PRgmERctAf5MpXmugOhbnj6OWcVHhIn9gbCvPhnQd4enCUy8sL+cLyqmmTbA2FI9ze3setbb14IzH+s6GCjy+rOGwpCEb6/Dx009aUhUIiPQdGeO7+Jg7uMLJ7OnNs5BY5sTmsDPf4CfjCiEDD0aWcfNnyrBiaAYYffIiOz3yGnJNOov7ntyL2+U1/8VpDqRj9/U/Q2vorBgb/gYiD6uq307Dselyu2V2L58pgOMKTA16eHvTy7JCPvnAEfzRGSCncFgvH5edwYoGHTfk5vK4w97DHWSQSjfppbrmRgwdvw2p1s2LFp6mpfgcicx+jFgyLjJ2jfq56ZT+BmOJ3Ry9nU8FUN8WoUvzoQDc/PtBNMKY4ucDDxWUFLM9x4bIIrYEQTw54eax/BF80xnnF+fzXiirW585uaJ4PYjHF1r+38tz9TYhFuPj6o6hNQygkMtLnp23XID0HvfiGgoSDEQrKcqhozKfx6FLcedmJm4gFAvT+5CcM/O8vyDnxROpuuRlLTma5gTQTicWCjIxsY3DoOTo7/4Tf34LTWUlN9VVUV1+B05m8Et5CEo4pLMKcd9YLgc+3j927/4fBoWfJzz+ODeu/R07OsjndUwuGRYJSivt6hvjU7lbybVZ+f8zyKcYoFYsR7uhAhcNYCwvpy8nldx393NczxJ6xwIS2pXYb55fmc21t2WETCCqmaN7ax5aHW+g96GXZUSWcddUa8ooXxuUuE1Q0yshDD9Hzgx8S6eyk8B3voOK/voDFsXCBesb/XQwQRBZn9Gs6BAIdDI+8zKh3J0NDWxjxvkIsZiRsLCg4ntqad1NefhEWy9y/YxVVRAcDREdCREdDxHxhot4QsdEw0dEwsdEQ0dEwYrdgzXdgzXNgr8rFUZuLvSYXyyzFlhYSFVMQU0gKLttKKbq672PPnq8gYmHDhh9SUnx6xn1rwXCYUUqxZWSM7zZ38eSgl035OdyyoYEa0yU0Fgjg/evf8D72GGPPP0908FDheteGDRRcfjkFl19Gt9NNRzBMIBaj1GFjdY4rI5WRbzhI00u99B70MtzjI+bzYQ8M446OkIeXAgZwSYjcNY0UXfbGCd450UgM31CQ3oNeWrb3c2BbH35vmPxSF6dcvoKVm8oPazTndCilCLe3M3zvfQzdfTeRri5cGzZQ/pnP4Dn5pHnpMxjsYWh4C6Oju/GPtRAIdhKNjDLmP0gs5h9vZ7XmYrcX4LCX4M5ZRnHx6ZQUn4XTmXkOqvkiHB5maGgz/kArfv8BfL59+Hz7CIV6ARCxkpe7gcLCEyks3ERBwSYcjok7RxVVqGAEFVXE/BFUKAoWQayCioEKR1HBqLHQ+8JGm2CUmD9CuGeMSJcPFZ5UL0LA4rFj8dix5jmweOyoUNQQGkNBoiOGkMIqOOrycDYU4KjPw1GfhzU3Ow8ESilUOGYIrMEAkT4/kT4/UW/IGH/QmJcKme9DUVTImIetxIVzZSHOFYW4VhZiyZlenTk21sLWbdfj8+1jeeMnaGz8WEbj1YLhMNEbCvOXvhF+2d7H9lE/xXYr/76sgqs9dgIvb2X05e2M7d5D9IVnYNSLrbwcz2mn4T7uWCxuN+GuLrx/foTAzp2Iy0X+JRdT/K534Vq/Pq1xKKUY6h7jwPZ+ml7qpXP/MABO5cc12gXRKCFHHgFXCSohElRiUWwRH3abgMsNDicBf4xY1PibcebYqF9fzPLjyll+bCmWecr7Ehsbw791GzH/GPaqKqz5+cQsYXzBFiKxUZREifiHUeEQEf8wEf8Q4YE+Yl19xNr6oXkYS5Mfy3AMJRDd6EFdsAzXGceT41mG212H212Py1UzpyfaSMRH/8BT9Pc/YSye/gPmGQtuVy1OVxU2Wx5uVy1WWy4iNlBRIhEv4cgQoVA/o6O7xhfZvNwNFJecSUnJWRQWHJ+WXlmp+G5kbkI6EvEyNPwCgwP/YnDwWbyjO8H0n7Na4zmFVpKbu5aCvE24AjXEBown+shAgMhg0FgYx8KHFsbJi3oKiN2CJceGrcSNvToXe6UHa4FjXAhYPPYZnRCi3hChVi/BAyME9w8R7hg1NmyAJdeOvdKDxW1DHFbEYcHisCIOK5iLvQrHUBHzZzSGWC2oqPE5OhomNhIk6ovAJM8kcViw5jkQlw2L04o4jftazJ/itCICobZRgs3DqGAULOBcUYjnpEpca4qT7nCi0TGam39KUdEplJScmfb3CYtIMIjIhcCPACtwm1Lqm5POi3n+YmAMeK9S6sWZ7rkYBINSChUK4R31sW9gmM1dvWxtG2Cgc4TikTD1fkVdSLCPKQJBC35bPhHbIV22oCgptVC2uoKGo8rILXbicNkIBSL4hoIM7zrA6OYXGNuxk2gULFV1SE09lFYhufkoqw0VU8RiauLPSAz/SJCRvgDhsPF7zgv3Utr2LGV9r1Bc6sBz2uvwvO515Jx4IpKXz3DPGD0HvARGw3gPduHd1UKgswc1PISoKK58F0UNpRQ3llB9TB3O6krE7cbi8WSsiolGg4Qjg0QjY8TCAfwvv0Toxd0EXthGpKkNNTia+e9GQFW5kVXFyKpiIscXECkOEwx24fcfJBYLJrQWPJ6VFBQcT37+MeTnHUVu7poZF+RQqI++vr/T2/sYA4P/IBYLYbMVmE/MJ1JUeBK5uWuwWFIL4FNKMTr6Kv39T9Lf/yTDIy+iVBSno4LS0nMpLDwRj2cVVqsbi8VJMNiFz9dEINhBJOIdf4qPCyWLxWH2bSES8WKxOHA4Sg1h6KrDk7vaTA+xFhELgWAXPt8+RkZeobfnUbyjrwIxLBYH+fnHUVR0KkWFJxv5gkachNtGCR30Emr1EuoYheih9UTsFqzFLqz55uLttCLOhAXSKuOLMUqhIsrYOdgtWJxWLLl2rB474rJlxfNswvccjhJqHSXU7iXc6SPcM2Y8wQdjqLDxRD8+F5sgNovxslsMoRBTiNU4bsm1Y813GnPMsWHNdWAtcmIvdWPJd6QsnFVUEWrzEnh1gLGXeogOBxG7BefyAvNViL3Kk5LaKRUWhWAQ479rD3A+0AZsBq5SSu1MaHMx8DEMwXAy8COl1Mkz3Xc+BEMsECA6OEhkYADfwAC+3kEiAyMEB0cID3sJD4/h84YJjISJBmKELTkEnEUEnYWEnAWEbR5i1omLpD08ipsx3C7IL3aSV1eKu74aq8vJ6GCAzv3D9LWNEg5EZx+gUlijAWzRABKLYLFasNiNfx4RkGgEwiFUwI897MPt7yPX105JuJ2iVVV4Xvc68l7/+ikRt0rFiMWCRKM+wuFhItFRgsEuopExwm3thJ7eRuQfu1F7eqc8GSmBaJEiVqiIFimipQI2C1itYDP/mayCsiiwGrYUGY0iQeOnxSdIEBzNgsUvKFGEaxXhekW0WBGps2ArLMYxmo8zUojdWoTTWoYVNxIFizsXi9OJ1ZWHzZWPtaAIe3UV9qoqLO7pg4pCoV78/oP4/QcY8x/AO7KN4ZGXiES8gPFUnJu7mtzcteTmrqMg/zhErHi92+jo/CNDQ88DCperhrLS8ykrO5+Cgk0z5uBJh3B4hP6BJ+np+TMDA0/PmB7CYnHjdteRk7McT85yRKzEYkFisRCKKDZrLrFYiGCol4C/lTH/QcLh/vF5Wix2wuFDasyCvE0Ue84gz3UMebb1xIZjRLrHCLWPEjo4QsxnpHgQuwV7bS6OunzsVR5sJS5sRS4sufZFqVZMFRWNgUjWhVJqfSuCTUP4d/YT3D9EpMdUPVpl3G4iDis5x5ThOTGzzK+LRTCcCnxJKXWB+fnzAEqpbyS0uQV4Qil1h/l5N3C2UqpzuvtmKhj++8Yv8/Ca9CtcaTQazWLh5N7d/OyqT2Z07UyCYSGTv9cArQmf2zB2BbO1qQEmCAYRuQ64DqC+PrMqVvZQmMpwX0bXajQazWLA4w/O3igDFlIwJNuPTd6upNIGpdStwK1g7BgyGcz//MfXMrlMo9FojngW0oG6DUgsslsLTK4bmEobjUaj0cwjCykYNgOrRKRRRBzAlcD9k9rcD1wtBqcAwzPZFzQajUaTfRZMlaSUiojIR4FHMdxVf6GU2iEi15vnbwYexvBI2ofhrvq+hRqfRqPRaAwWtPK4UuphjMU/8djNCe8V8JGFHJNGo9FoJrL0k7RoNBqNJqtowaDRaDSaCWjBoNFoNJoJaMGg0Wg0mgks+eyqItILHJi1YXJKgSMl/FnPZXFypMzlSJkH6LnEWaaUSprbfckLhrkgIlumyxWy1NBzWZwcKXM5UuYBei6poFVJGo1Go5mAFgwajUajmcBrXTDcergHkEX0XBYnR8pcjpR5gJ7LrLymbQwajUajmcprfceg0Wg0mklowaDRaDSaCbxmBYOIXCgiu0Vkn4h87nCPJxki8gsR6RGR7QnHikXkMRHZa/4sSjj3eXM+u0XkgoTjJ4jINvPcj2WBC/GKSJ2IPC4ir4rIDhH5xBKei0tEnheRV8y5fHmpzsUcg1VEXhKRB5f4PFrMMbwsIluW+FwKReRuEdll/s+cuuBzUUq95l4Yab/3A8sBB/AKsP5wjyvJOM8Ejge2Jxz7NvA58/3ngG+Z79eb83ACjeb8rOa554FTMSrk/Rm4aIHnUQUcb77PA/aY412KcxEg13xvB54DTlmKczHH8Eng98CDS/XvyxxDC1A66dhSncuvgA+a7x1A4ULPZUEnvFhe5pf1aMLnzwOfP9zjmmasDUwUDLuBKvN9FbA72Rww6l6carbZlXD8KuCWwzyn+4Dzl/pcgBzgRYza5UtuLhgVEv8GnMshwbDk5mH228JUwbDk5gLkA82YjkGHay6vVVVSDdCa8LnNPLYUqFBmVTvzZ7l5fLo51ZjvJx8/LIhIA3AcxpP2kpyLqX55GegBHlNKLdW5/BD4DBBLOLYU5wFGbfi/iMgLInKdeWwpzmU50Av80lTx3SYiHhZ4Lq9VwZBM17bU/Xanm9OimauI5AJ/BP5dKTUyU9MkxxbNXJRSUaXUsRhP3CeJyMYZmi/KuYjIG4EepdQLqV6S5Nhhn0cCpymljgcuAj4iImfO0HYxz8WGoT7+mVLqOMCHoTqajnmZy2tVMLQBdQmfa4GOwzSWdOkWkSoA82ePeXy6ObWZ7ycfX1BExI4hFH6nlPqTeXhJziWOUmoIeAK4kKU3l9OAy0SkBbgTOFdEfsvSmwcASqkO82cPcA9wEktzLm1Am7kLBbgbQ1As6Fxeq4JhM7BKRBpFxAFcCdx/mMeUKvcD15jvr8HQ18ePXykiThFpBFYBz5vbTq+InGJ6JVydcM2CYPb7v8CrSqnvJ5xainMpE5FC870beD2wiyU2F6XU55VStUqpBoy//78rpd691OYBICIeEcmLvwfeAGxnCc5FKdUFtIrIGvPQecBOFnouC20kWiwv4GIM75j9wH8d7vFMM8Y7gE4gjPEE8AGgBMNguNf8WZzQ/r/M+ewmwQMB2ITxj7If+CmTDFsLMI/TMbaxW4GXzdfFS3QuRwMvmXPZDnzRPL7k5pIwjrM5ZHxecvPA0Mu/Yr52xP+fl+JczDEcC2wx/8buBYoWei46JYZGo9FoJvBaVSVpNBqNZhq0YNBoNBrNBLRg0Gg0Gs0EtGDQaDQazQS0YNBoNBrNBLRg0GgSMDNbfjjhc7WI3D1Pfb1JRL44zblR82eZiDwyH/1rNNOhBYNGM5FCYFwwKKU6lFJvm6e+PgPcNFMDpVQv0Ckip83TGDSaKWjBoNFM5JvACjOv/3dEpEHMehgi8l4RuVdEHhCRZhH5qIh80kx29qyIFJvtVojII2ZCt6dFZO3kTkRkNRBUSvWZnxtF5BkR2SwiX53U/F7gXfM6a40mAS0YNJqJfA7Yr5Q6Vin16STnNwLvxMjFcwMwpoxkZ89gpB0Ao0D7x5RSJwCfIvmu4DSMlN1xfoSROO1EoGtS2y3AGRnOR6NJG9vhHoBGs8R4XCnlxchDMww8YB7fBhxtZpB9HfCHhIJZziT3qcJIrxznNOCt5vvfAN9KONcDVGdn+BrN7GjBoNGkRzDhfSzhcwzj/8kCDCkjLfdM+IGCScemy0/jMttrNAuCViVpNBPxYpQfzQhl1JloFpErwMgsKyLHJGn6KrAy4fM/MbKcwlR7wmqMZGgazYKgBYNGk4BSqh/4p4hsF5HvZHibdwEfEJF4ts/Lk7R5CjguoUD7JzAKzGxm6k7iHOChDMei0aSNzq6q0RwmRORHwANKqb/O0u4p4HKl1ODCjEzzWkfvGDSaw8fXgZyZGohIGfB9LRQ0C4neMWg0Go1mAnrHoNFoNJoJaMGg0Wg0mglowaDRaDSaCWjBoNFoNJoJaMGg0Wg0mgn8f4M9p+f85uN3AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] From 10d9876c27aa61ae7a31dc83b7061d2a9dbc0ab2 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 6 Aug 2021 14:31:51 -0400 Subject: [PATCH 20/71] Removed MTINY and the non-implemented YARKOVSKY and YORP flags from the default param list --- python/swiftest/swiftest/simulation_class.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index 670b72a60..30719a7db 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -45,9 +45,6 @@ def __init__(self, codename="Swiftest", param_file=""): 'TIDES': "NO", 'ENERGY': "NO", 'GR': "NO", - 'YARKOVSKY': "NO", - 'YORP': "NO", - 'MTINY' : "0.0" } self.codename = codename if param_file != "" : From 0cf3ddc48684c96a1aa8445766f3d6abee2d221b Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 6 Aug 2021 14:35:40 -0400 Subject: [PATCH 21/71] Added check to see if optional MTINY parameter is there during the param read --- python/swiftest/swiftest/io.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 01edfbf53..1cd0ef39a 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -64,7 +64,6 @@ def read_swiftest_param(param_file_name, param): param['CHK_RMAX'] = real2float(param['CHK_RMAX']) param['CHK_EJECT'] = real2float(param['CHK_EJECT']) param['CHK_QMIN'] = real2float(param['CHK_QMIN']) - param['MTINY'] = real2float(param['MTINY']) param['DU2M'] = real2float(param['DU2M']) param['MU2KG'] = real2float(param['MU2KG']) param['TU2S'] = real2float(param['TU2S']) @@ -77,7 +76,8 @@ def read_swiftest_param(param_file_name, param): param['TIDES'] = param['TIDES'].upper() param['ENERGY'] = param['ENERGY'].upper() param['GR'] = param['GR'].upper() - param['YORP'] = param['YORP'].upper() + if 'MTINY' in param: + param['MTINY'] = real2float(param['MTINY']) except IOError: print(f"{param_file_name} not found.") return param From 02485063cbf4f336f60abe6703a9553997072257 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 14:37:15 -0400 Subject: [PATCH 22/71] Fixed initial conditions of Helio swifter/swiftest comparison and Notebook of test results --- .../helio_swifter_comparison/init_cond.py | 1 + .../param.swiftest.in | 3 -- .../helio_swifter_comparison/pl.swifter.in | 48 +++++++++---------- .../helio_swifter_comparison/pl.swiftest.in | 48 +++++++++---------- .../swiftest_vs_swifter.ipynb | 4 +- .../helio_swifter_comparison/tp.swifter.in | 16 +++---- .../helio_swifter_comparison/tp.swiftest.in | 16 +++---- 7 files changed, 67 insertions(+), 69 deletions(-) diff --git a/examples/helio_swifter_comparison/init_cond.py b/examples/helio_swifter_comparison/init_cond.py index 4680d9e0a..b8b9b4369 100755 --- a/examples/helio_swifter_comparison/init_cond.py +++ b/examples/helio_swifter_comparison/init_cond.py @@ -20,6 +20,7 @@ sim.param['OUT_FORM'] = "XV" sim.param['OUT_STAT'] = "UNKNOWN" sim.param['GR'] = 'NO' +sim.param['RHILL_PRESENT'] = 'YES' bodyid = { "Sun": 0, diff --git a/examples/helio_swifter_comparison/param.swiftest.in b/examples/helio_swifter_comparison/param.swiftest.in index 13fdad2ec..df058ad4c 100644 --- a/examples/helio_swifter_comparison/param.swiftest.in +++ b/examples/helio_swifter_comparison/param.swiftest.in @@ -31,6 +31,3 @@ ROTATION NO TIDES NO ENERGY NO GR NO -YARKOVSKY NO -YORP NO -MTINY 0.0 diff --git a/examples/helio_swifter_comparison/pl.swifter.in b/examples/helio_swifter_comparison/pl.swifter.in index 7f71ec655..0b02f19c8 100644 --- a/examples/helio_swifter_comparison/pl.swifter.in +++ b/examples/helio_swifter_comparison/pl.swifter.in @@ -2,35 +2,35 @@ 0 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -1 6.5537098095653139645e-06 0.0014751244276585862212 +1 6.5537098095653139645e-06 0.001475124456355905224 1.6306381826061645943e-05 --0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 --7.636449781071190374 -8.230711833761744002 0.027897889786567415562 -2 9.663313399581537916e-05 0.006759070712609563929 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 0.006759069616556246028 4.0453784346544178454e-05 --0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 -4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 -3 0.000120026935827952453094 0.01004490423927810557 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 0.010044908171483009529 4.25875607065040958e-05 -0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 -4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 -4 1.2739802010675941456e-05 0.0072466832516755644343 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 0.0072466797341124641736 2.265740805092889601e-05 --1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 --1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 -5 0.037692251088985676735 0.35527077279847234866 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.35527079166215922855 0.00046732617030490929307 -4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 -1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 -6 0.011285899820091272997 0.43765804755160246957 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.43765832419088212185 0.00038925687730393611812 -6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 -1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 -7 0.0017236589478267730203 0.46959835521706382437 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.46960112247450473807 0.00016953449859497231466 -14.795764797253550427 13.071447820107550797 -0.14316267052797140846 --0.9602974676407360823 1.012024061970291078 0.016146735322636888151 -8 0.0020336100526728302319 0.7813622435281695686 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.78136567314580814177 0.000164587904124493665 -29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 -0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/helio_swifter_comparison/pl.swiftest.in b/examples/helio_swifter_comparison/pl.swiftest.in index 06c393c46..84cae57a2 100644 --- a/examples/helio_swifter_comparison/pl.swiftest.in +++ b/examples/helio_swifter_comparison/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 6.5537098095653139645e-06 0.0014751244276585862212 +1 6.5537098095653139645e-06 0.001475124456355905224 1.6306381826061645943e-05 --0.28963231309350817577 0.18505777632553971346 0.041690199036696552748 --7.636449781071190374 -8.230711833761744002 0.027897889786567415562 -2 9.663313399581537916e-05 0.006759070712609563929 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-6.8742992150644793847 -8.672423996611946485 -0.078109307586001638286 +2 9.663313399581537916e-05 0.006759069616556246028 4.0453784346544178454e-05 --0.56924731086399205093 -0.4448853077740749229 0.026742834854114529153 -4.4970878201205087762 -5.8559309604734073535 -0.33987302067212196325 -3 0.000120026935827952453094 0.01004490423927810557 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +4.6580776303108450487 -5.726444072926637749 -0.3473859047161406309 +3 0.000120026935827952453094 0.010044908171483009529 4.25875607065040958e-05 -0.68557554005930954055 -0.74774392436574432796 3.3215781231472978855e-05 -4.529549698952863699 4.223187462606770848 -0.00021705351084307017903 -4 1.2739802010675941456e-05 0.0072466832516755644343 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +4.4579240279134950613 4.300011122687349501 -0.00022055769049333364448 +4 1.2739802010675941456e-05 0.0072466797341124641736 2.265740805092889601e-05 --1.6149058006556089584 0.39555322375610602048 0.047903023702369727788 --1.0254865811345536522 -4.5279792592715677134 -0.0697376753600697812 -5 0.037692251088985676735 0.35527077279847234866 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.98751874613118001086 -4.5371239937302254657 -0.07086074102213555221 +5 0.037692251088985676735 0.35527079166215922855 0.00046732617030490929307 -4.1485722284141921534 -2.8413405904412840641 -0.081015809697524809874 -1.5260372589993542462 2.4062964793298095964 -0.044136376192527556195 -6 0.011285899820091272997 0.43765804755160246957 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +1.5225069137843642898 2.4087104911325327961 -0.044067446366273183833 +6 0.011285899820091272997 0.43765832419088212185 0.00038925687730393611812 -6.3907469739591356017 -7.624741463389934637 -0.12177209989682470648 -1.450023133321789527 1.3067045786330910449 -0.08040773079473842075 -7 0.0017236589478267730203 0.46959835521706382437 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +1.4493167787574136286 1.3075474785896286071 -0.08039429377859412155 +7 0.0017236589478267730203 0.46960112247450473807 0.00016953449859497231466 -14.795764797253550427 13.071447820107550797 -0.14316267052797140846 --0.9602974676407360823 1.012024061970291078 0.016146735322636888151 -8 0.0020336100526728302319 0.7813622435281695686 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.9605086875596024784 1.0118431725941020164 0.016148779866732710198 +8 0.0020336100526728302319 0.78136567314580814177 0.000164587904124493665 -29.568167916428858888 -4.5574316836467883007 -0.58763608457780613925 -0.16879901777383137264 1.1427778220120381962 -0.027390131426610687076 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.16867624969736024011 1.1427992197933557251 -0.027387722828706092838 diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index cb6b9ecd7..709b6cd44 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -100,7 +100,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -153,7 +153,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] diff --git a/examples/helio_swifter_comparison/tp.swifter.in b/examples/helio_swifter_comparison/tp.swifter.in index e91b52c9c..8a66912f4 100644 --- a/examples/helio_swifter_comparison/tp.swifter.in +++ b/examples/helio_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 --2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 +2.1159283340247889704 1.8593322968487970837 -0.33108647801775120678 +-2.557303042640355446 2.5920133227445458545 0.5530693963730075664 102 -3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 -0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 +3.055528708824450046 -0.9023759798915096386 0.36193041623852567623 +0.4122422441588732561 2.6115158464246720372 -1.8437451126910543971 103 --0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 -3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 +-0.26900389298636068203 -3.1374127668516589296 0.7234488489303841918 +3.0956076496295565968 0.17648254651685860603 -0.16591700615421532186 104 --1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 -2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 +-1.9061083760262669262 -1.0793924233562111059 0.26419511130887440853 +2.3545884478521155142 -3.673223720899393644 -0.17666743480430943436 diff --git a/examples/helio_swifter_comparison/tp.swiftest.in b/examples/helio_swifter_comparison/tp.swiftest.in index e91b52c9c..8a66912f4 100644 --- a/examples/helio_swifter_comparison/tp.swiftest.in +++ b/examples/helio_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.1229161119197987873 1.8522237100026059942 -0.33259854925516180169 --2.5472645182622320396 2.6008026042341226758 0.5514976560945522932 +2.1159283340247889704 1.8593322968487970837 -0.33108647801775120678 +-2.557303042640355446 2.5920133227445458545 0.5530693963730075664 102 -3.054386355288102095 -0.9095218820160763107 0.36697667872479622364 -0.4222440438063146342 2.6085624551380790432 -1.8425471496071408667 +3.055528708824450046 -0.9023759798915096386 0.36193041623852567623 +0.4122422441588732561 2.6115158464246720372 -1.8437451126910543971 103 --0.27747800994574201017 -3.1378821872210798105 0.72389993067619795575 -3.09473043735936102 0.16643076629286349722 -0.16359842504957606916 +-0.26900389298636068203 -3.1374127668516589296 0.7234488489303841918 +3.0956076496295565968 0.17648254651685860603 -0.16591700615421532186 104 --1.9125286108430290533 -1.0693208643153691018 0.26467515987932982435 -2.3353854076771408592 -3.6840315362407642648 -0.17400766828131512544 +-1.9061083760262669262 -1.0793924233562111059 0.26419511130887440853 +2.3545884478521155142 -3.673223720899393644 -0.17666743480430943436 From e39c330d601c47ef3bc1fa88f2396133ab26f6ad Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 14:44:57 -0400 Subject: [PATCH 23/71] Fixed initial conditions generator for SyMBA 1pl_1tp test --- .../1pl_1tp_encounter/init_cond.py | 2 ++ .../1pl_1tp_encounter/param.swiftest.in | 1 + .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 10 +++++----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index 338b5d5a8..6b9664542 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -20,6 +20,7 @@ swiftest_cb = "cb.swiftest.in" swiftest_bin = "bin.swiftest.dat" swiftest_enc = "enc.swiftest.dat" +swiftest_dis = "discard.swiftest.dat" MU2KG = swiftest.MSun TU2S = swiftest.YR2S @@ -168,6 +169,7 @@ print(f'CHK_QMIN_COORD HELIO') print(f'CHK_QMIN_RANGE {rmin} {rmax}') print(f'ENC_OUT {swiftest_enc}') +print(f'DISCARD_OUT {swiftest_dis}') print(f'EXTRA_FORCE no') print(f'BIG_DISCARD no') print(f'ROTATION no') 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 a7f91ba33..32cfb89bd 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -20,6 +20,7 @@ CHK_QMIN 0.004650467260962157 CHK_QMIN_COORD HELIO CHK_QMIN_RANGE 0.004650467260962157 1000.0 ENC_OUT enc.swiftest.dat +DISCARD_OUT discard.swiftest.dat EXTRA_FORCE no BIG_DISCARD no ROTATION no 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 02d6b0bef..78c6cf2b0 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -484,7 +484,7 @@ " 0., 0., 0., nan])\n", "Coordinates:\n", " id float64 100.0\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", From 2069c480424b97ddd61aca18be74ec456b7b13ef Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 6 Aug 2021 14:49:17 -0400 Subject: [PATCH 24/71] Pop out the new DISCARD_OUT param during a swiftest to swifter parameter file conversion --- python/swiftest/swiftest/io.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 1cd0ef39a..c0cd7d61f 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -1266,6 +1266,7 @@ def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): swifter_param = swiftest_param CBIN = swifter_param.pop("CB_IN", None) MTINY = swifter_param.pop("MTINY", None) + DISCARD_OUT = swifter_param.pop("DISCARD_OUT", None) MU2KG = swifter_param.pop("MU2KG", 1.0) DU2M = swifter_param.pop("DU2M", 1.0) TU2S = swifter_param.pop("TU2S", 1.0) From 7f1f5bddfefa854548214b8199e0bebe5880b2b5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 14:53:55 -0400 Subject: [PATCH 25/71] Fixed initial conditions for SyMBA 8pl_16tp test case --- .../8pl_16tp_encounters/cb.swiftest.in | 4 +- .../8pl_16tp_encounters/init_cond.py | 2 + .../8pl_16tp_encounters/param.swifter.in | 4 +- .../8pl_16tp_encounters/param.swiftest.in | 3 +- .../8pl_16tp_encounters/pl.in | 48 +++++++------- .../8pl_16tp_encounters/pl.swifter.in | 48 +++++++------- .../8pl_16tp_encounters/pl.swiftest.in | 48 +++++++------- .../8pl_16tp_encounters/tp.in | 64 +++++++++---------- 8 files changed, 111 insertions(+), 110 deletions(-) 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 2e8d49f62..81c636655 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 -0.0 -0.0 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py b/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py index 18ef4ce48..707c80b51 100755 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -19,6 +19,7 @@ swiftest_cb = "cb.swiftest.in" swiftest_bin = "bin.swiftest.dat" swiftest_enc = "enc.swiftest.dat" +swiftest_dis = "discard.swiftest.dat" sim = swiftest.Simulation() @@ -125,6 +126,7 @@ sim.param['CB_IN'] = swiftest_cb sim.param['BIN_OUT'] = swiftest_bin sim.param['ENC_OUT'] = swiftest_enc +sim.param['DISCARD_OUT'] = swiftest_dis sim.save(swiftest_input) sim.param['PL_IN'] = swifter_pl 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 f9305cfa2..d87472e35 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 0.0 -J4 0.0 +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index e9ed6376c..c72e9f4b4 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -13,6 +13,7 @@ TP_IN tp.in CB_IN cb.swiftest.in BIN_OUT bin.swiftest.dat ENC_OUT enc.swiftest.dat +DISCARD_OUT discard.swiftest.dat CHK_QMIN 0.004650467260962157 CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 @@ -31,6 +32,4 @@ ROTATION NO TIDES NO ENERGY NO GR NO -YARKOVSKY NO -YORP NO MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in index 86a616119..207dd84f6 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-05 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in index 595cdc169..3179473c0 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in @@ -2,35 +2,35 @@ 0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-05 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in index 86a616119..207dd84f6 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751239400086721089 +1 4.9125474498983623693e-11 0.001475124456355905224 1.6306381826061645943e-05 --0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 --0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 -2 7.243452483873646905e-10 0.0067590794275223005208 +-0.30949970210807342674 0.1619004125820537876 0.041620272188990829754 +-0.018820805516945871005 -0.023743802865467341506 -0.00021385162925667799668 +2 7.243452483873646905e-10 0.006759069616556246028 4.0453784346544178454e-05 --0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 -0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 -3 8.9970113821660187435e-10 0.010044873080337524463 +-0.5567137338251560985 -0.46074173273652380134 0.02580196630219121906 +0.012753121506668980284 -0.015678149412530151263 -0.0009510907726656827677 +3 8.9970113821660187435e-10 0.010044908171483009529 4.25875607065040958e-05 -0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 -0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 -4 9.549535102761465607e-11 0.0072467054748629370034 +0.6978790186886838498 -0.73607603319120218366 3.261671020506711323e-05 +0.012205130808798069983 0.0117727888369263504476 -6.0385404652521189453e-07 +4 9.549535102761465607e-11 0.0072466797341124641736 2.265740805092889601e-05 --1.592721551706784977 0.48166390206865000723 0.049163460846716633412 --0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 -5 2.825345908631354893e-07 0.35527074967975702942 +-1.617661473167097963 0.38314370807747849534 0.04771055403546069218 +-0.0027036789764029569086 -0.012421968497550240837 -0.00019400613558421780209 +5 2.825345908631354893e-07 0.35527079166215922855 0.00046732617030490929307 -4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 -0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 -6 8.459715183006415395e-08 0.4376562090257202473 +4.1527454588897487753 -2.8347492039446908763 -0.081136554176388195336 +0.0041683967523185880624 0.0065946899141205552256 -0.00012065009272080269359 +6 8.459715183006415395e-08 0.43765832419088212185 0.00038925687730393611812 -6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 -0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 -7 1.2920249163736673626e-08 0.4695793205674148502 +6.39471595410062843 -7.621162747287802297 -0.121992225877669294154 +0.0039680130835247464163 0.0035798698934692090544 -0.00022010758050265331019 +7 1.2920249163736673626e-08 0.46960112247450473807 0.00016953449859497231466 -14.814154683311180349 13.052040295401360126 -0.14347198499748289868 --0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 -8 1.5243589003230834323e-08 0.7813388398513013378 +14.793135356927480828 13.074218343364380601 -0.14311846037737518955 +-0.0026297294662822792016 0.0027702756265410048361 4.4212949669357180555e-05 +8 1.5243589003230834323e-08 0.78136567314580814177 0.000164587904124493665 -29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 -0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 +29.568629894896030663 -4.5543028991960081697 -0.58771107137394917874 +0.00046181040300440859715 0.0031288137434451902125 -7.498349850432879627e-05 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in index ae7796698..c1e239467 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in @@ -1,49 +1,49 @@ 16 101 --0.09859055695785905182 0.2975290300646933339 0.03335708456145129036 --0.029750083068855306956 -0.0078122718370876240157 0.0023293874953380202045 +-0.30947664140174180325 0.16192347328838543885 0.041620272188990829754 +-0.01621725604493672035 -0.023743802865467341506 -0.00021385162925667799668 102 --0.09863667837052235432 0.29748290865203008693 0.03335708456145129036 --0.034957182012873608268 -0.0078122718370876240157 0.0023293874953380202045 +-0.30952276281440505024 0.16187735187572213635 0.041620272188990829754 +-0.021424354988955021661 -0.023743802865467341506 -0.00021385162925667799668 103 --0.6439245854659476631 -0.32479782779646521051 0.032702713983447248558 -0.0153169432007213678765 -0.018153139924556138673 -0.0007667345025597138231 +-0.55665652353468386693 -0.46068452244605162527 0.02580196630219121906 +0.019100355212014374223 -0.015678149412530151263 -0.0009510907726656827677 104 --0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 -0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 +-0.5567709441156283301 -0.4607989430269959774 0.02580196630219121906 +0.0064058878013235863447 -0.015678149412530151263 -0.0009510907726656827677 105 -0.59427697124197276235 -0.8232523083817967491 3.7129329104855261984e-05 -0.020564990514662154913 0.010004295439859960809 -5.226292361234363611e-07 +0.6979392465946233637 -0.7360158052852626698 3.261671020506711323e-05 +0.019099571043071944532 0.0117727888369263504476 -6.0385404652521189453e-07 106 -0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 -0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 +0.6978187907827443359 -0.73613626109714169754 3.261671020506711323e-05 +0.005310690574524194567 0.0117727888369263504476 -6.0385404652521189453e-07 107 --1.5926895092930311026 0.48169594448240382611 0.049163460846716633412 --0.00044929323243133797994 -0.01219974682608557931 -0.00016910795626524249315 +-1.6176294307533440886 0.38317575049123231423 0.04771055403546069218 +0.00037580012182093606998 -0.012421968497550240837 -0.00019400613558421780209 108 --1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 --0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 +-1.6176935155808518374 0.38311166566372467646 0.04771055403546069218 +-0.005783158074626849887 -0.012421968497550240837 -0.00019400613558421780209 109 -4.119750673485228276 -2.8866333472175926822 -0.080165336328135106125 -0.041127620144391897894 0.0065414198811065849687 -0.00012215100047356211078 +4.1534063578978459574 -2.834088304936593694 -0.081136554176388195336 +0.041050613953966016978 0.0065946899141205552256 -0.00012065009272080269359 110 -4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 --0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 +4.152084559881651593 -2.8354101029527880584 -0.081136554176388195336 +-0.032713820449328842588 0.0065946899141205552256 -0.00012065009272080269359 111 -6.3634605491076454697 -7.64917730379279881 -0.12023019299387090186 -0.026096616095614821179 0.0035613826786502411278 -0.00022039988214595340028 +6.395266446455758924 -7.620612254932671803 -0.121992225877669294154 +0.026081181967058334609 0.0035798698934692090544 -0.00022010758050265331019 112 -6.3623595643973844815 -7.650278288503059798 -0.12023019299387090186 --0.01812972167145235694 0.0035613826786502411278 -0.00022039988214595340028 +6.394165461745497936 -7.621713239642932791 -0.121992225877669294154 +-0.01814515580000884351 0.0035798698934692090544 -0.00022010758050265331019 113 -14.814394441298382787 13.052280053388562564 -0.14347198499748289868 -0.010469662145386185101 0.0027742356008832688187 4.416821810149910185e-05 +14.793375114914683266 13.074458101351583039 -0.14311846037737518955 +0.0104650340723796142495 0.0027702756265410048361 4.4212949669357180555e-05 114 -14.813914925323977911 13.051800537414157688 -0.14347198499748289868 --0.015719864931937603536 0.0027742356008832688187 4.416821810149910185e-05 +14.79289559894027839 13.073978585377178163 -0.14311846037737518955 +-0.015724493004944172653 0.0027702756265410048361 4.4212949669357180555e-05 115 -29.565157420731857485 -4.579098772788029237 -0.5871109926822926095 -0.014900134286357700347 0.003128345390031967918 -7.5036135696161668576e-05 +29.568862657342247502 -4.5540701367497931074 -0.58771107137394917874 +0.0148974462162825404404 0.0031288137434451902125 -7.498349850432879627e-05 116 -29.564691895839423808 -4.5795642976804593616 -0.5871109926822926095 --0.0139711373401985618214 0.003128345390031967918 -7.5036135696161668576e-05 +29.568397132449813824 -4.554535661642223232 -0.58771107137394917874 +-0.013973825410273721728 0.0031288137434451902125 -7.498349850432879627e-05 From 1869147d425ea764d792ff8f210f9825e9ea59c0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 15:00:43 -0400 Subject: [PATCH 26/71] Added h2b conversion in the energy calculator --- .../swiftest_symba_vs_swifter_symba.ipynb | 25 +++++++++++++------ src/util/util_get_energy_momentum.f90 | 3 ++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index c3c42dd4f..76094351b 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": "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\n", "text/plain": [ "
    " ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAoLUlEQVR4nO3deZhcZZn+8e/dWQAhEoGIkIRFNhcGECO4Iowiizro4IIyLogwOG4zgoAjKqKOOIzrTyBGBgF14BoVNDoRRAFRVEyQNWA0rIlhCUIkrOl0Pb8/3reS6uqq7qpKdVVXnftzXXV1nXPec87Tp/vUU89Z3qOIwMzMrGyg2wGYmdnE4sRgZmbDODGYmdkwTgxmZjaME4OZmQ3jxGBmZsM4MVhNkk6V9J38fjtJj0qa1O24RiPpFZKWdHidIWnnDVzGYkn7tyeiEcuu+3eUtLWkqyWtlvRFJd+S9LCk349HPNYbnBj6lKS7JL26aty7Jf262WVFxD0RsVlEDLUvwuY08gEcEb+KiN06FVO7RMTzI+IqGP5BPg7rqf47Hgs8CDw9Io4HXg4cCMyKiH3GIwbrDU4M1hckTe52DD1oe+DWWH+X6/bAXRHxWLML8vbvL04MBSZpW0k/kLRS0p2SPlSn3Q75G/vkivnmS3pI0lJJx1S0nSTp3yXdng9RXCdpdp72HEmX5/mWSHpLxXznSTpT0v/l+a6VtFOednVudmM+FPJWSftLWi7pJEn3Ad8qj6tY5mxJF+ff76+Svl5nGzwhaYuKcS+Q9KCkKXn4PZJuy4dYLpO0fZ3ttLmkC/L67pZ0iqSBiunH5OWslnSrpL3z+LskvVrSwcC/A2/Nv+eNkt4s6bqq9Rwv6Yd1YthR0i/zOi4Htqr1d5R0HvAu4MS8rn8GzgFekoc/ned5naQbJK2S9BtJe1Qs7668/W8CHsvLfXFutyrHv39F+6skfUbSNTm+n0mqjO/lFfMuk/TuPH4jSf8l6R5J90uaK2mTPG0rST/J8zwk6VeV29xaFBF+9eELuAt4ddW4dwO/zu8HgOuATwJTgWcDdwAH5emnAt/J73cAApich38JnAVsDOwFrARelad9FLgZ2A0QsCewJbApsAw4CpgM7E06jPH8PN95wEPAPnn6d4GLKmIPYOeK4f2BtcAXgI2ATfK45Xn6JOBG4Mt53RsDL6+zra4AjqkYPgOYm9+/AVgKPDfHdQrwm1pxARcAPwKm5W32J+DoPO3NwF+AF+XtsjOwffXfqnK75+GN8nZ5bsW464HD6/wuvwW+lOfbD1g9yt/xPOCztf4/8vDewAPAvnl7vivHulFF3DcAs/P2nwn8FTiU9P91YB6ekdtfBdwO7JrbXwWcnqdtl2N9GzCF9D+zV572FWA+sEXetj8GPp+nfR6Ym+eZArwCULf3v15/dT0Av8bpD5t22keBVRWvx1mfGPYF7qma52PAt/L7dR9QlR8o+UNgCJhWMd/ngfPy+yXAYTXieSvwq6px3wA+ld+fB5xTMe1Q4I8Vw7USwxpg46px5cTwElLCmtzAtnovcEV+L1IC2y8P/5T84Z6HB/J23L4yLtIH51PA8yra/jNwVX5/GfDhUf5WNRNDHnc28Ln8/vnAw+QP56p225GS5aYV4/6n1t+xYpuPlhjOBj5TtY4lwCsr4n5PxbSTgG9Xtb8MeFd+fxVwSsW0fwEurfjfu6TG7yTgMWCninEvAe7M708jJeOdq+f1q/WXS67+9oaImF5+kXbEsu2BbXMJvkrSKtJhjK3HWOa2wEMRsbpi3N2kb4uQEsftNebbHti3an1HAs+qaHNfxfvHgc3GiGVlRDxZZ9ps4O6IWDvGMgC+TzqEsi3pW3YAv6qI+6sVMT9E+rCaWbWMrUiV190V4xrZLo04H3i7JAHvAP43Ip6q0W5b4OEYfo7g7hrtGrU9cHzV32x2Xk/Zsqr2b65q/3Jgm4o29f7G9bbPDOBpwHUVy7w0j4dU3S0FfibpDkknN/9rWjWfMCquZaRvXbs0Od8KYAtJ0yqSw3akwyTl5e4E3FJjfb+MiANbDbiG0boGXgZsJ2nyWMkhIlZJ+hnwFtIhowsjfx3Ny/lcRHx3jFgeBAbJJ3TzuFrbZSwjfqeI+J2kNaTDJG/Pr1ruBZ4hadOK5LBdrWU2qPy7f67BeJeRKoZj6jUeY121roR6EHiCdMjxL9UT8//g8aQE9nzgSkkLI+IXLcRgmSuG4vo98Eg+ebiJ0knj3SW9aLSZImIZ8Bvg85I2zicjjyadE4B0AvMzknZRsoekLYGfALtKeoekKfn1IknPbTDe+0nnQZr5/e4FTpe0aY71ZaO0/x/gncDh+X3ZXOBj+UOnfIL5zdUzR7oE9H+Bz0mapnSC+iNA+dLTc4ATJL0wb5edVfsk9v3ADjVOoF4AfB1YGxE1LzmOiLuBRcCnJU2V9HLg9aP8zmP5JnCcpH1zzJtKeq2kaXXafwd4vaSD8v/TxkoXBMxqYF3fBV4t6S35JPaWkvaKiFKO48uSngkgaaakg/L71+VtKeAR0mHOrl1W3S+cGAoqf5C9nnTy+E7SN7NzgM0bmP1tpOPVK4BLSOcJLs/TvkT6gPwZaUf9b2CT/M3uNcAReb77WH/iuBGnAufnwwlvGatxxe+3M3APsJx0nqOe+cAuwP0RcWPFci7JcV4k6RFSJXRInWV8kHQ8/A7g16QEc25ezveAz+Vxq4Efkk6mVvte/vlXSX+oGP9tYPf8czRvJ50/egj4FCmhtCQiFgHHkBLSw6RDNu8epf0y4DDSIcmVpCrgozTwORMR95DOKx2fY7+BdOECpHMXS4Hf5b/Bz0kXN0D6m/2cdD7tt8BZke8JsdZpfcVsZhNVvjzzAWDviPhzt+Ox/uaKwaw3vA9Y6KRgneCTz2YTnKS7SFdCvaG7kVhR+FCSmZkN40NJZmY2jBOD2TiSdGS+R2KsduPWq2orlPqu+my347DucGKwCUPrnxdQfoWkxyqGX9HCMkd0P141fX9Jpbz81Uqd+x3VYvzDOhsEiIjvRsRrWlmeWbf45LNNGPla9nXdYEgKYM+IWDrOq14REbPyTVKHAd+XdG1E3DrWjGVyt9PWR1wxWE9QC10vS/o2qUuIH+eK4MTR1hHJD0k3cz0v3+V7vaRHlLqBPrUinnJ1cLSke0g9tJa7B1+V1/cSVT0cSdLztb7r8fsl/Xud33e07qvfrdQv0Gql7tKPHGWbfUXSivz6iqSN8rRyt+XHS3pA0r31KiVJt0h6fcXwFKVuyfcabXta73JisF7xBVJ3zXuR7maeSeoyHNLdsstJHattTbrzNiLiHaS7nl8f6cll/znaCnIyeSMwndR1+GOkbjKmA68F3ifpDVWzvZLUv9JBpA74AKbn9f22avnTSHfpXkrqiG5nYESfPpJmAv8HfJZ0d/QJwA8kzZC0KfA14JCImAa8lHSXcC0fB15M2mZ7kvoiOqVi+rNId7rPJHVrcqakZ9RYzgXAP1UMHwrcGxH11ms9ri8Sg6Rz87ee6o7bWl3epfmb2k+qxr9K0h+UHlzya23gs36tMfkQzzHAv0VEuWfX/yB1rwGp87ptSF1hD0Z6xGcz12Fvq9Rr54OkbiTeERFLIuKqiLg5IkoRcRNwISkRVDo1Ih6LiCcaWM/rgPsi4osR8WRErI6Ia2u0+ydgQUQsyOu+nNQH0qF5egnYXdImEXFvRCyus74jgdMi4oGIWAl8mtQ7a9lgnj4YEQtI3UrUejTqd4BDJT09D7+DsbvmsB7WF4mB1K/8wW1c3hkM34HKzgaOjIi9SH3enFKjjbXfeHe9vCJ3Tb5FROwVERcBKHUed6XSE9n+BhxHxRPRsmUjllZfo11v1+2+Ovea+tYcy71KT7x7Tp3lbMvIbsAru8z+a1XPszW7Oo+IFcA1wOGSppP6ihqrt1nrYX2RGCLialLHW+tI2il/878uH3Out/PUWt4vSB2djZgElL81bU7qDM7GX2XXy+XnS2weEZtB6no5Io6PiGeTOs77iKRX5Xk35A7O/yF1rjc7IjYn9bSqqjZR530tjXa9Xe6+enrFa9OIOB0gIi7L3ZdvA/yR1PtoLStISaZsO1r/nz2fVMm8GfhtrS6wrX/0RWKoYx7wwYh4IekY7VltWOZ7gQVKzxV+B3B6G5ZpY9jArpeb7a670jTSQ4melLQP9Z+DULaSdJin3vp+AjxL0r/mE8PTJO1bo13d7qslbS3pH/K5hqdIh3/qdTN9IXBKPjexFemcTKv3SvyQ9KjPD7MBPbZab+jLxCBpM9JJue9JuoH0CMlt8rR/zFdZVL8ua2DR/wYcGhGzgG+Rupi2zmi16+XPkz4cV0k6ocl1/gtwmqTVpA/V/x2tcUQ8Tupa+5q8vhdXTV9Neg7y60ndjv8ZOKDGckbrvnqAdLJ9BalKfiXDn8xX6bOkcxM3kU6m/yGPa1o+h/IDYEfg4laWYb2jb/pKkrQD8JOI2D2fJFsSEduMMdtoy9sfOCEiXpeHZwC/i4id8vB2pOfVPm9DYzfrBZI+CewaEf80ZmPraX1ZMUTEI8Cdyk/aUrLnGLON5WFgc0m75uEDgds2cJlmPUHSFqRLWud1OxYbf32RGCRdSDqEsFu+aedo0qV6R0u6EVhMKs0bXd6vSE/SelVe3kH56o1jSNeT30g6x/DRdv8uZhONpGNIh7N+mi/0sD7XN4eSzMysPfqiYjAzs/bp+Y6/ttpqq9hhhx26HYaZWU+57rrrHoyIGbWm9Xxi2GGHHVi0aFG3wzAz6ymS7q43zYeSzMxsGCcGMzMbxonBzMyGcWIwM7NhnBjMzGwYJwYzMxvGicHMzIbp+fsYzMy6YdX3v8/gitGfe7TZAX/PJn+3e4ciah8nBjOzJg09+ij3nvKJNKDqh/plETz5xyXMPuvMzgXWJk4MZmZNiqeeAmDrT5zCFkceWbPNXW89Yl27XuNzDGZmTYrBQQA0ZUrdNpoyZV27XuPEYGbWpPWJYWrdNprqxGBmVhiNVAy4YjAzKw4fSjIzs2FijRODmZlVcMVgZmbDODGYmdkw6xLDVCcGMzMDYm0jFcNUYu3aToXUVk4MZmZN8qGkNpF0rqQHJN1SZ7okfU3SUkk3Sdq7U7GZmTXFiaFtzgMOHmX6IcAu+XUscHYHYjIza1qjFQODg0REp8Jqm44lhoi4GnholCaHARdE8jtguqRtOhOdmVnjGk4MsK666CUT6RzDTGBZxfDyPM7MbEJpKDFMnjysbS+ZSImhVqfmNWswScdKWiRp0cqVK8c5LDOz4ZqpGJwYNsxyYHbF8Cyg5uORImJeRMyJiDkzZszoSHBmZmUNJYapTgztMB94Z7466cXA3yLi3m4HZWZWrd8rho49wU3ShcD+wFaSlgOfAqYARMRcYAFwKLAUeBw4qlOxmZk1o9yJHpPrf4Q6MTQgIt42xvQA3t+hcMzMWhaDg2jKFFTvec/0dmKYSIeSzMx6QjkxjMaJwcysQJwYzMxsmFi7FhpNDD3YkZ4Tg5lZk5qqGNa4YjAz63s+lGRmZsM0khhwYjAzKw5XDGZmNkwMrnFiMDOz9VwxmJnZMM0lhjWdCKmtnBjMzJrkisHMzIZxYjAzs+GcGMzMrFKscWIwM7MKDR1KmjQJBgacGMzMiqChO5/JVYMTg5lZ/4u1axtODDHo3lXNzPpeMxVDLx5K6tijPa2/3fPeY3j82mu7HYZZR8TgIJo6dcx22mgjHr7wQlZ973vjEscW73kPz/y3f237cp0YrC2eXLyYqbvszGYve3m3QzEbfwMDTD/8H8dstvXH/50nb7p53MJ42pwXjstynRisLaJU4mkv2JtnHv+RbodiNmE8/cADefqBB3Y7jKb5HIO1x9AQTPK/k1k/8J5sbRGlEhqY1O0wzKwNnBisPVwxmPUN78nWFq4YzPqHE4O1hysGs77hPdk2WESAKwazvuHEYBuuVEo/XTGY9YWO7smSDpa0RNJSSSfXmL65pB9LulHSYklHdTI+a9HQEJB7kzSzntexxCBpEnAmcAjwPOBtkp5X1ez9wK0RsSewP/BFSWPfd25dFeWKwYeSzPpCJyuGfYClEXFHRKwBLgIOq2oTwDRJAjYDHgJ6r2vCollXMfhQklk/6OSePBNYVjG8PI+r9HXgucAK4GbgwxFRql6QpGMlLZK0aOXKleMVrzXIFYNZf+lkYlCNcVE1fBBwA7AtsBfwdUlPHzFTxLyImBMRc2bMmNHuOK1ZrhjM+kon9+TlwOyK4VmkyqDSUcDFkSwF7gSe06H4rEWuGMz6SycTw0JgF0k75hPKRwDzq9rcA7wKQNLWwG7AHR2M0VrhisGsr3Ss2+2IWCvpA8BlwCTg3IhYLOm4PH0u8BngPEk3kw49nRQRD3YqRmuNKwaz/tLR5zFExAJgQdW4uRXvVwCv6WRM1gauGMz6ivdk22DrKgb538msH4xZMUjarsFlrYqIRzYwHutFuWJwlxhm/aGRQ0nnky4rrXW5aVkA5wEXtCEm6zExlCoGd4lh1h/GTAwRcUD1OEnPioj7xick6zmlXDEMuGIw6wet7snvbGsU1tNcMZj1l1avSjpM0uPA5RGxpJ0BWQ9yxWDWV1rdk/8RWAq8UdI5bYzHepArBrP+0lLFEBH3A5fmlxWdKwazvtLSnizpTEnn5fe+Ia3gwg/qMesrrX7FW8P6Poz+vk2xWK+K3Emuu8Qw6wutJobHgc0lTQEavQHO+pW7xDDrK61elfQQ8ATpUZ3XtC8c60Xlk8+uGMz6Q1Nf8SRNl/Qt4PA86gJgTtujst5ScsVg1k+aqhgiYpWk04EdgAeBPYCLxyEu6yGuGMz6SyuHko4G7oyIy4Dr2hyP9SJXDGZ9pZXE8DBwnKTdgBuBGyLi+vaGZb3EFYNZf2k6MUTE5yX9AvgTsBewH+DEUGSuGMz6StOJQdJppEdz3kCqFq5qc0zWY9ZVDL7BzawvNP0VLyI+CTyV5z1c0jfbHpX1lnLF4C4xzPpCq3vyucBzgS2Bs9oXjvUiVwxm/aXVxPAh0mGoycBX2xeO9SRXDGZ9pdU9+XZgY+BHEbFfG+OxHuSKway/tJoYFgNXAEdLWtjGeKwXuWIw6yut9pW0E+l+hnn5pxVYudttVwxm/aHVxLAsIq6QtA3wQDsDsh5UKt/g5orBrB+0uicfLGkWMBf4chvjsR7kB/WY9ZdWE8N04CTgRNI9DVZkQ64YzPpJq3vyaaQrkpYAQ43OJOlgSUskLZV0cp02+0u6QdJiSb9sMT7roCi5YjDrJw2fY5C0Z0TcCBARy4Hl+X3ND/ga808iPdjnwDzvQknzI+LWijbTSTfMHRwR90h6ZqPxWRe5Ez2zvtJMxXC9pJsknShpdgvr2gdYGhF3RMQa4CLgsKo2bwcujoh7ACLCJ7Z7QLgTPbO+0sye/EVgU+B04E5JV0p6TxPzzwSWVQwvz+Mq7Qo8Q9JVkq6T9M4mlm/d4hvczPpKw4khIj4aETuRHuV5Dqm77XlNrEu1Fls1PBl4IfBa4CDgE5J2HbEg6VhJiyQtWrlyZRMh2HgI3+Bm1leaOcewJfBG4E3AAaQP+nuaWNdyoPIQ1CxgRY02D0bEY8Bjkq4G9iQ9+2GdiJhHTkpz5sypTi7Waa4YzPpKM1/x7gO+QaoYvgXsFxE7NjH/QmAXSTtKmgocAcyvavMj4BWSJkt6GrAvcFsT67AuiNIQSEi1ikIz6zXN3Pl8CfAd4KcRMdjsiiJiraQPAJeRHvRzbkQslnRcnj43Im6TdClwE1ACzomIW5pdl3XYUMnVglkfaTgxRMRbNnRlEbEAWFA1bm7V8BnAGRu6Luug0pDPL5j1Ee/NtsHCFYNZX2k6MUh6/XgEYj3MFYNZX2llb/5c26OwnuaKway/tJIYfOmJDVca8hVJZn2klcTg+wZsGFcMZv3FB4Ztw5WGwP0kmfUN7822wWKohNyzqlnfaCUx3N/2KKy3DbliMOsnTe/NEXHgeARivStKrhjM+om/5tmGc8Vg1le8N9sGc8Vg1l9aSgySPlLxfrf2hWM9yRWDWV9ppnfV8jOZvww8R9KTpF5QjwaOan9o1isiXDGY9ZOmEkNErAKOknQQ8CCwB3DxOMRlvcQ3uJn1laYSQ4XBiLhO0grggXYGZL0n3ImeWV9pdW8+WNIsYC7p0JIVmSsGs77SamKYDpwEnAg81bZorDe5YjDrK60eSjoN2C0ilkgaamdA1nvciZ5Zf2k1MXwM2BT4BXBl+8KxnjTkisGsn7S6N68B7sjvD2hTLNajouSKwayftJoYHgc2lzQF2K6N8VgvcsVg1lda3Zs/BdwOnAl8t33hWC9yxWDWX1o9x/ChiPgSuEsMwxWDWZ9ppUuMs4Htc5cYNwLvxV1iFJorBrP+0nSXGJKWA1cD1wJ74i4x+tJ9p53GI5df3lDboYceZurs2eMckZl1SiuHkv4KHAfsRqoYlrc1IpsQHrv29wxstDGbvvSlDbV/+uteO84RmVmnNJ0YIuJ0SVcAfwL2Al4BXN/muKzbhobYZI+/Y5vTPt3tSMysw5pODJJOAyYBNwA3RMRVbY7JJoAolcBdaZsVUivPfP4k8DVgNXC4pG82Oq+kgyUtkbRU0smjtHuRpCFJb2o2PmuToSHkh++YFVKrl6v+M/CNiLi00RkkTSLd93Ag6bzEQknzI+LWGu2+AFzWYmzWBq4YzIqr1a+E5wLvk3SGpL0anGcfYGlE3BERa4CLgMNqtPsg8AP8nIfu8uM6zQqr1T3/Q6RqYzLpsFIjZgLLKoaX53HrSJoJvJH0nIe6JB0raZGkRStXrmw4aGtclPy4TrOiajUx3A5sDPwoIvZrcB7VGBdVw18BToqIUbvyjoh5ETEnIubMmDGjwdVbU1wxmBVWq+cYFpO+/R8t6YyIeFED8ywHKu+CmgWsqGozB7hIEsBWwKGS1kbED1uM01rkisGsuFpNDDsBDwPz8s9GLAR2kbQj8BfgCODtlQ0iYsfye0nnAT9xUuiSoSFw/0dmhdRqYlgWEVdI2oYGTxJHxFpJHyBdbTQJODciFks6Lk8f9byCdVaqGJwYzIqo1cRwsKQ/kS4/vZt0MnpMEbEAWFA1rmZCiIh3txibtcPQkDvGMyuoVr8STgdOAk4EnmpbNDZhRKnkG9zMCqrhPV/SnhWDp5GuSFoCjHoFkfWooSHf4GZWUM18Jbxe0k2STgQUET8HiIi6XVtYb4oIcMVgVljN7PlfBDYFTgfulHSlpPeMT1jWVaVS+umKwayQGk4MEfHRiNiJdK/BOcB+pMtVrd8MpaODrhjMiqnhq5IkbUnqruJNwAGkO5nvGae4rIvCFYNZoTVzuep9pArjYeBbwHci4tfjEpV1V04MrhjMiqmZxHAJ8B3gpxExOE7x2ATgisGs2MZMDJK2y29PyD+3yX0ZVVsVEY+0KzDrIp9jMCu0RiqG81nfC2rNjJCnnwdc0IaYrMtcMZgV25iJISIO6EQgNoHkisHdbpsVk/d8GyGG8slnVwxmheTEYCOVXDGYFZn3fBvBFYNZsTkx2EiuGMwKzXu+jRDrLld1xWBWRE4MNtK6y1X972FWRN7zbQRXDGbF5sRgI7liMCs07/k2gisGs2JzYrCRXDGYFZr3fBvJFYNZoTkx2AjuRM+s2JwYbCR3u21WaN7zbYRylxiuGMyKyYnBRiq5YjArsmYe7WkFUcSKYXBokCuWXcFTQ091O5SW7faM3dhti926HYb1gY4mBkkHA18FJgHnRMTpVdOPBE7Kg48C74uIGzsZo1HIiuGaFddwwi9PGLvhBLbz9J255LBLuh2G9YGOJQZJk4AzgQOB5cBCSfMj4taKZncCr4yIhyUdAswD9u1UjJYUsWJ4fPBxAOYdOI9Z02Z1OZrmffm6L7P4wcXdDsP6RCcrhn2ApRFxB4Cki4DDgHWJISJ+U9H+d0Dv7aH9oIAVw2BpEIDZ02b3ZGLYfKPN1/0OZhuqk3v+TGBZxfDyPK6eo4Gf1pog6VhJiyQtWrlyZRtDNKioGAp0g1v5Q3XyQG+edpusyU4M1jadTAyqMS5qNpQOICWGk2pNj4h5ETEnIubMmDGjjSEasL5iKFCXGOUP1SkDU7ocSWumTJrixGBt08mvR8uB2RXDs4AV1Y0k7QGcAxwSEX/tUGxWoZAVw1BODJN6NDEMTFn3O5htqE5+JVwI7CJpR0lTgSOA+ZUNJG0HXAy8IyL+1MHYrJIrhp4zZSBVDBE1i3CzpnSsYoiItZI+AFxGulz13IhYLOm4PH0u8ElgS+AsSQBrI2JOp2K0pJAVQx8khiAYiiEmqzfPk9jE0dH/oIhYACyoGje34v17gfd2MiaroaAVgxCT1JvJsHwIbLA02LMn0G3iKM6ebw0rP6inaBXDlIEp5Eq155QrHZ+AtnZwYrCRyt1uqzj/HoNDgz174hkqEoNPQFsbFGfPt4ZFAbvdLlcMvcoVg7VTcfZ8a1wBTz6vLa3t7cQwyYnB2seJwUaIgp587unE4IrB2qg4e741roAVw2DJ5xjMypwYbIQiVgw9fygpx762tLbLkVg/KM6eb40rYsUw5ENJZmVODDZCESuGXr8xrBy7E4O1Q3H2fGtcESuGXj/57KuSrI2cGGykSImhaBVDTycGn2OwNirOnm8Ni6FSoaoFSOcYJk/q3UNJvirJ2smJwUYqDRWqWoD+qRh8KMnaoVh7vzWkkBWDE4PZOk4MNtKQK4Ze45PP1k7F2vutIVFyxdBr1l2u6nMM1gZODDZSESuGful22xWDtUGx9n5rSJSGClcxrI3+6BLDicHawYnBRhoqQYGexQB90CWGzzFYGxVr77eGRGkIDRSrYuj5cwxylxjWPk4MNlLBKoaI6PlutyUxZWCKTz5bWxRn77eGFa1iWBupG4lerhggxe+KwdrBicFGKljFUP6W3cu9q0KK34nB2qE4e781rGgVQ/nD1BWDWeLEYCMVrWLol8QwyecYrD2Ks/dbw4pWMZS7qu75xOCKwdrEicFGKlgneuVv2b18VRI4MVj7ODHYCFGwbrf75lCSE4O1SUf3fkkHS1oiaamkk2tMl6Sv5ek3Sdq7k/H1vMEn4alHN3w5RasYJlhiWPPE4zzx6GqG1jb3NDYnBmuXjl2fJ2kScCZwILAcWChpfkTcWtHsEGCX/NoXODv/tNGUSnDtXPjFaTC0Bv7h/8ELjtyA5bli6JY//HQ+V57/TYhg82duzds+819sOv0ZDc1bPvk8tLaEBsTAgMY52v5VKgWloRKloWBgQKj8UrqZsN8pIjqzIuklwKkRcVAe/hhARHy+os03gKsi4sI8vATYPyLurbfcOXPmxKJFi5qO5z+P/QRT//bnpucrihCsLUjREKTfd2rAQGd2h7rWDj3G1KlbstHUGax+dAkDA1MYUGMJa43S76Eu/w7WOWs2fyYfP+trLc0r6bqImFNrWifv6JkJLKsYXs7IaqBWm5nAsMQg6VjgWIDtttuupWCGBqaiSdNamnciCtZ/ixEb/slQGoCY3P/fjMoGgIGS6PZvPHXqDDbebHcGBqay6eRnsOaJuxued5KCtaINf33rFaVJTxuX5XYyMdTa56r/hxtpQ0TMA+ZBqhhaCeZjcz/RymxmZn2vkweSlwOzK4ZnAStaaGNmZuOok4lhIbCLpB0lTQWOAOZXtZkPvDNfnfRi4G+jnV8wM7P269ihpIhYK+kDwGXAJODciFgs6bg8fS6wADgUWAo8DhzVqfjMzCzpaHeSEbGA9OFfOW5uxfsA3t/JmMzMbLjiXKxuZmYNcWIwM7NhnBjMzGwYJwYzMxumY11ijBdJK4HGbw8dbivgwTaGM14cZ/v0QozgONupF2KEzse5fUTMqDWh5xPDhpC0qF5fIROJ42yfXogRHGc79UKMMLHi9KEkMzMbxonBzMyGKXpimNftABrkONunF2IEx9lOvRAjTKA4C32OwczMRip6xWBmZlWcGMzMbJjCJgZJB0taImmppJO7HMtdkm6WdIOkRXncFpIul/Tn/PMZFe0/luNeIumgcYzrXEkPSLqlYlzTcUl6Yf79lkr6mtr80Nw6cZ4q6S95m94g6dBuxilptqQrJd0mabGkD+fxE2p7jhLnhNmekjaW9HtJN+YYP53HT7RtWS/OCbMt64qIwr1I3X7fDjwbmArcCDyvi/HcBWxVNe4/gZPz+5OBL+T3z8vxbgTsmH+PSeMU137A3sAtGxIX8HvgJaQn9P0UOKQDcZ4KnFCjbVfiBLYB9s7vpwF/yrFMqO05SpwTZnvm5W2W308BrgVePAG3Zb04J8y2rPcqasWwD7A0Iu6IiDXARcBhXY6p2mHA+fn9+cAbKsZfFBFPRcSdpGdX7DMeAUTE1cBDGxKXpG2Ap0fEbyP9h19QMc94xllPV+KMiHsj4g/5/WrgNtLzzCfU9hwlzno6Hmckj+bBKfkVTLxtWS/Oerq2D1UramKYCSyrGF7O6P/84y2An0m6TtKxedzWkZ9el38+M4/vduzNxjUzv68e3wkfkHRTPtRUPqzQ9Tgl7QC8gPQNcsJuz6o4YQJtT0mTJN0APABcHhETclvWiRMm0LaspaiJodbxuW5et/uyiNgbOAR4v6T9Rmk70WIvqxdXt+I9G9gJ2Au4F/hiHt/VOCVtBvwA+NeIeGS0pnXi6VacE2p7RsRQROxFei78PpJ2H6V517ZlnTgn1LaspaiJYTkwu2J4FrCiS7EQESvyzweAS0iHhu7PJST55wO5ebdjbzau5fl99fhxFRH3552yBHyT9YfbuhanpCmkD9vvRsTFefSE25614pyI2zPHtQq4CjiYCbgta8U5UbdlpaImhoXALpJ2lDQVOAKY341AJG0qaVr5PfAa4JYcz7tys3cBP8rv5wNHSNpI0o7ALqQTU53SVFy5pF8t6cX5Sop3VswzbsofENkbSdu0a3HmZf43cFtEfKli0oTanvXinEjbU9IMSdPz+02AVwN/ZOJty5pxTqRtWdd4ntmeyC/gUNIVF7cDH+9iHM8mXYlwI7C4HAuwJfAL4M/55xYV83w8x72Ecbw6AbiQVOoOkr61HN1KXMAc0j//7cDXyXfcj3Oc3wZuBm4i7XDbdDNO4OWk8v8m4Ib8OnSibc9R4pww2xPYA7g+x3IL8MlW95lx3pb14pww27Ley11imJnZMEU9lGRmZnU4MZiZ2TBODGZmNowTg5mZDePEYGZmwzgxmFWQNF3Sv1QMbyvp++O0rjdI+mSdaY/mnzMkXToe6zerx4nBbLjpwLrEEBErIuJN47SuE4GzRmsQESuBeyW9bJxiMBvBicFsuNOBnXI/+WdI2kH5OQ+S3i3ph5J+LOlOSR+Q9BFJ10v6naQtcrudJF2aO0X8laTnVK9E0q7AUxHxYB7eUdJvJS2U9Jmq5j8EjhzX39qsghOD2XAnA7dHxF4R8dEa03cH3k7q3+ZzwOMR8QLgt6SuCiA91P2DEfFC4ARqVwUvA/5QMfxV4OyIeBFwX1XbRcArWvx9zJo2udsBmPWYKyM9p2C1pL8BP87jbwb2yL2SvhT4XsVDtjaqsZxtgJUVwy8DDs/vvw18oWLaA8C27QnfbGxODGbNearifaliuETanwaAVZG6Wh7NE8DmVePq9U+zcW5v1hE+lGQ23GrSIy1bEunZBXdKejOk3kol7Vmj6W3AzhXD15B6+YWR5xN2ZX0PnGbjzonBrEJE/BW4RtItks5ocTFHAkdLKveYW+uxsVcDL9D6400fJj2kaSEjK4kDgP9rMRazprl3VbMukfRV4McR8fMx2l0NHBYRD3cmMis6Vwxm3fMfwNNGayBpBvAlJwXrJFcMZmY2jCsGMzMbxonBzMyGcWIwM7NhnBjMzGwYJwYzMxvm/wPcPqGapk66/gAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -588,15 +588,24 @@ " fill: currentColor;\n", "}\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",
    +       "array([ 0.0000000e+00,  0.0000000e+00,  4.4408921e-16,  0.0000000e+00,\n",
    +       "        0.0000000e+00, -4.4408921e-16,  4.4408921e-16,  0.0000000e+00,\n",
    +       "        0.0000000e+00,  0.0000000e+00,  0.0000000e+00,  0.0000000e+00,\n",
    +       "        0.0000000e+00,  0.0000000e+00,  0.0000000e+00,  0.0000000e+00])\n",
            "Coordinates:\n",
            "  * id       (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n",
    -       "    time     float64 110.0
    " + " time float64 110.0" ], "text/plain": [ "\n", - "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", + "array([ 0.0000000e+00, 0.0000000e+00, 4.4408921e-16, 0.0000000e+00,\n", + " 0.0000000e+00, -4.4408921e-16, 4.4408921e-16, 0.0000000e+00,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00])\n", "Coordinates:\n", " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", " time float64 110.0" diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 38701229d..b004f84b7 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -37,6 +37,7 @@ module subroutine util_get_energy_momentum_system(self, param) Lplspiny(:) = 0.0_DP Lplspinz(:) = 0.0_DP lstatus(1:npl) = pl%status(1:npl) /= INACTIVE + call pl%h2b(cb) !!$omp simd private(v2, rot2, hx, hy, hz) do i = 1, npl v2 = dot_product(pl%vb(:,i), pl%vb(:,i)) @@ -82,7 +83,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! Do the potential energy between pairs of massive bodies do k = 1, pl%nplpl associate(ik => pl%k_plpl(1, k), jk => pl%k_plpl(2, k)) - pepl(k) = -pl%mass(ik) * pl%mass(jk) / norm2(pl%xb(:, jk) - pl%xb(:, ik)) + pepl(k) = -pl%mass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) end associate end do From ac3491807d395d618774df4ba68f0012e33f8896 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 15:27:47 -0400 Subject: [PATCH 27/71] Unified the variable names between integrators by refactoring mergesub_list to pl_discards (and mergeadd_list to pl_adds for consistency). Fixed some issues related to identifying collisions. --- docs/src/setup.f90 | 4 +- docs/src/symba_classes.f90 | 4 +- docs/src/symba_fragmentation.f90 | 72 +- docs/src/symba_io.f90 | 32 +- docs/src/symba_step.f90 | 6 +- docs/src/symba_util.f90 | 6 +- .../param.disruption_off_axis.in | 3 +- src/modules/symba_classes.f90 | 3 +- src/setup/setup.f90 | 4 +- src/symba/symba_fragmentation.f90 | 827 +++++++++--------- src/symba/symba_io.f90 | 90 +- src/symba/symba_step.f90 | 6 +- src/symba/symba_util.f90 | 17 +- 13 files changed, 541 insertions(+), 533 deletions(-) diff --git a/docs/src/setup.f90 b/docs/src/setup.f90 index 6cba6d27b..9346e8c12 100644 --- a/docs/src/setup.f90 +++ b/docs/src/setup.f90 @@ -54,8 +54,8 @@ module subroutine setup_construct_system(system, param) allocate(symba_pl :: system%pl) allocate(symba_tp :: system%tp) allocate(symba_tp :: system%tp_discards) - allocate(symba_merger :: system%mergeadd_list) - allocate(symba_merger :: system%mergesub_list) + allocate(symba_merger :: system%pl_adds) + allocate(symba_merger :: system%pl_discards) allocate(symba_plplenc :: system%plplenc_list) allocate(symba_pltpenc :: system%pltpenc_list) end select diff --git a/docs/src/symba_classes.f90 b/docs/src/symba_classes.f90 index 0e66ebf7c..4cf69a3e1 100644 --- a/docs/src/symba_classes.f90 +++ b/docs/src/symba_classes.f90 @@ -160,8 +160,8 @@ module symba_classes ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** type, extends(helio_nbody_system) :: symba_nbody_system - class(symba_merger), allocatable :: mergeadd_list !! List of added bodies in mergers or collisions - class(symba_merger), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions + class(symba_merger), allocatable :: pl_adds !! List of added bodies in mergers or collisions + class(symba_merger), allocatable :: pl_discards !! List of subtracted bodies in mergers or collisions class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step integer(I4B) :: irec !! System recursion level diff --git a/docs/src/symba_fragmentation.f90 b/docs/src/symba_fragmentation.f90 index efdd8c0d7..9c13170af 100644 --- a/docs/src/symba_fragmentation.f90 +++ b/docs/src/symba_fragmentation.f90 @@ -34,7 +34,7 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) + associate(pl_adds => system%pl_adds, pl_discards => system%pl_discards, cb => system%cb) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_DISRUPT allocate(m_frag(nfrag)) @@ -91,11 +91,11 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, lmask(:) = .false. lmask(family(:)) = .true. pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + pl_discards%ncomp(nstart:nend) = nfamily allocate(plnew, mold=pl) call plnew%setup(nfrag, param) @@ -133,10 +133,10 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, end if ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) deallocate(plnew) @@ -179,7 +179,7 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) + associate(pl_adds => system%pl_adds, pl_discards => system%pl_discards, cb => system%cb) mtot = sum(mass(:)) xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot @@ -247,11 +247,11 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m lmask(:) = .false. lmask(family(:)) = .true. pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + pl_discards%ncomp(nstart:nend) = nfamily allocate(plnew, mold=pl) call plnew%setup(nfrag, param) @@ -289,10 +289,10 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m end if ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) deallocate(plnew) @@ -334,7 +334,7 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) + associate(pl_adds => system%pl_adds, pl_discards => system%pl_discards, cb => system%cb) status = MERGED write(*, '("Merging bodies ",99(I8,",",:))') pl%id(family(:)) mass_new = sum(mass(:)) @@ -386,11 +386,11 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, lmask(:) = .false. lmask(family(:)) = .true. pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + pl_discards%ncomp(nstart:nend) = nfamily ! Create the new merged body allocate(plnew, mold=pl) @@ -422,10 +422,10 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, end if ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) deallocate(plnew) @@ -468,7 +468,7 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) + associate(pl_adds => system%pl_adds, pl_discards => system%pl_discards, cb => system%cb) ! Collisional fragments will be uniformly distributed around the pre-impact barycenter nfrag = NFRAG_SUPERCAT allocate(m_frag(nfrag)) @@ -521,11 +521,11 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, lmask(:) = .false. lmask(family(:)) = .true. pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + pl_discards%ncomp(nstart:nend) = nfamily allocate(plnew, mold=pl) call plnew%setup(nfrag, param) @@ -563,10 +563,10 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, end if ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) deallocate(plnew) diff --git a/docs/src/symba_io.f90 b/docs/src/symba_io.f90 index 2e568dd7e..8e6420f61 100644 --- a/docs/src/symba_io.f90 +++ b/docs/src/symba_io.f90 @@ -225,10 +225,10 @@ module subroutine symba_io_write_discard(self, param) character(*), parameter :: PLNAMEFMT = '(I8, 2(1X, E23.16))' class(swiftest_body), allocatable :: pltemp - associate(pl => self%pl, npl => self%pl%nbody, mergesub_list => self%mergesub_list, mergeadd_list => self%mergeadd_list) + associate(pl => self%pl, npl => self%pl%nbody, pl_discards => self%pl_discards, pl_adds => self%pl_adds) if (self%tp_discards%nbody > 0) call io_write_discard(self, param) - if (mergesub_list%nbody == 0) return + if (pl_discards%nbody == 0) return select case(param%out_stat) case('APPEND') open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) @@ -240,31 +240,31 @@ module subroutine symba_io_write_discard(self, param) end select lfirst = .false. if (param%lgr) then - call mergesub_list%pv2v(param) - call mergeadd_list%pv2v(param) + call pl_discards%pv2v(param) + call pl_adds%pv2v(param) end if - write(LUN, HDRFMT) param%t, mergesub_list%nbody, param%lbig_discard + write(LUN, HDRFMT) param%t, pl_discards%nbody, param%lbig_discard iadd = 1 isub = 1 - do while (iadd <= mergeadd_list%nbody) - nadd = mergeadd_list%ncomp(iadd) - nsub = mergesub_list%ncomp(isub) + do while (iadd <= pl_adds%nbody) + nadd = pl_adds%ncomp(iadd) + nsub = pl_discards%ncomp(isub) do j = 1, nadd - if (iadd <= mergeadd_list%nbody) then - write(LUN, NAMEFMT) ADD, mergesub_list%id(iadd), mergesub_list%status(iadd) - write(LUN, VECFMT) mergeadd_list%xh(1, iadd), mergeadd_list%xh(2, iadd), mergeadd_list%xh(3, iadd) - write(LUN, VECFMT) mergeadd_list%vh(1, iadd), mergeadd_list%vh(2, iadd), mergeadd_list%vh(3, iadd) + if (iadd <= pl_adds%nbody) then + write(LUN, NAMEFMT) ADD, pl_discards%id(iadd), pl_discards%status(iadd) + write(LUN, VECFMT) pl_adds%xh(1, iadd), pl_adds%xh(2, iadd), pl_adds%xh(3, iadd) + write(LUN, VECFMT) pl_adds%vh(1, iadd), pl_adds%vh(2, iadd), pl_adds%vh(3, iadd) else exit end if iadd = iadd + 1 end do do j = 1, nsub - if (isub <= mergesub_list%nbody) then - write(LUN, NAMEFMT) SUB, mergesub_list%id(isub), mergesub_list%status(isub) - write(LUN, VECFMT) mergesub_list%xh(1, isub), mergesub_list%xh(2, isub), mergesub_list%xh(3, isub) - write(LUN, VECFMT) mergesub_list%vh(1, isub), mergesub_list%vh(2, isub), mergesub_list%vh(3, isub) + if (isub <= pl_discards%nbody) then + write(LUN, NAMEFMT) SUB, pl_discards%id(isub), pl_discards%status(isub) + write(LUN, VECFMT) pl_discards%xh(1, isub), pl_discards%xh(2, isub), pl_discards%xh(3, isub) + write(LUN, VECFMT) pl_discards%vh(1, isub), pl_discards%vh(2, isub), pl_discards%vh(3, isub) else exit end if diff --git a/docs/src/symba_step.f90 b/docs/src/symba_step.f90 index 41e7a3a74..7065625b4 100644 --- a/docs/src/symba_step.f90 +++ b/docs/src/symba_step.f90 @@ -237,7 +237,7 @@ module subroutine symba_step_reset_system(self) ! Internals integer(I4B) :: i - associate(system => self, pltpenc_list => self%pltpenc_list, plplenc_list => self%plplenc_list, mergeadd_list => self%mergeadd_list, mergesub_list => self%mergesub_list) + associate(system => self, pltpenc_list => self%pltpenc_list, plplenc_list => self%plplenc_list, pl_adds => self%pl_adds, pl_discards => self%pl_discards) select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -265,8 +265,8 @@ module subroutine symba_step_reset_system(self) pltpenc_list%nenc = 0 end if - call mergeadd_list%resize(0) - call mergesub_list%resize(0) + call pl_adds%resize(0) + call pl_discards%resize(0) end select end select end associate diff --git a/docs/src/symba_util.f90 b/docs/src/symba_util.f90 index 98c8889d8..0517cff9a 100644 --- a/docs/src/symba_util.f90 +++ b/docs/src/symba_util.f90 @@ -381,13 +381,13 @@ module subroutine symba_util_rearray_pl(self, system, param) ! Internals class(symba_pl), allocatable :: pl_discards !! The discarded body list. - associate(pl => self, mergeadd_list => system%mergeadd_list) + associate(pl => self, pl_adds => system%pl_adds) allocate(pl_discards, mold=pl) ! Remove the discards call pl%spill(pl_discards, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) ! Add in any new bodies - call pl%append(mergeadd_list) + call pl%append(pl_adds) ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then @@ -397,7 +397,7 @@ module subroutine symba_util_rearray_pl(self, system, param) call pl%eucl_index() end if - ! Destroy the discarded body list, since we already have what we need in the mergesub_list + ! Destroy the discarded body list, since we already have what we need in the pl_discards call pl_discards%setup(0,param) deallocate(pl_discards) end associate diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index b6f29564b..bb0915050 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -17,9 +17,8 @@ CHK_RMIN 0.005 CHK_RMAX 1e6 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.disruption_off_axis.dat +DISCARD_OUT discard.disruption_off_axis.out EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 0e66ebf7c..ed495ecfa 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -160,8 +160,7 @@ module symba_classes ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** type, extends(helio_nbody_system) :: symba_nbody_system - class(symba_merger), allocatable :: mergeadd_list !! List of added bodies in mergers or collisions - class(symba_merger), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions + class(symba_merger), allocatable :: pl_adds !! List of added bodies in mergers or collisions class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step integer(I4B) :: irec !! System recursion level diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 6cba6d27b..9346e8c12 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -54,8 +54,8 @@ module subroutine setup_construct_system(system, param) allocate(symba_pl :: system%pl) allocate(symba_tp :: system%tp) allocate(symba_tp :: system%tp_discards) - allocate(symba_merger :: system%mergeadd_list) - allocate(symba_merger :: system%mergesub_list) + allocate(symba_merger :: system%pl_adds) + allocate(symba_merger :: system%pl_discards) allocate(symba_plplenc :: system%plplenc_list) allocate(symba_pltpenc :: system%pltpenc_list) end select diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index efdd8c0d7..a27d31e12 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -34,115 +34,117 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) - ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - nfrag = NFRAG_DISRUPT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment - m_frag(1) = mass_res(1) - if (mass_res(2) > mass_res(1) / 3._DP) then - m_frag(2) = mass_res(2) - istart = 3 - else - istart = 2 - end if - ! Distribute remaining mass among the remaining bodies - do i = istart, nfrag - m_frag(i) = (mtot - sum(m_frag(1:istart - 1))) / (nfrag - istart + 1) - end do - - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - - do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) - end do - - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) - - if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' - status = ACTIVE - nfrag = 0 - else - ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = DISRUPTION - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) - ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily - - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + select type(pl_discards => system%pl_discards) + class is (symba_merger) + associate(pl_adds => system%pl_adds, cb => system%cb) + ! Collisional fragments will be uniformly distributed around the pre-impact barycenter + nfrag = NFRAG_DISRUPT + allocate(m_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + + ! Get mass weighted mean of Ip and average density + Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot + vol(:) = 4._DP / 3._DP * PI * radius(:)**3 + avg_dens = mtot / sum(vol(:)) + + ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment + m_frag(1) = mass_res(1) + if (mass_res(2) > mass_res(1) / 3._DP) then + m_frag(2) = mass_res(2) + istart = 3 + else + istart = 2 + end if + ! Distribute remaining mass among the remaining bodies + do i = istart, nfrag + m_frag(i) = (mtot - sum(m_frag(1:istart - 1))) / (nfrag - istart + 1) end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Disruption" - plnew%info(:)%origin_time = param%t + + ! Distribute any residual mass if there is any and set the radius + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + Ip_frag(:, i) = Ip_new(:) end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if - - ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) - end if + + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + + if (lfailure) then + write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' + status = ACTIVE + nfrag = 0 + else + ! Populate the list of new bodies + write(*,'("Generating ",I2.0," fragments")') nfrag + status = DISRUPTION + + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily - end associate + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + + plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] + system%maxid = system%maxid + nfrag + plnew%status(:) = ACTIVE + plnew%lcollision(:) = .false. + plnew%ldiscard(:) = .false. + plnew%xb(:,:) = xb_frag(:, :) + plnew%vb(:,:) = vb_frag(:, :) + do i = 1, nfrag + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + end do + plnew%mass(:) = m_frag(:) + plnew%Gmass(:) = param%GU * m_frag(:) + plnew%density(:) = avg_dens + plnew%radius(:) = rad_frag(:) + plnew%info(:)%origin_type = "Disruption" + plnew%info(:)%origin_time = param%t + do i = 1, nfrag + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + end do + if (param%lrotation) then + plnew%Ip(:,:) = Ip_frag(:,:) + plnew%rot(:,:) = rot_frag(:,:) + end if + if (param%ltides) then + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) + end if + end associate + end select end select return @@ -179,126 +181,129 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - lpure = .false. - - ! The largest body will stay untouched - if (mass(1) > mass(2)) then - jtarg = 1 - jproj = 2 - else - jtarg = 2 - jproj = 1 - end if - - if (mass_res(2) > 0.9_DP * mass(jproj)) then ! Pure hit and run, so we'll just keep the two bodies untouched - write(*,*) 'Pure hit and run. No new fragments generated.' - nfrag = 0 - lpure = .true. - else ! Imperfect hit and run, so we'll keep the largest body and destroy the other - nfrag = NFRAG_DISRUPT - 1 + select type(pl_discards => system%pl_discards) + class is (symba_merger) + associate(pl_adds => system%pl_adds, cb => system%cb) + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot lpure = .false. - allocate(m_frag(nfrag)) - allocate(id_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - m_frag(1) = mass(jtarg) - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - id_frag(1) = pl%id(ibiggest) - rad_frag(1) = radius(jtarg) - xb_frag(:, 1) = x(:, jtarg) - vb_frag(:, 1) = v(:, jtarg) - Ip_frag(:,1) = Ip(:, jtarg) - - ! Get mass weighted mean of Ip and average density - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mass(jproj) / vol(jproj) - m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) - rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - - do i = 1, nfrag - Ip_frag(:, i) = Ip(:, jproj) - end do - - ! Put the fragments on the circle surrounding the center of mass of the system - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lpure) - if (lpure) then - write(*,*) 'Should have been a pure hit and run instead' - nfrag = 0 + + ! The largest body will stay untouched + if (mass(1) > mass(2)) then + jtarg = 1 + jproj = 2 else - write(*,'("Generating ",I2.0," fragments")') nfrag + jtarg = 2 + jproj = 1 end if - end if - if (lpure) then - status = ACTIVE - else - status = HIT_AND_RUN - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) - ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily - - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Hit and run fragment" - plnew%info(:)%origin_time = param%t - do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) - end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then + + if (mass_res(2) > 0.9_DP * mass(jproj)) then ! Pure hit and run, so we'll just keep the two bodies untouched + write(*,*) 'Pure hit and run. No new fragments generated.' + nfrag = 0 + lpure = .true. + else ! Imperfect hit and run, so we'll keep the largest body and destroy the other + nfrag = NFRAG_DISRUPT - 1 + lpure = .false. + allocate(m_frag(nfrag)) + allocate(id_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + m_frag(1) = mass(jtarg) ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) + id_frag(1) = pl%id(ibiggest) + rad_frag(1) = radius(jtarg) + xb_frag(:, 1) = x(:, jtarg) + vb_frag(:, 1) = v(:, jtarg) + Ip_frag(:,1) = Ip(:, jtarg) + + ! Get mass weighted mean of Ip and average density + vol(:) = 4._DP / 3._DP * pi * radius(:)**3 + avg_dens = mass(jproj) / vol(jproj) + m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) + rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + + do i = 1, nfrag + Ip_frag(:, i) = Ip(:, jproj) + end do + + ! Put the fragments on the circle surrounding the center of mass of the system + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lpure) + if (lpure) then + write(*,*) 'Should have been a pure hit and run instead' + nfrag = 0 + else + write(*,'("Generating ",I2.0," fragments")') nfrag + end if end if - - ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) + if (lpure) then + status = ACTIVE + else + status = HIT_AND_RUN + + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily + + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + + plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] + system%maxid = system%maxid + nfrag + plnew%status(:) = ACTIVE + plnew%lcollision(:) = .false. + plnew%ldiscard(:) = .false. + plnew%xb(:,:) = xb_frag(:, :) + plnew%vb(:,:) = vb_frag(:, :) + do i = 1, nfrag + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + end do + plnew%mass(:) = m_frag(:) + plnew%Gmass(:) = param%GU * m_frag(:) + plnew%density(:) = avg_dens + plnew%radius(:) = rad_frag(:) + plnew%info(:)%origin_type = "Hit and run fragment" + plnew%info(:)%origin_time = param%t + do i = 1, nfrag + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + end do + if (param%lrotation) then + plnew%Ip(:,:) = Ip_frag(:,:) + plnew%rot(:,:) = rot_frag(:,:) + end if + if (param%ltides) then + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) - end if - end associate + end if + end associate + end select end select return @@ -334,103 +339,105 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) - status = MERGED - write(*, '("Merging bodies ",99(I8,",",:))') pl%id(family(:)) - mass_new = sum(mass(:)) - - ! Merged body is created at the barycenter of the original bodies - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mass_new - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mass_new - - ! Get mass weighted mean of Ip and - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - volume_new = sum(vol(:)) - radius_new = (3 * volume_new / (4 * PI))**(1._DP / 3._DP) - - L_orb_old(:) = 0.0_DP - - ! Compute orbital angular momentum of pre-impact system - do i = 1, 2 - xc(:) = x(:, i) - xcom(:) - vc(:) = v(:, i) - vcom(:) - xcrossv(:) = xc(:) .cross. vc(:) - L_orb_old(:) = L_orb_old(:) + mass(i) * xcrossv(:) - end do + select type(pl_discards => system%pl_discards) + class is (symba_merger) + associate(pl_adds => system%pl_adds, cb => system%cb) + status = MERGED + write(*, '("Merging bodies ",99(I8,",",:))') pl%id(family(:)) + mass_new = sum(mass(:)) - if (param%lrotation) then - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mass_new - L_spin_old(:) = L_spin(:,1) + L_spin(:,2) + ! Merged body is created at the barycenter of the original bodies + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mass_new + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mass_new + + ! Get mass weighted mean of Ip and + vol(:) = 4._DP / 3._DP * PI * radius(:)**3 + volume_new = sum(vol(:)) + radius_new = (3 * volume_new / (4 * PI))**(1._DP / 3._DP) - ! Conserve angular momentum by putting pre-impact orbital momentum into spin of the new body - L_spin_new(:) = L_orb_old(:) + L_spin_old(:) - - ! Assume prinicpal axis rotation on 3rd Ip axis - rot_new(:) = L_spin_new(:) / (Ip_new(3) * mass_new * radius_new**2) - else ! If spin is not enabled, we will consider the lost pre-collision angular momentum as "escaped" and add it to our bookkeeping variable - system%Lescape(:) = system%Lescape(:) + L_orb_old(:) - end if - - ! Keep track of the component of potential energy due to the pre-impact family for book-keeping - nfamily = size(family(:)) - pe = 0.0_DP - do j = 1, nfamily - do i = j + 1, nfamily - pe = pe - pl%mass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) + L_orb_old(:) = 0.0_DP + + ! Compute orbital angular momentum of pre-impact system + do i = 1, 2 + xc(:) = x(:, i) - xcom(:) + vc(:) = v(:, i) - vcom(:) + xcrossv(:) = xc(:) .cross. vc(:) + L_orb_old(:) = L_orb_old(:) + mass(i) * xcrossv(:) end do - end do - system%Ecollisions = system%Ecollisions + pe - system%Euntracked = system%Euntracked - pe - - ! Add the family bodies to the subtraction list - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) - ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + + if (param%lrotation) then + Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mass_new + L_spin_old(:) = L_spin(:,1) + L_spin(:,2) - ! Create the new merged body - allocate(plnew, mold=pl) - call plnew%setup(1, param) + ! Conserve angular momentum by putting pre-impact orbital momentum into spin of the new body + L_spin_new(:) = L_orb_old(:) + L_spin_old(:) + + ! Assume prinicpal axis rotation on 3rd Ip axis + rot_new(:) = L_spin_new(:) / (Ip_new(3) * mass_new * radius_new**2) + else ! If spin is not enabled, we will consider the lost pre-collision angular momentum as "escaped" and add it to our bookkeeping variable + system%Lescape(:) = system%Lescape(:) + L_orb_old(:) + end if + + ! Keep track of the component of potential energy due to the pre-impact family for book-keeping + nfamily = size(family(:)) + pe = 0.0_DP + do j = 1, nfamily + do i = j + 1, nfamily + pe = pe - pl%mass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) + end do + end do + system%Ecollisions = system%Ecollisions + pe + system%Euntracked = system%Euntracked - pe + + ! Add the family bodies to the subtraction list + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily - ! The merged body's name will be that of the largest of the two parents - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%id(1) = pl%id(family(ibiggest)) - plnew%status(1) = ACTIVE - plnew%lcollision = .false. - plnew%ldiscard = .false. - plnew%xb(:,1) = xcom(:) - plnew%vb(:,1) = vcom(:) - plnew%xh(:,1) = xcom(:) - cb%xb(:) - plnew%vh(:,1) = vcom(:) - cb%vb(:) - plnew%mass(1) = mass_new - plnew%Gmass(1) = param%GU * mass_new - plnew%density(1) = mass_new / volume_new - plnew%radius(1) = radius_new - plnew%info(1) = pl%info(family(ibiggest)) - if (param%lrotation) then - plnew%Ip(:,1) = Ip_new(:) - plnew%rot(:,1) = rot_new(:) - end if - if (param%ltides) then - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if + ! Create the new merged body + allocate(plnew, mold=pl) + call plnew%setup(1, param) - ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody + ! The merged body's name will be that of the largest of the two parents + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + plnew%id(1) = pl%id(family(ibiggest)) + plnew%status(1) = ACTIVE + plnew%lcollision = .false. + plnew%ldiscard = .false. + plnew%xb(:,1) = xcom(:) + plnew%vb(:,1) = vcom(:) + plnew%xh(:,1) = xcom(:) - cb%xb(:) + plnew%vh(:,1) = vcom(:) - cb%vb(:) + plnew%mass(1) = mass_new + plnew%Gmass(1) = param%GU * mass_new + plnew%density(1) = mass_new / volume_new + plnew%radius(1) = radius_new + plnew%info(1) = pl%info(family(ibiggest)) + if (param%lrotation) then + plnew%Ip(:,1) = Ip_new(:) + plnew%rot(:,1) = rot_new(:) + end if + if (param%ltides) then + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if - call plnew%setup(0, param) - deallocate(plnew) + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody - end associate + call plnew%setup(0, param) + deallocate(plnew) + end associate + end select end select return @@ -468,111 +475,113 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, select type(pl => system%pl) class is (symba_pl) - associate(mergeadd_list => system%mergeadd_list, mergesub_list => system%mergesub_list, cb => system%cb) - ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - nfrag = NFRAG_SUPERCAT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! If we are adding the first and largest fragment (lr), check to see if its mass is SMALLER than an equal distribution of - ! mass between all fragments. If so, we will just distribute the mass equally between the fragments - min_frag_mass = mtot / nfrag - if (mass_res(1) < min_frag_mass) then - m_frag(:) = min_frag_mass - else - m_frag(1) = mass_res(1) - m_frag(2:nfrag) = (mtot - mass_res(1)) / (nfrag - 1) - end if - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - - do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) - end do + select type(pl_discards => system%pl_discards) + class is (symba_merger) + associate(pl_adds => system%pl_adds, cb => system%cb) + ! Collisional fragments will be uniformly distributed around the pre-impact barycenter + nfrag = NFRAG_SUPERCAT + allocate(m_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + + ! Get mass weighted mean of Ip and average density + Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot + vol(:) = 4._DP / 3._DP * pi * radius(:)**3 + avg_dens = mtot / sum(vol(:)) + + ! If we are adding the first and largest fragment (lr), check to see if its mass is SMALLER than an equal distribution of + ! mass between all fragments. If so, we will just distribute the mass equally between the fragments + min_frag_mass = mtot / nfrag + if (mass_res(1) < min_frag_mass) then + m_frag(:) = min_frag_mass + else + m_frag(1) = mass_res(1) + m_frag(2:nfrag) = (mtot - mass_res(1)) / (nfrag - 1) + end if + ! Distribute any residual mass if there is any and set the radius + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + + do i = 1, nfrag + Ip_frag(:, i) = Ip_new(:) + end do - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) - - if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' - status = ACTIVE - nfrag = 0 - else - ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = SUPERCATASTROPHIC + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + + if (lfailure) then + write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' + status = ACTIVE + nfrag = 0 + else + ! Populate the list of new bodies + write(*,'("Generating ",I2.0," fragments")') nfrag + status = SUPERCATASTROPHIC - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = mergesub_list%nbody + 1 - nend = mergesub_list%nbody + nfamily - call mergesub_list%append(pl, lmask) - ! Record how many bodies were subtracted in this event - mergesub_list%ncomp(nstart:nend) = nfamily + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = MERGED + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Supercatastrophic" - plnew%info(:)%origin_time = param%t - do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) - end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + + plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] + system%maxid = system%maxid + nfrag + plnew%status(:) = ACTIVE + plnew%lcollision(:) = .false. + plnew%ldiscard(:) = .false. + plnew%xb(:,:) = xb_frag(:, :) + plnew%vb(:,:) = vb_frag(:, :) + do i = 1, nfrag + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) + end do + plnew%mass(:) = m_frag(:) + plnew%Gmass(:) = param%GU * m_frag(:) + plnew%density(:) = avg_dens + plnew%radius(:) = rad_frag(:) + plnew%info(:)%origin_type = "Supercatastrophic" + plnew%info(:)%origin_time = param%t + do i = 1, nfrag + plnew%info(i)%origin_xh(:) = plnew%xh(:,i) + plnew%info(i)%origin_vh(:) = plnew%vh(:,i) + end do + if (param%lrotation) then + plnew%Ip(:,:) = Ip_frag(:,:) + plnew%rot(:,:) = rot_frag(:,:) + end if + if (param%ltides) then + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) end if - - ! Append the new merged body to the list and record how many we made - nstart = mergeadd_list%nbody + 1 - nend = mergeadd_list%nbody + plnew%nbody - call mergeadd_list%append(plnew) - mergeadd_list%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) - end if - - end associate + end associate + end select end select return diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 2e568dd7e..4401fb5db 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -225,54 +225,56 @@ module subroutine symba_io_write_discard(self, param) character(*), parameter :: PLNAMEFMT = '(I8, 2(1X, E23.16))' class(swiftest_body), allocatable :: pltemp - associate(pl => self%pl, npl => self%pl%nbody, mergesub_list => self%mergesub_list, mergeadd_list => self%mergeadd_list) + associate(pl => self%pl, npl => self%pl%nbody, pl_adds => self%pl_adds) if (self%tp_discards%nbody > 0) call io_write_discard(self, param) + select type(pl_discards => self%pl_discards) + class is (symba_merger) + if (pl_discards%nbody == 0) return + select case(param%out_stat) + case('APPEND') + open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) + case('NEW', 'REPLACE', 'UNKNOWN') + open(unit = LUN, file = param%discard_out, status = param%out_stat, form = 'FORMATTED', iostat = ierr) + case default + write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + lfirst = .false. + if (param%lgr) then + call pl_discards%pv2v(param) + call pl_adds%pv2v(param) + end if - if (mergesub_list%nbody == 0) return - select case(param%out_stat) - case('APPEND') - open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) - case('NEW', 'REPLACE', 'UNKNOWN') - open(unit = LUN, file = param%discard_out, status = param%out_stat, form = 'FORMATTED', iostat = ierr) - case default - write(*,*) 'Invalid status code for OUT_STAT: ',trim(adjustl(param%out_stat)) - call util_exit(FAILURE) - end select - lfirst = .false. - if (param%lgr) then - call mergesub_list%pv2v(param) - call mergeadd_list%pv2v(param) - end if - - write(LUN, HDRFMT) param%t, mergesub_list%nbody, param%lbig_discard - iadd = 1 - isub = 1 - do while (iadd <= mergeadd_list%nbody) - nadd = mergeadd_list%ncomp(iadd) - nsub = mergesub_list%ncomp(isub) - do j = 1, nadd - if (iadd <= mergeadd_list%nbody) then - write(LUN, NAMEFMT) ADD, mergesub_list%id(iadd), mergesub_list%status(iadd) - write(LUN, VECFMT) mergeadd_list%xh(1, iadd), mergeadd_list%xh(2, iadd), mergeadd_list%xh(3, iadd) - write(LUN, VECFMT) mergeadd_list%vh(1, iadd), mergeadd_list%vh(2, iadd), mergeadd_list%vh(3, iadd) - else - exit - end if - iadd = iadd + 1 - end do - do j = 1, nsub - if (isub <= mergesub_list%nbody) then - write(LUN, NAMEFMT) SUB, mergesub_list%id(isub), mergesub_list%status(isub) - write(LUN, VECFMT) mergesub_list%xh(1, isub), mergesub_list%xh(2, isub), mergesub_list%xh(3, isub) - write(LUN, VECFMT) mergesub_list%vh(1, isub), mergesub_list%vh(2, isub), mergesub_list%vh(3, isub) - else - exit - end if - isub = isub + 1 + write(LUN, HDRFMT) param%t, pl_discards%nbody, param%lbig_discard + iadd = 1 + isub = 1 + do while (iadd <= pl_adds%nbody) + nadd = pl_adds%ncomp(iadd) + nsub = pl_discards%ncomp(isub) + do j = 1, nadd + if (iadd <= pl_adds%nbody) then + write(LUN, NAMEFMT) ADD, pl_discards%id(iadd), pl_discards%status(iadd) + write(LUN, VECFMT) pl_adds%xh(1, iadd), pl_adds%xh(2, iadd), pl_adds%xh(3, iadd) + write(LUN, VECFMT) pl_adds%vh(1, iadd), pl_adds%vh(2, iadd), pl_adds%vh(3, iadd) + else + exit + end if + iadd = iadd + 1 + end do + do j = 1, nsub + if (isub <= pl_discards%nbody) then + write(LUN, NAMEFMT) SUB, pl_discards%id(isub), pl_discards%status(isub) + write(LUN, VECFMT) pl_discards%xh(1, isub), pl_discards%xh(2, isub), pl_discards%xh(3, isub) + write(LUN, VECFMT) pl_discards%vh(1, isub), pl_discards%vh(2, isub), pl_discards%vh(3, isub) + else + exit + end if + isub = isub + 1 + end do end do - end do - close(LUN) + close(LUN) + end select end associate return diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 41e7a3a74..7065625b4 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -237,7 +237,7 @@ module subroutine symba_step_reset_system(self) ! Internals integer(I4B) :: i - associate(system => self, pltpenc_list => self%pltpenc_list, plplenc_list => self%plplenc_list, mergeadd_list => self%mergeadd_list, mergesub_list => self%mergesub_list) + associate(system => self, pltpenc_list => self%pltpenc_list, plplenc_list => self%plplenc_list, pl_adds => self%pl_adds, pl_discards => self%pl_discards) select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -265,8 +265,8 @@ module subroutine symba_step_reset_system(self) pltpenc_list%nenc = 0 end if - call mergeadd_list%resize(0) - call mergesub_list%resize(0) + call pl_adds%resize(0) + call pl_discards%resize(0) end select end select end associate diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 98c8889d8..2ebc11ebb 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -379,15 +379,17 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(symba_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - class(symba_pl), allocatable :: pl_discards !! The discarded body list. + class(symba_pl), allocatable :: tmp !! The discarded body list. - associate(pl => self, mergeadd_list => system%mergeadd_list) - allocate(pl_discards, mold=pl) - ! Remove the discards - call pl%spill(pl_discards, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) + associate(pl => self, pl_adds => system%pl_adds) + allocate(tmp, mold=pl) + ! Remove the discards and destroy the list, as the system already tracks pl_discards elsewhere + call pl%spill(tmp, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) + call tmp%setup(0,param) + deallocate(tmp) ! Add in any new bodies - call pl%append(mergeadd_list) + call pl%append(pl_adds) ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then @@ -397,9 +399,6 @@ module subroutine symba_util_rearray_pl(self, system, param) call pl%eucl_index() end if - ! Destroy the discarded body list, since we already have what we need in the mergesub_list - call pl_discards%setup(0,param) - deallocate(pl_discards) end associate return From 90faadf0a71236af13feaa135c1a99e5026ce19d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 15:58:07 -0400 Subject: [PATCH 28/71] Refactored MTINY into GMTINY to be consistent in distinguishing G*mass and mass terms --- docs/src/fragmentation.f90 | 10 +++++----- docs/src/io.f90 | 2 +- docs/src/swiftest_classes.f90 | 4 ++-- docs/src/symba_classes.f90 | 8 ++++---- docs/src/symba_collision.f90 | 2 +- docs/src/symba_io.f90 | 12 ++++++------ docs/src/symba_setup.f90 | 2 +- docs/src/symba_util.f90 | 2 +- .../param.disruption_headon.in | 4 +--- .../param.disruption_off_axis.in | 2 +- examples/symba_energy_momentum/param.escape.in | 4 +--- examples/symba_energy_momentum/param.sun.in | 4 +--- .../param.supercatastrophic_headon.in | 4 +--- .../param.supercatastrophic_off_axis.in | 2 +- .../1pl_1pl_encounter/init_cond.py | 2 +- .../1pl_1pl_encounter/param.swiftest.in | 2 +- .../1pl_1tp_encounter/init_cond.py | 2 +- .../1pl_1tp_encounter/param.swiftest.in | 2 +- .../8pl_16tp_encounters/init_cond.py | 2 +- .../8pl_16tp_encounters/param.swiftest.in | 2 +- python/swiftest/swiftest/io.py | 18 +++++++++--------- src/fragmentation/fragmentation.f90 | 14 +++++++------- src/io/io.f90 | 2 +- src/modules/swiftest_classes.f90 | 4 ++-- src/modules/symba_classes.f90 | 8 ++++---- src/symba/symba_collision.f90 | 14 +++++++------- src/symba/symba_io.f90 | 12 ++++++------ src/symba/symba_setup.f90 | 2 +- src/symba/symba_util.f90 | 2 +- src/util/util_get_energy_momentum.f90 | 2 +- 30 files changed, 72 insertions(+), 80 deletions(-) diff --git a/docs/src/fragmentation.f90 b/docs/src/fragmentation.f90 index 460060183..c90f64cb4 100644 --- a/docs/src/fragmentation.f90 +++ b/docs/src/fragmentation.f90 @@ -369,7 +369,7 @@ subroutine calculate_system_energy(linclude_fragments) class is (symba_pl) select type(param) class is (symba_parameters) - plwksp%nplm = count(plwksp%Gmass > param%mtiny / mscale) + plwksp%nplm = count(plwksp%Gmass > param%Gmtiny / mscale) end select end select call tmpsys%pl%eucl_index() @@ -381,7 +381,7 @@ subroutine calculate_system_energy(linclude_fragments) class is (symba_pl) select type(param) class is (symba_parameters) - nplm = count(pl%mass > param%mtiny) + nplm = count(pl%mass > param%Gmtiny) end select end select if (lk_plpl) call pl%eucl_index() @@ -836,7 +836,7 @@ end subroutine fragmentation_initialize - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Determine the collisional regime of two colliding bodies. @@ -857,7 +857,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v ! Arguments integer(I4B), intent(out) :: regime real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision ! Constants @@ -931,7 +931,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v Qloss = 0.0_DP U_binding = (3.0_DP * Mtot) / (5.0_DP * Rp) ! LS12 eq. 27 - if ((m1 < mtiny).or.(m2 < mtiny)) then + if ((m1 < Gmtiny).or.(m2 < Gmtiny)) then regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime Mlr = Mtot Mslr = 0.0_DP diff --git a/docs/src/io.f90 b/docs/src/io.f90 index de1226951..1e0e8d626 100644 --- a/docs/src/io.f90 +++ b/docs/src/io.f90 @@ -493,7 +493,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) read(param_value, *) param%Ecollisions case("EUNTRACKED") read(param_value, *) param%Euntracked - case ("NPLMAX", "NTPMAX", "MTINY", "PARTICLE_FILE", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters + case ("NPLMAX", "NTPMAX", "GMTINY", "PARTICLE_FILE", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters case default write(iomsg,*) "Unknown parameter -> ",param_name iostat = -1 diff --git a/docs/src/swiftest_classes.f90 b/docs/src/swiftest_classes.f90 index 2455e77f2..051add1aa 100644 --- a/docs/src/swiftest_classes.f90 +++ b/docs/src/swiftest_classes.f90 @@ -469,11 +469,11 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, real(DP), intent(inout) :: Qloss end subroutine fragmentation_initialize - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) implicit none integer(I4B), intent(out) :: regime real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision end subroutine fragmentation_regime diff --git a/docs/src/symba_classes.f90 b/docs/src/symba_classes.f90 index 4cf69a3e1..6ecb27751 100644 --- a/docs/src/symba_classes.f90 +++ b/docs/src/symba_classes.f90 @@ -19,7 +19,7 @@ module symba_classes type, extends(swiftest_parameters) :: symba_parameters character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file - real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating + real(DP) :: GMTINY = -1.0_DP !! Smallest mass that is fully gravitating integer(I4B), dimension(:), allocatable :: seed !! Random seeds logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. contains @@ -73,9 +73,9 @@ module symba_classes type, extends(helio_pl) :: symba_pl logical, dimension(:), allocatable :: lcollision !! flag indicating whether body has merged with another this time step logical, dimension(:), allocatable :: lencounter !! flag indicating whether body is part of an encounter this time step - logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the MTINY cutoff value - integer(I4B) :: nplm !! number of bodies above the MTINY limit - integer(I8B) :: nplplm !! Number of body (all massive)-body (only those above MTINY) comparisons in the flattened upper triangular matrix + logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the GMTINY cutoff value + integer(I4B) :: nplm !! number of bodies above the GMTINY limit + integer(I8B) :: nplplm !! Number of body (all massive)-body (only those above GMTINY) comparisons in the flattened upper triangular matrix integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with other planets this time step integer(I4B), dimension(:), allocatable :: ntpenc !! number of encounters with test particles this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this body should be moved diff --git a/docs/src/symba_collision.f90 b/docs/src/symba_collision.f90 index 952d59709..caffdf296 100644 --- a/docs/src/symba_collision.f90 +++ b/docs/src/symba_collision.f90 @@ -449,7 +449,7 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) v2_si(:) = plpl_collisions%v2(:,i) * param%DU2M / param%TU2S !! The velocity of the parent from inside the step (at collision) density_si(:) = mass_si(:) / (4.0_DP / 3._DP * PI * radius_si(:)**3) !! The collective density of the parent and its children Mcb_si = cb%mass * param%MU2KG - mtiny_si = (param%MTINY / param%GU) * param%MU2KG + mtiny_si = (param%GMTINY / param%GU) * param%MU2KG mass_res(:) = 0.0_DP diff --git a/docs/src/symba_io.f90 b/docs/src/symba_io.f90 index 8e6420f61..713429365 100644 --- a/docs/src/symba_io.f90 +++ b/docs/src/symba_io.f90 @@ -71,8 +71,8 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms case ("FRAGMENTATION") call io_toupper(param_value) if (param_value == "YES" .or. param_value == "T") self%lfragmentation = .true. - case ("MTINY") - read(param_value, *) param%mtiny + case ("GMTINY") + read(param_value, *) param%Gmtiny case("SEED") read(param_value, *) nseeds_from_file ! Because the number of seeds can vary between compilers/systems, we need to make sure we can handle cases in which the input file has a different @@ -111,12 +111,12 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms write(*,*) "SEED: N,VAL = ",size(param%seed), param%seed(:) end if - if (self%mtiny < 0.0_DP) then - write(iomsg,*) "MTINY invalid or not set: ", self%mtiny + if (self%Gmtiny < 0.0_DP) then + write(iomsg,*) "GMTINY invalid or not set: ", self%Gmtiny iostat = -1 return else - write(*,*) "MTINY = ", self%mtiny + write(*,*) "GMTINY = ", self%Gmtiny end if if (.not.self%lclose) then @@ -167,7 +167,7 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms ! Special handling is required for writing the random number seed array as its size is not known until runtime ! For the "SEED" parameter line, the first value will be the size of the seed array and the rest will be the seed array elements write(param_name, Afmt) "PARTICLE_FILE"; write(param_value, Afmt) trim(adjustl(param%particle_file)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "MTINY"; write(param_value, Rfmt) param%mtiny; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "GMTINY"; write(param_value, Rfmt) param%Gmtiny; write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) if (param%lfragmentation) then write(param_name, Afmt) "SEED" diff --git a/docs/src/symba_setup.f90 b/docs/src/symba_setup.f90 index 021873a70..ab8b5543e 100644 --- a/docs/src/symba_setup.f90 +++ b/docs/src/symba_setup.f90 @@ -25,7 +25,7 @@ module subroutine symba_setup_initialize_system(self, param) call pl%sort("mass", ascending=.false.) select type(param) class is (symba_parameters) - pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY pl%nplm = count(pl%lmtiny(:)) end select end select diff --git a/docs/src/symba_util.f90 b/docs/src/symba_util.f90 index 0517cff9a..911f85304 100644 --- a/docs/src/symba_util.f90 +++ b/docs/src/symba_util.f90 @@ -392,7 +392,7 @@ module subroutine symba_util_rearray_pl(self, system, param) ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then call pl%sort("mass", ascending=.false.) - pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY pl%nplm = count(pl%lmtiny(:)) call pl%eucl_index() end if diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in index de3c83bea..6dbe1f788 100644 --- a/examples/symba_energy_momentum/param.disruption_headon.in +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -17,13 +17,11 @@ CHK_RMIN 0.005 CHK_RMAX 1e6 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.disruption_headon.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index bb0915050..39303284e 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -22,7 +22,7 @@ DISCARD_OUT discard.disruption_off_axis.out EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.escape.in b/examples/symba_energy_momentum/param.escape.in index 2b84eb719..99d572b75 100644 --- a/examples/symba_energy_momentum/param.escape.in +++ b/examples/symba_energy_momentum/param.escape.in @@ -19,13 +19,11 @@ CHK_RMIN 0.00465047 ! check for close solar encounters in AU CHK_RMAX 10000.0 ! discard outside of CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.escape.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT no ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.sun.in b/examples/symba_energy_momentum/param.sun.in index 65365b120..5e26e4cd3 100644 --- a/examples/symba_energy_momentum/param.sun.in +++ b/examples/symba_energy_momentum/param.sun.in @@ -19,13 +19,11 @@ CHK_RMIN 0.005 CHK_RMAX 1e2 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.escape.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT no ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in index 19b15de7b..3ba223ad9 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -17,13 +17,11 @@ CHK_RMIN 0.005 CHK_RMAX 1e6 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.supercatastrophic_headon.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index 9cd214534..d033c76f1 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -23,7 +23,7 @@ ENC_OUT enc.supercatastrophic_off_axis.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded RHILL_PRESENT yes ! Hill's sphere radii in input file -MTINY 1.0e-16 +GMTINY 1.0e-16 FRAGMENTATION yes MU2KG 1.98908e30 TU2S 3.1556925e7 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py index 245f5fae0..6547c2802 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -180,7 +180,7 @@ print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') print(f'RHILL_PRESENT yes') -print(f'MTINY 1e-12') +print(f'GMTINY 1e-12') diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in index 3050dea4a..c69ee07f9 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -30,4 +30,4 @@ MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 RHILL_PRESENT yes -MTINY 1e-12 +GMTINY 1e-12 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 6b9664542..ac55abb2b 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -178,7 +178,7 @@ print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') print(f'RHILL_PRESENT yes') -print(f'MTINY 1e-12') +print(f'GMTINY 1e-12') 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 32cfb89bd..9fb0bf743 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -29,4 +29,4 @@ MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 RHILL_PRESENT yes -MTINY 1e-12 +GMTINY 1e-12 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py b/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py index 707c80b51..546dcbb88 100755 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -39,7 +39,7 @@ sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' sim.param['RHILL_PRESENT'] = 'YES' -sim.param['MTINY'] = 1.0e-12 +sim.param['GMTINY'] = 1.0e-12 sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index c72e9f4b4..f26f33592 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -32,4 +32,4 @@ ROTATION NO TIDES NO ENERGY NO GR NO -MTINY 1e-12 +GMTINY 1e-12 diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index c0cd7d61f..81840ba05 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -76,8 +76,8 @@ def read_swiftest_param(param_file_name, param): param['TIDES'] = param['TIDES'].upper() param['ENERGY'] = param['ENERGY'].upper() param['GR'] = param['GR'].upper() - if 'MTINY' in param: - param['MTINY'] = real2float(param['MTINY']) + if 'GMTINY' in param: + param['GMTINY'] = real2float(param['GMTINY']) except IOError: print(f"{param_file_name} not found.") return param @@ -900,7 +900,7 @@ def swift2swifter(swift_param, plname="", tpname="", conversion_questions={}): intxt = conversion_questions.get('BIG_DISCARD', None) if not intxt: - intxt = input("BIG_DISCARD: include data for all bodies > MTINY for each discard record? (y/N)> ") + intxt = input("BIG_DISCARD: include data for all bodies > GMTINY for each discard record? (y/N)> ") if intxt.upper() == 'Y': swifter_param['BIG_DISCARD'] = 'YES' else: @@ -1215,11 +1215,11 @@ def swifter2swiftest(swifter_param, plname="", tpname="", cbname="", conversion_ print(f"Cannot write to file {swiftest_param['CB_IN']}") return swifter_param - MTINY = conversion_questions.get('MTINY', None) - if not MTINY: - MTINY = input(f"Value of MTINY if this is a SyMBA simulation (enter nothing if this is not a SyMBA parameter file)> ") - if MTINY != '' and real2float(MTINY.strip()) > 0: - swiftest_param['MTINY'] = real2float(MTINY.strip()) + GMTINY = conversion_questions.get('GMTINY', None) + if not GMTINY: + GMTINY = input(f"Value of GMTINY if this is a SyMBA simulation (enter nothing if this is not a SyMBA parameter file)> ") + if GMTINY != '' and real2float(GMTINY.strip()) > 0: + swiftest_param['GMTINY'] = real2float(GMTINY.strip()) # Remove the unneeded parameters if 'C' in swiftest_param: @@ -1265,7 +1265,7 @@ def swift2swiftest(swift_param, plname="", tpname="", cbname="", conversion_ques def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): swifter_param = swiftest_param CBIN = swifter_param.pop("CB_IN", None) - MTINY = swifter_param.pop("MTINY", None) + GMTINY = swifter_param.pop("GMTINY", None) DISCARD_OUT = swifter_param.pop("DISCARD_OUT", None) MU2KG = swifter_param.pop("MU2KG", 1.0) DU2M = swifter_param.pop("DU2M", 1.0) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 460060183..c0cfd3c97 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -165,10 +165,9 @@ subroutine set_scale_factors() vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot ! Set scale factors - !! Because of the implied G, mass is actually G*mass with units of distance**3 / time**2 Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) rscale = sum(radius(:)) - mscale = sqrt(Escale * rscale) + mscale = sqrt(Escale * rscale / param%GU) vscale = sqrt(Escale / mscale) tscale = rscale / vscale Lscale = mscale * rscale * vscale @@ -346,6 +345,7 @@ subroutine calculate_system_energy(linclude_fragments) if (linclude_fragments) then ! Append the fragments if they are included ! Energy calculation requires the fragments to be in the system barcyentric frame, s tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) + tmpsys%pl%Gmass(npl+1:npl_new) = param%GU * m_frag(1:nfrag) tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) tmpsys%pl%xb(:,npl+1:npl_new) = xb_frag(:,1:nfrag) tmpsys%pl%vb(:,npl+1:npl_new) = vb_frag(:,1:nfrag) @@ -369,7 +369,7 @@ subroutine calculate_system_energy(linclude_fragments) class is (symba_pl) select type(param) class is (symba_parameters) - plwksp%nplm = count(plwksp%Gmass > param%mtiny / mscale) + plwksp%nplm = count(plwksp%Gmass > param%Gmtiny / mscale) end select end select call tmpsys%pl%eucl_index() @@ -381,7 +381,7 @@ subroutine calculate_system_energy(linclude_fragments) class is (symba_pl) select type(param) class is (symba_parameters) - nplm = count(pl%mass > param%mtiny) + nplm = count(pl%Gmass > param%Gmtiny) end select end select if (lk_plpl) call pl%eucl_index() @@ -836,7 +836,7 @@ end subroutine fragmentation_initialize - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Determine the collisional regime of two colliding bodies. @@ -857,7 +857,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v ! Arguments integer(I4B), intent(out) :: regime real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision ! Constants @@ -931,7 +931,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v Qloss = 0.0_DP U_binding = (3.0_DP * Mtot) / (5.0_DP * Rp) ! LS12 eq. 27 - if ((m1 < mtiny).or.(m2 < mtiny)) then + if ((m1 < Gmtiny).or.(m2 < Gmtiny)) then regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime Mlr = Mtot Mslr = 0.0_DP diff --git a/src/io/io.f90 b/src/io/io.f90 index 05313275c..ebfe2b1ef 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -493,7 +493,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) read(param_value, *) param%Ecollisions case("EUNTRACKED") read(param_value, *) param%Euntracked - case ("NPLMAX", "NTPMAX", "MTINY", "PARTICLE_FILE", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters + case ("NPLMAX", "NTPMAX", "GMTINY", "PARTICLE_FILE", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters case default write(iomsg,*) "Unknown parameter -> ",param_name iostat = -1 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 25c18295a..7dc70a37f 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -470,11 +470,11 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, real(DP), intent(inout) :: Qloss end subroutine fragmentation_initialize - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) implicit none integer(I4B), intent(out) :: regime real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision end subroutine fragmentation_regime diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index ed495ecfa..dfe1c0326 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -19,7 +19,7 @@ module symba_classes type, extends(swiftest_parameters) :: symba_parameters character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file - real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating + real(DP) :: GMTINY = -1.0_DP !! Smallest mass that is fully gravitating integer(I4B), dimension(:), allocatable :: seed !! Random seeds logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. contains @@ -73,9 +73,9 @@ module symba_classes type, extends(helio_pl) :: symba_pl logical, dimension(:), allocatable :: lcollision !! flag indicating whether body has merged with another this time step logical, dimension(:), allocatable :: lencounter !! flag indicating whether body is part of an encounter this time step - logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the MTINY cutoff value - integer(I4B) :: nplm !! number of bodies above the MTINY limit - integer(I8B) :: nplplm !! Number of body (all massive)-body (only those above MTINY) comparisons in the flattened upper triangular matrix + logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the GMTINY cutoff value + integer(I4B) :: nplm !! number of bodies above the GMTINY limit + integer(I8B) :: nplplm !! Number of body (all massive)-body (only those above GMTINY) comparisons in the flattened upper triangular matrix integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with other planets this time step integer(I4B), dimension(:), allocatable :: ntpenc !! number of encounters with test particles this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this body should be moved diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 952d59709..1910411b9 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -22,7 +22,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec logical, dimension(:), allocatable :: lcollision, lmask real(DP), dimension(NDIM) :: xr, vr integer(I4B) :: k - real(DP) :: rlim, mtot + real(DP) :: rlim, Gmtot logical :: isplpl if (self%nenc == 0) return @@ -55,8 +55,8 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec xr(:) = pl%xh(:, ind1(k)) - pl%xh(:, ind2(k)) vr(:) = pl%vb(:, ind1(k)) - pl%vb(:, ind2(k)) rlim = pl%radius(ind1(k)) + pl%radius(ind2(k)) - mtot = pl%Gmass(ind1(k)) + pl%Gmass(ind2(k)) - lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), mtot, rlim, dt, self%lvdotr(k)) + Gmtot = pl%Gmass(ind1(k)) + pl%Gmass(ind2(k)) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), Gmtot, rlim, dt, self%lvdotr(k)) end do else do concurrent(k = 1:nenc, lmask(k)) @@ -359,7 +359,7 @@ module subroutine symba_collision_make_family_pl(self, idx) p2 = pl%kin(idx(2))%parent if (p1 == p2) return ! This is a collision between to children of a shared parent. We will ignore it. - if (pl%Gmass(p1) > pl%Gmass(p2)) then + if (pl%mass(p1) > pl%mass(p2)) then index_parent = p1 index_child = p2 else @@ -449,7 +449,7 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) v2_si(:) = plpl_collisions%v2(:,i) * param%DU2M / param%TU2S !! The velocity of the parent from inside the step (at collision) density_si(:) = mass_si(:) / (4.0_DP / 3._DP * PI * radius_si(:)**3) !! The collective density of the parent and its children Mcb_si = cb%mass * param%MU2KG - mtiny_si = (param%MTINY / param%GU) * param%MU2KG + mtiny_si = (param%GMTINY / param%GU) * param%MU2KG mass_res(:) = 0.0_DP @@ -463,8 +463,8 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) mass_res(1) = min(max(mlr, 0.0_DP), mtot) mass_res(2) = min(max(mslr, 0.0_DP), mtot) mass_res(3) = min(max(mtot - mlr - mslr, 0.0_DP), mtot) - mass_res(:) = (mass_res(:) / param%MU2KG) * param%GU - Qloss = Qloss * (param%GU / param%MU2KG) * (param%TU2S / param%DU2M)**2 + mass_res(:) = (mass_res(:) / param%MU2KG) + Qloss = Qloss * (param%TU2S / param%DU2M)**2 / param%MU2KG select case (regime) case (COLLRESOLVE_REGIME_DISRUPTION) diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 4401fb5db..ba972db8b 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -71,8 +71,8 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms case ("FRAGMENTATION") call io_toupper(param_value) if (param_value == "YES" .or. param_value == "T") self%lfragmentation = .true. - case ("MTINY") - read(param_value, *) param%mtiny + case ("GMTINY") + read(param_value, *) param%Gmtiny case("SEED") read(param_value, *) nseeds_from_file ! Because the number of seeds can vary between compilers/systems, we need to make sure we can handle cases in which the input file has a different @@ -111,12 +111,12 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms write(*,*) "SEED: N,VAL = ",size(param%seed), param%seed(:) end if - if (self%mtiny < 0.0_DP) then - write(iomsg,*) "MTINY invalid or not set: ", self%mtiny + if (self%Gmtiny < 0.0_DP) then + write(iomsg,*) "GMTINY invalid or not set: ", self%Gmtiny iostat = -1 return else - write(*,*) "MTINY = ", self%mtiny + write(*,*) "GMTINY = ", self%Gmtiny end if if (.not.self%lclose) then @@ -167,7 +167,7 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms ! Special handling is required for writing the random number seed array as its size is not known until runtime ! For the "SEED" parameter line, the first value will be the size of the seed array and the rest will be the seed array elements write(param_name, Afmt) "PARTICLE_FILE"; write(param_value, Afmt) trim(adjustl(param%particle_file)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "MTINY"; write(param_value, Rfmt) param%mtiny; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "GMTINY"; write(param_value, Rfmt) param%Gmtiny; write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) if (param%lfragmentation) then write(param_name, Afmt) "SEED" diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 021873a70..ab8b5543e 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -25,7 +25,7 @@ module subroutine symba_setup_initialize_system(self, param) call pl%sort("mass", ascending=.false.) select type(param) class is (symba_parameters) - pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY pl%nplm = count(pl%lmtiny(:)) end select end select diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 2ebc11ebb..2ab088d02 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -394,7 +394,7 @@ module subroutine symba_util_rearray_pl(self, system, param) ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then call pl%sort("mass", ascending=.false.) - pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY pl%nplm = count(pl%lmtiny(:)) call pl%eucl_index() end if diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index b004f84b7..fd331bcc3 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -83,7 +83,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! Do the potential energy between pairs of massive bodies do k = 1, pl%nplpl associate(ik => pl%k_plpl(1, k), jk => pl%k_plpl(2, k)) - pepl(k) = -pl%mass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) + pepl(k) = -param%GU * pl%mass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) end associate end do From 9214b2ab7ccd9ea89124bba5f7bec066cb1f4dda Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 15:58:39 -0400 Subject: [PATCH 29/71] Refactored MTINY into GMTINY to be consistent in distinguishing G*mass and mass terms --- .../symba_energy_momentum/param.supercatastrophic_off_axis.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index d033c76f1..49b8b0dd7 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -17,8 +17,6 @@ CHK_RMIN 0.005 CHK_RMAX 1e6 CHK_EJECT -1.0 ! ignore this check CHK_QMIN -1.0 ! ignore this check -!CHK_QMIN_COORD HELIO ! commented out here -!CHK_QMIN_RANGE 1.0 1000.0 ! commented out here ENC_OUT enc.supercatastrophic_off_axis.dat EXTRA_FORCE no ! no extra user-defined forces BIG_DISCARD no ! output all planets if anything discarded From 8d5455c231b0387381d26d49de8a4d0324c4564f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 16:03:58 -0400 Subject: [PATCH 30/71] Undid some damage due to previous refactoring as this subroutine actually wants an mtiny value not Gmtiny --- src/fragmentation/fragmentation.f90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index c0cfd3c97..353867c0b 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -835,8 +835,7 @@ end subroutine restructure_failed_fragments end subroutine fragmentation_initialize - - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Determine the collisional regime of two colliding bodies. @@ -931,7 +930,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v Qloss = 0.0_DP U_binding = (3.0_DP * Mtot) / (5.0_DP * Rp) ! LS12 eq. 27 - if ((m1 < Gmtiny).or.(m2 < Gmtiny)) then + if ((m1 < mtiny).or.(m2 < mtiny)) then regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime Mlr = Mtot Mslr = 0.0_DP From 71d17198492e4b0381aef5e7f94b3b96ce1478b9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 16:11:55 -0400 Subject: [PATCH 31/71] Undid some damage due to previous refactoring as this subroutine actually wants an mtiny value not Gmtiny. Fixed formatting of fragmentation interfaces --- src/fragmentation/fragmentation.f90 | 24 ++++++++++---------- src/modules/swiftest_classes.f90 | 34 ++++++++++++++--------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 353867c0b..60572e99d 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -10,17 +10,17 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, use, intrinsic :: ieee_exceptions implicit none ! Arguments - class(swiftest_nbody_system), intent(inout) :: system - class(swiftest_parameters), intent(in) :: param - integer(I4B), dimension(:), intent(in) :: family - real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip - real(DP), dimension(:), intent(inout) :: mass, radius - integer(I4B), intent(inout) :: nfrag - real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag - real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag - real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag - logical, intent(out) :: lfailure ! Answers the question: Should this have been a merger instead? - real(DP), intent(inout) :: Qloss + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + integer(I4B), dimension(:), intent(in) :: family !! Index of bodies involved in the collision + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Two-body equivalent position, vector, spin momentum, and rotational inertia values for the collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Two-body equivalent mass and radii for the bodies in the collision + integer(I4B), intent(inout) :: nfrag !! Number of fragments to generate + real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag !! Distribution of fragment mass and radii + real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag !! Fragment rotational inertia vectors + real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors + real(DP), intent(inout) :: Qloss !! Energy lost during the collision + logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? ! Internals real(DP) :: mscale, rscale, vscale, tscale, Lscale, Escale ! Scale factors that reduce quantities to O(~1) in the collisional system real(DP) :: mtot @@ -856,7 +856,7 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v ! Arguments integer(I4B), intent(out) :: regime real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision ! Constants diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7dc70a37f..e8d273f1c 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -457,26 +457,26 @@ module subroutine eucl_dist_index_plpl(self) module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) implicit none - class(swiftest_nbody_system), intent(inout) :: system - class(swiftest_parameters), intent(in) :: param - integer(I4B), dimension(:), intent(in) :: family - real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip - real(DP), dimension(:), intent(inout) :: mass, radius - integer(I4B), intent(inout) :: nfrag - real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag - real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag - real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag - logical, intent(out) :: lfailure ! Answers the question: Should this have been a merger instead? - real(DP), intent(inout) :: Qloss + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + integer(I4B), dimension(:), intent(in) :: family !! Index of bodies involved in the collision + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Two-body equivalent position, vector, spin momentum, and rotational inertia values for the collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Two-body equivalent mass and radii for the bodies in the collision + integer(I4B), intent(inout) :: nfrag !! Number of fragments to generate + real(DP), dimension(:), allocatable, intent(inout) :: m_frag, rad_frag !! Distribution of fragment mass and radii + real(DP), dimension(:,:), allocatable, intent(inout) :: Ip_frag !! Fragment rotational inertia vectors + real(DP), dimension(:,:), allocatable, intent(inout) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors + real(DP), intent(inout) :: Qloss !! Energy lost during the collision + logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? end subroutine fragmentation_initialize - module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, Gmtiny, Qloss) + module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, vb2, den1, den2, regime, Mlr, Mslr, mtiny, Qloss) implicit none - integer(I4B), intent(out) :: regime - real(DP), intent(out) :: Mlr, Mslr - real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, Gmtiny - real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 - real(DP), intent(out) :: Qloss !! The residual energy after the collision + integer(I4B), intent(out) :: regime + real(DP), intent(out) :: Mlr, Mslr + real(DP), intent(in) :: Mcb, m1, m2, rad1, rad2, den1, den2, mtiny + real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 + real(DP), intent(out) :: Qloss !! Energy lost during the collision end subroutine fragmentation_regime module pure subroutine gr_kick_getaccb_ns_body(self, system, param) From 77ee9ccdb892192c12aebf99ee7c6efdcce44323 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 16:33:13 -0400 Subject: [PATCH 32/71] Changed id validation code to by type-bound to the system object, and include cb ids in the validation --- Makefile.Defines | 4 ++-- src/fragmentation/fragmentation.f90 | 8 ++++++-- src/modules/swiftest_classes.f90 | 9 +++++---- src/setup/setup.f90 | 4 +--- src/util/util_valid.f90 | 20 +++++++++++--------- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 291f2c604..9fe6c3cbb 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -70,8 +70,8 @@ FFLAGS = $(IDEBUG) $(HEAPARR) FORTRAN = ifort #AR = xiar -#FORTRAN = gfortran -#FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) +FORTRAN = gfortran +FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 60572e99d..99daff3b7 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -336,8 +336,12 @@ subroutine calculate_system_energy(linclude_fragments) call setup_construct_system(tmpsys, param) deallocate(tmpsys%cb) allocate(tmpsys%cb, source=cb) - allocate(ltmp(npl)) - ltmp(:) = .true. + allocate(ltmp, mold=pl%ldiscard) + ltmp(:) = .false. + ltmp(1:npl) = .true. + write(*,*) 'npl : ',npl + write(*,*) 'npl_new: ',npl_new + write(*,*) 'ltmp: ',ltmp call tmpsys%pl%setup(npl_new, param) call tmpsys%pl%fill(pl, ltmp) deallocate(ltmp) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index e8d273f1c..7f4fd140e 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -306,6 +306,7 @@ module swiftest_classes procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. procedure :: get_energy_and_momentum => util_get_energy_momentum_system !! Calculates the total system energy and momentum + procedure :: validate_ids => util_valid_id_system !! Validate the numerical ids passed to the system and save the maximum value end type swiftest_nbody_system type :: swiftest_encounter @@ -1292,11 +1293,11 @@ module subroutine util_spill_tp(self, discards, lspill_list, ldestructive) logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not end subroutine util_spill_tp - module subroutine util_valid(pl, tp) + module subroutine util_valid_id_system(self, param) implicit none - class(swiftest_pl), intent(in) :: pl - class(swiftest_tp), intent(in) :: tp - end subroutine util_valid + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine util_valid_id_system module subroutine util_version() implicit none diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 9346e8c12..8f96c48a1 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -127,14 +127,12 @@ module subroutine setup_initialize_system(self, param) call self%cb%initialize(param) call self%pl%initialize(param) call self%tp%initialize(param) - call util_valid(self%pl, self%tp) - self%maxid = maxval([self%pl%id(:), self%tp%id(:)]) + call self%validate_ids(param) call self%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) call self%pl%eucl_index() if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) - !if (param%lfirstenergy) then return end subroutine setup_initialize_system diff --git a/src/util/util_valid.f90 b/src/util/util_valid.f90 index c5923b38e..f05c81f35 100644 --- a/src/util/util_valid.f90 +++ b/src/util/util_valid.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine util_valid(pl, tp) + module subroutine util_valid_id_system(self, param) !! author: David A. Minton !! !! Validate massive body and test particle ids @@ -11,31 +11,33 @@ module subroutine util_valid(pl, tp) !! Adapted from David E. Kaufmann's Swifter routine: util_valid.f90 implicit none ! Arguments - class(swiftest_pl), intent(in) :: pl - class(swiftest_tp), intent(in) :: tp + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i integer(I4B), dimension(:), allocatable :: idarr - associate(npl => pl%nbody, ntp => tp%nbody) - allocate(idarr(npl+ntp)) + associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) + allocate(idarr(1+npl+ntp)) + idarr(1) = cb%id do i = 1, npl - idarr(i) = pl%id(i) + idarr(1+i) = pl%id(i) end do do i = 1, ntp - idarr(npl+i) = tp%id(i) + idarr(1+npl+i) = tp%id(i) end do call util_sort(idarr) - do i = 1, npl + ntp - 1 + do i = 1, npl + ntp if (idarr(i) == idarr(i+1)) then write(*, *) "Swiftest error:" write(*, *) " more than one body/particle has id = ", idarr(i) call util_exit(FAILURE) end if end do + self%maxid = maxval(idarr) end associate return - end subroutine util_valid + end subroutine util_valid_id_system end submodule s_util_valid From adf3f1a94e62164dbdae7f28121b3e7ef69d3f87 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 16:39:47 -0400 Subject: [PATCH 33/71] Fixed bad mask size on fill operation --- Makefile.Defines | 4 ++-- src/fragmentation/fragmentation.f90 | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 9fe6c3cbb..291f2c604 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -70,8 +70,8 @@ FFLAGS = $(IDEBUG) $(HEAPARR) FORTRAN = ifort #AR = xiar -FORTRAN = gfortran -FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) +#FORTRAN = gfortran +#FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 99daff3b7..ad28edf6c 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -336,15 +336,11 @@ subroutine calculate_system_energy(linclude_fragments) call setup_construct_system(tmpsys, param) deallocate(tmpsys%cb) allocate(tmpsys%cb, source=cb) - allocate(ltmp, mold=pl%ldiscard) + allocate(ltmp(npl_new)) ltmp(:) = .false. ltmp(1:npl) = .true. - write(*,*) 'npl : ',npl - write(*,*) 'npl_new: ',npl_new - write(*,*) 'ltmp: ',ltmp call tmpsys%pl%setup(npl_new, param) call tmpsys%pl%fill(pl, ltmp) - deallocate(ltmp) if (linclude_fragments) then ! Append the fragments if they are included ! Energy calculation requires the fragments to be in the system barcyentric frame, s @@ -359,7 +355,6 @@ subroutine calculate_system_energy(linclude_fragments) tmpsys%pl%rot(:,npl+1:npl_new) = rot_frag(:,1:nfrag) end if call tmpsys%pl%b2h(tmpsys%cb) - allocate(ltmp(npl_new)) ltmp(1:npl) = lexclude(1:npl) ltmp(npl+1:npl_new) = .false. call move_alloc(ltmp, lexclude) From a9b56b3947cfcf5502ab3f7b1b995f0a2b915937 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 16:59:44 -0400 Subject: [PATCH 34/71] Removed old cruft --- descriptionator.sh | 7 ---- param.restart.in | 0 ps_maker.py | 89 ---------------------------------------------- tp_maker.py | 59 ------------------------------ 4 files changed, 155 deletions(-) delete mode 100755 descriptionator.sh delete mode 100644 param.restart.in delete mode 100644 ps_maker.py delete mode 100644 tp_maker.py diff --git a/descriptionator.sh b/descriptionator.sh deleted file mode 100755 index 3d86c8f14..000000000 --- a/descriptionator.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -for file_out in */*.f90; do - file_in="../../swifter-omp/$file_out"; - desc=$(grep "Description" $file_in | sed "s/! Description : //") - sed -i "" "s/Compute Hill sphere radii of massive bodie/$desc/" $file_out -done - diff --git a/param.restart.in b/param.restart.in deleted file mode 100644 index e69de29bb..000000000 diff --git a/ps_maker.py b/ps_maker.py deleted file mode 100644 index 9297ab9a1..000000000 --- a/ps_maker.py +++ /dev/null @@ -1,89 +0,0 @@ -import rebound -import numpy as np - -def setupSimulation(): - sim = rebound.Simulation() - sim.units = ('AU', 'yr', 'Msun') - sim.integrator = "mercurius" - sim.dt = 0.008 - sim.testparticle_type = 1 - sim.move_to_com() - return sim - -sim = setupSimulation() -ps = sim.particles -G_auy = 4 * np.pi * np.pi #G in units of AU^3 year^-2 M_sun^-1 -M_Sun = 1 -M_Sun_to_g = 1.989e33 -M_Sun_to_kg = 1.989e30 -AU_cubed_to_cm_cubed = 3.348e39 -AU_cubed_to_km_cubed = 3.348e24 -year_to_seconds = 3.154e7 -Mtot_disk = 6.006e-6 #~3*M_earth - -OUTFILE = open('pl.in', 'w') - -sim.add( m=1.0, hash="sun") # SUN - Adds a particle of mass 1 - -N_fully = 2001 -N_semi = 0 - -d_bodies = 2.0 * AU_cubed_to_cm_cubed * (1/M_Sun_to_g) #Changes 2 g/cm^3 to 3366515.837 M_sun/AU^3 - -m_semi = Mtot_disk / (N_semi + 2*N_fully) -m_fully = 2 * m_semi - -r_semi = ((3*m_semi)/(4*np.pi*d_bodies))**(1/3) -r_fully = ((3*m_fully)/(4*np.pi*d_bodies))**(1/3) - -np.random.seed(1) - -def uniform(minimum, maximum): - return np.random.uniform()*(maximum-minimum)+minimum - -while sim.N < N_fully: - a_fully = uniform(0.5,1) - e_fully = uniform(0.0, 0.3) - inc_fully = uniform(0.0, 0.3) - O_fully = uniform(0,2*np.pi) - o_fully = uniform(0,2*np.pi) - M_fully = uniform(-np.pi, np.pi) - fully = rebound.Particle(simulation=sim,primary=sim.particles[0],m=m_fully, r=r_fully, a=a_fully, e=e_fully, inc=inc_fully, Omega=O_fully, omega=o_fully, M=M_fully) - sim.add(fully) - -while sim.N < (N_fully+N_semi): - a_semi = uniform(0.5,1) - e_semi = uniform(0.0, 0.3) - inc_semi = uniform(0.0, 0.3) - O_semi = uniform(0,2*np.pi) - o_semi = uniform(0,2*np.pi) - M_semi = uniform(-np.pi, np.pi) - semi = rebound.Particle(simulation=sim,primary=sim.particles[0],m=m_semi, r=r_semi, a=a_semi, e=e_semi, inc=inc_semi, Omega=O_semi, omega=o_semi, M=M_semi) - sim.add(semi) - -x = [ps[i].x for i in range(1, sim.N)] -y = [ps[i].y for i in range(1, sim.N)] -z = [ps[i].z for i in range(1, sim.N)] -vx = [ps[i].vx for i in range(1, sim.N)] -vy = [ps[i].vy for i in range(1, sim.N)] -vz = [ps[i].vz for i in range(1, sim.N)] -m = [ps[i].m for i in range(1, sim.N)] -r = [ps[i].r for i in range(1, sim.N)] -Rhill = [ps[i].a*((ps[i].m/(3*M_Sun))**(0.333333)) for i in range(1, sim.N)] - -with OUTFILE as output: - output.write("%s ! Solar System in unit system AU, M_sun, and years\n" %(sim.N)) - output.write("1 %s\n"%"{:10.8e}".format(M_Sun*G_auy)) - output.write(".0 .0 .0 ! x y z\n") - output.write(".0 .0 .0 !vx vy vz\n") - for i in range (0, (sim.N-1)): - output.write("%s %s %s ! ID / G*Mass / Rhill\n"%((i+2),"{:10.8e}".format(m[i]*G_auy),"{:10.8e}".format(Rhill[i]))) - output.write("%s ! Radius\n"%("{:10.8e}".format(r[i]))) - output.write("%s %s %s ! x y z\n"%("{:10.8e}".format(x[i]),"{:10.8e}".format(y[i]),"{:10.8e}".format(z[i]))) - output.write("%s %s %s ! vx vy vz\n"%("{:10.8e}".format(vx[i]),"{:10.8e}".format(vy[i]),"{:10.8e}".format(vz[i]))) - - - - - - diff --git a/tp_maker.py b/tp_maker.py deleted file mode 100644 index 900283375..000000000 --- a/tp_maker.py +++ /dev/null @@ -1,59 +0,0 @@ -import rebound -import numpy as np - -sim = rebound.Simulation() -sim.units = ('AU', 'yr', 'Msun') -sim.add(m=1.) -sim.move_to_com() -ps = sim.particles - -#!!!!!!! CHANGE THESE THINGS !!!!!!!!!!!!! - -sim.convert_particle_units('AU', 'd', 'Msun') - -N_tp = 3000 -N_ps = 2001 - -#TP_OUTFILE_SWIFT = open('Feb25_tp_2_swift.txt', 'w') -TP_OUTFILE_SWIFTER = open('tp.in', 'w') - -np.random.seed(2) - -#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -def uniform(minimum, maximum): - return np.random.uniform()*(maximum-minimum)+minimum - -while sim.N < (1+N_tp): - a_tp = uniform(1.7,2.0) - e_tp = uniform(0.0, 0.3) - inc_tp = uniform(0.0, 0.3) - O_tp = uniform(0,2*np.pi) - o_tp = uniform(0,2*np.pi) - M_tp = uniform(-np.pi, np.pi) - tp = rebound.Particle(simulation=sim,primary=sim.particles[0],m=0.0, r=0.0, a=a_tp, e=e_tp, inc=inc_tp, Omega=O_tp, omega=o_tp, M=M_tp) - sim.add(tp) - -x_tp = [ps[i].x for i in range(0, sim.N)] -y_tp = [ps[i].y for i in range(0, sim.N)] -z_tp = [ps[i].z for i in range(0, sim.N)] -vx_tp = [ps[i].vx for i in range(0, sim.N)] -vy_tp = [ps[i].vy for i in range(0, sim.N)] -vz_tp = [ps[i].vz for i in range(0, sim.N)] - -#with TP_OUTFILE_SWIFT as output: -# output.write("%s \n" %(N_tp)) #number of particles in the system -# for i in range (1, sim.N): -# output.write("%s %s %s \n" % ("{:10.8e}".format(x_tp[i]), "{:10.8e}".format(y_tp[i]), "{:10.8e}".format(z_tp[i]))) #x y z -# output.write("%s %s %s \n" % ("{:10.8e}".format(vx_tp[i]), "{:10.8e}".format(vy_tp[i]), "{:10.8e}".format(vz_tp[i]))) #vx vy vz -# output.write("0 0 0 0 0 0 0 0 0 0 0 0 0\n") #flags -# output.write("0.0d0 0.0d0 0.0d0 0.0d0 0.0d0\n") #flags -# output.write("0.0d0 0.0d0 0.0d0 0.0d0 0.0d0\n") #flags -# output.write("0.0d0 0.0d0 0.0d0\n") #flags - -with TP_OUTFILE_SWIFTER as output: - output.write("%s \n" %(N_tp)) #number of particles in the system - for i in range (1, sim.N): - output.write("%s \n" % ((i+N_ps) )) #ID - output.write("%s %s %s \n" % ("{:10.8e}".format(x_tp[i]), "{:10.8e}".format(y_tp[i]), "{:10.8e}".format(z_tp[i]))) #x y z - output.write("%s %s %s \n" % ("{:10.8e}".format(vx_tp[i]), "{:10.8e}".format(vy_tp[i]), "{:10.8e}".format(vz_tp[i]))) #vx vy vz \ No newline at end of file From 6706e16e7662cf8802d28af1a589f70247106809 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 17:05:01 -0400 Subject: [PATCH 35/71] Added missing G term to potential energy calculations --- src/fragmentation/fragmentation.f90 | 40 +++++++++++++-------------- src/util/util_get_energy_momentum.f90 | 4 +-- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index ad28edf6c..e1b69dd44 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -525,21 +525,21 @@ subroutine set_fragment_tan_vel(lerr) call calculate_system_energy(linclude_fragments=.true.) ke_frag_budget = -dEtot - Qloss - !write(*,*) '***************************************************' - !write(*,*) 'Original dis : ',norm2(x(:,2) - x(:,1)) - !write(*,*) 'r_max : ',r_max - !write(*,*) 'f_spin : ',f_spin - !write(*,*) '***************************************************' - !write(*,*) 'Energy balance so far: ' - !write(*,*) 'ke_frag_budget : ',ke_frag_budget - !write(*,*) 'ke_orbit_before: ',ke_orbit_before - !write(*,*) 'ke_orbit_after : ',ke_orbit_after - !write(*,*) 'ke_spin_before : ',ke_spin_before - !write(*,*) 'ke_spin_after : ',ke_spin_after - !write(*,*) 'pe_before : ',pe_before - !write(*,*) 'pe_after : ',pe_after - !write(*,*) 'Qloss : ',Qloss - !write(*,*) '***************************************************' + write(*,*) '***************************************************' + write(*,*) 'Original dis : ',norm2(x(:,2) - x(:,1)) + write(*,*) 'r_max : ',r_max + write(*,*) 'f_spin : ',f_spin + write(*,*) '***************************************************' + write(*,*) 'Energy balance so far: ' + write(*,*) 'ke_frag_budget : ',ke_frag_budget + write(*,*) 'ke_orbit_before: ',ke_orbit_before + write(*,*) 'ke_orbit_after : ',ke_orbit_after + write(*,*) 'ke_spin_before : ',ke_spin_before + write(*,*) 'ke_spin_after : ',ke_spin_after + write(*,*) 'pe_before : ',pe_before + write(*,*) 'pe_after : ',pe_after + write(*,*) 'Qloss : ',Qloss + write(*,*) '***************************************************' if (ke_frag_budget < 0.0_DP) then write(*,*) 'Negative ke_frag_budget: ',ke_frag_budget r_max_start = r_max_start / 2 @@ -604,11 +604,11 @@ subroutine set_fragment_tan_vel(lerr) ! If we are over the energy budget, flag this as a failure so we can try again lerr = (ke_radial < 0.0_DP) - !write(*,*) 'Tangential' - !write(*,*) 'ke_frag_budget: ',ke_frag_budget - !write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - !write(*,*) 'ke_frag_spin : ',ke_frag_spin - !write(*,*) 'ke_radial : ',ke_radial + write(*,*) 'Tangential' + write(*,*) 'ke_frag_budget: ',ke_frag_budget + write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + write(*,*) 'ke_frag_spin : ',ke_frag_spin + write(*,*) 'ke_radial : ',ke_radial return diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index fd331bcc3..4ec9c6c36 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -76,7 +76,7 @@ module subroutine util_get_energy_momentum_system(self, param) !$omp simd do i = 1, npl associate(px => pl%xh(1,i), py => pl%xh(2,i), pz => pl%xh(3,i)) - pecb(i) = -cb%mass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) + pecb(i) = -param%GU * cb%mass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) end associate end do @@ -100,7 +100,7 @@ module subroutine util_get_energy_momentum_system(self, param) irh(i) = 1.0_DP / norm2(pl%xh(:,i)) end do call obl_pot(npl, cb%mass, pl%mass, cb%j2rp2, cb%j4rp4, pl%xh, irh, oblpot) - system%pe = system%pe + oblpot + system%pe = system%pe + param%GU * oblpot end if system%Lorbit(1) = sum(Lplorbitx(1:npl), lstatus(1:npl)) From a72bdc548c22ca4f3cb287f5090e1751226e6fdc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 6 Aug 2021 18:30:00 -0400 Subject: [PATCH 36/71] Moved G out from sqrt --- src/fragmentation/fragmentation.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index e1b69dd44..270f48a7a 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -167,7 +167,7 @@ subroutine set_scale_factors() ! Set scale factors Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) rscale = sum(radius(:)) - mscale = sqrt(Escale * rscale / param%GU) + mscale = sqrt(Escale * rscale) / param%GU vscale = sqrt(Escale / mscale) tscale = rscale / vscale Lscale = mscale * rscale * vscale From e880213553aa62d9aeeeeba9e0fba77247beaca7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 7 Aug 2021 08:53:08 -0400 Subject: [PATCH 37/71] Improved scaling and unit consistency --- src/fragmentation/fragmentation.f90 | 18 ++++++++++++++++-- src/util/util_get_energy_momentum.f90 | 8 ++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 270f48a7a..688ac1a6e 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -167,7 +167,7 @@ subroutine set_scale_factors() ! Set scale factors Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) rscale = sum(radius(:)) - mscale = sqrt(Escale * rscale) / param%GU + mscale = sqrt(Escale * rscale / param%GU) vscale = sqrt(Escale / mscale) tscale = rscale / vscale Lscale = mscale * rscale * vscale @@ -341,11 +341,25 @@ subroutine calculate_system_energy(linclude_fragments) ltmp(1:npl) = .true. call tmpsys%pl%setup(npl_new, param) call tmpsys%pl%fill(pl, ltmp) + tmpsys%pl%mass(1:npl) = tmpsys%pl%mass(1:npl) / mscale + tmpsys%pl%Gmass(1:npl) = tmpsys%pl%Gmass(1:npl) * tscale**2 / rscale**3 + tmpsys%cb%mass = tmpsys%cb%mass / mscale + tmpsys%cb%Gmass = tmpsys%cb%Gmass * tscale**2 / rscale**3 + tmpsys%cb%radius = tmpsys%cb%radius / rscale + tmpsys%pl%radius(1:npl) = tmpsys%pl%radius(1:npl) / rscale + tmpsys%pl%xh(:,1:npl) = tmpsys%pl%xh(:,1:npl) / rscale + tmpsys%pl%vh(:,1:npl) = tmpsys%pl%vh(:,1:npl) / vscale + tmpsys%pl%xb(:,1:npl) = tmpsys%pl%xb(:,1:npl) / rscale + tmpsys%pl%vb(:,1:npl) = tmpsys%pl%vb(:,1:npl) / vscale + tmpsys%pl%rot(:,1:npl) = tmpsys%pl%rot(:,1:npl) * tscale + tmpsys%cb%xb(:) = tmpsys%cb%xb(:) / rscale + tmpsys%cb%vb(:) = tmpsys%cb%vb(:) / vscale + if (linclude_fragments) then ! Append the fragments if they are included ! Energy calculation requires the fragments to be in the system barcyentric frame, s tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) - tmpsys%pl%Gmass(npl+1:npl_new) = param%GU * m_frag(1:nfrag) + tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * param%GU * rscale**3 * mscale / tscale**2 tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) tmpsys%pl%xb(:,npl+1:npl_new) = xb_frag(:,1:nfrag) tmpsys%pl%vb(:,npl+1:npl_new) = vb_frag(:,1:nfrag) diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 4ec9c6c36..05c3e2436 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -76,14 +76,14 @@ module subroutine util_get_energy_momentum_system(self, param) !$omp simd do i = 1, npl associate(px => pl%xh(1,i), py => pl%xh(2,i), pz => pl%xh(3,i)) - pecb(i) = -param%GU * cb%mass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) + pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) end associate end do ! Do the potential energy between pairs of massive bodies do k = 1, pl%nplpl associate(ik => pl%k_plpl(1, k), jk => pl%k_plpl(2, k)) - pepl(k) = -param%GU * pl%mass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) + pepl(k) = -pl%Gmass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) end associate end do @@ -99,8 +99,8 @@ module subroutine util_get_energy_momentum_system(self, param) do i = 1, npl irh(i) = 1.0_DP / norm2(pl%xh(:,i)) end do - call obl_pot(npl, cb%mass, pl%mass, cb%j2rp2, cb%j4rp4, pl%xh, irh, oblpot) - system%pe = system%pe + param%GU * oblpot + call obl_pot(npl, cb%Gmass, pl%mass, cb%j2rp2, cb%j4rp4, pl%xh, irh, oblpot) + system%pe = system%pe + oblpot end if system%Lorbit(1) = sum(Lplorbitx(1:npl), lstatus(1:npl)) From dcf602a736a72793cb195606609117577f907e2c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 7 Aug 2021 09:13:33 -0400 Subject: [PATCH 38/71] Deallocate temporary variables during rearray --- src/symba/symba_util.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 2ab088d02..028b0678c 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -388,6 +388,10 @@ module subroutine symba_util_rearray_pl(self, system, param) call tmp%setup(0,param) deallocate(tmp) + ! Deallocate any temporary variables + if (allocated(pl%xbeg)) deallocate(pl%xbeg) + if (allocated(pl%xend)) deallocate(pl%xend) + ! Add in any new bodies call pl%append(pl_adds) From 02b692d1e3279a27f849ea7643bb91be6e1c0049 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 7 Aug 2021 12:53:38 -0400 Subject: [PATCH 39/71] Added new rescale method for systems --- Makefile.Defines | 2 +- src/fragmentation/fragmentation.f90 | 18 ++----- src/modules/swiftest_classes.f90 | 73 ++++++++++++++++------------- src/util/util_rescale.f90 | 51 ++++++++++++++++++++ src/util/util_resize.f90 | 1 + 5 files changed, 98 insertions(+), 47 deletions(-) create mode 100644 src/util/util_rescale.f90 diff --git a/Makefile.Defines b/Makefile.Defines index 291f2c604..07126f842 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/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 688ac1a6e..d879eec53 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -314,6 +314,7 @@ subroutine calculate_system_energy(linclude_fragments) logical, dimension(:), allocatable :: ltmp logical :: lk_plpl class(swiftest_nbody_system), allocatable :: tmpsys + class(swiftest_parameters), allocatable :: tmpparam ! Because we're making a copy of symba_pl with the excludes/fragments appended, we need to deallocate the ! big k_plpl array and recreate it when we're done, otherwise we run the risk of blowing up the memory by @@ -334,27 +335,16 @@ subroutine calculate_system_energy(linclude_fragments) npl_new = npl end if call setup_construct_system(tmpsys, param) + call tmpsys%tp%setup(0, param) deallocate(tmpsys%cb) allocate(tmpsys%cb, source=cb) + allocate(tmpparam, source=param) allocate(ltmp(npl_new)) ltmp(:) = .false. ltmp(1:npl) = .true. call tmpsys%pl%setup(npl_new, param) call tmpsys%pl%fill(pl, ltmp) - tmpsys%pl%mass(1:npl) = tmpsys%pl%mass(1:npl) / mscale - tmpsys%pl%Gmass(1:npl) = tmpsys%pl%Gmass(1:npl) * tscale**2 / rscale**3 - tmpsys%cb%mass = tmpsys%cb%mass / mscale - tmpsys%cb%Gmass = tmpsys%cb%Gmass * tscale**2 / rscale**3 - tmpsys%cb%radius = tmpsys%cb%radius / rscale - tmpsys%pl%radius(1:npl) = tmpsys%pl%radius(1:npl) / rscale - tmpsys%pl%xh(:,1:npl) = tmpsys%pl%xh(:,1:npl) / rscale - tmpsys%pl%vh(:,1:npl) = tmpsys%pl%vh(:,1:npl) / vscale - tmpsys%pl%xb(:,1:npl) = tmpsys%pl%xb(:,1:npl) / rscale - tmpsys%pl%vb(:,1:npl) = tmpsys%pl%vb(:,1:npl) / vscale - tmpsys%pl%rot(:,1:npl) = tmpsys%pl%rot(:,1:npl) * tscale - tmpsys%cb%xb(:) = tmpsys%cb%xb(:) / rscale - tmpsys%cb%vb(:) = tmpsys%cb%vb(:) / vscale - + call tmpsys%rescale(tmpparam, mscale, rscale, tscale) if (linclude_fragments) then ! Append the fragments if they are included ! Energy calculation requires the fragments to be in the system barcyentric frame, s diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7f4fd140e..4d0e98704 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -306,6 +306,7 @@ module swiftest_classes procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. procedure :: get_energy_and_momentum => util_get_energy_momentum_system !! Calculates the total system energy and momentum + procedure :: rescale => util_rescale_system !! Rescales the system into a new set of units procedure :: validate_ids => util_valid_id_system !! Validate the numerical ids passed to the system and save the maximum value end type swiftest_nbody_system @@ -984,6 +985,13 @@ end subroutine util_fill_arr_logical end interface interface + module subroutine util_rescale_system(self, param, mscale, dscale, tscale) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters. Returns with new values of the scale vactors and GU + real(DP), intent(in) :: mscale, dscale, tscale !! Scale factors for mass, distance, and time units, respectively. + end subroutine util_rescale_system + module function util_minimize_bfgs(f, N, x0, eps, lerr) result(x1) use lambda_function implicit none @@ -1003,38 +1011,6 @@ module subroutine util_peri_tp(self, system, param) end subroutine util_peri_tp end interface - interface util_solve_linear_system - module function util_solve_linear_system_d(A,b,n,lerr) result(x) - implicit none - integer(I4B), intent(in) :: n - real(DP), dimension(:,:), intent(in) :: A - real(DP), dimension(:), intent(in) :: b - logical, intent(out) :: lerr - real(DP), dimension(n) :: x - end function util_solve_linear_system_d - - module function util_solve_linear_system_q(A,b,n,lerr) result(x) - implicit none - integer(I4B), intent(in) :: n - real(QP), dimension(:,:), intent(in) :: A - real(QP), dimension(:), intent(in) :: b - logical, intent(out) :: lerr - real(QP), dimension(n) :: x - end function util_solve_linear_system_q - end interface - - interface - module function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) - use lambda_function - implicit none - class(lambda_obj), intent(inout) :: f !! lambda function object that has been initialized to be a function of derivatives. The object will return with components lastarg and lasteval set - real(DP), dimension(:), intent(in) :: y0in !! Initial value at t=0 - real(DP), intent(in) :: t1 !! Final time - real(DP), intent(in) :: dt0 !! Initial step size guess - real(DP), intent(in) :: tol !! Tolerance on solution - real(DP), dimension(:), allocatable :: y1 !! Final result - end function util_solve_rkf45 - end interface interface util_resize module subroutine util_resize_arr_char_string(arr, nnew) @@ -1142,6 +1118,39 @@ module subroutine util_set_rhill_approximate(self,cb) end subroutine util_set_rhill_approximate end interface + interface util_solve_linear_system + module function util_solve_linear_system_d(A,b,n,lerr) result(x) + implicit none + integer(I4B), intent(in) :: n + real(DP), dimension(:,:), intent(in) :: A + real(DP), dimension(:), intent(in) :: b + logical, intent(out) :: lerr + real(DP), dimension(n) :: x + end function util_solve_linear_system_d + + module function util_solve_linear_system_q(A,b,n,lerr) result(x) + implicit none + integer(I4B), intent(in) :: n + real(QP), dimension(:,:), intent(in) :: A + real(QP), dimension(:), intent(in) :: b + logical, intent(out) :: lerr + real(QP), dimension(n) :: x + end function util_solve_linear_system_q + end interface + + interface + module function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) + use lambda_function + implicit none + class(lambda_obj), intent(inout) :: f !! lambda function object that has been initialized to be a function of derivatives. The object will return with components lastarg and lasteval set + real(DP), dimension(:), intent(in) :: y0in !! Initial value at t=0 + real(DP), intent(in) :: t1 !! Final time + real(DP), intent(in) :: dt0 !! Initial step size guess + real(DP), intent(in) :: tol !! Tolerance on solution + real(DP), dimension(:), allocatable :: y1 !! Final result + end function util_solve_rkf45 + end interface + interface util_sort module subroutine util_sort_i4b(arr) implicit none diff --git a/src/util/util_rescale.f90 b/src/util/util_rescale.f90 new file mode 100644 index 000000000..061ecf9a5 --- /dev/null +++ b/src/util/util_rescale.f90 @@ -0,0 +1,51 @@ +submodule (swiftest_classes) s_util_rescale + use swiftest +contains + module subroutine util_rescale_system(self, param, mscale, dscale, tscale) + !! author: David A. Minton + !! + !! Rescales an nbody system to a new set of units. Inputs are the multipliers on the mass (mscale), distance (dscale), and time units (tscale). + !! Rescales all united quantities in the system, as well as the mass conversion factors, gravitational constant, and Einstein's constant in the parameter object. + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters. Returns with new values of the scale vactors and GU + real(DP), intent(in) :: mscale, dscale, tscale !! Scale factors for mass, distance, and time units, respectively. + ! Internals + real(DP) :: vscale + + param%MU2KG = param%MU2KG * mscale + param%DU2M = param%DU2M * dscale + param%TU2S = param%TU2S * tscale + + ! Calculate the G for the system units + param%GU = GC / (param%DU2M**3 / (param%MU2KG * param%TU2S**2)) + + ! Calculate the inverse speed of light in the system units + param%inv_c2 = einsteinC * param%TU2S / param%DU2M + param%inv_c2 = (param%inv_c2)**(-2) + + vscale = dscale / tscale + + associate(cb => self%cb, pl => self%pl, npl => self%pl%nbody, tp => self%tp, ntp => self%tp%nbody) + + cb%mass = cb%mass / mscale + cb%Gmass = param%GU * cb%mass + cb%radius = cb%radius / dscale + cb%xb(:) = cb%xb(:) / dscale + cb%vb(:) = cb%vb(:) / vscale + pl%mass(1:npl) = pl%mass(1:npl) / mscale + pl%Gmass(1:npl) = param%GU * pl%mass(1:npl) + pl%radius(1:npl) = pl%radius(1:npl) / dscale + pl%xh(:,1:npl) = pl%xh(:,1:npl) / dscale + pl%vh(:,1:npl) = pl%vh(:,1:npl) / vscale + pl%xb(:,1:npl) = pl%xb(:,1:npl) / dscale + pl%vb(:,1:npl) = pl%vb(:,1:npl) / vscale + pl%rot(:,1:npl) = pl%rot(:,1:npl) * tscale + + end associate + + + return + end subroutine util_rescale_system + +end submodule s_util_rescale \ No newline at end of file diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index c6d5aa34f..80d87209c 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_resize use swiftest contains + module subroutine util_resize_arr_char_string(arr, nnew) !! author: David A. Minton !! From fb38873a6bb188c876f9519c314082a8bacd2489 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 7 Aug 2021 13:50:07 -0400 Subject: [PATCH 40/71] Refactored rscale to dscale for consistency --- src/fragmentation/fragmentation.f90 | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index d879eec53..5d92a1a3e 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -22,7 +22,7 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, real(DP), intent(inout) :: Qloss !! Energy lost during the collision logical, intent(out) :: lfailure !! Answers the question: Should this have been a merger instead? ! Internals - real(DP) :: mscale, rscale, vscale, tscale, Lscale, Escale ! Scale factors that reduce quantities to O(~1) in the collisional system + real(DP) :: mscale, dscale, vscale, tscale, Lscale, Escale ! Scale factors that reduce quantities to O(~1) in the collisional system real(DP) :: mtot real(DP), dimension(NDIM) :: xcom, vcom integer(I4B) :: ii @@ -46,6 +46,7 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, integer(I4B), parameter :: MAXTRY = 3000 integer(I4B), parameter :: TANTRY = 3 logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes + class(swiftest_parameters), allocatable :: tmpparam if (nfrag < NFRAG_MIN) then write(*,*) "symba_frag_pos needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." @@ -59,7 +60,7 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, f_spin = 0.05_DP mscale = 1.0_DP - rscale = 1.0_DP + dscale = 1.0_DP vscale = 1.0_DP tscale = 1.0_DP Lscale = 1.0_DP @@ -166,19 +167,19 @@ subroutine set_scale_factors() ! Set scale factors Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) - rscale = sum(radius(:)) - mscale = sqrt(Escale * rscale / param%GU) + dscale = sum(radius(:)) + mscale = sqrt(Escale * dscale / param%GU) vscale = sqrt(Escale / mscale) - tscale = rscale / vscale - Lscale = mscale * rscale * vscale + tscale = dscale / vscale + Lscale = mscale * dscale * vscale - xcom(:) = xcom(:) / rscale + xcom(:) = xcom(:) / dscale vcom(:) = vcom(:) / vscale mtot = mtot / mscale mass = mass / mscale - radius = radius / rscale - x = x / rscale + radius = radius / dscale + x = x / dscale v = v / vscale L_spin = L_spin / Lscale do i = 1, 2 @@ -186,7 +187,7 @@ subroutine set_scale_factors() end do m_frag = m_frag / mscale - rad_frag = rad_frag / rscale + rad_frag = rad_frag / dscale Qloss = Qloss / Escale return @@ -201,13 +202,13 @@ subroutine restore_scale_factors() call ieee_set_halting_mode(IEEE_ALL,.false.) ! Restore scale factors - xcom(:) = xcom(:) * rscale + xcom(:) = xcom(:) * dscale vcom(:) = vcom(:) * vscale mtot = mtot * mscale mass = mass * mscale - radius = radius * rscale - x = x * rscale + radius = radius * dscale + x = x * dscale v = v * vscale L_spin = L_spin * Lscale do i = 1, 2 @@ -215,9 +216,9 @@ subroutine restore_scale_factors() end do m_frag = m_frag * mscale - rad_frag = rad_frag * rscale + rad_frag = rad_frag * dscale rot_frag = rot_frag / tscale - x_frag = x_frag * rscale + x_frag = x_frag * dscale v_frag = v_frag * vscale Qloss = Qloss * Escale @@ -240,7 +241,7 @@ subroutine restore_scale_factors() Lmag_after = Lmag_after * Lscale mscale = 1.0_DP - rscale = 1.0_DP + dscale = 1.0_DP vscale = 1.0_DP tscale = 1.0_DP Lscale = 1.0_DP @@ -314,7 +315,6 @@ subroutine calculate_system_energy(linclude_fragments) logical, dimension(:), allocatable :: ltmp logical :: lk_plpl class(swiftest_nbody_system), allocatable :: tmpsys - class(swiftest_parameters), allocatable :: tmpparam ! Because we're making a copy of symba_pl with the excludes/fragments appended, we need to deallocate the ! big k_plpl array and recreate it when we're done, otherwise we run the risk of blowing up the memory by @@ -344,12 +344,12 @@ subroutine calculate_system_energy(linclude_fragments) ltmp(1:npl) = .true. call tmpsys%pl%setup(npl_new, param) call tmpsys%pl%fill(pl, ltmp) - call tmpsys%rescale(tmpparam, mscale, rscale, tscale) + call tmpsys%rescale(tmpparam, mscale, dscale, tscale) if (linclude_fragments) then ! Append the fragments if they are included ! Energy calculation requires the fragments to be in the system barcyentric frame, s tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) - tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * param%GU * rscale**3 * mscale / tscale**2 + tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * param%GU * dscale**3 * mscale / tscale**2 tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) tmpsys%pl%xb(:,npl+1:npl_new) = xb_frag(:,1:nfrag) tmpsys%pl%vb(:,npl+1:npl_new) = vb_frag(:,1:nfrag) From 6b04d411504aa5423ce99eaad4a767ffdafb56b5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 8 Aug 2021 16:53:22 -0400 Subject: [PATCH 41/71] Fixed bad indexing on potential energy calculation. Set mass scaling to be total mass in fragmentation --- src/fragmentation/fragmentation.f90 | 50 ++++++++++++++------------- src/util/util_get_energy_momentum.f90 | 6 ++-- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 5d92a1a3e..0b7f2721a 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -168,7 +168,7 @@ subroutine set_scale_factors() ! Set scale factors Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) dscale = sum(radius(:)) - mscale = sqrt(Escale * dscale / param%GU) + mscale = mtot vscale = sqrt(Escale / mscale) tscale = dscale / vscale Lscale = mscale * dscale * vscale @@ -338,6 +338,7 @@ subroutine calculate_system_energy(linclude_fragments) call tmpsys%tp%setup(0, param) deallocate(tmpsys%cb) allocate(tmpsys%cb, source=cb) + if (allocated(tmpparam)) deallocate(tmpparam) allocate(tmpparam, source=param) allocate(ltmp(npl_new)) ltmp(:) = .false. @@ -347,13 +348,14 @@ subroutine calculate_system_energy(linclude_fragments) call tmpsys%rescale(tmpparam, mscale, dscale, tscale) if (linclude_fragments) then ! Append the fragments if they are included - ! Energy calculation requires the fragments to be in the system barcyentric frame, s + ! Energy calculation requires the fragments to be in the system barcyentric frame + tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) - tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * param%GU * dscale**3 * mscale / tscale**2 + tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * tmpparam%GU tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) tmpsys%pl%xb(:,npl+1:npl_new) = xb_frag(:,1:nfrag) tmpsys%pl%vb(:,npl+1:npl_new) = vb_frag(:,1:nfrag) - tmpsys%pl%status(npl+1:npl_new) = COLLISION + tmpsys%pl%status(npl+1:npl_new) = ACTIVE if (param%lrotation) then tmpsys%pl%Ip(:,npl+1:npl_new) = Ip_frag(:,1:nfrag) tmpsys%pl%rot(:,npl+1:npl_new) = rot_frag(:,1:nfrag) @@ -529,21 +531,21 @@ subroutine set_fragment_tan_vel(lerr) call calculate_system_energy(linclude_fragments=.true.) ke_frag_budget = -dEtot - Qloss - write(*,*) '***************************************************' - write(*,*) 'Original dis : ',norm2(x(:,2) - x(:,1)) - write(*,*) 'r_max : ',r_max - write(*,*) 'f_spin : ',f_spin - write(*,*) '***************************************************' - write(*,*) 'Energy balance so far: ' - write(*,*) 'ke_frag_budget : ',ke_frag_budget - write(*,*) 'ke_orbit_before: ',ke_orbit_before - write(*,*) 'ke_orbit_after : ',ke_orbit_after - write(*,*) 'ke_spin_before : ',ke_spin_before - write(*,*) 'ke_spin_after : ',ke_spin_after - write(*,*) 'pe_before : ',pe_before - write(*,*) 'pe_after : ',pe_after - write(*,*) 'Qloss : ',Qloss - write(*,*) '***************************************************' + !write(*,*) '***************************************************' + !write(*,*) 'Original dis : ',norm2(x(:,2) - x(:,1)) + !write(*,*) 'r_max : ',r_max + !write(*,*) 'f_spin : ',f_spin + !write(*,*) '***************************************************' + !write(*,*) 'Energy balance so far: ' + !write(*,*) 'ke_frag_budget : ',ke_frag_budget + !write(*,*) 'ke_orbit_before: ',ke_orbit_before + !write(*,*) 'ke_orbit_after : ',ke_orbit_after + !write(*,*) 'ke_spin_before : ',ke_spin_before + !write(*,*) 'ke_spin_after : ',ke_spin_after + !write(*,*) 'pe_before : ',pe_before + !write(*,*) 'pe_after : ',pe_after + !write(*,*) 'Qloss : ',Qloss + !write(*,*) '***************************************************' if (ke_frag_budget < 0.0_DP) then write(*,*) 'Negative ke_frag_budget: ',ke_frag_budget r_max_start = r_max_start / 2 @@ -608,11 +610,11 @@ subroutine set_fragment_tan_vel(lerr) ! If we are over the energy budget, flag this as a failure so we can try again lerr = (ke_radial < 0.0_DP) - write(*,*) 'Tangential' - write(*,*) 'ke_frag_budget: ',ke_frag_budget - write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - write(*,*) 'ke_frag_spin : ',ke_frag_spin - write(*,*) 'ke_radial : ',ke_radial + !write(*,*) 'Tangential' + !write(*,*) 'ke_frag_budget: ',ke_frag_budget + !write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + !write(*,*) 'ke_frag_spin : ',ke_frag_spin + !write(*,*) 'ke_radial : ',ke_radial return diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 05c3e2436..5cf8d20c7 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -75,7 +75,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! Do the central body potential energy component first !$omp simd do i = 1, npl - associate(px => pl%xh(1,i), py => pl%xh(2,i), pz => pl%xh(3,i)) + associate(px => pl%xb(1,i), py => pl%xb(2,i), pz => pl%xb(3,i)) pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) end associate end do @@ -83,7 +83,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! Do the potential energy between pairs of massive bodies do k = 1, pl%nplpl associate(ik => pl%k_plpl(1, k), jk => pl%k_plpl(2, k)) - pepl(k) = -pl%Gmass(ik) * pl%mass(jk) / norm2(pl%xh(:, jk) - pl%xh(:, ik)) + pepl(k) = -pl%Gmass(ik) * pl%mass(jk) / norm2(pl%xb(:, jk) - pl%xb(:, ik)) lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) end associate end do @@ -91,7 +91,7 @@ module subroutine util_get_energy_momentum_system(self, param) system%ke_orbit = 0.5_DP * sum(kepl(1:npl), lstatus(:)) if (param%lrotation) system%ke_spin = 0.5_DP * sum(kespinpl(1:npl), lstatus(:)) - system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(2:npl), lstatus(2:npl)) + system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) ! Potential energy from the oblateness term if (param%loblatecb) then From 14d37ee8fca33b563ceae5559e104f98b171be7a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 8 Aug 2021 17:15:50 -0400 Subject: [PATCH 42/71] Added missing central body terms to energy and momentum calculations --- src/util/util_get_energy_momentum.f90 | 40 +++++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 5cf8d20c7..90f0d2242 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -16,6 +16,7 @@ module subroutine util_get_energy_momentum_system(self, param) integer(I4B) :: i, j integer(I8B) :: k real(DP) :: rmag, v2, rot2, oblpot, hx, hy, hz, hsx, hsy, hsz + real(DP) :: kecb, kespincb, Lcborbitx, Lcborbity, Lcborbitz, Lcbspinx, Lcbspiny, Lcbspinz real(DP), dimension(self%pl%nbody) :: irh, kepl, kespinpl, pecb real(DP), dimension(self%pl%nbody) :: Lplorbitx, Lplorbity, Lplorbitz real(DP), dimension(self%pl%nbody) :: Lplspinx, Lplspiny, Lplspinz @@ -38,6 +39,13 @@ module subroutine util_get_energy_momentum_system(self, param) Lplspinz(:) = 0.0_DP lstatus(1:npl) = pl%status(1:npl) /= INACTIVE call pl%h2b(cb) + kecb = cb%mass * dot_product(cb%vb(:), cb%vb(:)) + hx = cb%xb(2) * cb%vb(3) - cb%xb(3) * cb%vb(2) + hy = cb%xb(3) * cb%vb(1) - cb%xb(1) * cb%vb(3) + hz = cb%xb(1) * cb%vb(2) - cb%xb(2) * cb%vb(1) + Lcborbitx = cb%mass * hx + Lcborbity = cb%mass * hy + Lcborbitz = cb%mass * hz !!$omp simd private(v2, rot2, hx, hy, hz) do i = 1, npl v2 = dot_product(pl%vb(:,i), pl%vb(:,i)) @@ -55,6 +63,17 @@ module subroutine util_get_energy_momentum_system(self, param) end do if (param%lrotation) then + kespincb = cb%mass * cb%Ip(3) * cb%radius**2 * dot_product(cb%rot(:), cb%rot(:)) + ! For simplicity, we always assume that the rotation pole is the 3rd principal axis + hsx = cb%Ip(3) * cb%radius**2 * cb%rot(1) + hsy = cb%Ip(3) * cb%radius**2 * cb%rot(2) + hsz = cb%Ip(3) * cb%radius**2 * cb%rot(3) + + ! Angular momentum from spin + Lcbspinx = cb%mass * hsx + Lcbspiny = cb%mass * hsy + Lcbspinz = cb%mass * hsz + do i = 1, npl rot2 = dot_product(pl%rot(:,i), pl%rot(:,i)) ! For simplicity, we always assume that the rotation pole is the 3rd principal axis @@ -69,6 +88,7 @@ module subroutine util_get_energy_momentum_system(self, param) kespinpl(i) = pl%mass(i) * pl%Ip(3, i) * pl%radius(i)**2 * rot2 end do else + kespincb = 0.0_DP kespinpl(:) = 0.0_DP end if @@ -88,8 +108,8 @@ module subroutine util_get_energy_momentum_system(self, param) end associate end do - system%ke_orbit = 0.5_DP * sum(kepl(1:npl), lstatus(:)) - if (param%lrotation) system%ke_spin = 0.5_DP * sum(kespinpl(1:npl), lstatus(:)) + system%ke_orbit = 0.5_DP * (kecb + sum(kepl(1:npl), lstatus(:))) + if (param%lrotation) system%ke_spin = 0.5_DP * (kespincb + sum(kespinpl(1:npl), lstatus(:))) system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) @@ -103,13 +123,15 @@ module subroutine util_get_energy_momentum_system(self, param) system%pe = system%pe + oblpot end if - system%Lorbit(1) = sum(Lplorbitx(1:npl), lstatus(1:npl)) - system%Lorbit(2) = sum(Lplorbity(1:npl), lstatus(1:npl)) - system%Lorbit(3) = sum(Lplorbitz(1:npl), lstatus(1:npl)) - - system%Lspin(1) = sum(Lplspinx(1:npl), lstatus(1:npl)) - system%Lspin(2) = sum(Lplspiny(1:npl), lstatus(1:npl)) - system%Lspin(3) = sum(Lplspinz(1:npl), lstatus(1:npl)) + system%Lorbit(1) = Lcborbitx + sum(Lplorbitx(1:npl), lstatus(1:npl)) + system%Lorbit(2) = Lcborbity + sum(Lplorbity(1:npl), lstatus(1:npl)) + system%Lorbit(3) = Lcborbitz + sum(Lplorbitz(1:npl), lstatus(1:npl)) + + if (param%lrotation) then + system%Lspin(1) = Lcbspinx + sum(Lplspinx(1:npl), lstatus(1:npl)) + system%Lspin(2) = Lcbspiny + sum(Lplspiny(1:npl), lstatus(1:npl)) + system%Lspin(3) = Lcbspinz + sum(Lplspinz(1:npl), lstatus(1:npl)) + end if end associate return From c6d14b8934a247b5bb5582a77d809d3d3982cfc9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 06:16:04 -0400 Subject: [PATCH 43/71] Fixed conversion to 8-byte integer when it is really needed --- src/main/swiftest_driver.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 55eb1bc89..3d4c35aab 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -17,11 +17,11 @@ 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) :: 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 + character(*),parameter :: statusfmt = '("Time = ", ES12.5, "; fraction done = ", F6.3, "; ' // & 'Number of active pl, tp = ", I5, ", ", I5)' @@ -52,7 +52,7 @@ program swiftest_driver iloop = 0 iout = istep_out idump = istep_dump - nloops = ceiling(tstop / dt) + nloops = ceiling(tstop / dt, kind=I8B) if (istep_out > 0) call nbody_system%write_frame(iu, param) !> Define the maximum number of threads nthreads = 1 ! In the *serial* case From 3182b2154b9a3311e2b60d395052fed635158dbb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 06:18:59 -0400 Subject: [PATCH 44/71] Added the discard output file to the default parameter list --- python/swiftest/swiftest/simulation_class.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index 30719a7db..05b6896b1 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -37,6 +37,7 @@ def __init__(self, codename="Swiftest", param_file=""): 'TU2S': constants.JD2S, 'DU2M': constants.AU2M, 'EXTRA_FORCE': "NO", + 'DISCARD_OUT': "discard.out", 'BIG_DISCARD': "NO", 'CHK_CLOSE': "YES", 'RHILL_PRESENT': "YES", From db48ee6dfc7544b4ec1f6b7aa477f0d5aa2e5c23 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 12:43:38 -0400 Subject: [PATCH 45/71] Added random seeds to input files for the disruption examples --- examples/symba_energy_momentum/param.disruption_headon.in | 1 + examples/symba_energy_momentum/param.disruption_off_axis.in | 1 + examples/symba_energy_momentum/param.escape.in | 1 + examples/symba_energy_momentum/param.sun.in | 1 + examples/symba_energy_momentum/param.supercatastrophic_headon.in | 1 + .../symba_energy_momentum/param.supercatastrophic_off_axis.in | 1 + 6 files changed, 6 insertions(+) diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in index 6dbe1f788..0f3e88752 100644 --- a/examples/symba_energy_momentum/param.disruption_headon.in +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -28,3 +28,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 -223172604 -194186007 -2119403444 -114322815 -526658307 1075354356 2043693954 575062362 diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index 39303284e..ef32a5c2f 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -29,3 +29,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 933097 -220886113 -118730874 233084005 32111237 -823335422 524551114 -61162322 diff --git a/examples/symba_energy_momentum/param.escape.in b/examples/symba_energy_momentum/param.escape.in index 99d572b75..5db2c3fe4 100644 --- a/examples/symba_energy_momentum/param.escape.in +++ b/examples/symba_energy_momentum/param.escape.in @@ -30,3 +30,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 -1109809 -120983313 -335849874 123308005 -625127 322235652 -3405804 -113111354 diff --git a/examples/symba_energy_momentum/param.sun.in b/examples/symba_energy_momentum/param.sun.in index 5e26e4cd3..a21b5817b 100644 --- a/examples/symba_energy_momentum/param.sun.in +++ b/examples/symba_energy_momentum/param.sun.in @@ -30,3 +30,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 1230834 2346113 123409874 -123121105 -767545 -534058022 343309814 -12535638 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in index 3ba223ad9..47c239556 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -28,3 +28,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 97 120384098 122231114 -1133345 112137 -239375422 120938114 -66674667 diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index 49b8b0dd7..64759828c 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -28,3 +28,4 @@ TU2S 3.1556925e7 DU2M 1.49598e11 ENERGY yes ROTATION yes +SEED 8 92823097 -121212113 -736464874 352424135 34555257 -113243092 5640304 -394697 From f26efa6cc3fd3117428b868bc853c6ac7961dc1a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 16:44:57 -0400 Subject: [PATCH 46/71] Fixed energy bug in fragmentation. The energy calculation utility was switching to barycentric coordinates, which changed the central body velocity before the fragment velocities had been set, screwing up the energy balance calculation --- src/fragmentation/fragmentation.f90 | 1388 +++++++++++++------------ src/io/io.f90 | 1 + src/util/util_coord.f90 | 48 +- src/util/util_get_energy_momentum.f90 | 6 +- 4 files changed, 744 insertions(+), 699 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 0b7f2721a..1977d42f3 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -25,7 +25,7 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, real(DP) :: mscale, dscale, vscale, tscale, Lscale, Escale ! Scale factors that reduce quantities to O(~1) in the collisional system real(DP) :: mtot real(DP), dimension(NDIM) :: xcom, vcom - integer(I4B) :: ii + integer(I4B) :: ii, npl_new logical, dimension(:), allocatable :: lexclude real(DP), dimension(NDIM, 2) :: rot, L_orb real(DP), dimension(:,:), allocatable :: x_frag, v_frag, v_r_unit, v_t_unit, v_h_unit @@ -42,11 +42,13 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, integer(I4B), parameter :: NFRAG_MIN = 7 !! The minimum allowable number of fragments (set to 6 because that's how many unknowns are needed in the tangential velocity calculation) real(DP) :: r_max_start, r_max_start_old, r_max, f_spin real(DP), parameter :: Ltol = 10 * epsilon(1.0_DP) - real(DP), parameter :: Etol = 1e-10_DP + real(DP), parameter :: Etol = 1e-9_DP integer(I4B), parameter :: MAXTRY = 3000 integer(I4B), parameter :: TANTRY = 3 logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes - class(swiftest_parameters), allocatable :: tmpparam + class(swiftest_nbody_system), allocatable :: tmpsys + class(swiftest_parameters), allocatable :: tmpparam + if (nfrag < NFRAG_MIN) then write(*,*) "symba_frag_pos needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." @@ -59,29 +61,24 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, call ieee_set_halting_mode(IEEE_ALL,fpe_quiet_modes) f_spin = 0.05_DP - mscale = 1.0_DP - dscale = 1.0_DP - vscale = 1.0_DP - tscale = 1.0_DP - Lscale = 1.0_DP - Escale = 1.0_DP - - associate(npl => system%pl%nbody, status => system%pl%status) - allocate(lexclude(npl)) - where (status(1:npl) == INACTIVE) ! Safety check in case one of the included bodies has been previously deactivated - lexclude(1:npl) = .true. - elsewhere - lexclude(1:npl) = .false. - end where - end associate allocate(x_frag, source=xb_frag) allocate(v_frag, source=vb_frag) + associate(pl => system%pl, npl => system%pl%nbody) + npl_new = npl + nfrag + allocate(lexclude(npl_new)) + lexclude(1:npl) = pl%status(1:npl) == INACTIVE + lexclude(npl+1:npl_new) = .true. + end associate + call set_scale_factors() call define_coordinate_system() + call construct_temporary_system() + + ! Calculate the initial energy of the system without the collisional family call calculate_system_energy(linclude_fragments=.false.) - + r_max_start = norm2(x(:,2) - x(:,1)) try = 1 lfailure = .false. @@ -92,7 +89,15 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, ke_avg_deficit = 0.0_DP subtry = 1 do + ! Initialize the fragments with 0 velocity and spin so we can divide up the balance between the tangential, radial, and spin components while conserving momentum + xb_frag(:,:) = 0.0_DP + vb_frag(:,:) = 0.0_DP + rot_frag(:,:) = 0.0_DP + v_t_mag(:) = 0.0_DP + v_r_mag(:) = 0.0_DP call set_fragment_position_vectors() + call calculate_system_energy(linclude_fragments=.true.) + ke_frag_budget = -dEtot - Qloss call set_fragment_tan_vel(lfailure) ke_avg_deficit = ke_avg_deficit - ke_radial subtry = subtry + 1 @@ -103,13 +108,16 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, if (lfailure) write(*,*) 'Failed to find tangential velocities' if (.not.lfailure) then + call calculate_system_energy(linclude_fragments=.true.) + ke_radial = -dEtot - Qloss call set_fragment_radial_velocities(lfailure) if (lfailure) write(*,*) 'Failed to find radial velocities' if (.not.lfailure) then call calculate_system_energy(linclude_fragments=.true.) - !write(*,*) 'Qloss : ',Qloss - !write(*,*) '-dEtot: ',-dEtot - !write(*,*) 'delta : ',abs((dEtot + Qloss)) + + write(*,*) 'Qloss : ',Qloss + write(*,*) '-dEtot: ',-dEtot + write(*,*) 'delta : ',abs((dEtot + Qloss)) if ((abs(dEtot + Qloss) > Etol) .or. (dEtot > 0.0_DP)) then write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + Qloss) / Etol lfailure = .true. @@ -150,693 +158,737 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, contains - ! Because of the complexity of this procedure, we have chosen to break it up into a series of nested subroutines. - - subroutine set_scale_factors() - !! author: David A. Minton - !! - !! Scales dimenional quantities to ~O(1) with respect to the collisional system. This scaling makes it easier for the non-linear minimization - !! to converge on a solution - implicit none - integer(I4B) :: i - - ! Find the center of mass of the collisional system - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Set scale factors - Escale = 0.5_DP * (mass(1) * dot_product(v(:,1), v(:,1)) + mass(2) * dot_product(v(:,2), v(:,2))) - dscale = sum(radius(:)) - mscale = mtot - vscale = sqrt(Escale / mscale) - tscale = dscale / vscale - Lscale = mscale * dscale * vscale - - xcom(:) = xcom(:) / dscale - vcom(:) = vcom(:) / vscale - - mtot = mtot / mscale - mass = mass / mscale - radius = radius / dscale - x = x / dscale - v = v / vscale - L_spin = L_spin / Lscale - do i = 1, 2 - rot(:,i) = L_spin(:,i) / (mass(i) * radius(i)**2 * Ip(3, i)) - end do + ! Because of the complexity of this procedure, we have chosen to break it up into a series of nested subroutines. + subroutine set_scale_factors() + !! author: David A. Minton + !! + !! Scales dimenional quantities to ~O(1) with respect to the collisional system. This scaling makes it easier for the non-linear minimization + !! to converge on a solution + implicit none + integer(I4B) :: i + + ! Find the center of mass of the collisional system + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + + ! Set scale factors + dscale = sum(radius(:)) + mscale = mtot + vscale = (mass(1) * norm2(v(:,1) - vcom(:)) + mass(2) * norm2(v(:,2) - vcom(:))) / mtot + tscale = dscale / vscale + Lscale = mscale * dscale * vscale + Escale = mscale * vscale**2 + + xcom(:) = xcom(:) / dscale + vcom(:) = vcom(:) / vscale + + mtot = mtot / mscale + mass = mass / mscale + radius = radius / dscale + x = x / dscale + v = v / vscale + L_spin = L_spin / Lscale + do i = 1, 2 + rot(:,i) = L_spin(:,i) / (mass(i) * radius(i)**2 * Ip(3, i)) + end do - m_frag = m_frag / mscale - rad_frag = rad_frag / dscale - Qloss = Qloss / Escale + m_frag = m_frag / mscale + rad_frag = rad_frag / dscale + Qloss = Qloss / Escale - return - end subroutine set_scale_factors - - subroutine restore_scale_factors() - !! author: David A. Minton - !! - !! Restores dimenional quantities back to the system units - implicit none - integer(I4B) :: i - - call ieee_set_halting_mode(IEEE_ALL,.false.) - ! Restore scale factors - xcom(:) = xcom(:) * dscale - vcom(:) = vcom(:) * vscale - - mtot = mtot * mscale - mass = mass * mscale - radius = radius * dscale - x = x * dscale - v = v * vscale - L_spin = L_spin * Lscale - do i = 1, 2 - rot(:,i) = L_spin(:,i) * (mass(i) * radius(i)**2 * Ip(3, i)) - end do + return + end subroutine set_scale_factors - m_frag = m_frag * mscale - rad_frag = rad_frag * dscale - rot_frag = rot_frag / tscale - x_frag = x_frag * dscale - v_frag = v_frag * vscale - Qloss = Qloss * Escale - do i = 1, nfrag - xb_frag(:, i) = x_frag(:, i) + xcom(:) - vb_frag(:, i) = v_frag(:, i) + vcom(:) - end do + subroutine restore_scale_factors() + !! author: David A. Minton + !! + !! Restores dimenional quantities back to the system units + implicit none + integer(I4B) :: i + + call ieee_set_halting_mode(IEEE_ALL,.false.) + ! Restore scale factors + xcom(:) = xcom(:) * dscale + vcom(:) = vcom(:) * vscale + + mtot = mtot * mscale + mass = mass * mscale + radius = radius * dscale + x = x * dscale + v = v * vscale + L_spin = L_spin * Lscale + do i = 1, 2 + rot(:,i) = L_spin(:,i) * (mass(i) * radius(i)**2 * Ip(3, i)) + end do - Etot_before = Etot_before * Escale - pe_before = pe_before * Escale - ke_spin_before = ke_spin_before * Escale - ke_orbit_before = ke_orbit_before * Escale - Ltot_before = Ltot_before * Lscale - Lmag_before = Lmag_before * Lscale - Etot_after = Etot_after * Escale - pe_after = pe_after * Escale - ke_spin_after = ke_spin_after * Escale - ke_orbit_after = ke_orbit_after * Escale - Ltot_after = Ltot_after * Lscale - Lmag_after = Lmag_after * Lscale - - mscale = 1.0_DP - dscale = 1.0_DP - vscale = 1.0_DP - tscale = 1.0_DP - Lscale = 1.0_DP - Escale = 1.0_DP + m_frag = m_frag * mscale + rad_frag = rad_frag * dscale + rot_frag = rot_frag / tscale + x_frag = x_frag * dscale + v_frag = v_frag * vscale + Qloss = Qloss * Escale - return - end subroutine restore_scale_factors - - subroutine define_coordinate_system() - !! author: David A. Minton - !! - !! Defines the collisional coordinate system, including the unit vectors of both the system and individual fragments. - implicit none - integer(I4B) :: i - real(DP), dimension(NDIM) :: x_cross_v, xc, vc, delta_r, delta_v - real(DP) :: r_col_norm, v_col_norm - - allocate(rmag(nfrag)) - allocate(rotmag(nfrag)) - allocate(v_r_mag(nfrag)) - allocate(v_t_mag(nfrag)) - allocate(v_r_unit(NDIM,nfrag)) - allocate(v_t_unit(NDIM,nfrag)) - allocate(v_h_unit(NDIM,nfrag)) - - rmag(:) = 0.0_DP - rotmag(:) = 0.0_DP - v_r_mag(:) = 0.0_DP - v_t_mag(:) = 0.0_DP - v_r_unit(:,:) = 0.0_DP - v_t_unit(:,:) = 0.0_DP - v_h_unit(:,:) = 0.0_DP - - L_orb(:, :) = 0.0_DP - ! Compute orbital angular momentum of pre-impact system - do i = 1, 2 - xc(:) = x(:, i) - xcom(:) - vc(:) = v(:, i) - vcom(:) - x_cross_v(:) = xc(:) .cross. vc(:) - L_orb(:, i) = mass(i) * x_cross_v(:) - end do + do i = 1, nfrag + xb_frag(:, i) = x_frag(:, i) + xcom(:) + vb_frag(:, i) = v_frag(:, i) + vcom(:) + end do - ! Compute orbital angular momentum of pre-impact system. This will be the normal vector to the collision fragment plane - L_frag_tot(:) = L_spin(:, 1) + L_spin(:, 2) + L_orb(:, 1) + L_orb(:, 2) + Etot_before = Etot_before * Escale + pe_before = pe_before * Escale + ke_spin_before = ke_spin_before * Escale + ke_orbit_before = ke_orbit_before * Escale + Ltot_before = Ltot_before * Lscale + Lmag_before = Lmag_before * Lscale + Etot_after = Etot_after * Escale + pe_after = pe_after * Escale + ke_spin_after = ke_spin_after * Escale + ke_orbit_after = ke_orbit_after * Escale + Ltot_after = Ltot_after * Lscale + Lmag_after = Lmag_after * Lscale + + mscale = 1.0_DP + dscale = 1.0_DP + vscale = 1.0_DP + tscale = 1.0_DP + Lscale = 1.0_DP + Escale = 1.0_DP - delta_v(:) = v(:, 2) - v(:, 1) - v_col_norm = norm2(delta_v(:)) - delta_r(:) = x(:, 2) - x(:, 1) - r_col_norm = norm2(delta_r(:)) + return + end subroutine restore_scale_factors - ! We will initialize fragments on a plane defined by the pre-impact system, with the z-axis aligned with the angular momentum vector - ! and the y-axis aligned with the pre-impact distance vector. - y_col_unit(:) = delta_r(:) / r_col_norm - z_col_unit(:) = L_frag_tot(:) / norm2(L_frag_tot) - ! The cross product of the y- by z-axis will give us the x-axis - x_col_unit(:) = y_col_unit(:) .cross. z_col_unit(:) + + subroutine define_coordinate_system() + !! author: David A. Minton + !! + !! Defines the collisional coordinate system, including the unit vectors of both the system and individual fragments. + implicit none + integer(I4B) :: i + real(DP), dimension(NDIM) :: x_cross_v, xc, vc, delta_r, delta_v + real(DP) :: r_col_norm, v_col_norm + + allocate(rmag(nfrag)) + allocate(rotmag(nfrag)) + allocate(v_r_mag(nfrag)) + allocate(v_t_mag(nfrag)) + allocate(v_r_unit(NDIM,nfrag)) + allocate(v_t_unit(NDIM,nfrag)) + allocate(v_h_unit(NDIM,nfrag)) + + rmag(:) = 0.0_DP + rotmag(:) = 0.0_DP + v_r_mag(:) = 0.0_DP + v_t_mag(:) = 0.0_DP + v_r_unit(:,:) = 0.0_DP + v_t_unit(:,:) = 0.0_DP + v_h_unit(:,:) = 0.0_DP + + L_orb(:, :) = 0.0_DP + ! Compute orbital angular momentum of pre-impact system + do i = 1, 2 + xc(:) = x(:, i) - xcom(:) + vc(:) = v(:, i) - vcom(:) + x_cross_v(:) = xc(:) .cross. vc(:) + L_orb(:, i) = mass(i) * x_cross_v(:) + end do + + ! Compute orbital angular momentum of pre-impact system. This will be the normal vector to the collision fragment plane + L_frag_tot(:) = L_spin(:, 1) + L_spin(:, 2) + L_orb(:, 1) + L_orb(:, 2) + + delta_v(:) = v(:, 2) - v(:, 1) + v_col_norm = norm2(delta_v(:)) + delta_r(:) = x(:, 2) - x(:, 1) + r_col_norm = norm2(delta_r(:)) + + ! We will initialize fragments on a plane defined by the pre-impact system, with the z-axis aligned with the angular momentum vector + ! and the y-axis aligned with the pre-impact distance vector. + y_col_unit(:) = delta_r(:) / r_col_norm + z_col_unit(:) = L_frag_tot(:) / norm2(L_frag_tot) + ! The cross product of the y- by z-axis will give us the x-axis + x_col_unit(:) = y_col_unit(:) .cross. z_col_unit(:) + + return + end subroutine define_coordinate_system + + + subroutine construct_temporary_system() + !! Author: David A. Minton + !! + !! Constructs a temporary internal system consisting of active bodies and additional fragments. This internal temporary system is used to calculate system energy with and without fragments + !! and optionally including fragments. + implicit none + ! Internals + logical, dimension(:), allocatable :: lexclude_tmp + + associate(pl => system%pl, npl => system%pl%nbody, cb => system%cb) + if (size(lexclude) /= npl + nfrag) then + allocate(lexclude_tmp(npl_new)) + lexclude_tmp(1:npl) = lexclude(1:npl) + call move_alloc(lexclude_tmp, lexclude) + end if + where (pl%status(1:npl) == INACTIVE) ! Safety check in case one of the included bodies has been previously deactivated + lexclude(1:npl) = .true. + elsewhere + lexclude(1:npl) = .false. + end where + lexclude(npl+1:npl_new) = .true. + if (allocated(tmpparam)) deallocate(tmpparam) + allocate(tmpparam, source=param) + call setup_construct_system(tmpsys, param) + call tmpsys%tp%setup(0, param) + deallocate(tmpsys%cb) + allocate(tmpsys%cb, source=cb) + call tmpsys%pl%setup(npl + nfrag, tmpparam) + call tmpsys%pl%fill(pl, .not.lexclude) + call tmpsys%rescale(tmpparam, mscale, dscale, tscale) + + end associate return - end subroutine define_coordinate_system - - subroutine calculate_system_energy(linclude_fragments) - !! Author: David A. Minton - !! - !! Calculates total system energy, including all bodies in the pl list that do not have a corresponding value of the lexclude array that is true - !! and optionally including fragments. - implicit none - ! Arguments - logical, intent(in) :: linclude_fragments - ! Internals - integer(I4B) :: i, npl_new, nplm - logical, dimension(:), allocatable :: ltmp - logical :: lk_plpl - class(swiftest_nbody_system), allocatable :: tmpsys - - ! Because we're making a copy of symba_pl with the excludes/fragments appended, we need to deallocate the - ! big k_plpl array and recreate it when we're done, otherwise we run the risk of blowing up the memory by - ! allocating two of these ginormous arrays simulteouously. This is not particularly efficient, but as this - ! subroutine should be called relatively infrequently, it shouldn't matter too much. - !if (allocated(pl%k_plpl)) deallocate(pl%k_plpl) - - ! Build the internal planet list out of the non-excluded bodies and optionally with fragments appended. This - ! will get passed to the energy calculation subroutine so that energy is computed exactly the same way is it - ! is in the main program. - associate(pl => system%pl, npl => system%pl%nbody, cb => system%cb) - lk_plpl = allocated(pl%k_plpl) - if (lk_plpl) deallocate(pl%k_plpl) - if (linclude_fragments) then ! Temporarily expand the planet list to feed it into symba_energy - lexclude(family(:)) = .true. - npl_new = npl + nfrag - else - npl_new = npl - end if - call setup_construct_system(tmpsys, param) - call tmpsys%tp%setup(0, param) - deallocate(tmpsys%cb) - allocate(tmpsys%cb, source=cb) - if (allocated(tmpparam)) deallocate(tmpparam) - allocate(tmpparam, source=param) - allocate(ltmp(npl_new)) - ltmp(:) = .false. - ltmp(1:npl) = .true. - call tmpsys%pl%setup(npl_new, param) - call tmpsys%pl%fill(pl, ltmp) - call tmpsys%rescale(tmpparam, mscale, dscale, tscale) - - if (linclude_fragments) then ! Append the fragments if they are included - ! Energy calculation requires the fragments to be in the system barcyentric frame + end subroutine construct_temporary_system + + + subroutine add_fragments_to_tmpsys() + !! Author: David A. Minton + !! + !! Adds fragments to the temporary system pl object + implicit none + ! Internals + integer(I4B) :: i + + associate(pl => system%pl, npl => system%pl%nbody) tmpsys%pl%mass(npl+1:npl_new) = m_frag(1:nfrag) tmpsys%pl%Gmass(npl+1:npl_new) = m_frag(1:nfrag) * tmpparam%GU tmpsys%pl%radius(npl+1:npl_new) = rad_frag(1:nfrag) - tmpsys%pl%xb(:,npl+1:npl_new) = xb_frag(:,1:nfrag) - tmpsys%pl%vb(:,npl+1:npl_new) = vb_frag(:,1:nfrag) - tmpsys%pl%status(npl+1:npl_new) = ACTIVE - if (param%lrotation) then + do concurrent (i = 1:nfrag) + tmpsys%pl%xb(:,npl+i) = xb_frag(:,i) + tmpsys%pl%vb(:,npl+i) = vb_frag(:,i) + tmpsys%pl%xh(:,npl+i) = xb_frag(:,i) - tmpsys%cb%xb(:) + tmpsys%pl%vh(:,npl+i) = vb_frag(:,i) - tmpsys%cb%vb(:) + end do + if (tmpparam%lrotation) then tmpsys%pl%Ip(:,npl+1:npl_new) = Ip_frag(:,1:nfrag) tmpsys%pl%rot(:,npl+1:npl_new) = rot_frag(:,1:nfrag) end if - call tmpsys%pl%b2h(tmpsys%cb) - ltmp(1:npl) = lexclude(1:npl) - ltmp(npl+1:npl_new) = .false. - call move_alloc(ltmp, lexclude) - end if + ! Disable the collisional family for subsequent energy calculations and coordinate shifts + lexclude(family(:)) = .true. + lexclude(npl+1:npl_new) = .false. + where(lexclude(:)) + tmpsys%pl%status(:) = INACTIVE + elsewhere + tmpsys%pl%status(:) = ACTIVE + end where + + end associate + + return + end subroutine add_fragments_to_tmpsys + + + subroutine calculate_system_energy(linclude_fragments) + !! Author: David A. Minton + !! + !! Calculates total system energy, including all bodies in the pl list that do not have a corresponding value of the lexclude array that is true + !! and optionally including fragments. + implicit none + ! Arguments + logical, intent(in) :: linclude_fragments + ! Internals + integer(I4B) :: i, nplm + logical, dimension(:), allocatable :: lexclude_tmp + logical :: lk_plpl + + ! Because we're making a copy of symba_pl with the excludes/fragments appended, we need to deallocate the + ! big k_plpl array and recreate it when we're done, otherwise we run the risk of blowing up the memory by + ! allocating two of these ginormous arrays simulteouously. This is not particularly efficient, but as this + ! subroutine should be called relatively infrequently, it shouldn't matter too much. + + ! Build the internal planet list out of the non-excluded bodies and optionally with fragments appended. This + ! will get passed to the energy calculation subroutine so that energy is computed exactly the same way is it + ! is in the main program. This will temporarily expand the planet list in a temporary system object called tmpsys to feed it into symba_energy + associate(pl => system%pl, npl => system%pl%nbody, cb => system%cb) + + where (lexclude(1:npl_new)) + tmpsys%pl%status(1:npl_new) = INACTIVE + elsewhere + tmpsys%pl%status(1:npl_new) = ACTIVE + end where - where (lexclude(1:npl_new)) - tmpsys%pl%status(1:npl_new) = INACTIVE - end where - - select type(plwksp => tmpsys%pl) - class is (symba_pl) - select type(param) - class is (symba_parameters) - plwksp%nplm = count(plwksp%Gmass > param%Gmtiny / mscale) + select type(plwksp => tmpsys%pl) + class is (symba_pl) + select type(param) + class is (symba_parameters) + plwksp%nplm = count(plwksp%Gmass > param%Gmtiny / mscale) + end select end select - end select - call tmpsys%pl%eucl_index() - call tmpsys%get_energy_and_momentum(param) - - ! Restore the big array - deallocate(tmpsys%pl%k_plpl) - select type(pl) - class is (symba_pl) - select type(param) - class is (symba_parameters) - nplm = count(pl%Gmass > param%Gmtiny) + + lk_plpl = allocated(pl%k_plpl) + if (lk_plpl) deallocate(pl%k_plpl) + + call tmpsys%pl%eucl_index() + + call tmpsys%get_energy_and_momentum(param) + + ! Restore the big array + deallocate(tmpsys%pl%k_plpl) + select type(pl) + class is (symba_pl) + select type(param) + class is (symba_parameters) + pl%nplm = count(pl%Gmass > param%Gmtiny) + end select end select - end select - if (lk_plpl) call pl%eucl_index() - - ! Calculate the current fragment energy and momentum balances - if (linclude_fragments) then - Ltot_after(:) = tmpsys%Lorbit(:) + tmpsys%Lspin(:) - Lmag_after = norm2(Ltot_after(:)) - ke_orbit_after = tmpsys%ke_orbit - ke_spin_after = tmpsys%ke_spin - pe_after = tmpsys%pe - Etot_after = ke_orbit_after + ke_spin_after + pe_after - dEtot = Etot_after - Etot_before - dLmag = norm2(Ltot_after(:) - Ltot_before(:)) - else - Ltot_before(:) = tmpsys%Lorbit(:) + tmpsys%Lspin(:) - Lmag_before = norm2(Ltot_before(:)) - ke_orbit_before = tmpsys%ke_orbit - ke_spin_before = tmpsys%ke_spin - pe_before = tmpsys%pe - Etot_before = ke_orbit_before + ke_spin_before + pe_before - end if - end associate - return - end subroutine calculate_system_energy - - subroutine shift_vector_to_origin(m_frag, vec_frag) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Adjusts the position or velocity of the fragments as needed to align them with the origin - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: m_frag !! Fragment masses - real(DP), dimension(:,:), intent(inout) :: vec_frag !! Fragment positions or velocities in the center of mass frame - - ! Internals - real(DP), dimension(NDIM) :: mvec_frag, COM_offset - integer(I4B) :: i - - mvec_frag(:) = 0.0_DP - - do i = 1, nfrag - mvec_frag = mvec_frag(:) + vec_frag(:,i) * m_frag(i) - end do - COM_offset(:) = -mvec_frag(:) / mtot - do i = 1, nfrag - vec_frag(:, i) = vec_frag(:, i) + COM_offset(:) - end do - return - end subroutine shift_vector_to_origin - - subroutine set_fragment_position_vectors() - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Initializes the orbits of the fragments around the center of mass. The fragments are initially placed on a plane defined by the - !! pre-impact angular momentum. They are distributed on an ellipse surrounding the center of mass. - !! The initial positions do not conserve energy or momentum, so these need to be adjusted later. - - implicit none - real(DP) :: dis, rad - real(DP), dimension(NDIM) :: L_sigma - logical, dimension(:), allocatable :: loverlap - integer(I4B) :: i, j - - allocate(loverlap(nfrag)) - - ! Place the fragments into a region that is big enough that we should usually not have overlapping bodies - ! An overlapping bodies will collide in the next time step, so it's not a major problem if they do (it just slows the run down) - r_max = r_max_start - rad = sum(radius(:)) - - ! We will treat the first two fragments of the list as special cases. They get initialized the maximum distances apart along the original impactor distance vector. - ! This is done because in a regular disruption, the first body is the largest, the second the second largest, and the rest are smaller equal-mass fragments. - - call random_number(x_frag(:,3:nfrag)) - loverlap(:) = .true. - do while (any(loverlap(3:nfrag))) - x_frag(:, 1) = x(:, 1) - xcom(:) - x_frag(:, 2) = x(:, 2) - xcom(:) - r_max = r_max + 0.1_DP * rad - do i = 3, nfrag - if (loverlap(i)) then - call random_number(x_frag(:,i)) - x_frag(:, i) = 2 * (x_frag(:, i) - 0.5_DP) * r_max + if (lk_plpl) call pl%eucl_index() + + ! Calculate the current fragment energy and momentum balances + if (linclude_fragments) then + Ltot_after(:) = tmpsys%Lorbit(:) + tmpsys%Lspin(:) + Lmag_after = norm2(Ltot_after(:)) + ke_orbit_after = tmpsys%ke_orbit + ke_spin_after = tmpsys%ke_spin + pe_after = tmpsys%pe + Etot_after = ke_orbit_after + ke_spin_after + pe_after + dEtot = Etot_after - Etot_before + dLmag = norm2(Ltot_after(:) - Ltot_before(:)) + else + Ltot_before(:) = tmpsys%Lorbit(:) + tmpsys%Lspin(:) + Lmag_before = norm2(Ltot_before(:)) + ke_orbit_before = tmpsys%ke_orbit + ke_spin_before = tmpsys%ke_spin + pe_before = tmpsys%pe + Etot_before = ke_orbit_before + ke_spin_before + pe_before end if + end associate + + return + end subroutine calculate_system_energy + + + subroutine shift_vector_to_origin(m_frag, vec_frag) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Adjusts the position or velocity of the fragments as needed to align them with the origin + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: m_frag !! Fragment masses + real(DP), dimension(:,:), intent(inout) :: vec_frag !! Fragment positions or velocities in the center of mass frame + + ! Internals + real(DP), dimension(NDIM) :: mvec_frag, COM_offset + integer(I4B) :: i + + mvec_frag(:) = 0.0_DP + + do i = 1, nfrag + mvec_frag = mvec_frag(:) + vec_frag(:,i) * m_frag(i) + end do + COM_offset(:) = -mvec_frag(:) / mtot + do i = 1, nfrag + vec_frag(:, i) = vec_frag(:, i) + COM_offset(:) end do - loverlap(:) = .false. - do j = 1, nfrag - do i = j + 1, nfrag - dis = norm2(x_frag(:,j) - x_frag(:,i)) - loverlap(i) = loverlap(i) .or. (dis <= (rad_frag(i) + rad_frag(j))) + + return + end subroutine shift_vector_to_origin + + + subroutine set_fragment_position_vectors() + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Initializes the orbits of the fragments around the center of mass. The fragments are initially placed on a plane defined by the + !! pre-impact angular momentum. They are distributed on an ellipse surrounding the center of mass. + !! The initial positions do not conserve energy or momentum, so these need to be adjusted later. + + implicit none + real(DP) :: dis, rad + real(DP), dimension(NDIM) :: L_sigma + logical, dimension(:), allocatable :: loverlap + integer(I4B) :: i, j + + allocate(loverlap(nfrag)) + + ! Place the fragments into a region that is big enough that we should usually not have overlapping bodies + ! An overlapping bodies will collide in the next time step, so it's not a major problem if they do (it just slows the run down) + r_max = r_max_start + rad = sum(radius(:)) + + ! We will treat the first two fragments of the list as special cases. They get initialized the maximum distances apart along the original impactor distance vector. + ! This is done because in a regular disruption, the first body is the largest, the second the second largest, and the rest are smaller equal-mass fragments. + + call random_number(x_frag(:,3:nfrag)) + loverlap(:) = .true. + do while (any(loverlap(3:nfrag))) + x_frag(:, 1) = x(:, 1) - xcom(:) + x_frag(:, 2) = x(:, 2) - xcom(:) + r_max = r_max + 0.1_DP * rad + do i = 3, nfrag + if (loverlap(i)) then + call random_number(x_frag(:,i)) + x_frag(:, i) = 2 * (x_frag(:, i) - 0.5_DP) * r_max + end if + end do + loverlap(:) = .false. + do j = 1, nfrag + do i = j + 1, nfrag + dis = norm2(x_frag(:,j) - x_frag(:,i)) + loverlap(i) = loverlap(i) .or. (dis <= (rad_frag(i) + rad_frag(j))) + end do end do end do - end do - call shift_vector_to_origin(m_frag, x_frag) - - do i = 1, nfrag - rmag(i) = norm2(x_frag(:, i)) - v_r_unit(:, i) = x_frag(:, i) / rmag(i) - call random_number(L_sigma(:)) ! Randomize the tangential velocity direction. This helps to ensure that the tangential velocity doesn't completely line up with the angular momentum vector, - ! otherwise we can get an ill-conditioned system - v_h_unit(:, i) = z_col_unit(:) + 2e-1_DP * (L_sigma(:) - 0.5_DP) - v_h_unit(:, i) = v_h_unit(:, i) / norm2(v_h_unit(:, i)) - v_t_unit(:, i) = v_h_unit(:, i) .cross. v_r_unit(:, i) - xb_frag(:,i) = x_frag(:,i) + xcom(:) - end do + call shift_vector_to_origin(m_frag, x_frag) + + do i = 1, nfrag + rmag(i) = norm2(x_frag(:, i)) + v_r_unit(:, i) = x_frag(:, i) / rmag(i) + call random_number(L_sigma(:)) ! Randomize the tangential velocity direction. This helps to ensure that the tangential velocity doesn't completely line up with the angular momentum vector, + ! otherwise we can get an ill-conditioned system + v_h_unit(:, i) = z_col_unit(:) + 2e-1_DP * (L_sigma(:) - 0.5_DP) + v_h_unit(:, i) = v_h_unit(:, i) / norm2(v_h_unit(:, i)) + v_t_unit(:, i) = v_h_unit(:, i) .cross. v_r_unit(:, i) + xb_frag(:,i) = x_frag(:,i) + xcom(:) + end do + + call add_fragments_to_tmpsys() + + xcom(:) = 0.0_DP + do i = 1, nfrag + xcom(:) = xcom(:) + m_frag(i) * xb_frag(:,i) + end do + xcom(:) = xcom(:) / mtot - return - end subroutine set_fragment_position_vectors - - subroutine set_fragment_tan_vel(lerr) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Adjusts the tangential velocities and spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. - !! This procedure works in several stages, with a goal to solve the angular and linear momentum constraints on the fragments, while still leaving a positive balance of - !! our fragment kinetic energy (ke_frag_budget) that we can put into the radial velocity distribution. - !! - !! The first thing we'll try to do is solve for the tangential velocities of the first 6 fragments, using angular and linear momentum as constraints and an initial - !! tangential velocity distribution for the remaining bodies (if there are any) that distributes their angular momentum equally between them. - !! If that doesn't work and we blow our kinetic energy budget, we will attempt to find a tangential velocity distribution that minimizes the kinetic energy while - !! conserving momentum. - !! - !! A failure will trigger a restructuring of the fragments so we will try new values of the radial position distribution. - implicit none - ! Arguments - logical, intent(out) :: lerr - ! Internals - integer(I4B) :: i - real(DP), parameter :: TOL = 1e-4_DP - real(DP), dimension(:), allocatable :: v_t_initial - type(lambda_obj) :: spinfunc - type(lambda_obj_err) :: objective_function - real(DP), dimension(NDIM) :: L_frag_spin, L_remainder, Li, rot_L, rot_ke - - ! Initialize the fragments with 0 velocity and spin so we can divide up the balance between the tangential, radial, and spin components while conserving momentum - lerr = .false. - vb_frag(:,:) = 0.0_DP - rot_frag(:,:) = 0.0_DP - v_t_mag(:) = 0.0_DP - v_r_mag(:) = 0.0_DP - - call calculate_system_energy(linclude_fragments=.true.) - ke_frag_budget = -dEtot - Qloss - !write(*,*) '***************************************************' - !write(*,*) 'Original dis : ',norm2(x(:,2) - x(:,1)) - !write(*,*) 'r_max : ',r_max - !write(*,*) 'f_spin : ',f_spin - !write(*,*) '***************************************************' - !write(*,*) 'Energy balance so far: ' - !write(*,*) 'ke_frag_budget : ',ke_frag_budget - !write(*,*) 'ke_orbit_before: ',ke_orbit_before - !write(*,*) 'ke_orbit_after : ',ke_orbit_after - !write(*,*) 'ke_spin_before : ',ke_spin_before - !write(*,*) 'ke_spin_after : ',ke_spin_after - !write(*,*) 'pe_before : ',pe_before - !write(*,*) 'pe_after : ',pe_after - !write(*,*) 'Qloss : ',Qloss - !write(*,*) '***************************************************' - if (ke_frag_budget < 0.0_DP) then - write(*,*) 'Negative ke_frag_budget: ',ke_frag_budget - r_max_start = r_max_start / 2 - lerr = .true. return - end if + end subroutine set_fragment_position_vectors - allocate(v_t_initial, mold=v_t_mag) - L_frag_spin(:) = 0.0_DP - ke_frag_spin = 0.0_DP - ! Start the first two bodies with the same rotation as the original two impactors, then distribute the remaining angular momentum among the rest - do i = 1, 2 - rot_frag(:, i) = rot(:, i) - L_frag_spin(:) = L_frag_spin(:) + m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i) * rot_frag(:, i) - end do - L_frag_orb(:) = L_frag_tot(:) - L_frag_spin(:) - L_frag_spin(:) = 0.0_DP - do i = 1, nfrag - ! Convert a fraction (f_spin) of either the remaining angular momentum or kinetic energy budget into spin, whichever gives the smaller rotation so as not to blow any budgets - rot_ke(:) = sqrt(2 * f_spin * ke_frag_budget / (nfrag * m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i))) * L_frag_orb(:) / norm2(L_frag_orb(:)) - rot_L(:) = f_spin * L_frag_orb(:) / (nfrag * m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i)) - if (norm2(rot_ke) < norm2(rot_L)) then - rot_frag(:,i) = rot_frag(:, i) + rot_ke(:) - else - rot_frag(:, i) = rot_frag(:, i) + rot_L(:) + subroutine set_fragment_tan_vel(lerr) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Adjusts the tangential velocities and spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. + !! This procedure works in several stages, with a goal to solve the angular and linear momentum constraints on the fragments, while still leaving a positive balance of + !! our fragment kinetic energy (ke_frag_budget) that we can put into the radial velocity distribution. + !! + !! The first thing we'll try to do is solve for the tangential velocities of the first 6 fragments, using angular and linear momentum as constraints and an initial + !! tangential velocity distribution for the remaining bodies (if there are any) that distributes their angular momentum equally between them. + !! If that doesn't work and we blow our kinetic energy budget, we will attempt to find a tangential velocity distribution that minimizes the kinetic energy while + !! conserving momentum. + !! + !! A failure will trigger a restructuring of the fragments so we will try new values of the radial position distribution. + implicit none + ! Arguments + logical, intent(out) :: lerr + ! Internals + integer(I4B) :: i + real(DP), parameter :: TOL = 1e-4_DP + real(DP), dimension(:), allocatable :: v_t_initial + real(DP), dimension(nfrag) :: kefrag + type(lambda_obj) :: spinfunc + type(lambda_obj_err) :: objective_function + real(DP), dimension(NDIM) :: L_frag_spin, L_remainder, Li, rot_L, rot_ke + + ! Initialize the fragments with 0 velocity and spin so we can divide up the balance between the tangential, radial, and spin components while conserving momentum + lerr = .false. + + if (ke_frag_budget < 0.0_DP) then + write(*,*) 'Negative ke_frag_budget: ',ke_frag_budget + r_max_start = r_max_start / 2 + lerr = .true. + return end if - L_frag_spin(:) = L_frag_spin(:) + m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i) * rot_frag(:, i) - ke_frag_spin = ke_frag_spin + m_frag(i) * Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:, i), rot_frag(:, i)) - end do - ke_frag_spin = 0.5_DP * ke_frag_spin - ! Convert a fraction of the pre-impact angular momentum into fragment spin angular momentum - L_frag_orb(:) = L_frag_tot(:) - L_frag_spin(:) - L_remainder(:) = L_frag_orb(:) - ! Next we will solve for the tangential component of the velocities that both conserves linear momentum and uses the remaining angular momentum not used in spin. - ! This will be done using a linear solver that solves for the tangential velocities of the first 6 fragments, constrained by the linear and angular momentum vectors, - ! which is embedded in a non-linear minimizer that will adjust the tangential velocities of the remaining i>6 fragments to minimize kinetic energy for a given momentum solution - ! The initial conditions fed to the minimizer for the fragments will be the remaining angular momentum distributed between the fragments. - do i = 1, nfrag - v_t_initial(i) = norm2(L_remainder(:)) / ((nfrag - i + 1) * m_frag(i) * norm2(x_frag(:,i))) - Li(:) = m_frag(i) * x_frag(:,i) .cross. v_t_initial(i) * v_t_unit(:, i) - L_remainder(:) = L_remainder(:) - Li(:) - end do - ! Find the local kinetic energy minimum for the system that conserves linear and angular momentum - objective_function = lambda_obj(tangential_objective_function, lerr) - v_t_mag(7:nfrag) = util_minimize_bfgs(objective_function, nfrag-6, v_t_initial(7:nfrag), TOL, lerr) - ! Now that the KE-minimized values of the i>6 fragments are found, calculate the momentum-conserving solution for tangential velociteis - v_t_initial(7:nfrag) = v_t_mag(7:nfrag) - v_t_mag(1:nfrag) = solve_fragment_tan_vel(v_t_mag_input=v_t_initial(7:nfrag), lerr=lerr) - - ! Perform one final shift of the radial velocity vectors to align with the center of mass of the collisional system (the origin) - vb_frag(:,1:nfrag) = vmag_to_vb(v_r_mag(1:nfrag), v_r_unit(:,1:nfrag), v_t_mag(1:nfrag), v_t_unit(:,1:nfrag), m_frag(1:nfrag), vcom(:)) - ! Now do a kinetic energy budget check to make sure we are still within the budget. - ke_frag_orbit = 0.0_DP - do i = 1, nfrag - v_frag(:, i) = vb_frag(:, i) - vcom(:) - ke_frag_orbit = ke_frag_orbit + m_frag(i) * dot_product(vb_frag(:, i), vb_frag(:, i)) - end do - ke_frag_orbit = 0.5_DP * ke_frag_orbit - ke_radial = ke_frag_budget - ke_frag_orbit - ke_frag_spin + allocate(v_t_initial, mold=v_t_mag) - ! If we are over the energy budget, flag this as a failure so we can try again - lerr = (ke_radial < 0.0_DP) - !write(*,*) 'Tangential' - !write(*,*) 'ke_frag_budget: ',ke_frag_budget - !write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - !write(*,*) 'ke_frag_spin : ',ke_frag_spin - !write(*,*) 'ke_radial : ',ke_radial + L_frag_spin(:) = 0.0_DP + ke_frag_spin = 0.0_DP + ! Start the first two bodies with the same rotation as the original two impactors, then distribute the remaining angular momentum among the rest + do i = 1, 2 + rot_frag(:, i) = rot(:, i) + L_frag_spin(:) = L_frag_spin(:) + m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i) * rot_frag(:, i) + end do + L_frag_orb(:) = L_frag_tot(:) - L_frag_spin(:) + L_frag_spin(:) = 0.0_DP + do i = 1, nfrag + ! Convert a fraction (f_spin) of either the remaining angular momentum or kinetic energy budget into spin, whichever gives the smaller rotation so as not to blow any budgets + rot_ke(:) = sqrt(2 * f_spin * ke_frag_budget / (nfrag * m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i))) * L_frag_orb(:) / norm2(L_frag_orb(:)) + rot_L(:) = f_spin * L_frag_orb(:) / (nfrag * m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i)) + if (norm2(rot_ke) < norm2(rot_L)) then + rot_frag(:,i) = rot_frag(:, i) + rot_ke(:) + else + rot_frag(:, i) = rot_frag(:, i) + rot_L(:) + end if + L_frag_spin(:) = L_frag_spin(:) + m_frag(i) * rad_frag(i)**2 * Ip_frag(3, i) * rot_frag(:, i) + ke_frag_spin = ke_frag_spin + m_frag(i) * Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:, i), rot_frag(:, i)) + end do + ke_frag_spin = 0.5_DP * ke_frag_spin + ! Convert a fraction of the pre-impact angular momentum into fragment spin angular momentum + L_frag_orb(:) = L_frag_tot(:) - L_frag_spin(:) + L_remainder(:) = L_frag_orb(:) + ! Next we will solve for the tangential component of the velocities that both conserves linear momentum and uses the remaining angular momentum not used in spin. + ! This will be done using a linear solver that solves for the tangential velocities of the first 6 fragments, constrained by the linear and angular momentum vectors, + ! which is embedded in a non-linear minimizer that will adjust the tangential velocities of the remaining i>6 fragments to minimize kinetic energy for a given momentum solution + ! The initial conditions fed to the minimizer for the fragments will be the remaining angular momentum distributed between the fragments. + do i = 1, nfrag + v_t_initial(i) = norm2(L_remainder(:)) / ((nfrag - i + 1) * m_frag(i) * norm2(x_frag(:,i))) + Li(:) = m_frag(i) * x_frag(:,i) .cross. v_t_initial(i) * v_t_unit(:, i) + L_remainder(:) = L_remainder(:) - Li(:) + end do - return + ! Find the local kinetic energy minimum for the system that conserves linear and angular momentum + objective_function = lambda_obj(tangential_objective_function, lerr) + v_t_mag(7:nfrag) = util_minimize_bfgs(objective_function, nfrag-6, v_t_initial(7:nfrag), TOL, lerr) + ! Now that the KE-minimized values of the i>6 fragments are found, calculate the momentum-conserving solution for tangential velociteis + v_t_initial(7:nfrag) = v_t_mag(7:nfrag) + v_t_mag(1:nfrag) = solve_fragment_tan_vel(v_t_mag_input=v_t_initial(7:nfrag), lerr=lerr) + + ! Perform one final shift of the radial velocity vectors to align with the center of mass of the collisional system (the origin) + vb_frag(:,1:nfrag) = vmag_to_vb(v_r_mag(1:nfrag), v_r_unit(:,1:nfrag), v_t_mag(1:nfrag), v_t_unit(:,1:nfrag), m_frag(1:nfrag), vcom(:)) + call add_fragments_to_tmpsys() + + ! Now do a kinetic energy budget check to make sure we are still within the budget. + kefrag = 0.0_DP + do concurrent(i = 1:nfrag) + v_frag(:, i) = vb_frag(:, i) - vcom(:) + kefrag(i) = m_frag(i) * dot_product(vb_frag(:, i), vb_frag(:, i)) + end do + ke_frag_orbit = 0.5_DP * sum(kefrag(:)) + ke_radial = ke_frag_budget - ke_frag_orbit - ke_frag_spin - end subroutine set_fragment_tan_vel - - function tangential_objective_function(v_t_mag_input, lerr) result(fval) - !! Author: David A. Minton - !! - !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: v_t_mag_input !! Unknown tangential component of velocity vector set previously by angular momentum constraint - logical, intent(out) :: lerr !! Error flag - ! Result - real(DP) :: fval - ! Internals - integer(I4B) :: i - real(DP), dimension(:,:), allocatable :: v_shift - real(DP), dimension(:), allocatable :: v_t_new - real(DP) :: keo - - lerr = .false. - - allocate(v_shift(NDIM, nfrag)) - allocate(v_t_new(nfrag)) - - v_t_new(:) = solve_fragment_tan_vel(v_t_mag_input=v_t_mag_input(:), lerr=lerr) - v_shift(:,:) = vmag_to_vb(v_r_mag, v_r_unit, v_t_new, v_t_unit, m_frag, vcom) - - keo = 0.0_DP - do i = 1, nfrag - keo = keo + m_frag(i) * dot_product(v_shift(:, i), v_shift(:, i)) - end do - keo = 0.5_DP * keo - fval = keo - lerr = .false. - return - end function tangential_objective_function - - function solve_fragment_tan_vel(lerr, v_t_mag_input) result(v_t_mag_output) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! Adjusts the positions, velocities, and spins of a collection of fragments such that they conserve angular momentum - implicit none - ! Arguments - logical, intent(out) :: lerr !! Error flag - real(DP), dimension(:), optional, intent(in) :: v_t_mag_input !! Unknown tangential velocities for fragments 7:nfrag - ! Internals - integer(I4B) :: i - ! Result - real(DP), dimension(:), allocatable :: v_t_mag_output - - real(DP), dimension(2 * NDIM, 2 * NDIM) :: A ! LHS of linear equation used to solve for momentum constraint in Gauss elimination code - real(DP), dimension(2 * NDIM) :: b ! RHS of linear equation used to solve for momentum constraint in Gauss elimination code - real(DP), dimension(NDIM) :: L_lin_others, L_orb_others, L, vtmp - - v_frag(:,:) = 0.0_DP - lerr = .false. - - ! We have 6 constraint equations (2 vector constraints in 3 dimensions each) - ! The first 3 are that the linear momentum of the fragments is zero with respect to the collisional barycenter - ! The second 3 are that the sum of the angular momentum of the fragments is conserved from the pre-impact state - L_lin_others(:) = 0.0_DP - L_orb_others(:) = 0.0_DP - do i = 1, nfrag - if (i <= 2 * NDIM) then ! The tangential velocities of the first set of bodies will be the unknowns we will solve for to satisfy the constraints - A(1:3, i) = m_frag(i) * v_t_unit(:, i) - L(:) = v_r_unit(:, i) .cross. v_t_unit(:, i) - A(4:6, i) = m_frag(i) * rmag(i) * L(:) - else if (present(v_t_mag_input)) then - vtmp(:) = v_t_mag_input(i - 6) * v_t_unit(:, i) - L_lin_others(:) = L_lin_others(:) + m_frag(i) * vtmp(:) - L(:) = x_frag(:, i) .cross. vtmp(:) - L_orb_others(:) = L_orb_others(:) + m_frag(i) * L(:) - end if - end do - b(1:3) = -L_lin_others(:) - b(4:6) = L_frag_orb(:) - L_orb_others(:) - allocate(v_t_mag_output(nfrag)) - v_t_mag_output(1:6) = util_solve_linear_system(A, b, 6, lerr) - if (present(v_t_mag_input)) v_t_mag_output(7:nfrag) = v_t_mag_input(:) - - return - end function solve_fragment_tan_vel - - subroutine set_fragment_radial_velocities(lerr) - !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton - !! - !! - !! Adjust the fragment velocities to set the fragment orbital kinetic energy. This will minimize the difference between the fragment kinetic energy and the energy budget - implicit none - ! Arguments - logical, intent(out) :: lerr - ! Internals - real(DP), parameter :: TOL = 1e-10_DP - integer(I4B) :: i, j - real(DP), dimension(:), allocatable :: v_r_initial, v_r_sigma - real(DP), dimension(:,:), allocatable :: v_r - type(lambda_obj) :: objective_function - - ! Set the "target" ke_orbit_after (the value of the orbital kinetic energy that the fragments ought to have) - - allocate(v_r_initial, source=v_r_mag) - ! Initialize radial velocity magnitudes with a random value that is approximately 10% of that found by distributing the kinetic energy equally - allocate(v_r_sigma, source=v_r_mag) - call random_number(v_r_sigma(1:nfrag)) - v_r_sigma(1:nfrag) = sqrt(1.0_DP + 2 * (v_r_sigma(1:nfrag) - 0.5_DP) * 1e-4_DP) - v_r_initial(1:nfrag) = v_r_sigma(1:nfrag) * sqrt(abs(ke_radial) / (2 * m_frag(1:nfrag) * nfrag)) - - ! Initialize the lambda function using a structure constructor that calls the init method - ! Minimize the ke objective function using the BFGS optimizer - objective_function = lambda_obj(radial_objective_function) - v_r_mag = util_minimize_bfgs(objective_function, nfrag, v_r_initial, TOL, lerr) - ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) - vb_frag(:,1:nfrag) = vmag_to_vb(v_r_mag(1:nfrag), v_r_unit(:,1:nfrag), v_t_mag(1:nfrag), v_t_unit(:,1:nfrag), m_frag(1:nfrag), vcom(:)) - do i = 1, nfrag - v_frag(:, i) = vb_frag(:, i) - vcom(:) - end do - ke_frag_orbit = 0.0_DP - do i = 1, nfrag - ke_frag_orbit = ke_frag_orbit + m_frag(i) * dot_product(vb_frag(:, i), vb_frag(:, i)) - end do - ke_frag_orbit = 0.5_DP * ke_frag_orbit - !write(*,*) 'Radial' - !write(*,*) 'Failure? ',lerr - !write(*,*) 'ke_frag_budget: ',ke_frag_budget - !write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - !write(*,*) 'ke_frag_spin : ',ke_frag_spin - !write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) - lerr = .false. + ! If we are over the energy budget, flag this as a failure so we can try again + lerr = (ke_radial < 0.0_DP) + ! write(*,*) 'Tangential' + ! write(*,*) 'ke_frag_budget: ',ke_frag_budget + ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + ! write(*,*) 'ke_frag_spin : ',ke_frag_spin + ! write(*,*) 'ke_radial : ',ke_radial - return - end subroutine set_fragment_radial_velocities - - function radial_objective_function(v_r_mag_input) result(fval) - !! Author: David A. Minton - !! - !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: v_r_mag_input !! Unknown radial component of fragment velocity vector - ! Result - real(DP) :: fval !! The objective function result, which is the square of the difference between the calculated fragment kinetic energy and our target - !! Minimizing this brings us closer to our objective - ! Internals - integer(I4B) :: i - real(DP), dimension(:,:), allocatable :: v_shift - - allocate(v_shift, mold=vb_frag) - v_shift(:,:) = vmag_to_vb(v_r_mag_input, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) - fval = 2 * ke_frag_budget - do i = 1, nfrag - fval = fval - m_frag(i) * (Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:, i), rot_frag(:, i)) + dot_product(v_shift(:, i), v_shift(:, i))) - end do - ! The following ensures that fval = 0 is a local minimum, which is what the BFGS method is searching for - fval = (fval / (2 * ke_radial))**2 + return + end subroutine set_fragment_tan_vel - return - end function radial_objective_function - - function vmag_to_vb(v_r_mag, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) result(vb) - !! Author: David A. Minton - !! - !! Converts radial and tangential velocity magnitudes into barycentric velocity - implicit none - ! Arguments - real(DP), dimension(:), intent(in) :: v_r_mag !! Unknown radial component of fragment velocity vector - real(DP), dimension(:), intent(in) :: v_t_mag !! Tangential component of velocity vector set previously by angular momentum constraint - real(DP), dimension(:,:), intent(in) :: v_r_unit, v_t_unit !! Radial and tangential unit vectors for each fragment - real(DP), dimension(:), intent(in) :: m_frag !! Fragment masses - real(DP), dimension(:), intent(in) :: vcom !! Barycentric velocity of collisional system center of mass - ! Result - real(DP), dimension(:,:), allocatable :: vb - ! Internals - integer(I4B) :: i - - allocate(vb, mold=v_r_unit) - ! Make sure the velocity magnitude stays positive - do i = 1, nfrag - vb(:,i) = abs(v_r_mag(i)) * v_r_unit(:, i) - end do - ! In order to keep satisfying the kinetic energy constraint, we must shift the origin of the radial component of the velocities to the center of mass - call shift_vector_to_origin(m_frag, vb) - - do i = 1, nfrag - vb(:, i) = vb(:, i) + v_t_mag(i) * v_t_unit(:, i) + vcom(:) - end do + function tangential_objective_function(v_t_mag_input, lerr) result(fval) + !! Author: David A. Minton + !! + !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: v_t_mag_input !! Unknown tangential component of velocity vector set previously by angular momentum constraint + logical, intent(out) :: lerr !! Error flag + ! Result + real(DP) :: fval + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM,nfrag) :: v_shift + real(DP), dimension(nfrag) :: v_t_new, kearr + real(DP) :: keo - end function vmag_to_vb - - subroutine restructure_failed_fragments() - !! Author: David A. Minton - !! - !! We failed to find a set of positions and velocities that satisfy all the constraints, and so we will alter the fragments and try again. - implicit none - integer(I4B) :: i - real(DP), dimension(:), allocatable :: m_frag_new, rad_frag_new - real(DP), dimension(:,:), allocatable :: xb_frag_new, vb_frag_new, Ip_frag_new, rot_frag_new - real(DP) :: delta_r, delta_r_max - real(DP), parameter :: ke_avg_deficit_target = 0.0_DP - - ! Introduce a bit of noise in the radius determination so we don't just flip flop between similar failed positions - call random_number(delta_r_max) - delta_r_max = sum(radius(:)) * (1.0_DP + 2e-1_DP * (delta_r_max - 0.5_DP)) - if (try > 2) then - ! Linearly interpolate the last two failed solution ke deficits to find a new distance value to try - delta_r = (r_max_start - r_max_start_old) * (ke_avg_deficit_target - ke_avg_deficit_old) / (ke_avg_deficit - ke_avg_deficit_old) - if (abs(delta_r) > delta_r_max) delta_r = sign(delta_r_max, delta_r) - else - delta_r = delta_r_max - end if - r_max_start_old = r_max_start - r_max_start = r_max_start + delta_r ! The larger lever arm can help if the problem is in the angular momentum step - if (f_spin > epsilon(1.0_DP)) then - f_spin = f_spin / 2 - else - f_spin = 0.0_DP - end if - end subroutine restructure_failed_fragments + lerr = .false. + + v_t_new(:) = solve_fragment_tan_vel(v_t_mag_input=v_t_mag_input(:), lerr=lerr) + v_shift(:,:) = vmag_to_vb(v_r_mag, v_r_unit, v_t_new, v_t_unit, m_frag, vcom) + + kearr = 0.0_DP + do concurrent(i = 1:nfrag) + kearr(i) = m_frag(i) * dot_product(v_shift(:, i), v_shift(:, i)) + end do + keo = 0.5_DP * sum(kearr(:)) + fval = keo + lerr = .false. + + return + end function tangential_objective_function + function solve_fragment_tan_vel(lerr, v_t_mag_input) result(v_t_mag_output) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Adjusts the positions, velocities, and spins of a collection of fragments such that they conserve angular momentum + implicit none + ! Arguments + logical, intent(out) :: lerr !! Error flag + real(DP), dimension(:), optional, intent(in) :: v_t_mag_input !! Unknown tangential velocities for fragments 7:nfrag + ! Internals + integer(I4B) :: i + ! Result + real(DP), dimension(:), allocatable :: v_t_mag_output + + real(DP), dimension(2 * NDIM, 2 * NDIM) :: A ! LHS of linear equation used to solve for momentum constraint in Gauss elimination code + real(DP), dimension(2 * NDIM) :: b ! RHS of linear equation used to solve for momentum constraint in Gauss elimination code + real(DP), dimension(NDIM) :: L_lin_others, L_orb_others, L, vtmp + + v_frag(:,:) = 0.0_DP + lerr = .false. + + ! We have 6 constraint equations (2 vector constraints in 3 dimensions each) + ! The first 3 are that the linear momentum of the fragments is zero with respect to the collisional barycenter + ! The second 3 are that the sum of the angular momentum of the fragments is conserved from the pre-impact state + L_lin_others(:) = 0.0_DP + L_orb_others(:) = 0.0_DP + do i = 1, nfrag + if (i <= 2 * NDIM) then ! The tangential velocities of the first set of bodies will be the unknowns we will solve for to satisfy the constraints + A(1:3, i) = m_frag(i) * v_t_unit(:, i) + L(:) = v_r_unit(:, i) .cross. v_t_unit(:, i) + A(4:6, i) = m_frag(i) * rmag(i) * L(:) + else if (present(v_t_mag_input)) then + vtmp(:) = v_t_mag_input(i - 6) * v_t_unit(:, i) + L_lin_others(:) = L_lin_others(:) + m_frag(i) * vtmp(:) + L(:) = x_frag(:, i) .cross. vtmp(:) + L_orb_others(:) = L_orb_others(:) + m_frag(i) * L(:) + end if + end do + b(1:3) = -L_lin_others(:) + b(4:6) = L_frag_orb(:) - L_orb_others(:) + allocate(v_t_mag_output(nfrag)) + v_t_mag_output(1:6) = util_solve_linear_system(A, b, 6, lerr) + if (present(v_t_mag_input)) v_t_mag_output(7:nfrag) = v_t_mag_input(:) + + return + end function solve_fragment_tan_vel + + + subroutine set_fragment_radial_velocities(lerr) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! + !! Adjust the fragment velocities to set the fragment orbital kinetic energy. This will minimize the difference between the fragment kinetic energy and the energy budget + implicit none + ! Arguments + logical, intent(out) :: lerr + ! Internals + real(DP), parameter :: TOL = 1e-10_DP + integer(I4B) :: i, j + real(DP), dimension(:), allocatable :: v_r_initial, v_r_sigma + real(DP), dimension(:,:), allocatable :: v_r + real(DP), dimension(nfrag) :: kearr, kespinarr + type(lambda_obj) :: objective_function + + ! Set the "target" ke_orbit_after (the value of the orbital kinetic energy that the fragments ought to have) + + allocate(v_r_initial, source=v_r_mag) + ! Initialize radial velocity magnitudes with a random value that is approximately 10% of that found by distributing the kinetic energy equally + allocate(v_r_sigma, source=v_r_mag) + call random_number(v_r_sigma(1:nfrag)) + v_r_sigma(1:nfrag) = sqrt(1.0_DP + 2 * (v_r_sigma(1:nfrag) - 0.5_DP) * 1e-4_DP) + v_r_initial(1:nfrag) = v_r_sigma(1:nfrag) * sqrt(abs(2 * ke_radial) / (m_frag(1:nfrag) * nfrag)) + + ! Initialize the lambda function using a structure constructor that calls the init method + ! Minimize the ke objective function using the BFGS optimizer + objective_function = lambda_obj(radial_objective_function) + v_r_mag = util_minimize_bfgs(objective_function, nfrag, v_r_initial, TOL, lerr) + ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) + vb_frag(:,1:nfrag) = vmag_to_vb(v_r_mag(1:nfrag), v_r_unit(:,1:nfrag), v_t_mag(1:nfrag), v_t_unit(:,1:nfrag), m_frag(1:nfrag), vcom(:)) + call add_fragments_to_tmpsys() + + do concurrent(i = 1:nfrag) + kearr(i) = m_frag(i) * dot_product(vb_frag(:, i), vb_frag(:, i)) + kespinarr(i) = m_frag(i) * Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:,i), rot_frag(:,i)) + end do + ke_frag_orbit = 0.5_DP * sum(kearr(:)) + ke_frag_spin = 0.5_DP * sum(kespinarr(:)) + ! write(*,*) 'Radial' + ! write(*,*) 'Failure? ',lerr + ! write(*,*) 'ke_frag_budget: ',ke_frag_budget + ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + ! write(*,*) 'ke_frag_spin : ',ke_frag_spin + ! write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) + lerr = .false. + + return + end subroutine set_fragment_radial_velocities + + + function radial_objective_function(v_r_mag_input) result(fval) + !! Author: David A. Minton + !! + !! Objective function for evaluating how close our fragment velocities get to minimizing KE error from our required value + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: v_r_mag_input !! Unknown radial component of fragment velocity vector + ! Result + real(DP) :: fval !! The objective function result, which is the square of the difference between the calculated fragment kinetic energy and our target + !! Minimizing this brings us closer to our objective + ! Internals + integer(I4B) :: i + real(DP), dimension(:,:), allocatable :: v_shift + real(DP), dimension(nfrag) :: kearr + real(DP) :: keo + + allocate(v_shift, mold=vb_frag) + v_shift(:,:) = vmag_to_vb(v_r_mag_input, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) + do concurrent(i = 1:nfrag) + kearr(i) = m_frag(i) * (Ip_frag(3, i) * rad_frag(i)**2 * dot_product(rot_frag(:, i), rot_frag(:, i)) + dot_product(v_shift(:, i), v_shift(:, i))) + end do + keo = 2 * ke_frag_budget - sum(kearr(:)) + ! The following ensures that fval = 0 is a local minimum, which is what the BFGS method is searching for + fval = (keo / (2 * ke_radial))**2 + + return + end function radial_objective_function + + + function vmag_to_vb(v_r_mag, v_r_unit, v_t_mag, v_t_unit, m_frag, vcom) result(vb) + !! Author: David A. Minton + !! + !! Converts radial and tangential velocity magnitudes into barycentric velocity + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: v_r_mag !! Unknown radial component of fragment velocity vector + real(DP), dimension(:), intent(in) :: v_t_mag !! Tangential component of velocity vector set previously by angular momentum constraint + real(DP), dimension(:,:), intent(in) :: v_r_unit, v_t_unit !! Radial and tangential unit vectors for each fragment + real(DP), dimension(:), intent(in) :: m_frag !! Fragment masses + real(DP), dimension(:), intent(in) :: vcom !! Barycentric velocity of collisional system center of mass + ! Result + real(DP), dimension(:,:), allocatable :: vb + ! Internals + integer(I4B) :: i + + allocate(vb, mold=v_r_unit) + ! Make sure the velocity magnitude stays positive + do i = 1, nfrag + vb(:,i) = abs(v_r_mag(i)) * v_r_unit(:, i) + end do + ! In order to keep satisfying the kinetic energy constraint, we must shift the origin of the radial component of the velocities to the center of mass + call shift_vector_to_origin(m_frag, vb) + + do i = 1, nfrag + vb(:, i) = vb(:, i) + v_t_mag(i) * v_t_unit(:, i) + vcom(:) + end do + + return + end function vmag_to_vb + + + subroutine restructure_failed_fragments() + !! Author: David A. Minton + !! + !! We failed to find a set of positions and velocities that satisfy all the constraints, and so we will alter the fragments and try again. + implicit none + integer(I4B) :: i + real(DP), dimension(:), allocatable :: m_frag_new, rad_frag_new + real(DP), dimension(:,:), allocatable :: xb_frag_new, vb_frag_new, Ip_frag_new, rot_frag_new + real(DP) :: delta_r, delta_r_max + real(DP), parameter :: ke_avg_deficit_target = 0.0_DP + + ! Introduce a bit of noise in the radius determination so we don't just flip flop between similar failed positions + call random_number(delta_r_max) + delta_r_max = sum(radius(:)) * (1.0_DP + 2e-1_DP * (delta_r_max - 0.5_DP)) + if (try > 2) then + ! Linearly interpolate the last two failed solution ke deficits to find a new distance value to try + delta_r = (r_max_start - r_max_start_old) * (ke_avg_deficit_target - ke_avg_deficit_old) / (ke_avg_deficit - ke_avg_deficit_old) + if (abs(delta_r) > delta_r_max) delta_r = sign(delta_r_max, delta_r) + else + delta_r = delta_r_max + end if + r_max_start_old = r_max_start + r_max_start = r_max_start + delta_r ! The larger lever arm can help if the problem is in the angular momentum step + if (f_spin > epsilon(1.0_DP)) then + f_spin = f_spin / 2 + else + f_spin = 0.0_DP + end if + + return + end subroutine restructure_failed_fragments end subroutine fragmentation_initialize diff --git a/src/io/io.f90 b/src/io/io.f90 index ebfe2b1ef..52183460c 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -39,6 +39,7 @@ module subroutine io_conservation_report(self, param, lterminal) write(EGYIU,EGYHEADER) end if end if + call pl%h2b(cb) call system%get_energy_and_momentum(param) ke_orbit_now = system%ke_orbit ke_spin_now = system%ke_spin diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index c10dbace7..2a970d0dc 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -24,6 +24,7 @@ module subroutine util_coord_h2b_pl(self, cb) xtmp(:) = 0.0_DP vtmp(:) = 0.0_DP do i = 1, npl + if (pl%status(i) == INACTIVE) cycle Gmtot = Gmtot + pl%Gmass(i) xtmp(:) = xtmp(:) + pl%Gmass(i) * pl%xh(:,i) vtmp(:) = vtmp(:) + pl%Gmass(i) * pl%vh(:,i) @@ -31,6 +32,7 @@ module subroutine util_coord_h2b_pl(self, cb) cb%xb(:) = -xtmp(:) / Gmtot cb%vb(:) = -vtmp(:) / Gmtot do i = 1, npl + if (pl%status(i) == INACTIVE) cycle pl%xb(:,i) = pl%xh(:,i) + cb%xb(:) pl%vb(:,i) = pl%vh(:,i) + cb%vb(:) end do @@ -51,20 +53,15 @@ module subroutine util_coord_h2b_tp(self, cb) ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_cb), intent(in) :: cb !! Swiftest central body object + ! Internals + integer(I4B) :: i if (self%nbody == 0) return - associate(ntp => self%nbody, xbcb => cb%xb, vbcb => cb%vb, status => self%status, & - xb => self%xb, xh => self%xh, vb => self%vb, vh => self%vh) - - where(status(1:ntp) /= INACTIVE) - xb(1, 1:ntp) = xh(1, 1:ntp) + xbcb(1) - xb(2, 1:ntp) = xh(2, 1:ntp) + xbcb(2) - xb(3, 1:ntp) = xh(3, 1:ntp) + xbcb(3) - - 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) - end where + associate(tp => self, ntp => self%nbody) + do concurrent (i = 1:ntp, tp%status(i) /= INACTIVE) + tp%xb(:, i) = tp%xh(:, i) + cb%xb(:) + tp%vb(:, i) = tp%vh(:, i) + cb%vb(:) + end do end associate return @@ -87,11 +84,10 @@ module subroutine util_coord_b2h_pl(self, cb) if (self%nbody == 0) return - associate(npl => self%nbody, xbcb => cb%xb, vbcb => cb%vb, xb => self%xb, xh => self%xh, & - vb => self%vb, vh => self%vh) - do i = 1, NDIM - xh(i, 1:npl) = xb(i, 1:npl) - xbcb(i) - vh(i, 1:npl) = vb(i, 1:npl) - vbcb(i) + associate(pl => self, npl => self%nbody) + do concurrent (i = 1:npl, pl%status(i) /= INACTIVE) + pl%xh(:, i) = pl%xb(:, i) - cb%xb(:) + pl%vh(:, i) = pl%vb(:, i) - cb%vb(:) end do end associate @@ -110,20 +106,16 @@ module subroutine util_coord_b2h_tp(self, cb) ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(in) :: cb !! Swiftest central body object + ! Internals + integer(I4B) :: i if (self%nbody == 0) return - associate(ntp => self%nbody, xbcb => cb%xb, vbcb => cb%vb, xb => self%xb, xh => self%xh, & - vb => self%vb, vh => self%vh, status => self%status) - where(status(1:ntp) /= INACTIVE) - xh(1, 1:ntp) = xb(1, 1:ntp) - xbcb(1) - xh(2, 1:ntp) = xb(2, 1:ntp) - xbcb(2) - xh(3, 1:ntp) = xb(3, 1:ntp) - xbcb(3) - - 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) - end where + associate(tp => self, ntp => self%nbody) + do concurrent(i = 1:ntp, tp%status(i) /= INACTIVE) + tp%xh(:, i) = tp%xb(:, i) - cb%xb(:) + tp%vh(:, i) = tp%vb(:, i) - cb%vb(:) + end do end associate return diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 90f0d2242..f8047b6b6 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -38,7 +38,7 @@ module subroutine util_get_energy_momentum_system(self, param) Lplspiny(:) = 0.0_DP Lplspinz(:) = 0.0_DP lstatus(1:npl) = pl%status(1:npl) /= INACTIVE - call pl%h2b(cb) + kecb = cb%mass * dot_product(cb%vb(:), cb%vb(:)) hx = cb%xb(2) * cb%vb(3) - cb%xb(3) * cb%vb(2) hy = cb%xb(3) * cb%vb(1) - cb%xb(1) * cb%vb(3) @@ -108,11 +108,11 @@ module subroutine util_get_energy_momentum_system(self, param) end associate end do + system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) + system%ke_orbit = 0.5_DP * (kecb + sum(kepl(1:npl), lstatus(:))) if (param%lrotation) system%ke_spin = 0.5_DP * (kespincb + sum(kespinpl(1:npl), lstatus(:))) - system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) - ! Potential energy from the oblateness term if (param%loblatecb) then !$omp simd From 72834ce565ea4a8310630a676395462418f64997 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 18:03:12 -0400 Subject: [PATCH 47/71] Made numerous changes attempting to get momentum error under control. Still not there yet --- src/fragmentation/fragmentation.f90 | 18 ++++-- src/modules/rmvs_classes.f90 | 4 +- src/modules/swiftest_classes.f90 | 16 +++--- src/modules/symba_classes.f90 | 10 ++-- src/modules/whm_classes.f90 | 2 +- src/rmvs/rmvs_util.f90 | 4 +- src/symba/symba_fragmentation.f90 | 16 ++++-- src/symba/symba_util.f90 | 42 +++++--------- src/util/util_append.f90 | 80 +++++++-------------------- src/util/util_get_energy_momentum.f90 | 27 +++++---- src/whm/whm_util.f90 | 2 +- 11 files changed, 93 insertions(+), 128 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 1977d42f3..f4ff3b4ce 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -49,7 +49,6 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, class(swiftest_nbody_system), allocatable :: tmpsys class(swiftest_parameters), allocatable :: tmpparam - if (nfrag < NFRAG_MIN) then write(*,*) "symba_frag_pos needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." lfailure = .true. @@ -114,10 +113,9 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, if (lfailure) write(*,*) 'Failed to find radial velocities' if (.not.lfailure) then call calculate_system_energy(linclude_fragments=.true.) - - write(*,*) 'Qloss : ',Qloss - write(*,*) '-dEtot: ',-dEtot - write(*,*) 'delta : ',abs((dEtot + Qloss)) + ! write(*,*) 'Qloss : ',Qloss + ! write(*,*) '-dEtot: ',-dEtot + ! write(*,*) 'delta : ',abs((dEtot + Qloss)) if ((abs(dEtot + Qloss) > Etol) .or. (dEtot > 0.0_DP)) then write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + Qloss) / Etol lfailure = .true. @@ -132,6 +130,10 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, call restructure_failed_fragments() try = try + 1 end do + call restore_scale_factors() + call calculate_system_energy(linclude_fragments=.true.) + + write(*, "(' -------------------------------------------------------------------------------------')") write(*, "(' Final diagnostic')") write(*, "(' -------------------------------------------------------------------------------------')") @@ -151,7 +153,6 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, end if write(*, "(' -------------------------------------------------------------------------------------')") - call restore_scale_factors() call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily return @@ -248,6 +249,11 @@ subroutine restore_scale_factors() Ltot_after = Ltot_after * Lscale Lmag_after = Lmag_after * Lscale + dLmag = norm2(Ltot_after(:) - Ltot_before(:)) + dEtot = Etot_after - Etot_before + + call tmpsys%rescale(tmpparam, mscale**(-1), dscale**(-1), tscale**(-1)) + mscale = 1.0_DP dscale = 1.0_DP vscale = 1.0_DP diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 4f7255237..6ffb7ba1b 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -163,7 +163,7 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine rmvs_util_append_pl module subroutine rmvs_util_append_tp(self, source, lsource_mask) @@ -171,7 +171,7 @@ module subroutine rmvs_util_append_tp(self, source, lsource_mask) implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine rmvs_util_append_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 4d0e98704..0d7fac843 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -836,35 +836,35 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) implicit none character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array character(len=STRMAX), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_char_string module subroutine util_append_arr_DP(arr, source, lsource_mask) implicit none real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_DP module subroutine util_append_arr_DPvec(arr, source, lsource_mask) implicit none real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:,:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_DPvec module subroutine util_append_arr_I4B(arr, source, lsource_mask) implicit none integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_I4B module subroutine util_append_arr_logical(arr, source, lsource_mask) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array logical, dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_logical end interface @@ -873,21 +873,21 @@ module subroutine util_append_body(self, source, lsource_mask) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_body module subroutine util_append_pl(self, source, lsource_mask) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_pl module subroutine util_append_tp(self, source, lsource_mask) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_tp module subroutine util_coord_b2h_pl(self, cb) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index dfe1c0326..e8b5918b3 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -492,14 +492,14 @@ module subroutine symba_util_append_arr_info(arr, source, lsource_mask) implicit none type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_arr_info module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_kinship), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_arr_kin end interface @@ -509,7 +509,7 @@ module subroutine symba_util_append_merger(self, source, lsource_mask) implicit none class(symba_merger), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_merger module subroutine symba_util_append_pl(self, source, lsource_mask) @@ -517,7 +517,7 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_pl module subroutine symba_util_append_tp(self, source, lsource_mask) @@ -525,7 +525,7 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_tp end interface diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index a79f52bca..6d5b26394 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -232,7 +232,7 @@ module subroutine whm_util_append_pl(self, source, lsource_mask) implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine whm_util_append_pl module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 9f9cf0037..67a76acb3 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -11,7 +11,7 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) !! Arguments class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (rmvs_pl) @@ -44,7 +44,7 @@ module subroutine rmvs_util_append_tp(self, source, lsource_mask) !! Arguments class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (rmvs_tp) diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index a27d31e12..9b82e145a 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -133,11 +133,13 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, plnew%k2 = pl%k2(ibiggest) plnew%tlag = pl%tlag(ibiggest) end if + call plnew%set_mu(cb) + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY ! Append the new merged body to the list and record how many we made nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew) + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) @@ -291,11 +293,13 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m plnew%k2 = pl%k2(ibiggest) plnew%tlag = pl%tlag(ibiggest) end if + call plnew%set_mu(cb) + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY ! Append the new merged body to the list and record how many we made nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew) + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) @@ -427,11 +431,13 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, plnew%k2 = pl%k2(ibiggest) plnew%tlag = pl%tlag(ibiggest) end if + call plnew%set_mu(cb) + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY ! Append the new merged body to the list and record how many we made nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew) + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) @@ -570,11 +576,13 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, plnew%k2 = pl%k2(ibiggest) plnew%tlag = pl%tlag(ibiggest) end if + call plnew%set_mu(cb) + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY ! Append the new merged body to the list and record how many we made nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew) + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 028b0678c..37fdca873 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -10,17 +10,13 @@ module subroutine symba_util_append_arr_info(arr, source, lsource_mask) ! Arguments type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr) @@ -31,11 +27,7 @@ module subroutine symba_util_append_arr_info(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine symba_util_append_arr_info @@ -49,17 +41,13 @@ module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) ! Arguments type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_kinship), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr) @@ -70,11 +58,7 @@ module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine symba_util_append_arr_kin @@ -89,7 +73,7 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) !! Arguments class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (symba_pl) @@ -125,7 +109,7 @@ module subroutine symba_util_append_merger(self, source, lsource_mask) ! Arguments class(symba_merger), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B), dimension(:), allocatable :: ncomp_tmp !! Temporary placeholder for ncomp incase we are appending a symba_pl object to a symba_merger @@ -156,7 +140,7 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) !! Arguments class(symba_tp), intent(inout) :: self !! SyMBA test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (symba_tp) @@ -380,11 +364,15 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(in) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. + integer(I4B) :: i + logical, dimension(:), allocatable :: lmask associate(pl => self, pl_adds => system%pl_adds) allocate(tmp, mold=pl) ! Remove the discards and destroy the list, as the system already tracks pl_discards elsewhere - call pl%spill(tmp, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) + allocate(lmask, source=pl%ldiscard(:)) + lmask(:) = lmask(:) .or. pl%status(:) == INACTIVE + call pl%spill(tmp, lspill_list=lmask, ldestructive=.true.) call tmp%setup(0,param) deallocate(tmp) @@ -393,7 +381,7 @@ module subroutine symba_util_rearray_pl(self, system, param) if (allocated(pl%xend)) deallocate(pl%xend) ! Add in any new bodies - call pl%append(pl_adds) + call pl%append(pl_adds, lsource_mask=[(.true., i=1, pl_adds%nbody)]) ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 0f7ac0bde..cf0bb4117 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -10,17 +10,13 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) ! Arguments character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array character(len=STRMAX), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr) @@ -31,11 +27,7 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine util_append_arr_char_string @@ -49,17 +41,13 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) ! Arguments real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr) @@ -70,11 +58,7 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine util_append_arr_DP @@ -88,17 +72,13 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) ! Arguments real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:,:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source, dim=2) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr, dim=2) @@ -109,13 +89,9 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(1, narr + 1:narr + nsrc) = pack(source(1,:), lsource_mask(:)) - arr(2, narr + 1:narr + nsrc) = pack(source(2,:), lsource_mask(:)) - arr(3, narr + 1:narr + nsrc) = pack(source(3,:), lsource_mask(:)) - else - arr(:, narr + 1:narr + nsrc) = source(:,:) - end if + arr(1, narr + 1:narr + nsrc) = pack(source(1,:), lsource_mask(:)) + arr(2, narr + 1:narr + nsrc) = pack(source(2,:), lsource_mask(:)) + arr(3, narr + 1:narr + nsrc) = pack(source(3,:), lsource_mask(:)) return end subroutine util_append_arr_DPvec @@ -129,17 +105,13 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) ! Arguments integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) if (allocated(arr)) then narr = size(arr) @@ -150,11 +122,7 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine util_append_arr_I4B @@ -168,7 +136,7 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) ! Arguments logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array logical, dimension(:), allocatable, intent(in) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B) :: narr, nsrc @@ -181,19 +149,11 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) narr = 0 end if - if (present(lsource_mask)) then - nsrc = count(lsource_mask) - else - nsrc = size(source) - end if + nsrc = count(lsource_mask) call util_resize(arr, narr + nsrc) - if (present(lsource_mask)) then - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) - else - arr(narr + 1:narr + nsrc) = source(:) - end if + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) return end subroutine util_append_arr_logical @@ -208,7 +168,7 @@ module subroutine util_append_body(self, source, lsource_mask) ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to call util_append(self%name, source%name, lsource_mask) call util_append(self%id, source%id, lsource_mask) @@ -247,7 +207,7 @@ module subroutine util_append_pl(self, source, lsource_mask) ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) @@ -287,7 +247,7 @@ module subroutine util_append_tp(self, source, lsource_mask) ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (swiftest_tp) diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index f8047b6b6..55d05e823 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -94,19 +94,22 @@ module subroutine util_get_energy_momentum_system(self, param) ! Do the central body potential energy component first !$omp simd - do i = 1, npl - associate(px => pl%xb(1,i), py => pl%xb(2,i), pz => pl%xb(3,i)) - pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px**2 + py**2 + pz**2) - end associate - end do + associate(px => pl%xb(1,:), py => pl%xb(2,:), pz => pl%xb(3,:)) + do concurrent(i = 1:npl, lstatus(i)) + pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px(i)**2 + py(i)**2 + pz(i)**2) + end do + end associate ! Do the potential energy between pairs of massive bodies - do k = 1, pl%nplpl - associate(ik => pl%k_plpl(1, k), jk => pl%k_plpl(2, k)) - pepl(k) = -pl%Gmass(ik) * pl%mass(jk) / norm2(pl%xb(:, jk) - pl%xb(:, ik)) - lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) - end associate - end do + associate(indi => pl%k_plpl(1, :), indj => pl%k_plpl(2, :)) + do concurrent (k = 1:pl%nplpl) + lstatpl(k) = (lstatus(indi(k)) .and. lstatus(indj(k))) + end do + + do concurrent (k = 1:pl%nplpl, lstatpl(k)) + pepl(k) = -pl%Gmass(indi(k)) * pl%mass(indj(k)) / norm2(pl%xb(:, indi(k)) - pl%xb(:, indj(k))) + end do + end associate system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(1:npl), lstatus(1:npl)) @@ -116,7 +119,7 @@ module subroutine util_get_energy_momentum_system(self, param) ! Potential energy from the oblateness term if (param%loblatecb) then !$omp simd - do i = 1, npl + do concurrent(i = 1:npl, lstatus(i)) irh(i) = 1.0_DP / norm2(pl%xh(:,i)) end do call obl_pot(npl, cb%Gmass, pl%mass, cb%j2rp2, cb%j4rp4, pl%xh, irh, oblpot) diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index f3dc15d3e..a71e4439c 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -11,7 +11,7 @@ module subroutine whm_util_append_pl(self, source, lsource_mask) !! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(in) :: source !! Source object to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to select type(source) class is (whm_pl) From ec70fc66caa1657c9e20a7dd255dfbbf5bf17353 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 18:36:53 -0400 Subject: [PATCH 48/71] Fixed typo that associated a pl object with a tp one --- src/discard/discard.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 3d65a235d..9c8044c61 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -17,7 +17,7 @@ module subroutine discard_system(self, param) lpl_check = allocated(self%pl_discards) ltp_check = allocated(self%tp_discards) - associate(system => self, tp => self%tp, pl => self%pl, tp_discards => self%tp_discards, pl_discards => self%tp_discards) + associate(system => self, tp => self%tp, pl => self%pl, tp_discards => self%tp_discards, pl_discards => self%pl_discards) lpl_discards = .false. ltp_discards = .false. if (lpl_check) then @@ -31,8 +31,10 @@ module subroutine discard_system(self, param) end if if (lpl_discards .or. ltp_discards) call system%write_discard(param) + if (lpl_discards .and. param%lenergy) call self%conservation_report(param, lterminal=.true.) if (lpl_check) call pl_discards%setup(0,param) if (ltp_check) call tp_discards%setup(0,param) + end associate return From 49ca22a529c12283413b00404c15c17b32c521c9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 19:29:29 -0400 Subject: [PATCH 49/71] Fixed typo. pl_discards -> pl_adds --- src/symba/symba_io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index ba972db8b..faa3d446b 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -253,7 +253,7 @@ module subroutine symba_io_write_discard(self, param) nsub = pl_discards%ncomp(isub) do j = 1, nadd if (iadd <= pl_adds%nbody) then - write(LUN, NAMEFMT) ADD, pl_discards%id(iadd), pl_discards%status(iadd) + write(LUN, NAMEFMT) ADD, pl_adds%id(iadd), pl_adds%status(iadd) write(LUN, VECFMT) pl_adds%xh(1, iadd), pl_adds%xh(2, iadd), pl_adds%xh(3, iadd) write(LUN, VECFMT) pl_adds%vh(1, iadd), pl_adds%vh(2, iadd), pl_adds%vh(3, iadd) else From 741971e5034cfdf68ea2f6bba91d23f7aae6e4d4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 9 Aug 2021 23:06:40 -0400 Subject: [PATCH 50/71] Improved handling of appends --- src/modules/swiftest_classes.f90 | 17 ++- src/modules/symba_classes.f90 | 6 +- src/rmvs/rmvs_util.f90 | 30 ++--- src/symba/symba_fragmentation.f90 | 3 + src/symba/symba_util.f90 | 104 ++++++++--------- src/util/util_append.f90 | 180 +++++++++++++----------------- src/whm/whm_util.f90 | 16 +-- 7 files changed, 171 insertions(+), 185 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 0d7fac843..25f258d0c 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -832,38 +832,43 @@ end subroutine user_kick_getacch_body end interface interface util_append - module subroutine util_append_arr_char_string(arr, source, lsource_mask) + module subroutine util_append_arr_char_string(arr, source, nold, nsrc, lsource_mask) implicit none character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array character(len=STRMAX), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_char_string - module subroutine util_append_arr_DP(arr, source, lsource_mask) + module subroutine util_append_arr_DP(arr, source, nold, nsrc, lsource_mask) implicit none real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_DP - module subroutine util_append_arr_DPvec(arr, source, lsource_mask) + module subroutine util_append_arr_DPvec(arr, source, nold, nsrc, lsource_mask) implicit none real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:,:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_DPvec - module subroutine util_append_arr_I4B(arr, source, lsource_mask) + module subroutine util_append_arr_I4B(arr, source, nold, nsrc, lsource_mask) implicit none integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_I4B - module subroutine util_append_arr_logical(arr, source, lsource_mask) + module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array logical, dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_logical end interface @@ -872,7 +877,7 @@ end subroutine util_append_arr_logical module subroutine util_append_body(self, source, lsource_mask) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(in) :: source !! Source object to append + class(swiftest_body), intent(in) :: source !! Source object to append logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_body diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index e8b5918b3..b80a9cab8 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -488,17 +488,19 @@ end subroutine symba_step_reset_system end interface interface util_append - module subroutine symba_util_append_arr_info(arr, source, lsource_mask) + module subroutine symba_util_append_arr_info(arr, source, nold, nsrc, lsource_mask) implicit none type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_arr_info - module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) + module subroutine symba_util_append_arr_kin(arr, source, nold, nsrc, lsource_mask) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_kinship), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine symba_util_append_arr_kin end interface diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 67a76acb3..3be6130bf 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -15,17 +15,19 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) select type(source) class is (rmvs_pl) - call whm_util_append_pl(self, source, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call whm_util_append_pl(self, source, lsource_mask) - call util_append(self%nenc, source%nenc, lsource_mask) - call util_append(self%tpenc1P, source%tpenc1P, lsource_mask) - call util_append(self%plind, source%plind, lsource_mask) + call util_append(self%nenc, source%nenc, nold, nsrc, lsource_mask) + call util_append(self%tpenc1P, source%tpenc1P, nold, nsrc, lsource_mask) + call util_append(self%plind, source%plind, nold, nsrc, lsource_mask) - ! The following are not implemented as RMVS doesn't make use of fill operations on pl type - ! So they are here as a placeholder in case someone wants to extend the RMVS class for some reason - !call util_append(self%outer, source%outer, lsource_mask) - !call util_append(self%inner, source%inner, lsource_mask) - !call util_append(self%planetocentric, source%planetocentric, lsource_mask) + ! The following are not implemented as RMVS doesn't make use of fill operations on pl type + ! So they are here as a placeholder in case someone wants to extend the RMVS class for some reason + !call util_append(self%outer, source%outer, nold, nsrc, lsource_mask) + !call util_append(self%inner, source%inner, nold, nsrc, lsource_mask) + !call util_append(self%planetocentric, source%planetocentric, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_pl or its descendents!" call util_exit(FAILURE) @@ -48,11 +50,13 @@ module subroutine rmvs_util_append_tp(self, source, lsource_mask) select type(source) class is (rmvs_tp) - call util_append_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class - call util_append(self%lperi, source%lperi, lsource_mask) - call util_append(self%plperP, source%plperP, lsource_mask) - call util_append(self%plencP, source%plencP, lsource_mask) + call util_append(self%lperi, source%lperi, nold, nsrc, lsource_mask) + call util_append(self%plperP, source%plperP, nold, nsrc, lsource_mask) + call util_append(self%plencP, source%plencP, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_tp or its descendents!" call util_exit(FAILURE) diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index 9b82e145a..f7ce51432 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -140,6 +140,9 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + do i = 1, plnew%nbody + write(*,*) i, pl_adds%xb(:,i) + end do pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 37fdca873..9816ab4a2 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine symba_util_append_arr_info(arr, source, lsource_mask) + module subroutine symba_util_append_arr_info(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of particle information type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -10,30 +10,24 @@ module subroutine symba_util_append_arr_info(arr, source, lsource_mask) ! Arguments type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_particle_info), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine symba_util_append_arr_info - module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) + module subroutine symba_util_append_arr_kin(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of kinship type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -41,24 +35,18 @@ module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) ! Arguments type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Destination array type(symba_kinship), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine symba_util_append_arr_kin @@ -77,20 +65,22 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) select type(source) class is (symba_pl) - call util_append_pl(self, source, lsource_mask) ! Note: helio_pl does not have its own append method, so we skip back to the base class - - call util_append(self%lcollision, source%lcollision, lsource_mask) - call util_append(self%lencounter, source%lencounter, lsource_mask) - call util_append(self%lmtiny, source%lmtiny, lsource_mask) - call util_append(self%nplenc, source%nplenc, lsource_mask) - call util_append(self%ntpenc, source%ntpenc, lsource_mask) - call util_append(self%levelg, source%levelg, lsource_mask) - call util_append(self%levelm, source%levelm, lsource_mask) - call util_append(self%isperi, source%isperi, lsource_mask) - call util_append(self%peri, source%peri, lsource_mask) - call util_append(self%atp, source%atp, lsource_mask) - call util_append(self%kin, source%kin, lsource_mask) - call util_append(self%info, source%info, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_pl(self, source, lsource_mask) ! Note: helio_pl does not have its own append method, so we skip back to the base class + + call util_append(self%lcollision, source%lcollision, nold, nsrc, lsource_mask) + call util_append(self%lencounter, source%lencounter, nold, nsrc, lsource_mask) + call util_append(self%lmtiny, source%lmtiny, nold, nsrc, lsource_mask) + call util_append(self%nplenc, source%nplenc, nold, nsrc, lsource_mask) + call util_append(self%ntpenc, source%ntpenc, nold, nsrc, lsource_mask) + call util_append(self%levelg, source%levelg, nold, nsrc, lsource_mask) + call util_append(self%levelm, source%levelm, nold, nsrc, lsource_mask) + call util_append(self%isperi, source%isperi, nold, nsrc, lsource_mask) + call util_append(self%peri, source%peri, nold, nsrc, lsource_mask) + call util_append(self%atp, source%atp, nold, nsrc, lsource_mask) + call util_append(self%kin, source%kin, nold, nsrc, lsource_mask) + call util_append(self%info, source%info, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" call util_exit(FAILURE) @@ -113,19 +103,21 @@ module subroutine symba_util_append_merger(self, source, lsource_mask) ! Internals integer(I4B), dimension(:), allocatable :: ncomp_tmp !! Temporary placeholder for ncomp incase we are appending a symba_pl object to a symba_merger - select type(source) - class is (symba_merger) - call symba_util_append_pl(self, source, lsource_mask) - call util_append(self%ncomp, source%ncomp, lsource_mask) - class is (symba_pl) - call symba_util_append_pl(self, source, lsource_mask) - allocate(ncomp_tmp, mold=source%id) - ncomp_tmp(:) = 0 - call util_append(self%ncomp, ncomp_tmp, lsource_mask) - class default - write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" - call util_exit(FAILURE) - end select + associate(nold => self%nbody, nsrc => source%nbody) + select type(source) + class is (symba_merger) + call symba_util_append_pl(self, source, lsource_mask) + call util_append(self%ncomp, source%ncomp, nold, nsrc, lsource_mask) + class is (symba_pl) + call symba_util_append_pl(self, source, lsource_mask) + allocate(ncomp_tmp, mold=source%id) + ncomp_tmp(:) = 0 + call util_append(self%ncomp, ncomp_tmp, nold, nsrc, lsource_mask) + class default + write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" + call util_exit(FAILURE) + end select + end associate return end subroutine symba_util_append_merger @@ -144,11 +136,13 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) select type(source) class is (symba_tp) - call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class - call util_append(self%nplenc, source%nplenc, lsource_mask) - call util_append(self%levelg, source%levelg, lsource_mask) - call util_append(self%levelm, source%levelm, lsource_mask) + call util_append(self%nplenc, source%nplenc, nold, nsrc, lsource_mask) + call util_append(self%levelg, source%levelg, nold, nsrc, lsource_mask) + call util_append(self%levelm, source%levelm, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class symba_tp or its descendents!" call util_exit(FAILURE) diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index cf0bb4117..221888e4b 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine util_append_arr_char_string(arr, source, lsource_mask) + module subroutine util_append_arr_char_string(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of character string type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -10,30 +10,24 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) ! Arguments character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array character(len=STRMAX), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_char_string - module subroutine util_append_arr_DP(arr, source, lsource_mask) + module subroutine util_append_arr_DP(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of double precision type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -41,30 +35,24 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) ! Arguments real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_DP - module subroutine util_append_arr_DPvec(arr, source, lsource_mask) + module subroutine util_append_arr_DPvec(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of double precision vector type of size (NDIM, n) onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -72,32 +60,26 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) ! Arguments real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array real(DP), dimension(:,:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr, dim=2) + if (.not.allocated(arr)) then + allocate(arr(NDIM, nold+nsrc)) else - allocate(arr(NDIM, nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(1, narr + 1:narr + nsrc) = pack(source(1,:), lsource_mask(:)) - arr(2, narr + 1:narr + nsrc) = pack(source(2,:), lsource_mask(:)) - arr(3, narr + 1:narr + nsrc) = pack(source(3,:), lsource_mask(:)) + arr(1, nold + 1:nold + nsrc) = pack(source(1,1:nsrc), lsource_mask(1:nsrc)) + arr(2, nold + 1:nold + nsrc) = pack(source(2,1:nsrc), lsource_mask(1:nsrc)) + arr(3, nold + 1:nold + nsrc) = pack(source(3,1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_DPvec - module subroutine util_append_arr_I4B(arr, source, lsource_mask) + module subroutine util_append_arr_I4B(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of integer(I4B) onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -105,30 +87,24 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) ! Arguments integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - nsrc = count(lsource_mask) - - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_I4B - module subroutine util_append_arr_logical(arr, source, lsource_mask) + module subroutine util_append_arr_logical(arr, source, nold, nsrc, lsource_mask) !! author: David A. Minton !! !! Append a single array of logical type onto another. If the destination array is not allocated, or is not big enough, this will allocate space for it. @@ -136,24 +112,18 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) ! Arguments logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array logical, dimension(:), allocatable, intent(in) :: source !! Array to append + integer(I4B), intent(in) :: nold, nsrc !! Extend of the old array and the source array, respectively logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: narr, nsrc if (.not. allocated(source)) return - if (allocated(arr)) then - narr = size(arr) + if (.not.allocated(arr)) then + allocate(arr(nold+nsrc)) else - allocate(arr(nsrc)) - narr = 0 + call util_resize(arr, nold + nsrc) end if - nsrc = count(lsource_mask) - - call util_resize(arr, narr + nsrc) - - arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) + arr(nold + 1:nold + nsrc) = pack(source(1:nsrc), lsource_mask(1:nsrc)) return end subroutine util_append_arr_logical @@ -170,27 +140,29 @@ module subroutine util_append_body(self, source, lsource_mask) class(swiftest_body), intent(in) :: source !! Source object to append logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - call util_append(self%name, source%name, lsource_mask) - call util_append(self%id, source%id, lsource_mask) - call util_append(self%status, source%status, lsource_mask) - call util_append(self%ldiscard, source%ldiscard, lsource_mask) - call util_append(self%lmask, source%lmask, lsource_mask) - call util_append(self%mu, source%mu, lsource_mask) - call util_append(self%xh, source%xh, lsource_mask) - call util_append(self%vh, source%vh, lsource_mask) - call util_append(self%xb, source%xb, lsource_mask) - call util_append(self%vb, source%vb, lsource_mask) - call util_append(self%ah, source%ah, lsource_mask) - call util_append(self%aobl, source%aobl, lsource_mask) - call util_append(self%atide, source%atide, lsource_mask) - call util_append(self%agr, source%agr, lsource_mask) - call util_append(self%ir3h, source%ir3h, lsource_mask) - call util_append(self%a, source%a, lsource_mask) - call util_append(self%e, source%e, lsource_mask) - call util_append(self%inc, source%inc, lsource_mask) - call util_append(self%capom, source%capom, lsource_mask) - call util_append(self%omega, source%omega, lsource_mask) - call util_append(self%capm, source%capm, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call util_append(self%name, source%name, nold, nsrc, lsource_mask) + call util_append(self%id, source%id, nold, nsrc, lsource_mask) + call util_append(self%status, source%status, nold, nsrc, lsource_mask) + call util_append(self%ldiscard, source%ldiscard, nold, nsrc, lsource_mask) + call util_append(self%lmask, source%lmask, nold, nsrc, lsource_mask) + call util_append(self%mu, source%mu, nold, nsrc, lsource_mask) + call util_append(self%xh, source%xh, nold, nsrc, lsource_mask) + call util_append(self%vh, source%vh, nold, nsrc, lsource_mask) + call util_append(self%xb, source%xb, nold, nsrc, lsource_mask) + call util_append(self%vb, source%vb, nold, nsrc, lsource_mask) + call util_append(self%ah, source%ah, nold, nsrc, lsource_mask) + call util_append(self%aobl, source%aobl, nold, nsrc, lsource_mask) + call util_append(self%atide, source%atide, nold, nsrc, lsource_mask) + call util_append(self%agr, source%agr, nold, nsrc, lsource_mask) + call util_append(self%ir3h, source%ir3h, nold, nsrc, lsource_mask) + call util_append(self%a, source%a, nold, nsrc, lsource_mask) + call util_append(self%e, source%e, nold, nsrc, lsource_mask) + call util_append(self%inc, source%inc, nold, nsrc, lsource_mask) + call util_append(self%capom, source%capom, nold, nsrc, lsource_mask) + call util_append(self%omega, source%omega, nold, nsrc, lsource_mask) + call util_append(self%capm, source%capm, nold, nsrc, lsource_mask) + end associate self%nbody = count(self%status(:) /= INACTIVE) @@ -212,21 +184,23 @@ module subroutine util_append_pl(self, source, lsource_mask) select type(source) class is (swiftest_pl) - call util_append_body(self, source, lsource_mask) - - call util_append(self%mass, source%mass, lsource_mask) - call util_append(self%Gmass, source%Gmass, lsource_mask) - call util_append(self%rhill, source%rhill, lsource_mask) - call util_append(self%radius, source%radius, lsource_mask) - call util_append(self%xbeg, source%xbeg, lsource_mask) - call util_append(self%xend, source%xend, lsource_mask) - call util_append(self%vbeg, source%vbeg, lsource_mask) - call util_append(self%density, source%density, lsource_mask) - call util_append(self%Ip, source%Ip, lsource_mask) - call util_append(self%rot, source%rot, lsource_mask) - call util_append(self%k2, source%k2, lsource_mask) - call util_append(self%Q, source%Q, lsource_mask) - call util_append(self%tlag, source%tlag, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_body(self, source, lsource_mask) + + call util_append(self%mass, source%mass, nold, nsrc, lsource_mask) + call util_append(self%Gmass, source%Gmass, nold, nsrc, lsource_mask) + call util_append(self%rhill, source%rhill, nold, nsrc, lsource_mask) + call util_append(self%radius, source%radius, nold, nsrc, lsource_mask) + call util_append(self%xbeg, source%xbeg, nold, nsrc, lsource_mask) + call util_append(self%xend, source%xend, nold, nsrc, lsource_mask) + call util_append(self%vbeg, source%vbeg, nold, nsrc, lsource_mask) + call util_append(self%density, source%density, nold, nsrc, lsource_mask) + call util_append(self%Ip, source%Ip, nold, nsrc, lsource_mask) + call util_append(self%rot, source%rot, nold, nsrc, lsource_mask) + call util_append(self%k2, source%k2, nold, nsrc, lsource_mask) + call util_append(self%Q, source%Q, nold, nsrc, lsource_mask) + call util_append(self%tlag, source%tlag, nold, nsrc, lsource_mask) + end associate call self%eucl_index() class default @@ -251,11 +225,13 @@ module subroutine util_append_tp(self, source, lsource_mask) select type(source) class is (swiftest_tp) - call util_append_body(self, source, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_body(self, source, lsource_mask) - call util_append(self%isperi, source%isperi, lsource_mask) - call util_append(self%peri, source%peri, lsource_mask) - call util_append(self%atp, source%atp, lsource_mask) + call util_append(self%isperi, source%isperi, nold, nsrc, lsource_mask) + call util_append(self%peri, source%peri, nold, nsrc, lsource_mask) + call util_append(self%atp, source%atp, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class swiftest_tp or its descendents" call util_exit(FAILURE) diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index a71e4439c..777925889 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -15,13 +15,15 @@ module subroutine whm_util_append_pl(self, source, lsource_mask) select type(source) class is (whm_pl) - call util_append_pl(self, source, lsource_mask) - - call util_append(self%eta, source%eta, lsource_mask) - call util_append(self%muj, source%muj, lsource_mask) - call util_append(self%ir3j, source%ir3j, lsource_mask) - call util_append(self%xj, source%xj, lsource_mask) - call util_append(self%vj, source%vj, lsource_mask) + associate(nold => self%nbody, nsrc => source%nbody) + call util_append_pl(self, source, lsource_mask) + + call util_append(self%eta, source%eta, nold, nsrc, lsource_mask) + call util_append(self%muj, source%muj, nold, nsrc, lsource_mask) + call util_append(self%ir3j, source%ir3j, nold, nsrc, lsource_mask) + call util_append(self%xj, source%xj, nold, nsrc, lsource_mask) + call util_append(self%vj, source%vj, nold, nsrc, lsource_mask) + end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class whm_pl or its descendents" call util_exit(FAILURE) From 56d61d76d26c24f347c94ff24824314ae2baab01 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 08:51:53 -0400 Subject: [PATCH 51/71] Rearranged the extended versions of the append methods so that the operation on the base components happens last. Otherwise, %nbody gets updated too early and the extended components don't get appended properly. Did the same thing for the fill methods for consistency --- src/rmvs/rmvs_util.f90 | 15 ++++----- src/symba/symba_fragmentation.f90 | 4 --- src/symba/symba_util.f90 | 54 +++++++++++++++++-------------- src/util/util_append.f90 | 8 ++--- src/whm/whm_util.f90 | 8 ++--- 5 files changed, 44 insertions(+), 45 deletions(-) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 3be6130bf..ee9ce6932 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -16,8 +16,6 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) select type(source) class is (rmvs_pl) associate(nold => self%nbody, nsrc => source%nbody) - call whm_util_append_pl(self, source, lsource_mask) - call util_append(self%nenc, source%nenc, nold, nsrc, lsource_mask) call util_append(self%tpenc1P, source%tpenc1P, nold, nsrc, lsource_mask) call util_append(self%plind, source%plind, nold, nsrc, lsource_mask) @@ -27,6 +25,8 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) !call util_append(self%outer, source%outer, nold, nsrc, lsource_mask) !call util_append(self%inner, source%inner, nold, nsrc, lsource_mask) !call util_append(self%planetocentric, source%planetocentric, nold, nsrc, lsource_mask) + + call whm_util_append_pl(self, source, lsource_mask) end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_pl or its descendents!" @@ -51,11 +51,11 @@ module subroutine rmvs_util_append_tp(self, source, lsource_mask) select type(source) class is (rmvs_tp) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class - call util_append(self%lperi, source%lperi, nold, nsrc, lsource_mask) call util_append(self%plperP, source%plperP, nold, nsrc, lsource_mask) call util_append(self%plencP, source%plencP, nold, nsrc, lsource_mask) + + call util_append_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_tp or its descendents!" @@ -143,8 +143,6 @@ module subroutine rmvs_util_resize_pl(self, nnew) class(rmvs_pl), intent(inout) :: self !! RMVS massive body object integer(I4B), intent(in) :: nnew !! New size neded - call whm_util_resize_pl(self, nnew) - call util_resize(self%nenc, nnew) call util_resize(self%tpenc1P, nnew) call util_resize(self%plind, nnew) @@ -155,6 +153,7 @@ module subroutine rmvs_util_resize_pl(self, nnew) !call util_resize(self%inner, nnew) !call util_resize(self%planetocentric, nnew) + call whm_util_resize_pl(self, nnew) return end subroutine rmvs_util_resize_pl @@ -168,13 +167,13 @@ module subroutine rmvs_util_resize_tp(self, nnew) class(rmvs_tp), intent(inout) :: self !! RMVS test particle object integer(I4B), intent(in) :: nnew !! New size neded - call util_resize_tp(self, nnew) - call util_resize(self%lperi, nnew) call util_resize(self%plperP, nnew) call util_resize(self%plencP, nnew) call util_resize(self%xheliocentric, nnew) + call util_resize_tp(self, nnew) + return end subroutine rmvs_util_resize_tp diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index f7ce51432..9fb11b6ae 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -140,10 +140,6 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, nstart = pl_adds%nbody + 1 nend = pl_adds%nbody + plnew%nbody call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - do i = 1, plnew%nbody - write(*,*) i, pl_adds%xb(:,i) - end do - pl_adds%ncomp(nstart:nend) = plnew%nbody call plnew%setup(0, param) deallocate(plnew) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 9816ab4a2..90f5a06e5 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -66,8 +66,6 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) select type(source) class is (symba_pl) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_pl(self, source, lsource_mask) ! Note: helio_pl does not have its own append method, so we skip back to the base class - call util_append(self%lcollision, source%lcollision, nold, nsrc, lsource_mask) call util_append(self%lencounter, source%lencounter, nold, nsrc, lsource_mask) call util_append(self%lmtiny, source%lmtiny, nold, nsrc, lsource_mask) @@ -80,6 +78,8 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) call util_append(self%atp, source%atp, nold, nsrc, lsource_mask) call util_append(self%kin, source%kin, nold, nsrc, lsource_mask) call util_append(self%info, source%info, nold, nsrc, lsource_mask) + + call util_append_pl(self, source, lsource_mask) ! Note: helio_pl does not have its own append method, so we skip back to the base class end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" @@ -102,22 +102,26 @@ module subroutine symba_util_append_merger(self, source, lsource_mask) logical, dimension(:), intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals integer(I4B), dimension(:), allocatable :: ncomp_tmp !! Temporary placeholder for ncomp incase we are appending a symba_pl object to a symba_merger + integer(I4B) :: nold, nsrc - associate(nold => self%nbody, nsrc => source%nbody) - select type(source) - class is (symba_merger) - call symba_util_append_pl(self, source, lsource_mask) - call util_append(self%ncomp, source%ncomp, nold, nsrc, lsource_mask) - class is (symba_pl) - call symba_util_append_pl(self, source, lsource_mask) - allocate(ncomp_tmp, mold=source%id) - ncomp_tmp(:) = 0 - call util_append(self%ncomp, ncomp_tmp, nold, nsrc, lsource_mask) - class default - write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" - call util_exit(FAILURE) - end select - end associate + nold = self%nbody + nsrc = source%nbody + select type(source) + class is (symba_merger) + call util_append(self%ncomp, source%ncomp, nold, nsrc, lsource_mask) + call symba_util_append_pl(self, source, lsource_mask) + class is (symba_pl) + allocate(ncomp_tmp, mold=source%id) + ncomp_tmp(:) = 0 + call util_append(self%ncomp, ncomp_tmp, nold, nsrc, lsource_mask) + call symba_util_append_pl(self, source, lsource_mask) + class default + write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" + call util_exit(FAILURE) + end select + + ! Save the number of appended bodies + self%ncomp(nold+1:nold+nsrc) = nsrc return end subroutine symba_util_append_merger @@ -137,11 +141,11 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) select type(source) class is (symba_tp) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class - call util_append(self%nplenc, source%nplenc, nold, nsrc, lsource_mask) call util_append(self%levelg, source%levelg, nold, nsrc, lsource_mask) call util_append(self%levelm, source%levelm, nold, nsrc, lsource_mask) + + call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class symba_tp or its descendents!" @@ -468,10 +472,10 @@ module subroutine symba_util_resize_merger(self, nnew) class(symba_merger), intent(inout) :: self !! SyMBA massive body object integer(I4B), intent(in) :: nnew !! New size neded - call symba_util_resize_pl(self, nnew) - call util_resize(self%ncomp, nnew) + call symba_util_resize_pl(self, nnew) + return end subroutine symba_util_resize_merger @@ -485,8 +489,6 @@ module subroutine symba_util_resize_pl(self, nnew) class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), intent(in) :: nnew !! New size neded - call util_resize_pl(self, nnew) - call util_resize(self%lcollision, nnew) call util_resize(self%lencounter, nnew) call util_resize(self%lmtiny, nnew) @@ -500,6 +502,8 @@ module subroutine symba_util_resize_pl(self, nnew) call util_resize(self%kin, nnew) call util_resize(self%info, nnew) + call util_resize_pl(self, nnew) + return end subroutine symba_util_resize_pl @@ -513,12 +517,12 @@ module subroutine symba_util_resize_tp(self, nnew) class(symba_tp), intent(inout) :: self !! SyMBA test particle object integer(I4B), intent(in) :: nnew !! New size neded - call util_resize_tp(self, nnew) - call util_resize(self%nplenc, nnew) call util_resize(self%levelg, nnew) call util_resize(self%levelm, nnew) + call util_resize_tp(self, nnew) + return end subroutine symba_util_resize_tp diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 221888e4b..dc48f9861 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -185,8 +185,6 @@ module subroutine util_append_pl(self, source, lsource_mask) select type(source) class is (swiftest_pl) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_body(self, source, lsource_mask) - call util_append(self%mass, source%mass, nold, nsrc, lsource_mask) call util_append(self%Gmass, source%Gmass, nold, nsrc, lsource_mask) call util_append(self%rhill, source%rhill, nold, nsrc, lsource_mask) @@ -200,6 +198,8 @@ module subroutine util_append_pl(self, source, lsource_mask) call util_append(self%k2, source%k2, nold, nsrc, lsource_mask) call util_append(self%Q, source%Q, nold, nsrc, lsource_mask) call util_append(self%tlag, source%tlag, nold, nsrc, lsource_mask) + + call util_append_body(self, source, lsource_mask) end associate call self%eucl_index() @@ -226,11 +226,11 @@ module subroutine util_append_tp(self, source, lsource_mask) select type(source) class is (swiftest_tp) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_body(self, source, lsource_mask) - call util_append(self%isperi, source%isperi, nold, nsrc, lsource_mask) call util_append(self%peri, source%peri, nold, nsrc, lsource_mask) call util_append(self%atp, source%atp, nold, nsrc, lsource_mask) + + call util_append_body(self, source, lsource_mask) end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class swiftest_tp or its descendents" diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 777925889..cc84ba3d5 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -16,13 +16,13 @@ module subroutine whm_util_append_pl(self, source, lsource_mask) select type(source) class is (whm_pl) associate(nold => self%nbody, nsrc => source%nbody) - call util_append_pl(self, source, lsource_mask) - call util_append(self%eta, source%eta, nold, nsrc, lsource_mask) call util_append(self%muj, source%muj, nold, nsrc, lsource_mask) call util_append(self%ir3j, source%ir3j, nold, nsrc, lsource_mask) call util_append(self%xj, source%xj, nold, nsrc, lsource_mask) call util_append(self%vj, source%vj, nold, nsrc, lsource_mask) + + call util_append_pl(self, source, lsource_mask) end associate class default write(*,*) "Invalid object passed to the append method. Source must be of class whm_pl or its descendents" @@ -76,14 +76,14 @@ module subroutine whm_util_resize_pl(self, nnew) class(whm_pl), intent(inout) :: self !! WHM massive body object integer(I4B), intent(in) :: nnew !! New size neded - call util_resize_pl(self, nnew) - call util_resize(self%eta, nnew) call util_resize(self%xj, nnew) call util_resize(self%vj, nnew) call util_resize(self%muj, nnew) call util_resize(self%ir3j, nnew) + call util_resize_pl(self, nnew) + return end subroutine whm_util_resize_pl From 0d158a5b496b2761f3d0f56cd729967b3291eb06 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 08:53:51 -0400 Subject: [PATCH 52/71] Commented out diagnostic write statement in the fragmentation initialization procedure --- src/fragmentation/fragmentation.f90 | 37 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index f4ff3b4ce..9d9718bfa 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -133,25 +133,24 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, call restore_scale_factors() call calculate_system_energy(linclude_fragments=.true.) - - write(*, "(' -------------------------------------------------------------------------------------')") - write(*, "(' Final diagnostic')") - write(*, "(' -------------------------------------------------------------------------------------')") - if (lfailure) then - write(*,*) "symba_frag_pos failed after: ",try," tries" - do ii = 1, nfrag - vb_frag(:, ii) = vcom(:) - end do - else - write(*,*) "symba_frag_pos succeeded after: ",try," tries" - write(*, "(' dL_tot should be very small' )") - write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before - write(*, "(' dE_tot should be negative and equal to Qloss' )") - write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) - write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) - write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) - end if - write(*, "(' -------------------------------------------------------------------------------------')") + ! write(*, "(' -------------------------------------------------------------------------------------')") + ! write(*, "(' Final diagnostic')") + ! write(*, "(' -------------------------------------------------------------------------------------')") + ! if (lfailure) then + ! write(*,*) "symba_frag_pos failed after: ",try," tries" + ! do ii = 1, nfrag + ! vb_frag(:, ii) = vcom(:) + ! end do + ! else + ! write(*,*) "symba_frag_pos succeeded after: ",try," tries" + ! write(*, "(' dL_tot should be very small' )") + ! write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before + ! write(*, "(' dE_tot should be negative and equal to Qloss' )") + ! write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) + ! write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) + ! write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) + ! end if + ! write(*, "(' -------------------------------------------------------------------------------------')") call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily From e48c71b9065d840529cbaaae99e9310cfb9f5477 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 09:13:43 -0400 Subject: [PATCH 53/71] Removed simd directives and replaced with do concurrent with block for private variables --- src/util/util_get_energy_momentum.f90 | 88 +++++++++++++-------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 55d05e823..700ecbe40 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -15,12 +15,12 @@ module subroutine util_get_energy_momentum_system(self, param) ! Internals integer(I4B) :: i, j integer(I8B) :: k - real(DP) :: rmag, v2, rot2, oblpot, hx, hy, hz, hsx, hsy, hsz - real(DP) :: kecb, kespincb, Lcborbitx, Lcborbity, Lcborbitz, Lcbspinx, Lcbspiny, Lcbspinz + real(DP) :: oblpot, kecb, kespincb real(DP), dimension(self%pl%nbody) :: irh, kepl, kespinpl, pecb real(DP), dimension(self%pl%nbody) :: Lplorbitx, Lplorbity, Lplorbitz real(DP), dimension(self%pl%nbody) :: Lplspinx, Lplspiny, Lplspinz real(DP), dimension(self%pl%nplpl) :: pepl + real(DP), dimension(NDIM) :: Lcborbit, Lcbspin logical, dimension(self%pl%nplpl) :: lstatpl logical, dimension(self%pl%nbody) :: lstatus @@ -40,52 +40,48 @@ module subroutine util_get_energy_momentum_system(self, param) lstatus(1:npl) = pl%status(1:npl) /= INACTIVE kecb = cb%mass * dot_product(cb%vb(:), cb%vb(:)) - hx = cb%xb(2) * cb%vb(3) - cb%xb(3) * cb%vb(2) - hy = cb%xb(3) * cb%vb(1) - cb%xb(1) * cb%vb(3) - hz = cb%xb(1) * cb%vb(2) - cb%xb(2) * cb%vb(1) - Lcborbitx = cb%mass * hx - Lcborbity = cb%mass * hy - Lcborbitz = cb%mass * hz - !!$omp simd private(v2, rot2, hx, hy, hz) - do i = 1, npl - v2 = dot_product(pl%vb(:,i), pl%vb(:,i)) - hx = pl%xb(2,i) * pl%vb(3,i) - pl%xb(3,i) * pl%vb(2,i) - hy = pl%xb(3,i) * pl%vb(1,i) - pl%xb(1,i) * pl%vb(3,i) - hz = pl%xb(1,i) * pl%vb(2,i) - pl%xb(2,i) * pl%vb(1,i) + Lcborbit(:) = cb%mass * cb%xb(:) .cross. cb%vb(:) - ! Angular momentum from orbit - Lplorbitx(i) = pl%mass(i) * hx - Lplorbity(i) = pl%mass(i) * hy - Lplorbitz(i) = pl%mass(i) * hz + do concurrent (i = 1:npl, lstatus(i)) + block ! We use a block construct to prevent generating temporary arrays for local variables + real(DP) :: v2, hx, hy, hz + v2 = dot_product(pl%vb(:,i), pl%vb(:,i)) + hx = pl%xb(2,i) * pl%vb(3,i) - pl%xb(3,i) * pl%vb(2,i) + hy = pl%xb(3,i) * pl%vb(1,i) - pl%xb(1,i) * pl%vb(3,i) + hz = pl%xb(1,i) * pl%vb(2,i) - pl%xb(2,i) * pl%vb(1,i) + + ! Angular momentum from orbit + Lplorbitx(i) = pl%mass(i) * hx + Lplorbity(i) = pl%mass(i) * hy + Lplorbitz(i) = pl%mass(i) * hz - ! Kinetic energy from orbit and spin - kepl(i) = pl%mass(i) * v2 + ! Kinetic energy from orbit and spin + kepl(i) = pl%mass(i) * v2 + end block end do if (param%lrotation) then kespincb = cb%mass * cb%Ip(3) * cb%radius**2 * dot_product(cb%rot(:), cb%rot(:)) - ! For simplicity, we always assume that the rotation pole is the 3rd principal axis - hsx = cb%Ip(3) * cb%radius**2 * cb%rot(1) - hsy = cb%Ip(3) * cb%radius**2 * cb%rot(2) - hsz = cb%Ip(3) * cb%radius**2 * cb%rot(3) - ! Angular momentum from spin - Lcbspinx = cb%mass * hsx - Lcbspiny = cb%mass * hsy - Lcbspinz = cb%mass * hsz + ! For simplicity, we always assume that the rotation pole is the 3rd principal axis + Lcbspin(:) = cb%Ip(3) * cb%mass * cb%radius**2 * cb%rot(:) - do i = 1, npl - rot2 = dot_product(pl%rot(:,i), pl%rot(:,i)) - ! For simplicity, we always assume that the rotation pole is the 3rd principal axis - hsx = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(1,i) - hsy = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(2,i) - hsz = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(3,i) + do concurrent (i = 1:npl, lstatus(i)) + block + real(DP) :: rot2, hsx, hsy, hsz - ! Angular momentum from spin - Lplspinx(i) = pl%mass(i) * hsx - Lplspiny(i) = pl%mass(i) * hsy - Lplspinz(i) = pl%mass(i) * hsz - kespinpl(i) = pl%mass(i) * pl%Ip(3, i) * pl%radius(i)**2 * rot2 + rot2 = dot_product(pl%rot(:,i), pl%rot(:,i)) + ! For simplicity, we always assume that the rotation pole is the 3rd principal axis + hsx = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(1,i) + hsy = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(2,i) + hsz = pl%Ip(3,i) * pl%radius(i)**2 * pl%rot(3,i) + + ! Angular momentum from spin + Lplspinx(i) = pl%mass(i) * hsx + Lplspiny(i) = pl%mass(i) * hsy + Lplspinz(i) = pl%mass(i) * hsz + kespinpl(i) = pl%mass(i) * pl%Ip(3, i) * pl%radius(i)**2 * rot2 + end block end do else kespincb = 0.0_DP @@ -93,7 +89,6 @@ module subroutine util_get_energy_momentum_system(self, param) end if ! Do the central body potential energy component first - !$omp simd associate(px => pl%xb(1,:), py => pl%xb(2,:), pz => pl%xb(3,:)) do concurrent(i = 1:npl, lstatus(i)) pecb(i) = -cb%Gmass * pl%mass(i) / sqrt(px(i)**2 + py(i)**2 + pz(i)**2) @@ -118,7 +113,6 @@ module subroutine util_get_energy_momentum_system(self, param) ! Potential energy from the oblateness term if (param%loblatecb) then - !$omp simd do concurrent(i = 1:npl, lstatus(i)) irh(i) = 1.0_DP / norm2(pl%xh(:,i)) end do @@ -126,14 +120,14 @@ module subroutine util_get_energy_momentum_system(self, param) system%pe = system%pe + oblpot end if - system%Lorbit(1) = Lcborbitx + sum(Lplorbitx(1:npl), lstatus(1:npl)) - system%Lorbit(2) = Lcborbity + sum(Lplorbity(1:npl), lstatus(1:npl)) - system%Lorbit(3) = Lcborbitz + sum(Lplorbitz(1:npl), lstatus(1:npl)) + system%Lorbit(1) = Lcborbit(1) + sum(Lplorbitx(1:npl), lstatus(1:npl)) + system%Lorbit(2) = Lcborbit(2) + sum(Lplorbity(1:npl), lstatus(1:npl)) + system%Lorbit(3) = Lcborbit(3) + sum(Lplorbitz(1:npl), lstatus(1:npl)) if (param%lrotation) then - system%Lspin(1) = Lcbspinx + sum(Lplspinx(1:npl), lstatus(1:npl)) - system%Lspin(2) = Lcbspiny + sum(Lplspiny(1:npl), lstatus(1:npl)) - system%Lspin(3) = Lcbspinz + sum(Lplspinz(1:npl), lstatus(1:npl)) + system%Lspin(1) = Lcbspin(1) + sum(Lplspinx(1:npl), lstatus(1:npl)) + system%Lspin(2) = Lcbspin(2) + sum(Lplspiny(1:npl), lstatus(1:npl)) + system%Lspin(3) = Lcbspin(3) + sum(Lplspinz(1:npl), lstatus(1:npl)) end if end associate From d6572812d208361dabd4a51d8325ad5d4cf294ab Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 10:06:43 -0400 Subject: [PATCH 54/71] Removed need for sla library and also changed Mass to GMass for consistency --- .../symba_energy_momentum/collision_movie.py | 313 ++++++++++++++++++ python/swiftest/swiftest/io.py | 38 +-- python/swiftest/swiftest/simulation_class.py | 9 + python/swiftest/swiftest/tool.py | 16 +- 4 files changed, 350 insertions(+), 26 deletions(-) create mode 100644 examples/symba_energy_momentum/collision_movie.py diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py new file mode 100644 index 000000000..c3c1cf112 --- /dev/null +++ b/examples/symba_energy_momentum/collision_movie.py @@ -0,0 +1,313 @@ +import swiftest +import numpy as np +import matplotlib.pyplot as plt +from matplotlib import animation +import matplotlib.collections as clt +from scipy.spatial.transform import Rotation as R + +xmin = -20.0 +xmax = 20.0 +ymin = -20.0 +ymax = 20.0 + +#cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] +cases = ['disruption_off'] + +def scale_sim(ds, param): + + dsscale = ds + + dsscale['Mass'] = ds['Mass'] / param['GU'] + Mtot = dsscale['Mass'].sum(skipna=True, dim="id").isel(time=0) + rscale = sum(ds['Radius'].sel(id=[2, 3], time=0)).item() + ds['Radius'] /= rscale + + dsscale['radmarker'] = dsscale['Radius'].fillna(0) + + dsscale['px'] /= rscale + dsscale['py'] /= rscale + dsscale['pz'] /= rscale + + mpx = dsscale['Mass'] * dsscale['px'] + mpy = dsscale['Mass'] * dsscale['py'] + mpz = dsscale['Mass'] * dsscale['pz'] + xbsys = mpx.sum(skipna=True, dim="id") / Mtot + ybsys = mpy.sum(skipna=True, dim="id") / Mtot + zbsys = mpz.sum(skipna=True, dim="id") / Mtot + + mvx = dsscale['Mass'] * dsscale['vx'] + mvy = dsscale['Mass'] * dsscale['vy'] + mvz = dsscale['Mass'] * dsscale['vz'] + vxbsys = mvx.sum(skipna=True, dim="id") / Mtot + vybsys = mvy.sum(skipna=True, dim="id") / Mtot + vzbsys = mvz.sum(skipna=True, dim="id") / Mtot + + dsscale['pxb'] = dsscale['px'] - xbsys + dsscale['pyb'] = dsscale['py'] - ybsys + dsscale['pzb'] = dsscale['pz'] - zbsys + + dsscale['vxb'] = dsscale['vx'] - vxbsys + dsscale['vyb'] = dsscale['vy'] - vybsys + dsscale['vzb'] = dsscale['vz'] - vzbsys + + return dsscale + +class UpdatablePatchCollection(clt.PatchCollection): + def __init__(self, patches, *args, **kwargs): + self.patches = patches + clt.PatchCollection.__init__(self, patches, *args, **kwargs) + + def get_paths(self): + self.set_paths(self.patches) + return self._paths + +class AnimatedScatter(object): + """An animated scatter plot using matplotlib.animations.FuncAnimation.""" + + def __init__(self, ds, param): + + frame = 0 + nframes = ds['time'].size + self.ds = scale_sim(ds, param) + self.param = param + self.rot_angle = {} + + self.clist = {'Initial conditions' : 'xkcd:windows blue', + 'Disruption' : 'xkcd:baby poop', + 'Supercatastrophic' : 'xkcd:shocking pink', + 'Hit and run fragment' : 'xkcd:blue with a hint of purple', + 'Central body' : 'xkcd:almost black'} + + self.stream = self.data_stream(frame) + # Setup the figure and axes... + self.fig, self.ax = plt.subplots(figsize=(8,8)) + # Then setup FuncAnimation. + self.ani = animation.FuncAnimation(self.fig, self.update, interval=1, frames=nframes, + init_func=self.setup_plot, blit=False) + self.ani.save(animfile, fps=60, dpi=300, + extra_args=['-vcodec', 'mpeg4']) + + def plot_pl_circles(self, pl, radmarker): + patches = [] + for i in range(pl.shape[0]): + s = plt.Circle((pl[i, 0], pl[i, 1]), radmarker[i]) + patches.append(s) + return patches + + def vec_props(self, c): + arrowprops = { + 'arrowstyle': '<|-', + 'mutation_scale': 20, + 'connectionstyle': 'arc3', + } + + arrow_args = { + 'xycoords': 'data', + 'textcoords': 'data', + 'arrowprops': arrowprops, + 'annotation_clip': True, + 'zorder': 100, + 'animated' : True + } + aarg = arrow_args.copy() + aprop = arrowprops.copy() + aprop['color'] = c + aarg['arrowprops'] = aprop + aarg['color'] = c + return aarg + + def plot_pl_vectors(self, pl, cval, r): + varrowend, varrowtip = self.velocity_vectors(pl, r) + arrows = [] + for i in range(pl.shape[0]): + aarg = self.vec_props(cval[i]) + a = self.ax.annotate("",xy=varrowend[i],xytext=varrowtip[i], **aarg) + arrows.append(a) + return arrows + + def plot_pl_spins(self, pl, id, cval, len): + sarrowend, sarrowtip = self.spin_arrows(pl, id, len) + arrows = [] + for i in range(pl.shape[0]): + aarg = self.vec_props(cval[i]) + aarg['arrowprops']['mutation_scale'] = 5 + aarg['arrowprops']['arrowstyle'] = "simple" + a = self.ax.annotate("",xy=sarrowend[i],xytext=sarrowtip[i], **aarg) + arrows.append(a) + return arrows + + def origin_to_color(self, origin): + cval = [] + for o in origin: + c = self.clist[o] + cval.append(c) + + return cval + + def velocity_vectors(self, pl, r): + px = pl[:, 0] + py = pl[:, 1] + vx = pl[:, 2] + vy = pl[:, 3] + vmag = np.sqrt(vx ** 2 + vy ** 2) + ux = np.zeros_like(vx) + uy = np.zeros_like(vx) + goodv = vmag > 0.0 + ux[goodv] = vx[goodv] / vmag[goodv] + uy[goodv] = vy[goodv] / vmag[goodv] + varrowend = [] + varrowtip = [] + for i in range(pl.shape[0]): + vend = (px[i], py[i]) + vtip = (px[i] + vx[i] * self.v_length, py[i] + vy[i] * self.v_length) + varrowend.append(vend) + varrowtip.append(vtip) + return varrowend, varrowtip + + def spin_arrows(self, pl, id, len): + px = pl[:, 0] + py = pl[:, 1] + sarrowend = [] + sarrowtip = [] + for i in range(pl.shape[0]): + endrel = np.array([0.0, len[i], 0.0]) + tiprel = np.array([0.0, -len[i], 0.0]) + r = R.from_rotvec(self.rot_angle[id[i]]) + endrel = r.apply(endrel) + tiprel = r.apply(tiprel) + send = (px[i] + endrel[0], py[i] + endrel[1]) + stip = (px[i] + tiprel[0], py[i] + tiprel[1]) + sarrowend.append(send) + sarrowtip.append(stip) + return sarrowend, sarrowtip + + def setup_plot(self): + # First frame + """Initial drawing of the scatter plot.""" + t, name, Mass, Radius, npl, pl, radmarker, origin = next(self.data_stream(0)) + + cval = self.origin_to_color(origin) + # set up the figure + self.ax = plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax)) + plt.axis('off') + plt.tight_layout(pad=0) + self.ax.set_aspect(1) + self.ax.get_xaxis().set_visible(False) + self.ax.get_yaxis().set_visible(False) + + # Scale markers to the size of the system + self.v_length = 0.50 # Length of arrow as fraction of velocity + + self.ax.margins(x=1, y=1) + self.ax.set_xlabel('x distance / ($R_1 + R_2$)', fontsize='16', labelpad=1) + self.ax.set_ylabel('y distance / ($R_1 + R_2$)', fontsize='16', labelpad=1) + + self.title = self.ax.text(0.50, 0.90, "", bbox={'facecolor': 'w', 'pad': 5}, transform=self.ax.transAxes, + ha="center", zorder=1000) + + self.title.set_text(titletext) + self.patches = self.plot_pl_circles(pl, radmarker) + + self.collection = UpdatablePatchCollection(self.patches, color=cval, alpha=0.5, zorder=50) + self.ax.add_collection(self.collection) + #self.varrows = self.plot_pl_vectors(pl, cval, radmarker) + self.sarrows = self.plot_pl_spins(pl, name, cval, radmarker) + + return self.collection, self.sarrows + + def update(self,frame): + """Update the scatter plot.""" + t, name, Mass, Radius, npl, pl, radmarker, origin = next(self.data_stream(frame)) + cval = self.origin_to_color(origin) + #varrowend, varrowtip = self.velocity_vectors(pl, radmarker) + sarrowend, sarrowtip = self.spin_arrows(pl, name, radmarker) + for i, p in enumerate(self.patches): + p.set_center((pl[i, 0], pl[i,1])) + p.set_radius(radmarker[i]) + p.set_color(cval[i]) + #self.varrows[i].set_position(varrowtip[i]) + #self.varrows[i].xy = varrowend[i] + self.sarrows[i].set_position(sarrowtip[i]) + self.sarrows[i].xy = sarrowend[i] + + self.collection.set_paths(self.patches) + return self.collection, self.sarrows + + def data_stream(self, frame=0): + while True: + d = self.ds.isel(time=frame) + Radius = d['radmarker'].values + Mass = d['Mass'].values + x = d['pxb'].values + y = d['pyb'].values + vx = d['vxb'].values + vy = d['vyb'].values + name = d['id'].values + npl = d['npl'].values + id = d['id'].values + rotx = d['rot_x'].values + roty = d['rot_y'].values + rotz = d['rot_z'].values + + radmarker = d['radmarker'].values + origin = d['origin_type'].values + + t = self.ds.coords['time'].values[frame] + self.mask = np.logical_not(np.isnan(x)) + + x = np.nan_to_num(x, copy=False) + y = np.nan_to_num(y, copy=False) + vx = np.nan_to_num(vx, copy=False) + vy = np.nan_to_num(vy, copy=False) + radmarker = np.nan_to_num(radmarker, copy=False) + Mass = np.nan_to_num(Mass, copy=False) + Radius = np.nan_to_num(Radius, copy=False) + rotx = np.nan_to_num(rotx, copy=False) + roty = np.nan_to_num(roty, copy=False) + rotz = np.nan_to_num(rotz, copy=False) + rotvec = np.array([rotx, roty, rotz]) + self.rotvec = dict(zip(id, zip(*rotvec))) + + if frame == 0: + tmp = np.zeros_like(rotvec) + self.rot_angle = dict(zip(id, zip(*tmp))) + else: + t0 = self.ds.coords['time'].values[frame-1] + dt = t - t0 + idxactive = np.arange(id.size)[self.mask] + for i in id[idxactive]: + self.rot_angle[i] = self.rot_angle[i] + dt * np.array(self.rotvec[i]) + frame += 1 + yield t, name, Mass, Radius, npl, np.c_[x, y, vx, vy], radmarker, origin + +for case in cases: + if case == 'supercat_off': + animfile = 'movies/supercat_off_axis.mp4' + titletext = "Supercatastrophic - Off Axis" + paramfile = 'param.supercatastrophic_off_axis.in' + elif case == 'supercat_head': + animfile = 'movies/supercat_headon.mp4' + titletext = "Supercatastrophic - Head on" + paramfile = 'param.supercatastrophic_headon.in' + elif case == 'disruption_off': + animfile = 'movies/disruption_off_axis.mp4' + titletext = "Disruption - Off Axis" + paramfile = 'param.disruption_off_axis.in' + elif case == 'disruption_head': + animfile = 'movies/disruption_headon.mp4' + titletext = "Disruption- Head on" + paramfile = 'param.disruption_headon.in' + elif case == 'merger': + animfile = 'movies/merger.mp4' + titletext = "Merger" + paramfile = 'param.merger.in' + else: + print(f'{case} is an unknown case') + exit(-1) + sim = swiftest.Simulation(param_file=paramfile) + sim.bin2xr() + ds = sim.ds + print('Making animation') + anim = AnimatedScatter(ds,sim.param) + print('Animation finished') + plt.close(fig='all') diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 81840ba05..37f3370fd 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -318,7 +318,7 @@ def swifter_stream(f, param): plid : int array IDs of massive bodies pvec : float array - (npl,N) - vector of N quantities or each particle (6 of XV/EL + Mass, Radius, etc) + (npl,N) - vector of N quantities or each particle (6 of XV/EL + GMass, Radius, etc) plab : string list Labels for the pvec data ntp : int @@ -376,7 +376,7 @@ def swifter_stream(f, param): tlab.append('omega') tlab.append('capm') plab = tlab.copy() - plab.append('Mass') + plab.append('GMass') plab.append('Radius') pvec = np.vstack([pvec, Mpl, Rpl]) @@ -401,11 +401,11 @@ def make_swiftest_labels(param): tlab.append('omega') tlab.append('capm') plab = tlab.copy() - plab.append('Mass') + plab.append('GMass') plab.append('Radius') if param['RHILL_PRESENT'] == 'YES': plab.append('Rhill') - clab = ['Mass', 'Radius', 'J_2', 'J_4'] + clab = ['GMass', 'Radius', 'J_2', 'J_4'] if param['ROTATION'] == 'YES': clab.append('Ip_x') clab.append('Ip_y') @@ -443,13 +443,13 @@ def swiftest_stream(f, param): cbid : int array ID of central body (always returns 0) cvec : float array - (npl,1) - vector of quantities for the massive body (Mass, Radius, J2, J4, etc) + (npl,1) - vector of quantities for the massive body (GMass, Radius, J2, J4, etc) npl : int Number of massive bodies plid : int array IDs of massive bodies pvec : float array - (npl,N) - vector of N quantities or each particle (6 of XV/EL + Mass, Radius, etc) + (npl,N) - vector of N quantities or each particle (6 of XV/EL + GMass, Radius, etc) plab : string list Labels for the pvec data ntp : int @@ -656,10 +656,10 @@ def swiftest_xr2infile(ds, param, framenum=-1): frame = ds.isel(time=framenum) cb = frame.where(frame.id == 0, drop=True) pl = frame.where(frame.id > 0, drop=True) - pl = pl.where(np.invert(np.isnan(pl['Mass'])), drop=True).drop_vars(['J_2', 'J_4']) - tp = frame.where(np.isnan(frame['Mass']), drop=True).drop_vars(['Mass', 'Radius', 'J_2', 'J_4']) + pl = pl.where(np.invert(np.isnan(pl['GMass'])), drop=True).drop_vars(['J_2', 'J_4']) + tp = frame.where(np.isnan(frame['GMass']), drop=True).drop_vars(['GMass', 'Radius', 'J_2', 'J_4']) - GMSun = np.double(cb['Mass']) + GMSun = np.double(cb['GMass']) RSun = np.double(cb['Radius']) J2 = np.double(cb['J_2']) J4 = np.double(cb['J_4']) @@ -680,9 +680,9 @@ def swiftest_xr2infile(ds, param, framenum=-1): for i in pl.id: pli = pl.sel(id=i) if param['RHILL_PRESENT'] == 'YES': - print(i.values, pli['Mass'].values, pli['Rhill'].values, file=plfile) + print(i.values, pli['GMass'].values, pli['Rhill'].values, file=plfile) else: - print(i.values, pli['Mass'].values, file=plfile) + print(i.values, pli['GMass'].values, file=plfile) print(pli['Radius'].values, file=plfile) print(pli['px'].values, pli['py'].values, pli['pz'].values, file=plfile) print(pli['vx'].values, pli['vy'].values, pli['vz'].values, file=plfile) @@ -716,7 +716,7 @@ def swiftest_xr2infile(ds, param, framenum=-1): vx = pl['vx'].values vy = pl['vy'].values vz = pl['vz'].values - mass = pl['Mass'].values + Gmass = pl['GMass'].values radius = pl['Radius'].values plfile.write_record(npl) @@ -727,7 +727,7 @@ def swiftest_xr2infile(ds, param, framenum=-1): plfile.write_record(vx) plfile.write_record(vy) plfile.write_record(vz) - plfile.write_record(mass) + plfile.write_record(Gmass) if param['RHILL_PRESENT'] == 'YES': rhill = pl['Rhill'].values plfile.write_record(rhill) @@ -774,10 +774,10 @@ def swifter_xr2infile(ds, param, framenum=-1): frame = ds.isel(time=framenum) cb = frame.where(frame.id == 0, drop=True) pl = frame.where(frame.id > 0, drop=True) - pl = pl.where(np.invert(np.isnan(pl['Mass'])), drop=True).drop_vars(['J_2', 'J_4']) - tp = frame.where(np.isnan(frame['Mass']), drop=True).drop_vars(['Mass', 'Radius', 'J_2', 'J_4']) + pl = pl.where(np.invert(np.isnan(pl['GMass'])), drop=True).drop_vars(['J_2', 'J_4']) + tp = frame.where(np.isnan(frame['GMass']), drop=True).drop_vars(['GMass', 'Radius', 'J_2', 'J_4']) - GMSun = np.double(cb['Mass']) + GMSun = np.double(cb['GMass']) RSun = np.double(cb['Radius']) param['J2'] = np.double(cb['J_2']) param['J4'] = np.double(cb['J_4']) @@ -786,15 +786,15 @@ def swifter_xr2infile(ds, param, framenum=-1): # Swiftest Central body file plfile = open(param['PL_IN'], 'w') print(pl.id.count().values + 1, file=plfile) - print(cb.id.values[0], cb['Mass'].values[0], file=plfile) + print(cb.id.values[0], cb['GMass'].values[0], file=plfile) print('0.0 0.0 0.0', file=plfile) print('0.0 0.0 0.0', file=plfile) for i in pl.id: pli = pl.sel(id=i) if param['RHILL_PRESENT'] == "YES": - print(i.values, pli['Mass'].values, pli['Rhill'].values, file=plfile) + print(i.values, pli['GMass'].values, pli['Rhill'].values, file=plfile) else: - print(i.values, pli['Mass'].values, file=plfile) + print(i.values, pli['GMass'].values, file=plfile) if param['CHK_CLOSE'] == "YES": print(pli['Radius'].values, file=plfile) print(pli['px'].values, pli['py'].values, pli['pz'].values, file=plfile) diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index 05b6896b1..bea59ae5f 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -52,6 +52,7 @@ def __init__(self, codename="Swiftest", param_file=""): self.read_param(param_file, codename) return + def add(self, plname, date=date.today().isoformat(), idval=None): """ Adds a solar system body to an existing simulation DataSet. @@ -69,6 +70,7 @@ def add(self, plname, date=date.today().isoformat(), idval=None): self.ds = init_cond.solar_system_horizons(plname, idval, self.param, date, self.ds) return + def read_param(self, param_file, codename="Swiftest"): if codename == "Swiftest": self.param = io.read_swiftest_param(param_file, self.param) @@ -84,6 +86,7 @@ def read_param(self, param_file, codename="Swiftest"): self.codename = "Unknown" return + def write_param(self, param_file, param=None): if param is None: param = self.param @@ -97,6 +100,7 @@ def write_param(self, param_file, param=None): print('Cannot process unknown code type. Call the read_param method with a valid code name. Valid options are "Swiftest", "Swifter", or "Swift".') return + def convert(self, param_file, newcodename="Swiftest", plname="pl.swiftest.in", tpname="tp.swiftest.in", cbname="cb.swiftest.in", conversion_questions={}): """ Converts simulation input files from one code type to another (Swift, Swifter, or Swiftest). Returns the old parameter configuration. @@ -130,6 +134,7 @@ def convert(self, param_file, newcodename="Swiftest", plname="pl.swiftest.in", t print(f"Conversion from {self.codename} to {newcodename} is not supported.") return oldparam + def bin2xr(self): if self.codename == "Swiftest": self.ds = io.swiftest2xr(self.param) @@ -143,6 +148,7 @@ def bin2xr(self): print('Cannot process unknown code type. Call the read_param method with a valid code name. Valid options are "Swiftest", "Swifter", or "Swift".') return + def follow(self, codestyle="Swifter"): if self.ds is None: self.bin2xr() @@ -163,10 +169,13 @@ def follow(self, codestyle="Swifter"): ifol = None nskp = None fol = tool.follow_swift(self.ds, ifol=ifol, nskp=nskp) + else: + fol = None print('follow.out written') return fol + def save(self, param_file, framenum=-1, codename="Swiftest"): if codename == "Swiftest": io.swiftest_xr2infile(self.ds, self.param, framenum) diff --git a/python/swiftest/swiftest/tool.py b/python/swiftest/swiftest/tool.py index 741dc0f1b..a96610bc2 100644 --- a/python/swiftest/swiftest/tool.py +++ b/python/swiftest/swiftest/tool.py @@ -2,15 +2,17 @@ import numpy as np import os import glob -from pyslalib import slalib import xarray as xr """ Functions that recreate the Swift/Swifter tool programs """ -def sla_dranrm(angle): - func = np.vectorize(slalib.sla_dranrm) - return xr.apply_ufunc(func, angle) +def wrap_angle(angle): + while np.any(angle >= 2 * np.pi): + angle[angle >= 2 * np.pi] -= 2 * np.pi + while np.any(angle < 0.0): + angle[angle < 0.0] += 2 * np.pi + return angle def follow_swift(ds, ifol=None, nskp=None): """ @@ -36,11 +38,11 @@ def follow_swift(ds, ifol=None, nskp=None): ifol = int(intxt) print(f"Following particle {ifol}") if ifol < 0: # Negative numbers are planets - fol = ds.where(np.invert(np.isnan(ds['Mass'])), drop=True) + fol = ds.where(np.invert(np.isnan(ds['GMass'])), drop=True) fol = fol.where(np.invert(np.isnan(fol['a'])), drop=True) # Remove times where this body doesn't exist (but this also gets rid of the central body) fol = fol.isel(id = -ifol - 2) # Take 1 off for 0-indexed arrays in Python, and take 1 more off because the central body is gone elif ifol > 0: # Positive numbers are test particles - fol = ds.where(np.isnan(ds['Mass']), drop=True).drop_vars(['Mass', 'Radius']) + fol = ds.where(np.isnan(ds['GMass']), drop=True).drop_vars(['GMass', 'Radius']) fol = fol.where(np.invert(np.isnan(fol['a'])), drop=True) fol = fol.isel(id = ifol - 1) # Take 1 off for 0-indexed arrays in Python @@ -51,7 +53,7 @@ def follow_swift(ds, ifol=None, nskp=None): dr = 180.0 / np.pi fol['obar'] = fol['capom'] + fol['omega'] fol['obar'] = fol['obar'].fillna(0) - fol['obar'] = sla_dranrm(fol['obar']) + fol['obar'] = wrap_angle(fol['obar']) fol['obar'] = fol['obar'] * dr fol['inc'] = fol['inc'] * dr fol['capom'] = fol['capom'] * dr From 44df3c5ead84a6ba84f870ef9663cd68b3eed249 Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 10:14:15 -0400 Subject: [PATCH 55/71] Added in collision movie generator (but it won't work until I get the particle info file methods finished) --- .../symba_energy_momentum/collision_movie.py | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) mode change 100644 => 100755 examples/symba_energy_momentum/collision_movie.py diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py old mode 100644 new mode 100755 index c3c1cf112..ec4741895 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import swiftest import numpy as np import matplotlib.pyplot as plt @@ -17,8 +18,7 @@ def scale_sim(ds, param): dsscale = ds - dsscale['Mass'] = ds['Mass'] / param['GU'] - Mtot = dsscale['Mass'].sum(skipna=True, dim="id").isel(time=0) + GMtot = dsscale['GMass'].sum(skipna=True, dim="id").isel(time=0) rscale = sum(ds['Radius'].sel(id=[2, 3], time=0)).item() ds['Radius'] /= rscale @@ -28,19 +28,19 @@ def scale_sim(ds, param): dsscale['py'] /= rscale dsscale['pz'] /= rscale - mpx = dsscale['Mass'] * dsscale['px'] - mpy = dsscale['Mass'] * dsscale['py'] - mpz = dsscale['Mass'] * dsscale['pz'] - xbsys = mpx.sum(skipna=True, dim="id") / Mtot - ybsys = mpy.sum(skipna=True, dim="id") / Mtot - zbsys = mpz.sum(skipna=True, dim="id") / Mtot + mpx = dsscale['GMass'] * dsscale['px'] + mpy = dsscale['GMass'] * dsscale['py'] + mpz = dsscale['GMass'] * dsscale['pz'] + xbsys = mpx.sum(skipna=True, dim="id") / GMtot + ybsys = mpy.sum(skipna=True, dim="id") / GMtot + zbsys = mpz.sum(skipna=True, dim="id") / GMtot - mvx = dsscale['Mass'] * dsscale['vx'] - mvy = dsscale['Mass'] * dsscale['vy'] - mvz = dsscale['Mass'] * dsscale['vz'] - vxbsys = mvx.sum(skipna=True, dim="id") / Mtot - vybsys = mvy.sum(skipna=True, dim="id") / Mtot - vzbsys = mvz.sum(skipna=True, dim="id") / Mtot + mvx = dsscale['GMass'] * dsscale['vx'] + mvy = dsscale['GMass'] * dsscale['vy'] + mvz = dsscale['GMass'] * dsscale['vz'] + vxbsys = mvx.sum(skipna=True, dim="id") / GMtot + vybsys = mvy.sum(skipna=True, dim="id") / GMtot + vzbsys = mvz.sum(skipna=True, dim="id") / GMtot dsscale['pxb'] = dsscale['px'] - xbsys dsscale['pyb'] = dsscale['py'] - ybsys @@ -184,7 +184,7 @@ def spin_arrows(self, pl, id, len): def setup_plot(self): # First frame """Initial drawing of the scatter plot.""" - t, name, Mass, Radius, npl, pl, radmarker, origin = next(self.data_stream(0)) + t, name, GMass, Radius, npl, pl, radmarker, origin = next(self.data_stream(0)) cval = self.origin_to_color(origin) # set up the figure @@ -217,7 +217,7 @@ def setup_plot(self): def update(self,frame): """Update the scatter plot.""" - t, name, Mass, Radius, npl, pl, radmarker, origin = next(self.data_stream(frame)) + t, name, GMass, Radius, npl, pl, radmarker, origin = next(self.data_stream(frame)) cval = self.origin_to_color(origin) #varrowend, varrowtip = self.velocity_vectors(pl, radmarker) sarrowend, sarrowtip = self.spin_arrows(pl, name, radmarker) @@ -237,13 +237,13 @@ def data_stream(self, frame=0): while True: d = self.ds.isel(time=frame) Radius = d['radmarker'].values - Mass = d['Mass'].values + GMass = d['GMass'].values x = d['pxb'].values y = d['pyb'].values vx = d['vxb'].values vy = d['vyb'].values name = d['id'].values - npl = d['npl'].values + npl = d.id.count().values id = d['id'].values rotx = d['rot_x'].values roty = d['rot_y'].values @@ -260,7 +260,7 @@ def data_stream(self, frame=0): vx = np.nan_to_num(vx, copy=False) vy = np.nan_to_num(vy, copy=False) radmarker = np.nan_to_num(radmarker, copy=False) - Mass = np.nan_to_num(Mass, copy=False) + GMass = np.nan_to_num(Mass, copy=False) Radius = np.nan_to_num(Radius, copy=False) rotx = np.nan_to_num(rotx, copy=False) roty = np.nan_to_num(roty, copy=False) @@ -278,7 +278,7 @@ def data_stream(self, frame=0): for i in id[idxactive]: self.rot_angle[i] = self.rot_angle[i] + dt * np.array(self.rotvec[i]) frame += 1 - yield t, name, Mass, Radius, npl, np.c_[x, y, vx, vy], radmarker, origin + yield t, name, GMass, Radius, npl, np.c_[x, y, vx, vy], radmarker, origin for case in cases: if case == 'supercat_off': From 88ba918de0663bd05b739a17686cd35afdb30f2f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 11:14:24 -0400 Subject: [PATCH 56/71] Added energy file to parameter read. Started particle info io methods in SyMBA --- src/io/io.f90 | 18 +++-- src/modules/swiftest_classes.f90 | 2 +- src/modules/symba_classes.f90 | 77 +++++++++----------- src/symba/symba_io.f90 | 116 +++++++++++++++++++++++-------- src/symba/symba_setup.f90 | 2 + src/symba/symba_util.f90 | 5 ++ 6 files changed, 139 insertions(+), 81 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 52183460c..e19ce2558 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -31,11 +31,11 @@ module subroutine io_conservation_report(self, param, lterminal) Euntracked => self%Euntracked, Eorbit_orig => param%Eorbit_orig, Mtot_orig => param%Mtot_orig, & Ltot_orig => param%Ltot_orig(:), Lmag_orig => param%Lmag_orig, Lorbit_orig => param%Lorbit_orig(:), Lspin_orig => param%Lspin_orig(:), & lfirst => param%lfirstenergy) - if (lfirst) then - if (param%out_stat == "OLD") then - open(unit = EGYIU, file = ENERGY_FILE, form = "formatted", status = "old", action = "write", position = "append") - else - open(unit = EGYIU, file = ENERGY_FILE, form = "formatted", status = "replace", action = "write") + if (param%energy_out /= "") then + if (lfirst .and. (param%out_stat /= "OLD")) then + open(unit = EGYIU, file = param%energy_out, form = "formatted", status = "replace", action = "write") + else + open(unit = EGYIU, file = param%energy_out, form = "formatted", status = "old", action = "write", position = "append") write(EGYIU,EGYHEADER) end if end if @@ -59,8 +59,10 @@ module subroutine io_conservation_report(self, param, lterminal) lfirst = .false. end if - write(EGYIU,EGYFMT) param%t, Eorbit_now, Ecollisions, Ltot_now, Mtot_now - flush(EGYIU) + if (param%energy_out /= "") then + write(EGYIU,EGYFMT) param%t, Eorbit_now, Ecollisions, Ltot_now, Mtot_now + close(EGYIU) + end if if (.not.lfirst .and. lterminal) then Lmag_now = norm2(Ltot_now) Lerror = norm2(Ltot_now - Ltot_orig) / Lmag_orig @@ -422,6 +424,8 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) param%enc_out = param_value case ("DISCARD_OUT") param%discard_out = param_value + case ("ENERGY_OUT") + param%energy_out = param_value case ("EXTRA_FORCE") call io_toupper(param_value) if (param_value == "YES" .or. param_value == 'T') param%lextra_force = .true. diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 25f258d0c..ff32faf80 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -45,7 +45,7 @@ module swiftest_classes real(QP) :: DU2M = -1.0_QP !! Converts distance unit to centimeters real(DP) :: GU = -1.0_DP !! Universal gravitational constant in the system units real(DP) :: inv_c2 = -1.0_DP !! Inverse speed of light squared in the system units - character(STRMAX) :: ennergy_out = "" !! Name of output energy and momentum report file + character(STRMAX) :: energy_out = "" !! Name of output energy and momentum report file ! Logical flags to turn on or off various features of the code logical :: lrhill_present = .false. !! Hill radii are given as an input rather than calculated by the code (can be used to inflate close encounter regions manually) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index b80a9cab8..f11c5d444 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -27,33 +27,17 @@ module symba_classes procedure :: writer => symba_io_param_writer end type symba_parameters - !******************************************************************************************************************************** - ! symba_cb class definitions and method interfaces - !******************************************************************************************************************************* - !> SyMBA central body particle class - type, extends(helio_cb) :: symba_cb - real(DP) :: M0 = 0.0_DP !! Initial mass of the central body - real(DP) :: dM = 0.0_DP !! Change in mass of the central body - real(DP) :: R0 = 0.0_DP !! Initial radius of the central body - real(DP) :: dR = 0.0_DP !! Change in the radius of the central body - contains - end type symba_cb - !******************************************************************************************************************************** ! symba_particle_info class definitions and method interfaces !******************************************************************************************************************************* !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime !> of fragments produced in collisional events. - type, extends(swiftest_base) :: symba_particle_info + type :: symba_particle_info + sequence character(len=32) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) real(DP) :: origin_time !! The time of the particle's formation real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation - contains - procedure :: dump => symba_io_dump_particle_info !! I/O routine for dumping particle info to file - procedure :: initialize => symba_io_initialize_particle_info !! I/O routine for reading in particle info data - procedure :: read_frame => symba_io_read_frame_info !! I/O routine for reading in a single frame of particle info - procedure :: write_frame => symba_io_write_frame_info !! I/O routine for writing out a single frame of particle info end type symba_particle_info !******************************************************************************************************************************** @@ -66,6 +50,19 @@ module symba_classes integer(I4B), dimension(:), allocatable :: child !! Index of children particles end type symba_kinship + !******************************************************************************************************************************** + ! symba_cb class definitions and method interfaces + !******************************************************************************************************************************* + !> SyMBA central body particle class + type, extends(helio_cb) :: symba_cb + real(DP) :: M0 = 0.0_DP !! Initial mass of the central body + real(DP) :: dM = 0.0_DP !! Change in mass of the central body + real(DP) :: R0 = 0.0_DP !! Initial radius of the central body + real(DP) :: dR = 0.0_DP !! Change in the radius of the central body + type(symba_particle_info) :: info + contains + end type symba_cb + !******************************************************************************************************************************** ! symba_pl class definitions and method interfaces !******************************************************************************************************************************* @@ -118,6 +115,7 @@ module symba_classes integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with planets this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this particle should be moved integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step + type(symba_particle_info), dimension(:), allocatable :: info 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 @@ -327,12 +325,12 @@ module subroutine symba_io_write_discard(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_discard - module subroutine symba_io_dump_particle_info(self, param, msg) - use swiftest_classes, only : swiftest_parameters + module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) implicit none - class(symba_particle_info), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file + integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file end subroutine symba_io_dump_particle_info module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) @@ -357,22 +355,21 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 end subroutine symba_io_param_writer - module subroutine symba_io_initialize_particle_info(self, param) - use swiftest_classes, only : swiftest_parameters + module subroutine symba_io_initialize_particle_info(system, param) implicit none - class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions end subroutine symba_io_initialize_particle_info - module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), intent(in) :: form !! Input format code ("XV" or "EL") - integer(I4B), intent(out) :: ierr !! Error code - end subroutine symba_io_read_frame_info + !module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) + ! use swiftest_classes, only : swiftest_parameters + ! implicit none + ! class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object + ! integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to + ! class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! character(*), intent(in) :: form !! Input format code ("XV" or "EL") + ! integer(I4B), intent(out) :: ierr !! Error code + !end subroutine symba_io_read_frame_info module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters @@ -403,14 +400,6 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration end subroutine symba_kick_pltpenc - module subroutine symba_io_write_frame_info(self, iu, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_particle_info), intent(in) :: self !! SyMBA particle info object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_io_write_frame_info - module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index faa3d446b..af7a4f706 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -2,25 +2,91 @@ use swiftest contains - module subroutine symba_io_dump_particle_info(self, param, msg) + module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) !! author: David A. Minton !! - !! Dumps the particle information data to a file + !! Dumps the particle information data to a file. + !! Pass a list of array indices for test particles (tpidx) and/or massive bodies (plidx) to append implicit none - class(symba_particle_info), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation + ! Arguments + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file + integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file + ! Internals + logical, save :: lfirst = .true. + integer(I4B), parameter :: iu = 22 + integer(I4B) :: i, ierr + + if (.not.present(tpidx) .and. .not.present(plidx)) return + if (lfirst) then + select case(param%out_stat) + case('APPEND') + open(unit = iu, file = param%particle_file, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + case('NEW', 'UNKNOWN', 'REPLACE') + open(unit = iu, file = param%particle_file, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) + case default + write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) + call util_exit(FAILURE) + end select + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " particle output file already exists or cannot be accessed" + call util_exit(FAILURE) + end if + + lfirst = .false. + else + open(unit = iu, file = param%particle_file, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " unable to open binary output file for APPEND" + call util_exit(FAILURE) + end if + end if + + if (present(plidx) .and. (system%pl%nbody > 0) .and. size(plidx) > 0) then + select type(pl => system%pl) + class is (symba_pl) + do i = 1, size(plidx) + write(iu) pl%id(plidx(i)) + write(iu) pl%info(plidx(i)) + end do + end select + end if + + if (present(tpidx) .and. (system%tp%nbody > 0) .and. size(tpidx) > 0) then + select type(tp => system%tp) + class is (symba_tp) + do i = 1, size(tpidx) + write(iu) tp%id(tpidx(i)) + write(iu) tp%info(tpidx(i)) + end do + end select + end if + + close(unit = iu, iostat = ierr) + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " unable to close particle output file" + call util_exit(FAILURE) + end if + + return end subroutine symba_io_dump_particle_info - module subroutine symba_io_initialize_particle_info(self, param) + module subroutine symba_io_initialize_particle_info(system, param) !! author: David A. Minton !! !! Initializes a particle info data structure, either starting a new one or reading one in !! from a file if it is a restarted run implicit none - class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! Argumets + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + + return end subroutine symba_io_initialize_particle_info @@ -194,19 +260,19 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end subroutine symba_io_param_writer - module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) - !! author: David A. Minton - !! - !! Reads a single frame of a particle info data from a file. - implicit none - class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), intent(in) :: form !! Input format code ("XV" or "EL") - integer(I4B), intent(out) :: ierr !! Error code - - ierr = 0 - end subroutine symba_io_read_frame_info + !module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) + ! !! author: David A. Minton + ! !! + ! !! Reads a single frame of a particle info data from a file. + ! implicit none + ! class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object + ! integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to + ! class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! character(*), intent(in) :: form !! Input format code ("XV" or "EL") + ! integer(I4B), intent(out) :: ierr !! Error code +! +! ierr = 0 +! end subroutine symba_io_read_frame_info module subroutine symba_io_write_discard(self, param) @@ -280,13 +346,5 @@ module subroutine symba_io_write_discard(self, param) return end subroutine symba_io_write_discard - - module subroutine symba_io_write_frame_info(self, iu, param) - implicit none - class(symba_particle_info), intent(in) :: self !! SyMBA particle info object - integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_io_write_frame_info - end submodule s_symba_io diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index ab8b5543e..8d727be5c 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -162,10 +162,12 @@ module subroutine symba_setup_tp(self, n, param) if (allocated(self%nplenc)) deallocate(self%nplenc) if (allocated(self%levelg)) deallocate(self%levelg) if (allocated(self%levelm)) deallocate(self%levelm) + if (allocated(self%info)) deallocate(self%info) allocate(self%nplenc(n)) allocate(self%levelg(n)) allocate(self%levelm(n)) + allocate(self%info(n)) self%nplenc(:) = 0 self%levelg(:) = -1 diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 90f5a06e5..efb1832a1 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -144,6 +144,7 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) call util_append(self%nplenc, source%nplenc, nold, nsrc, lsource_mask) call util_append(self%levelg, source%levelg, nold, nsrc, lsource_mask) call util_append(self%levelm, source%levelm, nold, nsrc, lsource_mask) + call util_append(self%info, source%info, nold, nsrc, lsource_mask) call util_append_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class end associate @@ -253,6 +254,7 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) call util_fill(keeps%nplenc, inserts%nplenc, lfill_list) call util_fill(keeps%levelg, inserts%levelg, lfill_list) call util_fill(keeps%levelm, inserts%levelm, lfill_list) + call util_fill(keeps%info, inserts%info, lfill_list) call util_fill_tp(keeps, inserts, lfill_list) ! Note: helio_tp does not have its own fill method, so we skip back to the base class class default @@ -520,6 +522,7 @@ module subroutine symba_util_resize_tp(self, nnew) call util_resize(self%nplenc, nnew) call util_resize(self%levelg, nnew) call util_resize(self%levelm, nnew) + call util_resize(self%info, nnew) call util_resize_tp(self, nnew) @@ -679,6 +682,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) if (allocated(tp%nplenc)) tp%nplenc(1:ntp) = tp_sorted%nplenc(ind(1:ntp)) if (allocated(tp%levelg)) tp%levelg(1:ntp) = tp_sorted%levelg(ind(1:ntp)) if (allocated(tp%levelm)) tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) + if (allocated(tp%info)) tp%info(1:ntp) = tp_sorted%info(ind(1:ntp)) deallocate(tp_sorted) end associate @@ -836,6 +840,7 @@ module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) call util_spill(keeps%nplenc, discards%nplenc, lspill_list, ldestructive) call util_spill(keeps%levelg, discards%levelg, lspill_list, ldestructive) call util_spill(keeps%levelm, discards%levelm, lspill_list, ldestructive) + call util_spill(keeps%info, discards%info, lspill_list, ldestructive) call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default From ac702cecb4aebad2b39e549e29fdee0e98bb5e99 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 11:35:12 -0400 Subject: [PATCH 57/71] Adding in particle info initialization methods --- src/io/io.f90 | 2 ++ src/modules/swiftest_classes.f90 | 11 ++++----- src/modules/symba_classes.f90 | 24 +++++++++----------- src/symba/symba_io.f90 | 38 +++++++++----------------------- src/symba/symba_setup.f90 | 17 ++++++++++++++ 5 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e19ce2558..e2908b957 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -540,6 +540,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) iostat = -1 return end if + param%lrestart = (param%out_stat == "APPEND") if (param%outfile /= "") then if ((param%out_type /= REAL4_TYPE) .and. (param%out_type /= REAL8_TYPE) .and. & (param%out_type /= SWIFTER_REAL4_TYPE) .and. (param%out_type /= SWIFTER_REAL8_TYPE)) then @@ -557,6 +558,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) iostat = -1 return end if + end if if (param%qmin > 0.0_DP) then if ((param%qmin_coord /= "HELIO") .and. (param%qmin_coord /= "BARY")) then diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index ff32faf80..fa5ec8b97 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -64,13 +64,14 @@ module swiftest_classes real(DP), dimension(NDIM) :: Ltot_orig = 0.0_DP !! Initial total angular momentum vector real(DP), dimension(NDIM) :: Lorbit_orig = 0.0_DP !! Initial orbital angular momentum real(DP), dimension(NDIM) :: Lspin_orig = 0.0_DP !! Initial spin angular momentum vector - real(DP), dimension(NDIM) :: Ltot = 0.0_DP !! System angular momentum vector - real(DP), dimension(NDIM) :: Lescape = 0.0_DP !! Angular momentum of bodies that escaped the system (used for bookeeping) - real(DP) :: Mescape = 0.0_DP !! Mass of bodies that escaped the system (used for bookeeping) - real(DP) :: Ecollisions = 0.0_DP !! Energy lost from system due to collisions - real(DP) :: Euntracked = 0.0_DP !! Energy gained from system due to escaped bodies + real(DP), dimension(NDIM) :: Ltot = 0.0_DP !! System angular momentum vector + real(DP), dimension(NDIM) :: Lescape = 0.0_DP !! Angular momentum of bodies that escaped the system (used for bookeeping) + real(DP) :: Mescape = 0.0_DP !! Mass of bodies that escaped the system (used for bookeeping) + real(DP) :: Ecollisions = 0.0_DP !! Energy lost from system due to collisions + real(DP) :: Euntracked = 0.0_DP !! Energy gained from system due to escaped bodies logical :: lfirstenergy = .true. !! This is the first time computing energe logical :: lfirstkick = .true. !! Initiate the first kick in a symplectic step + logical :: lrestart = .false. !! Indicates whether or not this is a restarted run ! Future features not implemented or in development logical :: lgr = .false. !! Turn on GR diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index f11c5d444..de747708c 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -354,22 +354,12 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms integer, intent(out) :: iostat !! IO status code character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 end subroutine symba_io_param_writer - - module subroutine symba_io_initialize_particle_info(system, param) + + module subroutine symba_io_read_particle(system, param) implicit none - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system file class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions - end subroutine symba_io_initialize_particle_info - - !module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) - ! use swiftest_classes, only : swiftest_parameters - ! implicit none - ! class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - ! integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - ! class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! character(*), intent(in) :: form !! Input format code ("XV" or "EL") - ! integer(I4B), intent(out) :: ierr !! Error code - !end subroutine symba_io_read_frame_info + end subroutine symba_io_read_particle module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters @@ -399,6 +389,12 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) integer(I4B), intent(in) :: irec !! Current recursion level integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration end subroutine symba_kick_pltpenc + + module subroutine symba_setup_initialize_particle_info(system, param) + implicit none + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + end subroutine symba_setup_initialize_particle_info module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index af7a4f706..0e774fdc6 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -75,21 +75,6 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) return end subroutine symba_io_dump_particle_info - - module subroutine symba_io_initialize_particle_info(system, param) - !! author: David A. Minton - !! - !! Initializes a particle info data structure, either starting a new one or reading one in - !! from a file if it is a restarted run - implicit none - ! Argumets - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions - - return - end subroutine symba_io_initialize_particle_info - - module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -260,19 +245,16 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end subroutine symba_io_param_writer - !module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) - ! !! author: David A. Minton - ! !! - ! !! Reads a single frame of a particle info data from a file. - ! implicit none - ! class(symba_particle_info), intent(inout) :: self !! SyMBA particle info object - ! integer(I4B), intent(inout) :: iu !! Unit number for the output file to write frame to - ! class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! character(*), intent(in) :: form !! Input format code ("XV" or "EL") - ! integer(I4B), intent(out) :: ierr !! Error code -! -! ierr = 0 -! end subroutine symba_io_read_frame_info + module subroutine symba_io_read_particle(system, param) + !! author: David A. Minton + !! + !! Reads an old particle information file for a restartd run + implicit none + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system file + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + + return + end subroutine symba_io_read_particle module subroutine symba_io_write_discard(self, param) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 8d727be5c..994e228a3 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -2,6 +2,18 @@ use swiftest contains + module subroutine symba_setup_initialize_particle_info(system, param) + !! author: David A. Minton + !! + !! Initializes a new particle information data structure with initial conditions recorded + implicit none + ! Argumets + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + + return + end subroutine symba_setup_initialize_particle_info + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -27,6 +39,11 @@ module subroutine symba_setup_initialize_system(self, param) class is (symba_parameters) pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY pl%nplm = count(pl%lmtiny(:)) + if (param%lrestart) then + call symba_io_read_particle(system, param) + else + call symba_setup_initialize_particle_info(system, param) + end if end select end select end associate From 95147430fbf4ac2ddf50fbc4d164db2b330ee7ea Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 11:47:23 -0400 Subject: [PATCH 58/71] Added particle information initalization subroutine --- src/symba/symba_setup.f90 | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 994e228a3..a5870ed52 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -10,10 +10,41 @@ module subroutine symba_setup_initialize_particle_info(system, param) ! Argumets class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + ! Internals + integer(I4B) :: i + + select type(cb => system%cb) + class is (symba_cb) + cb%info%origin_type = "Central body" + cb%info%origin_time = param%t0 + cb%info%origin_xh(:) = 0.0_DP + cb%info%origin_vh(:) = 0.0_DP + end select + + select type(pl => system%pl) + class is (symba_pl) + do i = 1, pl%nbody + pl%info(i)%origin_type = "Initial conditions" + pl%info(i)%origin_time = param%t0 + pl%info(i)%origin_xh(:) = pl%xh(:,i) + pl%info(i)%origin_vh(:) = pl%vh(:,i) + end do + end select + + select type(tp => system%tp) + class is (symba_tp) + do i = 1, tp%nbody + tp%info(i)%origin_type = "Initial conditions" + tp%info(i)%origin_time = param%t0 + tp%info(i)%origin_xh(:) = tp%xh(:,i) + tp%info(i)%origin_vh(:) = tp%vh(:,i) + end do + end select return end subroutine symba_setup_initialize_particle_info + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! From 8dbe02c0f77b067cdb97716879bc1a751c8977d5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 11:59:18 -0400 Subject: [PATCH 59/71] Added in particle info reader --- src/symba/symba_io.f90 | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 0e774fdc6..906929bef 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -253,6 +253,64 @@ module subroutine symba_io_read_particle(system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system file class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + ! Internals + integer(I4B), parameter :: LUN = 22 + integer(I4B) :: i, ierr, id, idx + logical :: lmatch + type(symba_particle_info) :: tmpinfo + + open(unit = LUN, file = param%particle_file, status = 'OLD', form = 'UNFORMATTED', iostat = ierr) + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " unable to open binary particle file for reading" + call util_exit(FAILURE) + end if + + select type(cb => system%cb) + class is (symba_cb) + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + do + lmatch = .false. + read(LUN, iostat=ierr) id + if (ierr /=0) exit + + if (idx == cb%id) then + read(LUN) cb%info + lmatch = .true. + else + if (pl%nbody > 0) then + idx = findloc(pl%id(:), id, dim=1) + if (idx /= 0) then + read(LUN) pl%info(idx) + lmatch = .true. + end if + end if + if (.not.lmatch .and. tp%nbody > 0) then + idx = findloc(tp%id(:), id, dim=1) + if (idx /= 0) then + read(LUN) tp%info(idx) + lmatch = .true. + end if + end if + end if + if (.not.lmatch) then + write(*,*) 'Particle id ',id,' not found. Skipping' + read(LUN) tmpinfo + end if + end do + close(unit = LUN, iostat = ierr) + end select + end select + end select + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " unable to close particle output file" + call util_exit(FAILURE) + end if + return end subroutine symba_io_read_particle From 58dac0d2a278511529047bbc462433408a0886b2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 12:33:36 -0400 Subject: [PATCH 60/71] Refactored PARTICLE_FILE to PARTICLE_OUT for consistency. Added in particle info io to SyMBA --- .../param.disruption_headon.in | 2 +- .../param.disruption_off_axis.in | 2 +- .../symba_energy_momentum/param.escape.in | 2 +- examples/symba_energy_momentum/param.sun.in | 2 +- .../param.supercatastrophic_headon.in | 2 +- .../param.supercatastrophic_off_axis.in | 2 +- src/io/io.f90 | 2 +- src/modules/symba_classes.f90 | 7 ++-- src/symba/symba_io.f90 | 40 +++++++++++++------ src/symba/symba_setup.f90 | 15 ++++++- src/symba/symba_util.f90 | 5 ++- 11 files changed, 56 insertions(+), 25 deletions(-) diff --git a/examples/symba_energy_momentum/param.disruption_headon.in b/examples/symba_energy_momentum/param.disruption_headon.in index 0f3e88752..4a291535e 100644 --- a/examples/symba_energy_momentum/param.disruption_headon.in +++ b/examples/symba_energy_momentum/param.disruption_headon.in @@ -7,7 +7,7 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ! output cadence every year BIN_OUT bin.disruption_headon.dat -PARTICLE_FILE particle.disruption_headon.dat +PARTICLE_OUT particle.disruption_headon.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/examples/symba_energy_momentum/param.disruption_off_axis.in b/examples/symba_energy_momentum/param.disruption_off_axis.in index ef32a5c2f..0dfbae80a 100644 --- a/examples/symba_energy_momentum/param.disruption_off_axis.in +++ b/examples/symba_energy_momentum/param.disruption_off_axis.in @@ -7,7 +7,7 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ! output cadence every year BIN_OUT bin.disruption_off_axis.dat -PARTICLE_FILE particle.disruption_off_axis.dat +PARTICLE_OUT particle.disruption_off_axis.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/examples/symba_energy_momentum/param.escape.in b/examples/symba_energy_momentum/param.escape.in index 5db2c3fe4..90d118017 100644 --- a/examples/symba_energy_momentum/param.escape.in +++ b/examples/symba_energy_momentum/param.escape.in @@ -7,7 +7,7 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ! output cadence every year BIN_OUT bin.escape.dat -PARTICLE_FILE particle.escape.dat +PARTICLE_OUT particle.escape.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/examples/symba_energy_momentum/param.sun.in b/examples/symba_energy_momentum/param.sun.in index a21b5817b..a7748b19c 100644 --- a/examples/symba_energy_momentum/param.sun.in +++ b/examples/symba_energy_momentum/param.sun.in @@ -9,7 +9,7 @@ IN_TYPE ASCII ISTEP_OUT 1 ISTEP_DUMP 1 BIN_OUT bin.sun.dat -PARTICLE_FILE particle.sun.dat +PARTICLE_OUT particle.sun.dat OUT_TYPE REAL8 OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/examples/symba_energy_momentum/param.supercatastrophic_headon.in b/examples/symba_energy_momentum/param.supercatastrophic_headon.in index 47c239556..e9b60e7da 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_headon.in @@ -7,7 +7,7 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ! output cadence every year BIN_OUT bin.supercatastrophic_headon.dat -PARTICLE_FILE particle.supercatastrophic_headon.dat +PARTICLE_OUT particle.supercatastrophic_headon.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in index 64759828c..0bf836be5 100644 --- a/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/param.supercatastrophic_off_axis.in @@ -7,7 +7,7 @@ TP_IN tp.in IN_TYPE ASCII ISTEP_OUT 1 ! output cadence every year BIN_OUT bin.supercatastrophic_off_axis.dat -PARTICLE_FILE particle.supercatastrophic_off_axis.dat +PARTICLE_OUT particle.supercatastrophic_off_axis.dat OUT_TYPE REAL8 ! double precision real output OUT_FORM XV ! osculating element output OUT_STAT REPLACE diff --git a/src/io/io.f90 b/src/io/io.f90 index e2908b957..03fdc2e17 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -498,7 +498,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) read(param_value, *) param%Ecollisions case("EUNTRACKED") read(param_value, *) param%Euntracked - case ("NPLMAX", "NTPMAX", "GMTINY", "PARTICLE_FILE", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters + case ("NPLMAX", "NTPMAX", "GMTINY", "PARTICLE_OUT", "FRAGMENTATION", "SEED", "YARKOVSKY", "YORP") ! Ignore SyMBA-specific, not-yet-implemented, or obsolete input parameters case default write(iomsg,*) "Unknown parameter -> ",param_name iostat = -1 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index de747708c..4628202f8 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -18,7 +18,7 @@ module symba_classes integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file type, extends(swiftest_parameters) :: symba_parameters - character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file + character(STRMAX) :: particle_out = PARTICLE_OUTFILE !! Name of output particle information file real(DP) :: GMTINY = -1.0_DP !! Smallest mass that is fully gravitating integer(I4B), dimension(:), allocatable :: seed !! Random seeds logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. @@ -325,10 +325,11 @@ module subroutine symba_io_write_discard(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_discard - module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) + module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, plidx) implicit none class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA extensions + logical, optional, intent(in) :: lincludecb !! Set to true to include the central body (default is false) integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file end subroutine symba_io_dump_particle_info diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 906929bef..7751b7b21 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) + module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, plidx) !! author: David A. Minton !! !! Dumps the particle information data to a file. @@ -10,21 +10,22 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) implicit none ! Arguments class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA extensions + logical, optional, intent(in) :: lincludecb !! Set to true to include the central body (default is false) integer(I4B), dimension(:), optional, intent(in) :: tpidx !! Array of test particle indices to append to the particle file integer(I4B), dimension(:), optional, intent(in) :: plidx !! Array of massive body indices to append to the particle file ! Internals logical, save :: lfirst = .true. - integer(I4B), parameter :: iu = 22 + integer(I4B), parameter :: LUN = 22 integer(I4B) :: i, ierr if (.not.present(tpidx) .and. .not.present(plidx)) return if (lfirst) then select case(param%out_stat) case('APPEND') - open(unit = iu, file = param%particle_file, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) case('NEW', 'UNKNOWN', 'REPLACE') - open(unit = iu, file = param%particle_file, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) + open(unit = LUN, file = param%particle_out, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) case default write(*,*) 'Invalid status code',trim(adjustl(param%out_stat)) call util_exit(FAILURE) @@ -37,7 +38,7 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) lfirst = .false. else - open(unit = iu, file = param%particle_file, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + open(unit = LUN, file = param%particle_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) if (ierr /= 0) then write(*, *) "Swiftest error:" write(*, *) " unable to open binary output file for APPEND" @@ -45,12 +46,22 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) end if end if + if (present(lincludecb)) then + if (lincludecb) then + select type(cb => system%cb) + class is (symba_cb) + write(LUN) cb%id + write(LUN) cb%info + end select + end if + end if + if (present(plidx) .and. (system%pl%nbody > 0) .and. size(plidx) > 0) then select type(pl => system%pl) class is (symba_pl) do i = 1, size(plidx) - write(iu) pl%id(plidx(i)) - write(iu) pl%info(plidx(i)) + write(LUN) pl%id(plidx(i)) + write(LUN) pl%info(plidx(i)) end do end select end if @@ -59,13 +70,13 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) select type(tp => system%tp) class is (symba_tp) do i = 1, size(tpidx) - write(iu) tp%id(tpidx(i)) - write(iu) tp%info(tpidx(i)) + write(LUN) tp%id(tpidx(i)) + write(LUN) tp%info(tpidx(i)) end do end select end if - close(unit = iu, iostat = ierr) + close(unit = LUN, iostat = ierr) if (ierr /= 0) then write(*, *) "Swiftest error:" write(*, *) " unable to close particle output file" @@ -75,6 +86,7 @@ module subroutine symba_io_dump_particle_info(system, param, tpidx, plidx) return end subroutine symba_io_dump_particle_info + module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -119,6 +131,8 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms ifirst = ilast + 1 param_value = io_get_token(line_trim, ifirst, ilast, iostat) select case (param_name) + case ("PARTICLE_OUT") + param%particle_out = param_value case ("FRAGMENTATION") call io_toupper(param_value) if (param_value == "YES" .or. param_value == "T") self%lfragmentation = .true. @@ -217,7 +231,7 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms ! Special handling is required for writing the random number seed array as its size is not known until runtime ! For the "SEED" parameter line, the first value will be the size of the seed array and the rest will be the seed array elements - write(param_name, Afmt) "PARTICLE_FILE"; write(param_value, Afmt) trim(adjustl(param%particle_file)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "PARTICLE_OUT"; write(param_value, Afmt) trim(adjustl(param%particle_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "GMTINY"; write(param_value, Rfmt) param%Gmtiny; write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "FRAGMENTATION"; write(param_value, Lfmt) param%lfragmentation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) if (param%lfragmentation) then @@ -259,7 +273,7 @@ module subroutine symba_io_read_particle(system, param) logical :: lmatch type(symba_particle_info) :: tmpinfo - open(unit = LUN, file = param%particle_file, status = 'OLD', form = 'UNFORMATTED', iostat = ierr) + open(unit = LUN, file = param%particle_out, status = 'OLD', form = 'UNFORMATTED', iostat = ierr) if (ierr /= 0) then write(*, *) "Swiftest error:" write(*, *) " unable to open binary particle file for reading" diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index a5870ed52..e06fb20b5 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -12,6 +12,7 @@ module subroutine symba_setup_initialize_particle_info(system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA extensions ! Internals integer(I4B) :: i + integer(I4B), dimension(:), allocatable :: idx select type(cb => system%cb) class is (symba_cb) @@ -19,6 +20,7 @@ module subroutine symba_setup_initialize_particle_info(system, param) cb%info%origin_time = param%t0 cb%info%origin_xh(:) = 0.0_DP cb%info%origin_vh(:) = 0.0_DP + call symba_io_dump_particle_info(system, param, lincludecb=.true.) end select select type(pl => system%pl) @@ -29,6 +31,11 @@ module subroutine symba_setup_initialize_particle_info(system, param) pl%info(i)%origin_xh(:) = pl%xh(:,i) pl%info(i)%origin_vh(:) = pl%vh(:,i) end do + if (pl%nbody > 0) then + allocate(idx(pl%nbody)) + call symba_io_dump_particle_info(system, param, plidx=[(i, i=1, pl%nbody)]) + deallocate(idx) + end if end select select type(tp => system%tp) @@ -38,9 +45,15 @@ module subroutine symba_setup_initialize_particle_info(system, param) tp%info(i)%origin_time = param%t0 tp%info(i)%origin_xh(:) = tp%xh(:,i) tp%info(i)%origin_vh(:) = tp%vh(:,i) - end do + end do + if (tp%nbody > 0) then + allocate(idx(tp%nbody)) + call symba_io_dump_particle_info(system, param, tpidx=[(i, i=1, tp%nbody)]) + deallocate(idx) + end if end select + return end subroutine symba_setup_initialize_particle_info diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index efb1832a1..4c0f256e3 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -381,7 +381,10 @@ module subroutine symba_util_rearray_pl(self, system, param) if (allocated(pl%xend)) deallocate(pl%xend) ! Add in any new bodies - call pl%append(pl_adds, lsource_mask=[(.true., i=1, pl_adds%nbody)]) + if (pl_adds%nbody > 0) then + call pl%append(pl_adds, lsource_mask=[(.true., i=1, pl_adds%nbody)]) + call symba_io_dump_particle_info(system, param, plidx=[(i, i = 1, pl%nbody)]) + end if ! If there are still bodies in the system, sort by mass in descending order and re-index if (pl%nbody > 0) then From 3b441e7b1f581abd0011c7f10b087fb5f18dfbae Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 13:06:54 -0400 Subject: [PATCH 61/71] Added back the swiftest_particle_2xr function to io.py. Also added two spaces between function definitions --- python/swiftest/swiftest/io.py | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 37f3370fd..037bc0806 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -24,6 +24,7 @@ def real2float(realstr): """ return float(realstr.replace('d', 'E').replace('D', 'E')) + def read_swiftest_param(param_file_name, param): """ Reads in a Swiftest param.in file and saves it as a dictionary @@ -82,6 +83,7 @@ def read_swiftest_param(param_file_name, param): print(f"{param_file_name} not found.") return param + def read_swifter_param(param_file_name): """ Reads in a Swifter param.in file and saves it as a dictionary @@ -165,6 +167,7 @@ def read_swifter_param(param_file_name): return param + def read_swift_param(param_file_name, startfile="swift.in"): """ Reads in a Swift param.in file and saves it as a dictionary @@ -251,6 +254,7 @@ def read_swift_param(param_file_name, startfile="swift.in"): return param + def write_swift_param(param, param_file_name): outfile = open(param_file_name, 'w') print(param['T0'], param['TSTOP'], param['DT'], file=outfile) @@ -262,6 +266,7 @@ def write_swift_param(param, param_file_name): outfile.close() return + def write_labeled_param(param, param_file_name): outfile = open(param_file_name, 'w') keylist = ['! VERSION', @@ -300,6 +305,7 @@ def write_labeled_param(param, param_file_name): outfile.close() return + def swifter_stream(f, param): """ Reads in a Swifter bin.dat file and returns a single frame of data as a datastream @@ -544,6 +550,7 @@ def swiftest_stream(f, param): npl, plid, pvec.T, plab, \ ntp, tpid, tvec.T, tlab + def swifter2xr(param): """ Converts a Swifter binary data file into an xarray DataSet. @@ -586,6 +593,7 @@ def swifter2xr(param): print(f"Successfully converted {ds.sizes['time']} output frames.") return ds + def swiftest2xr(param): """ Converts a Swiftest binary data file into an xarray DataSet. @@ -636,6 +644,35 @@ def swiftest2xr(param): print(f"Successfully converted {ds.sizes['time']} output frames.") return ds + +def swiftest_particle_2xr(ds, param): + """Reads in the Swiftest PARTICLE_OUT and converts it to an xarray Dataset""" + veclab = ['time_origin', 'px_origin', 'py_origin', 'pz_origin', 'vx_origin', 'vy_origin', 'vz_origin'] + id_list = [] + origin_type_list = [] + origin_vec_list = [] + + with FortranFile(param['PARTICLE_OUT'], 'r') as f: + for plid, origin_type, origin_vec in swiftest_particle_stream(f): + id_list.append(plid) + + origin_type_list.append(origin_type) + origin_vec_list.append(origin_vec) + + id_list = np.asarray(id_list)[:,0] + origin_type_list = np.asarray(origin_type_list) + origin_vec_list = np.vstack(origin_vec_list) + + typeda = xr.DataArray(origin_type_list, dims=['id'], coords={'id' : id_list}) + vecda = xr.DataArray(origin_vec_list, dims=['id', 'vec'], coords={'id' : id_list, 'vec' : veclab}) + + infoxr = vecda.to_dataset(dim='vec') + infoxr['origin_type'] = typeda + + print('\nAdding particle info to Dataset') + ds = xr.merge([ds, infoxr]) + return ds + def swiftest_xr2infile(ds, param, framenum=-1): """ Writes a set of Swiftest input files from a single frame of a Swiftest xarray dataset From 1fa1832eca0c30eaac14460de59d108ab250389f Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 13:27:12 -0400 Subject: [PATCH 62/71] Added back the particle info reader --- .../symba_energy_momentum/collision_movie.py | 2 +- python/swiftest/swiftest/io.py | 99 ++++++++++++++----- python/swiftest/swiftest/simulation_class.py | 1 + 3 files changed, 75 insertions(+), 27 deletions(-) diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index ec4741895..85a020183 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -260,7 +260,7 @@ def data_stream(self, frame=0): vx = np.nan_to_num(vx, copy=False) vy = np.nan_to_num(vy, copy=False) radmarker = np.nan_to_num(radmarker, copy=False) - GMass = np.nan_to_num(Mass, copy=False) + GMass = np.nan_to_num(GMass, copy=False) Radius = np.nan_to_num(Radius, copy=False) rotx = np.nan_to_num(rotx, copy=False) roty = np.nan_to_num(roty, copy=False) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 037bc0806..0492a05f8 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -73,6 +73,8 @@ def read_swiftest_param(param_file_name, param): param['CHK_CLOSE'] = param['CHK_CLOSE'].upper() param['RHILL_PRESENT'] = param['RHILL_PRESENT'].upper() param['FRAGMENTATION'] = param['FRAGMENTATION'].upper() + if param['FRAGMENTATION'] == 'YES' and param['PARTICLE_OUT'] == '': + param['PARTICLE_OUT'] = 'particle.dat' param['ROTATION'] = param['ROTATION'].upper() param['TIDES'] = param['TIDES'].upper() param['ENERGY'] = param['ENERGY'].upper() @@ -612,26 +614,29 @@ def swiftest2xr(param): cb = [] pl = [] tp = [] - with FortranFile(param['BIN_OUT'], 'r') as f: - for t, cbid, cvec, clab, \ - npl, plid, pvec, plab, \ - ntp, tpid, tvec, tlab in swiftest_stream(f, param): - # Prepare frames by adding an extra axis for the time coordinate - cbframe = np.expand_dims(cvec, axis=0) - plframe = np.expand_dims(pvec, axis=0) - tpframe = np.expand_dims(tvec, axis=0) + try: + with FortranFile(param['BIN_OUT'], 'r') as f: + for t, cbid, cvec, clab, \ + npl, plid, pvec, plab, \ + ntp, tpid, tvec, tlab in swiftest_stream(f, param): + # Prepare frames by adding an extra axis for the time coordinate + cbframe = np.expand_dims(cvec, axis=0) + plframe = np.expand_dims(pvec, axis=0) + tpframe = np.expand_dims(tvec, axis=0) + + # Create xarray DataArrays out of each body type + cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) + plxr = xr.DataArray(plframe, dims=dims, coords={'time': t, 'id': plid, 'vec': plab}) + tpxr = xr.DataArray(tpframe, dims=dims, coords={'time': t, 'id': tpid, 'vec': tlab}) + + cb.append(cbxr) + pl.append(plxr) + tp.append(tpxr) + sys.stdout.write('\r' + f"Reading in time {t[0]:.3e}") + sys.stdout.flush() + except IOError: + print(f"Error encountered reading in {param['BIN_OUT']}") - # Create xarray DataArrays out of each body type - cbxr = xr.DataArray(cbframe, dims=dims, coords={'time': t, 'id': cbid, 'vec': clab}) - plxr = xr.DataArray(plframe, dims=dims, coords={'time': t, 'id': plid, 'vec': plab}) - tpxr = xr.DataArray(tpframe, dims=dims, coords={'time': t, 'id': tpid, 'vec': tlab}) - - cb.append(cbxr) - pl.append(plxr) - tp.append(tpxr) - sys.stdout.write('\r' + f"Reading in time {t[0]:.3e}") - sys.stdout.flush() - cbda = xr.concat(cb, dim='time') plda = xr.concat(pl, dim='time') tpda = xr.concat(tp, dim='time') @@ -642,22 +647,59 @@ def swiftest2xr(param): print('\nCreating Dataset') ds = xr.combine_by_coords([cbds, plds, tpds]) print(f"Successfully converted {ds.sizes['time']} output frames.") + if param['PARTICLE_OUT'] != "": + ds = swiftest_particle_2xr(ds, param) + return ds +def swiftest_particle_stream(f): + """ + Reads in a Swiftest particle.dat file and returns a single frame of particle data as a datastream + + Parameters + ---------- + f : file object + param : dict + + Yields + ------- + plid : int + ID of massive bodie + origin_type : string + The origin type for the body (Initial conditions, disruption, supercatastrophic, hit and run, etc) + origin_xh : float array + The origin heliocentric position vector + origin_vh : float array + The origin heliocentric velocity vector + """ + while True: # Loop until you read the end of file + try: + # Read multi-line header + plid = f.read_ints() # Try first part of the header + except: + break + origin_rec = f.read_record(np.dtype('a32'), np.dtype((' ") + swiftest_param['! VERSION'] = "Swiftest parameter file converted from Swifter" return swiftest_param diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index bea59ae5f..fc5075ab9 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -38,6 +38,7 @@ def __init__(self, codename="Swiftest", param_file=""): 'DU2M': constants.AU2M, 'EXTRA_FORCE': "NO", 'DISCARD_OUT': "discard.out", + 'PARTICLE_OUT' : "", 'BIG_DISCARD': "NO", 'CHK_CLOSE': "YES", 'RHILL_PRESENT': "YES", From 542bf97deef7e0abd780e5642c9cabeb4fe5c7a0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 13:35:41 -0400 Subject: [PATCH 63/71] Removed check from the particle writer that was preventing central bodies from being recorded --- src/symba/symba_io.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 7751b7b21..e9e52fc2d 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -19,7 +19,6 @@ module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, integer(I4B), parameter :: LUN = 22 integer(I4B) :: i, ierr - if (.not.present(tpidx) .and. .not.present(plidx)) return if (lfirst) then select case(param%out_stat) case('APPEND') From 156fa2f260b2d7f4cd881ebdff3f52e51e2a7811 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 13:40:26 -0400 Subject: [PATCH 64/71] Removed unnecessary check for size of plidx and tpidx, as they cause a segfault when not present --- src/symba/symba_io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index e9e52fc2d..97e5798c2 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -55,7 +55,7 @@ module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, end if end if - if (present(plidx) .and. (system%pl%nbody > 0) .and. size(plidx) > 0) then + if (present(plidx) .and. (system%pl%nbody > 0)) then select type(pl => system%pl) class is (symba_pl) do i = 1, size(plidx) @@ -65,7 +65,7 @@ module subroutine symba_io_dump_particle_info(system, param, lincludecb, tpidx, end select end if - if (present(tpidx) .and. (system%tp%nbody > 0) .and. size(tpidx) > 0) then + if (present(tpidx) .and. (system%tp%nbody > 0)) then select type(tp => system%tp) class is (symba_tp) do i = 1, size(tpidx) From 57c5a9c0afded5ddc93057792e123a75ab36fa27 Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 13:50:18 -0400 Subject: [PATCH 65/71] Switched back to libx264 codec --- examples/symba_energy_momentum/collision_movie.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index 85a020183..de39bc326 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -85,7 +85,7 @@ def __init__(self, ds, param): self.ani = animation.FuncAnimation(self.fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) self.ani.save(animfile, fps=60, dpi=300, - extra_args=['-vcodec', 'mpeg4']) + extra_args=['-vcodec', 'libx264']) def plot_pl_circles(self, pl, radmarker): patches = [] From 35cf1b55521cb7065761b5be28dd20bff6123ca2 Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 10 Aug 2021 14:50:46 -0400 Subject: [PATCH 66/71] Fixed bugs in the collision_movie script for the fragmentation examples. Updated the initial conditions files for the fragmentation tests --- Makefile.Defines | 4 +- .../symba_energy_momentum/collision_movie.py | 37 ++++++++++--------- .../disruption_headon.in | 4 +- .../disruption_off_axis.in | 4 +- examples/symba_energy_momentum/escape.in | 4 +- examples/symba_energy_momentum/sun.in | 4 +- .../supercatastrophic_headon.in | 4 +- .../supercatastrophic_off_axis.in | 4 +- 8 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 07126f842..820ad6d7d 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,8 +65,8 @@ GPAR = -fopenmp -ftree-parallelize-loops=4 GMEM = -fsanitize=undefined -fsanitize=address -fsanitize=leak GWARNINGS = -Wall -Warray-bounds -Wimplicit-interface -Wextra -Warray-temporaries -FFLAGS = $(IDEBUG) $(HEAPARR) -#FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) +#FFLAGS = $(IDEBUG) $(HEAPARR) +FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) FORTRAN = ifort #AR = xiar diff --git a/examples/symba_energy_momentum/collision_movie.py b/examples/symba_energy_momentum/collision_movie.py index de39bc326..3fd3b6a86 100755 --- a/examples/symba_energy_momentum/collision_movie.py +++ b/examples/symba_energy_momentum/collision_movie.py @@ -11,16 +11,15 @@ ymin = -20.0 ymax = 20.0 -#cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] -cases = ['disruption_off'] +cases = ['supercat_head', 'supercat_off', 'disruption_head', 'disruption_off'] -def scale_sim(ds, param): +def scale_sim(ds): - dsscale = ds + dsscale = ds.where(ds.id > 0, drop=True) # Remove the central body GMtot = dsscale['GMass'].sum(skipna=True, dim="id").isel(time=0) - rscale = sum(ds['Radius'].sel(id=[2, 3], time=0)).item() - ds['Radius'] /= rscale + rscale = ds['Radius'].sel(id=1, time=0) + dsscale['Radius'] /= rscale dsscale['radmarker'] = dsscale['Radius'].fillna(0) @@ -68,7 +67,7 @@ def __init__(self, ds, param): frame = 0 nframes = ds['time'].size - self.ds = scale_sim(ds, param) + self.ds = scale_sim(ds) self.param = param self.rot_angle = {} @@ -80,9 +79,20 @@ def __init__(self, ds, param): self.stream = self.data_stream(frame) # Setup the figure and axes... - self.fig, self.ax = plt.subplots(figsize=(8,8)) + fig = plt.figure(figsize=(8,8), dpi=300) + plt.tight_layout(pad=0) + # set up the figure + self.ax = plt.Axes(fig, [0., 0., 1., 1.]) + self.ax.set_xlim(xmin, xmax) + self.ax.set_ylim(ymin, ymax) + self.ax.set_axis_off() + self.ax.set_aspect(1) + self.ax.get_xaxis().set_visible(False) + self.ax.get_yaxis().set_visible(False) + fig.add_axes(self.ax) + # Then setup FuncAnimation. - self.ani = animation.FuncAnimation(self.fig, self.update, interval=1, frames=nframes, + self.ani = animation.FuncAnimation(fig, self.update, interval=1, frames=nframes, init_func=self.setup_plot, blit=False) self.ani.save(animfile, fps=60, dpi=300, extra_args=['-vcodec', 'libx264']) @@ -187,13 +197,6 @@ def setup_plot(self): t, name, GMass, Radius, npl, pl, radmarker, origin = next(self.data_stream(0)) cval = self.origin_to_color(origin) - # set up the figure - self.ax = plt.axes(xlim=(xmin, xmax), ylim=(ymin, ymax)) - plt.axis('off') - plt.tight_layout(pad=0) - self.ax.set_aspect(1) - self.ax.get_xaxis().set_visible(False) - self.ax.get_yaxis().set_visible(False) # Scale markers to the size of the system self.v_length = 0.50 # Length of arrow as fraction of velocity @@ -219,7 +222,7 @@ def update(self,frame): """Update the scatter plot.""" t, name, GMass, Radius, npl, pl, radmarker, origin = next(self.data_stream(frame)) cval = self.origin_to_color(origin) - #varrowend, varrowtip = self.velocity_vectors(pl, radmarker) + varrowend, varrowtip = self.velocity_vectors(pl, radmarker) sarrowend, sarrowtip = self.spin_arrows(pl, name, radmarker) for i, p in enumerate(self.patches): p.set_center((pl[i, 0], pl[i,1])) diff --git a/examples/symba_energy_momentum/disruption_headon.in b/examples/symba_energy_momentum/disruption_headon.in index e1a5316bc..bc91bbdd0 100644 --- a/examples/symba_energy_momentum/disruption_headon.in +++ b/examples/symba_energy_momentum/disruption_headon.in @@ -1,11 +1,11 @@ 2 -2 1e-07 0.0009 +1 1e-07 0.0009 7e-06 1.0 -4.20E-05 0.0 0.00 6.28 0.0 0.4 0.4 0.4 !Ip 0.0 0.0 6.0e4 !rot -3 7e-10 0.0004 +2 7e-10 0.0004 3.25e-06 1.0 4.20E-05 0.0 0.00 -6.28 0.0 diff --git a/examples/symba_energy_momentum/disruption_off_axis.in b/examples/symba_energy_momentum/disruption_off_axis.in index b6bc29c26..792bb3a4a 100644 --- a/examples/symba_energy_momentum/disruption_off_axis.in +++ b/examples/symba_energy_momentum/disruption_off_axis.in @@ -1,11 +1,11 @@ 2 -2 1e-07 0.0009 +1 1e-07 0.0009 7e-06 1.0 -4.20E-05 0.0 0.00 6.28 0.0 0.4 0.4 0.4 !Ip 0.0 0.0 6.0e4 !rot -3 7e-10 0.0004 +2 7e-10 0.0004 3.25e-06 1.0 4.20E-05 0.0 -0.80 -6.28 0.0 diff --git a/examples/symba_energy_momentum/escape.in b/examples/symba_energy_momentum/escape.in index b8308af87..911cfce8e 100644 --- a/examples/symba_energy_momentum/escape.in +++ b/examples/symba_energy_momentum/escape.in @@ -1,11 +1,11 @@ 2 -2 1e-07 0.0009 +1 1e-07 0.0009 7e-05 99.9 0.0 0.0 100.00 10.00 0.0 0.4 0.4 0.4 !Ip 0.0 0.0 1000.0 !rot -3 1e-08 0.0004 +2 1e-08 0.0004 3.25e-05 1.0 4.20E-05 0.0 0.00 -6.28 0.0 diff --git a/examples/symba_energy_momentum/sun.in b/examples/symba_energy_momentum/sun.in index 7117d93c3..2f3904e5d 100644 --- a/examples/symba_energy_momentum/sun.in +++ b/examples/symba_energy_momentum/sun.in @@ -1,11 +1,11 @@ 2 -2 2e-08 +1 2e-08 3e-04 5e-2 0.0 0.0 0.00 10.00 0.0 0.4 0.4 0.4 !Ip 100.0 100000.0 -2300.0 !rot -3 2e-08 +2 2e-08 3e-06 1.0 0.00E-05 0.0 0.00 6.28 0.0 diff --git a/examples/symba_energy_momentum/supercatastrophic_headon.in b/examples/symba_energy_momentum/supercatastrophic_headon.in index 7b420c9a0..6894837f9 100644 --- a/examples/symba_energy_momentum/supercatastrophic_headon.in +++ b/examples/symba_energy_momentum/supercatastrophic_headon.in @@ -1,11 +1,11 @@ 2 -2 1e-07 0.0009 +1 1e-07 0.0009 7e-06 1.0 -4.20E-05 0.0 0.00 6.28 0.0 0.4 0.4 0.4 !Ip 0.0 0.0 -6.0e4 !rot -3 1e-08 0.0004 +2 1e-08 0.0004 3.25e-06 1.0 4.20E-05 0.0 0.00 -6.28 0.0 diff --git a/examples/symba_energy_momentum/supercatastrophic_off_axis.in b/examples/symba_energy_momentum/supercatastrophic_off_axis.in index a464d037e..230ed071f 100644 --- a/examples/symba_energy_momentum/supercatastrophic_off_axis.in +++ b/examples/symba_energy_momentum/supercatastrophic_off_axis.in @@ -1,11 +1,11 @@ 2 -2 1e-07 0.0009 +1 1e-07 0.0009 7e-06 1.0 -4.20E-05 0.0 0.00 6.28 0.0 0.4 0.4 0.4 !Ip 0.0 0.0 -6.0e4 !rot -3 1e-08 0.0004 +2 1e-08 0.0004 3.25e-06 1.0 4.20E-05 0.0 1.00 -6.28 0.0 From d24de6d0e470ce1abb91439837f286342e92ea3c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 15:07:31 -0400 Subject: [PATCH 67/71] Added total energy tracker and update the collisional energy bookkeeping term after discards --- src/symba/symba_discard.f90 | 12 +++++++++++- src/util/util_get_energy_momentum.f90 | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 5f6d3926a..253fb2700 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -271,7 +271,6 @@ subroutine symba_discard_peri_pl(pl, system, param) pl%lfirst = lfirst_orig return - end subroutine symba_discard_peri_pl @@ -285,6 +284,8 @@ module subroutine symba_discard_pl(self, system, param) class(symba_pl), intent(inout) :: self !! SyMBA test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! Internals + real(DP) :: Eorbit_before, Eorbit_after select type(system) class is (symba_nbody_system) @@ -309,8 +310,17 @@ module subroutine symba_discard_pl(self, system, param) end if if (any(pl%ldiscard(:))) then + if (param%lenergy) then + call system%get_energy_and_momentum(param) + Eorbit_before = system%te + end if call symba_discard_nonplpl_conservation(self, system, param) call pl%rearray(system, param) + if (param%lenergy) then + call system%get_energy_and_momentum(param) + Eorbit_after = system%te + system%Ecollisions = Eorbit_after - Eorbit_before + end if end if end associate diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 700ecbe40..fa7cda43d 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -129,6 +129,8 @@ module subroutine util_get_energy_momentum_system(self, param) system%Lspin(2) = Lcbspin(2) + sum(Lplspiny(1:npl), lstatus(1:npl)) system%Lspin(3) = Lcbspin(3) + sum(Lplspinz(1:npl), lstatus(1:npl)) end if + + system%te = system%ke_orbit + system%ke_spin + system%pe end associate return From 8228d4370873cb7de6ea5ecbace22bfd0c5ef625 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 16:36:43 -0400 Subject: [PATCH 68/71] Consolidated the add/subrtract procedure for each of the fragmentation cases into one subroutine --- src/fragmentation/fragmentation.f90 | 60 +-- src/symba/symba_fragmentation.f90 | 764 ++++++++++++---------------- 2 files changed, 348 insertions(+), 476 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 9d9718bfa..1fc9e9560 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -133,24 +133,24 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, call restore_scale_factors() call calculate_system_energy(linclude_fragments=.true.) - ! write(*, "(' -------------------------------------------------------------------------------------')") - ! write(*, "(' Final diagnostic')") - ! write(*, "(' -------------------------------------------------------------------------------------')") - ! if (lfailure) then - ! write(*,*) "symba_frag_pos failed after: ",try," tries" - ! do ii = 1, nfrag - ! vb_frag(:, ii) = vcom(:) - ! end do - ! else - ! write(*,*) "symba_frag_pos succeeded after: ",try," tries" - ! write(*, "(' dL_tot should be very small' )") - ! write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before - ! write(*, "(' dE_tot should be negative and equal to Qloss' )") - ! write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) - ! write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) - ! write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) - ! end if - ! write(*, "(' -------------------------------------------------------------------------------------')") + write(*, "(' -------------------------------------------------------------------------------------')") + write(*, "(' Final diagnostic')") + write(*, "(' -------------------------------------------------------------------------------------')") + if (lfailure) then + write(*,*) "symba_frag_pos failed after: ",try," tries" + do ii = 1, nfrag + vb_frag(:, ii) = vcom(:) + end do + else + write(*,*) "symba_frag_pos succeeded after: ",try," tries" + write(*, "(' dL_tot should be very small' )") + write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before + write(*, "(' dE_tot should be negative and equal to Qloss' )") + write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) + write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) + write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) + end if + write(*, "(' -------------------------------------------------------------------------------------')") call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily @@ -592,7 +592,6 @@ subroutine set_fragment_tan_vel(lerr) type(lambda_obj_err) :: objective_function real(DP), dimension(NDIM) :: L_frag_spin, L_remainder, Li, rot_L, rot_ke - ! Initialize the fragments with 0 velocity and spin so we can divide up the balance between the tangential, radial, and spin components while conserving momentum lerr = .false. if (ke_frag_budget < 0.0_DP) then @@ -661,11 +660,12 @@ subroutine set_fragment_tan_vel(lerr) ! If we are over the energy budget, flag this as a failure so we can try again lerr = (ke_radial < 0.0_DP) - ! write(*,*) 'Tangential' - ! write(*,*) 'ke_frag_budget: ',ke_frag_budget - ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - ! write(*,*) 'ke_frag_spin : ',ke_frag_spin - ! write(*,*) 'ke_radial : ',ke_radial + write(*,*) 'Tangential' + write(*,*) 'Failure? ',lerr + write(*,*) 'ke_frag_budget: ',ke_frag_budget + write(*,*) 'ke_frag_spin : ',ke_frag_spin + write(*,*) 'ke_tangential : ',ke_frag_orbit + write(*,*) 'ke_remainder : ',ke_radial return end subroutine set_fragment_tan_vel @@ -790,12 +790,12 @@ subroutine set_fragment_radial_velocities(lerr) end do ke_frag_orbit = 0.5_DP * sum(kearr(:)) ke_frag_spin = 0.5_DP * sum(kespinarr(:)) - ! write(*,*) 'Radial' - ! write(*,*) 'Failure? ',lerr - ! write(*,*) 'ke_frag_budget: ',ke_frag_budget - ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - ! write(*,*) 'ke_frag_spin : ',ke_frag_spin - ! write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) + write(*,*) 'Radial' + write(*,*) 'Failure? ',lerr + write(*,*) 'ke_frag_budget: ',ke_frag_budget + write(*,*) 'ke_frag_spin : ',ke_frag_spin + write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) lerr = .false. return diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index 9fb11b6ae..f70b36ce7 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -28,125 +28,63 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, real(DP), dimension(2) :: vol real(DP), dimension(:, :), allocatable :: vb_frag, xb_frag, rot_frag, Ip_frag real(DP), dimension(:), allocatable :: m_frag, rad_frag + integer(I4B), dimension(:), allocatable :: id_frag logical :: lfailure - logical, dimension(system%pl%nbody) :: lmask - class(symba_pl), allocatable :: plnew - select type(pl => system%pl) - class is (symba_pl) - select type(pl_discards => system%pl_discards) - class is (symba_merger) - associate(pl_adds => system%pl_adds, cb => system%cb) - ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - nfrag = NFRAG_DISRUPT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment - m_frag(1) = mass_res(1) - if (mass_res(2) > mass_res(1) / 3._DP) then - m_frag(2) = mass_res(2) - istart = 3 - else - istart = 2 - end if - ! Distribute remaining mass among the remaining bodies - do i = istart, nfrag - m_frag(i) = (mtot - sum(m_frag(1:istart - 1))) / (nfrag - istart + 1) - end do - - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - - do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) - end do - - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) - - if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' - status = ACTIVE - nfrag = 0 - else - ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = DISRUPTION - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Disruption" - plnew%info(:)%origin_time = param%t - do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) - end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if - call plnew%set_mu(cb) - pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY - - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - - call plnew%setup(0, param) - deallocate(plnew) - end if - end associate - end select - end select + ! Collisional fragments will be uniformly distributed around the pre-impact barycenter + nfrag = NFRAG_DISRUPT + allocate(m_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + allocate(id_frag(nfrag)) + + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + + ! Get mass weighted mean of Ip and average density + Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot + vol(:) = 4._DP / 3._DP * PI * radius(:)**3 + avg_dens = mtot / sum(vol(:)) + + ! Distribute the mass among fragments, with a branch to check for the size of the second largest fragment + m_frag(1) = mass_res(1) + if (mass_res(2) > mass_res(1) / 3._DP) then + m_frag(2) = mass_res(2) + istart = 3 + else + istart = 2 + end if + ! Distribute remaining mass among the remaining bodies + do i = istart, nfrag + m_frag(i) = (mtot - sum(m_frag(1:istart - 1))) / (nfrag - istart + 1) + end do + + ! Distribute any residual mass if there is any and set the radius + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + id_frag(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] + + do i = 1, nfrag + Ip_frag(:, i) = Ip_new(:) + end do + + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + + if (lfailure) then + write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' + status = ACTIVE + nfrag = 0 + else + ! Populate the list of new bodies + write(*,'("Generating ",I2.0," fragments")') nfrag + status = DISRUPTION + call symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + end if return end function symba_fragmentation_casedisruption @@ -169,7 +107,7 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, nfrag, jproj, jtarg, idstart, ibiggest, nfamily, nstart, nend + integer(I4B) :: i, nfrag, jproj, jtarg, idstart, ibiggest, nfamily real(DP) :: mtot, avg_dens real(DP), dimension(NDIM) :: xcom, vcom real(DP), dimension(2) :: vol @@ -178,138 +116,73 @@ module function symba_fragmentation_casehitandrun(system, param, family, x, v, m integer(I4B), dimension(:), allocatable :: id_frag logical :: lpure logical, dimension(system%pl%nbody) :: lmask - class(symba_pl), allocatable :: plnew - select type(pl => system%pl) - class is (symba_pl) - select type(pl_discards => system%pl_discards) - class is (symba_merger) - associate(pl_adds => system%pl_adds, cb => system%cb) - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - lpure = .false. - - ! The largest body will stay untouched - if (mass(1) > mass(2)) then - jtarg = 1 - jproj = 2 - else - jtarg = 2 - jproj = 1 - end if - - if (mass_res(2) > 0.9_DP * mass(jproj)) then ! Pure hit and run, so we'll just keep the two bodies untouched - write(*,*) 'Pure hit and run. No new fragments generated.' - nfrag = 0 - lpure = .true. - else ! Imperfect hit and run, so we'll keep the largest body and destroy the other - nfrag = NFRAG_DISRUPT - 1 - lpure = .false. - allocate(m_frag(nfrag)) - allocate(id_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - m_frag(1) = mass(jtarg) - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - id_frag(1) = pl%id(ibiggest) - rad_frag(1) = radius(jtarg) - xb_frag(:, 1) = x(:, jtarg) - vb_frag(:, 1) = v(:, jtarg) - Ip_frag(:,1) = Ip(:, jtarg) - - ! Get mass weighted mean of Ip and average density - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mass(jproj) / vol(jproj) - m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) - rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - - do i = 1, nfrag - Ip_frag(:, i) = Ip(:, jproj) - end do - - ! Put the fragments on the circle surrounding the center of mass of the system - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lpure) - if (lpure) then - write(*,*) 'Should have been a pure hit and run instead' - nfrag = 0 - else - write(*,'("Generating ",I2.0," fragments")') nfrag - end if - end if - if (lpure) then - status = ACTIVE - else - status = HIT_AND_RUN - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Hit and run fragment" - plnew%info(:)%origin_time = param%t - do i = 1, nfrag - plnew%info(i)%origin_xh(:) = plnew%xh(:,i) - plnew%info(i)%origin_vh(:) = plnew%vh(:,i) - end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if - call plnew%set_mu(cb) - pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY - - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - pl_adds%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) - - end if - end associate - end select - end select + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + lpure = .false. + + ! The largest body will stay untouched + if (mass(1) > mass(2)) then + jtarg = 1 + jproj = 2 + else + jtarg = 2 + jproj = 1 + end if + + if (mass_res(2) > 0.9_DP * mass(jproj)) then ! Pure hit and run, so we'll just keep the two bodies untouched + write(*,*) 'Pure hit and run. No new fragments generated.' + nfrag = 0 + lpure = .true. + else ! Imperfect hit and run, so we'll keep the largest body and destroy the other + nfrag = NFRAG_DISRUPT - 1 + lpure = .false. + allocate(m_frag(nfrag)) + allocate(id_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + m_frag(1) = mass(jtarg) + ibiggest = maxloc(system%pl%Gmass(family(:)), dim=1) + id_frag(1) = system%pl%id(ibiggest) + rad_frag(1) = radius(jtarg) + xb_frag(:, 1) = x(:, jtarg) + vb_frag(:, 1) = v(:, jtarg) + Ip_frag(:,1) = Ip(:, jtarg) + + ! Get mass weighted mean of Ip and average density + vol(:) = 4._DP / 3._DP * pi * radius(:)**3 + avg_dens = mass(jproj) / vol(jproj) + m_frag(2:nfrag) = (mtot - m_frag(1)) / (nfrag - 1) + rad_frag(2:nfrag) = (3 * m_frag(2:nfrag) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + id_frag(2:nfrag) = [(i, i = system%maxid + 1, system%maxid + nfrag - 1)] + + do i = 1, nfrag + Ip_frag(:, i) = Ip(:, jproj) + end do + + ! Put the fragments on the circle surrounding the center of mass of the system + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lpure) + if (lpure) then + write(*,*) 'Should have been a pure hit and run instead' + nfrag = 0 + else + write(*,'("Generating ",I2.0," fragments")') nfrag + end if + end if + if (lpure) then + status = ACTIVE + else + status = HIT_AND_RUN + call symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + end if - return + return end function symba_fragmentation_casehitandrun @@ -331,122 +204,75 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, j, ibiggest, nfamily, nstart, nend - real(DP) :: mass_new, radius_new, volume_new, pe - real(DP), dimension(NDIM) :: xcom, vcom, xc, vc, xcrossv + integer(I4B) :: i, j, ibiggest, nfamily + real(DP) :: volume_new, pe + real(DP), dimension(NDIM) :: xc, vc, xcrossv real(DP), dimension(2) :: vol real(DP), dimension(NDIM) :: L_orb_old, L_spin_old - real(DP), dimension(NDIM) :: L_spin_new, rot_new, Ip_new + real(DP), dimension(NDIM) :: L_spin_new logical, dimension(system%pl%nbody) :: lmask - class(symba_pl), allocatable :: plnew + real(DP), dimension(NDIM, 1) :: vb_frag, xb_frag, rot_frag, Ip_frag + real(DP), dimension(1) :: m_frag, rad_frag + integer(I4B), dimension(1) :: id_frag select type(pl => system%pl) class is (symba_pl) - select type(pl_discards => system%pl_discards) - class is (symba_merger) - associate(pl_adds => system%pl_adds, cb => system%cb) - status = MERGED - write(*, '("Merging bodies ",99(I8,",",:))') pl%id(family(:)) - mass_new = sum(mass(:)) - - ! Merged body is created at the barycenter of the original bodies - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mass_new - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mass_new - - ! Get mass weighted mean of Ip and - vol(:) = 4._DP / 3._DP * PI * radius(:)**3 - volume_new = sum(vol(:)) - radius_new = (3 * volume_new / (4 * PI))**(1._DP / 3._DP) - - L_orb_old(:) = 0.0_DP - - ! Compute orbital angular momentum of pre-impact system - do i = 1, 2 - xc(:) = x(:, i) - xcom(:) - vc(:) = v(:, i) - vcom(:) - xcrossv(:) = xc(:) .cross. vc(:) - L_orb_old(:) = L_orb_old(:) + mass(i) * xcrossv(:) - end do - - if (param%lrotation) then - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mass_new - L_spin_old(:) = L_spin(:,1) + L_spin(:,2) + write(*, '("Merging bodies ",99(I8,",",:))') pl%id(family(:)) - ! Conserve angular momentum by putting pre-impact orbital momentum into spin of the new body - L_spin_new(:) = L_orb_old(:) + L_spin_old(:) - - ! Assume prinicpal axis rotation on 3rd Ip axis - rot_new(:) = L_spin_new(:) / (Ip_new(3) * mass_new * radius_new**2) - else ! If spin is not enabled, we will consider the lost pre-collision angular momentum as "escaped" and add it to our bookkeeping variable - system%Lescape(:) = system%Lescape(:) + L_orb_old(:) - end if - - ! Keep track of the component of potential energy due to the pre-impact family for book-keeping - nfamily = size(family(:)) - pe = 0.0_DP - do j = 1, nfamily - do i = j + 1, nfamily - pe = pe - pl%mass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) - end do - end do - system%Ecollisions = system%Ecollisions + pe - system%Euntracked = system%Euntracked - pe - - ! Add the family bodies to the subtraction list - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + id_frag(1) = pl%id(family(ibiggest)) - ! Create the new merged body - allocate(plnew, mold=pl) - call plnew%setup(1, param) + m_frag(1) = sum(mass(:)) + + ! Merged body is created at the barycenter of the original bodies + xb_frag(:,1) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / m_frag(1) + vb_frag(:,1) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / m_frag(1) + + ! Get mass weighted mean of Ip and + vol(:) = 4._DP / 3._DP * PI * radius(:)**3 + volume_new = sum(vol(:)) + rad_frag(1) = (3 * volume_new / (4 * PI))**(1._DP / 3._DP) - ! The merged body's name will be that of the largest of the two parents - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%id(1) = pl%id(family(ibiggest)) - plnew%status(1) = ACTIVE - plnew%lcollision = .false. - plnew%ldiscard = .false. - plnew%xb(:,1) = xcom(:) - plnew%vb(:,1) = vcom(:) - plnew%xh(:,1) = xcom(:) - cb%xb(:) - plnew%vh(:,1) = vcom(:) - cb%vb(:) - plnew%mass(1) = mass_new - plnew%Gmass(1) = param%GU * mass_new - plnew%density(1) = mass_new / volume_new - plnew%radius(1) = radius_new - plnew%info(1) = pl%info(family(ibiggest)) - if (param%lrotation) then - plnew%Ip(:,1) = Ip_new(:) - plnew%rot(:,1) = rot_new(:) - end if - if (param%ltides) then - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if - call plnew%set_mu(cb) - pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY + L_orb_old(:) = 0.0_DP - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - pl_adds%ncomp(nstart:nend) = plnew%nbody + ! Compute orbital angular momentum of pre-impact system + do i = 1, 2 + xc(:) = x(:, i) - xb_frag(:,1) + vc(:) = v(:, i) - vb_frag(:,1) + xcrossv(:) = xc(:) .cross. vc(:) + L_orb_old(:) = L_orb_old(:) + mass(i) * xcrossv(:) + end do + + if (param%lrotation) then + Ip_frag(:,1) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / m_frag(1) + L_spin_old(:) = L_spin(:,1) + L_spin(:,2) - call plnew%setup(0, param) - deallocate(plnew) - end associate - end select + ! Conserve angular momentum by putting pre-impact orbital momentum into spin of the new body + L_spin_new(:) = L_orb_old(:) + L_spin_old(:) + + ! Assume prinicpal axis rotation on 3rd Ip axis + rot_frag(:,1) = L_spin_new(:) / (Ip_frag(3,1) * m_frag(1) * rad_frag(1)**2) + else ! If spin is not enabled, we will consider the lost pre-collision angular momentum as "escaped" and add it to our bookkeeping variable + system%Lescape(:) = system%Lescape(:) + L_orb_old(:) + end if + + ! Keep track of the component of potential energy due to the pre-impact family for book-keeping + nfamily = size(family(:)) + pe = 0.0_DP + do j = 1, nfamily + do i = j + 1, nfamily + pe = pe - pl%mass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) + end do + end do + system%Ecollisions = system%Ecollisions + pe + system%Euntracked = system%Euntracked - pe + + status = MERGED + call symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + end select return - end function symba_fragmentation_casemerge @@ -474,124 +300,170 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, real(DP), dimension(NDIM) :: Ip_new real(DP), dimension(:, :), allocatable :: vb_frag, xb_frag, rot_frag, Ip_frag real(DP), dimension(:), allocatable :: m_frag, rad_frag + integer(I4B), dimension(:), allocatable :: id_frag logical :: lfailure logical, dimension(system%pl%nbody) :: lmask + + ! Collisional fragments will be uniformly distributed around the pre-impact barycenter + nfrag = NFRAG_SUPERCAT + allocate(m_frag(nfrag)) + allocate(rad_frag(nfrag)) + allocate(id_frag(nfrag)) + allocate(xb_frag(NDIM, nfrag)) + allocate(vb_frag(NDIM, nfrag)) + allocate(rot_frag(NDIM, nfrag)) + allocate(Ip_frag(NDIM, nfrag)) + + mtot = sum(mass(:)) + xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot + vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot + + ! Get mass weighted mean of Ip and average density + Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot + vol(:) = 4._DP / 3._DP * pi * radius(:)**3 + avg_dens = mtot / sum(vol(:)) + + ! If we are adding the first and largest fragment (lr), check to see if its mass is SMALLER than an equal distribution of + ! mass between all fragments. If so, we will just distribute the mass equally between the fragments + min_frag_mass = mtot / nfrag + if (mass_res(1) < min_frag_mass) then + m_frag(:) = min_frag_mass + else + m_frag(1) = mass_res(1) + m_frag(2:nfrag) = (mtot - mass_res(1)) / (nfrag - 1) + end if + ! Distribute any residual mass if there is any and set the radius + m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) + rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) + id_frag(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] + + do i = 1, nfrag + Ip_frag(:, i) = Ip_new(:) + end do + + call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + + if (lfailure) then + write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' + status = ACTIVE + nfrag = 0 + else + ! Populate the list of new bodies + write(*,'("Generating ",I2.0," fragments")') nfrag + status = SUPERCATASTROPHIC + call symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + end if + + return + end function symba_fragmentation_casesupercatastrophic + + + subroutine symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, status) + !! author: David A. Minton + !! + !! Fills the pl_discards and pl_adds with removed and added bodies + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions + integer(I4B), dimension(:), intent(in) :: family !! List of indices of all bodies inovlved in the collision + integer(I4B), dimension(:), intent(in) :: id_frag !! List of fragment ids + real(DP), dimension(:), intent(in) :: m_frag, rad_frag !! Distribution of fragment mass and radii + real(DP), dimension(:,:), intent(in) :: Ip_frag !! Fragment rotational inertia vectors + real(DP), dimension(:,:), intent(in) :: xb_frag, vb_frag, rot_frag !! Fragment barycentric position, barycentric velocity, and rotation vectors + integer(I4B), intent(in) :: status !! Status flag to assign to adds + ! Internals + integer(I4B) :: i, ibiggest, nstart, nend, nfamily, nfrag + logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew - + select type(pl => system%pl) class is (symba_pl) select type(pl_discards => system%pl_discards) class is (symba_merger) associate(pl_adds => system%pl_adds, cb => system%cb) - ! Collisional fragments will be uniformly distributed around the pre-impact barycenter - nfrag = NFRAG_SUPERCAT - allocate(m_frag(nfrag)) - allocate(rad_frag(nfrag)) - allocate(xb_frag(NDIM, nfrag)) - allocate(vb_frag(NDIM, nfrag)) - allocate(rot_frag(NDIM, nfrag)) - allocate(Ip_frag(NDIM, nfrag)) - - mtot = sum(mass(:)) - xcom(:) = (mass(1) * x(:,1) + mass(2) * x(:,2)) / mtot - vcom(:) = (mass(1) * v(:,1) + mass(2) * v(:,2)) / mtot - - ! Get mass weighted mean of Ip and average density - Ip_new(:) = (mass(1) * Ip(:,1) + mass(2) * Ip(:,2)) / mtot - vol(:) = 4._DP / 3._DP * pi * radius(:)**3 - avg_dens = mtot / sum(vol(:)) - - ! If we are adding the first and largest fragment (lr), check to see if its mass is SMALLER than an equal distribution of - ! mass between all fragments. If so, we will just distribute the mass equally between the fragments - min_frag_mass = mtot / nfrag - if (mass_res(1) < min_frag_mass) then - m_frag(:) = min_frag_mass - else - m_frag(1) = mass_res(1) - m_frag(2:nfrag) = (mtot - mass_res(1)) / (nfrag - 1) - end if - ! Distribute any residual mass if there is any and set the radius - m_frag(nfrag) = m_frag(nfrag) + (mtot - sum(m_frag(:))) - rad_frag(:) = (3 * m_frag(:) / (4 * PI * avg_dens))**(1.0_DP / 3.0_DP) - + + ! Add the family bodies to the subtraction list + nfamily = size(family(:)) + nfrag = size(m_frag(:)) + lmask(:) = .false. + lmask(family(:)) = .true. + pl%status(family(:)) = INACTIVE + + nstart = pl_discards%nbody + 1 + nend = pl_discards%nbody + nfamily + call pl_discards%append(pl, lmask) + + ! Record how many bodies were subtracted in this event + pl_discards%ncomp(nstart:nend) = nfamily + + ! Setup new bodies + allocate(plnew, mold=pl) + call plnew%setup(nfrag, param) + ibiggest = maxloc(pl%Gmass(family(:)), dim=1) + + plnew%id(:) = id_frag(:) + system%maxid = system%maxid + nfrag + plnew%status(:) = ACTIVE + plnew%lcollision(:) = .false. + plnew%ldiscard(:) = .false. + plnew%xb(:,:) = xb_frag(:, :) + plnew%vb(:,:) = vb_frag(:, :) do i = 1, nfrag - Ip_frag(:, i) = Ip_new(:) + plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) + plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) end do + plnew%mass(:) = m_frag(:) + plnew%Gmass(:) = param%GU * m_frag(:) + plnew%radius(:) = rad_frag(:) + plnew%density(:) = m_frag(:) / rad_frag(:) - call fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & - nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) - - if (lfailure) then - write(*,*) 'No fragment solution found, so treat as a pure hit-and-run' - status = ACTIVE - nfrag = 0 - else - ! Populate the list of new bodies - write(*,'("Generating ",I2.0," fragments")') nfrag - status = SUPERCATASTROPHIC - - ! Add the family bodies to the subtraction list - nfamily = size(family(:)) - lmask(:) = .false. - lmask(family(:)) = .true. - pl%status(family(:)) = MERGED - nstart = pl_discards%nbody + 1 - nend = pl_discards%nbody + nfamily - call pl_discards%append(pl, lmask) - ! Record how many bodies were subtracted in this event - pl_discards%ncomp(nstart:nend) = nfamily - - allocate(plnew, mold=pl) - call plnew%setup(nfrag, param) - - plnew%id(:) = [(i, i = system%maxid + 1, system%maxid + nfrag)] - system%maxid = system%maxid + nfrag - plnew%status(:) = ACTIVE - plnew%lcollision(:) = .false. - plnew%ldiscard(:) = .false. - plnew%xb(:,:) = xb_frag(:, :) - plnew%vb(:,:) = vb_frag(:, :) - do i = 1, nfrag - plnew%xh(:,i) = xb_frag(:, i) - cb%xb(:) - plnew%vh(:,i) = vb_frag(:, i) - cb%vb(:) - end do - plnew%mass(:) = m_frag(:) - plnew%Gmass(:) = param%GU * m_frag(:) - plnew%density(:) = avg_dens - plnew%radius(:) = rad_frag(:) + select case(status) + case(DISRUPTION) + plnew%info(:)%origin_type = "Disruption" + case(SUPERCATASTROPHIC) plnew%info(:)%origin_type = "Supercatastrophic" + case(HIT_AND_RUN) + plnew%info(:)%origin_type = "Hit and run fragment" + case(MERGED) + plnew%info(1) = pl%info(ibiggest) + end select + + if (status /= MERGED) then plnew%info(:)%origin_time = param%t do i = 1, nfrag plnew%info(i)%origin_xh(:) = plnew%xh(:,i) plnew%info(i)%origin_vh(:) = plnew%vh(:,i) end do - if (param%lrotation) then - plnew%Ip(:,:) = Ip_frag(:,:) - plnew%rot(:,:) = rot_frag(:,:) - end if - if (param%ltides) then - ibiggest = maxloc(pl%Gmass(family(:)), dim=1) - plnew%Q = pl%Q(ibiggest) - plnew%k2 = pl%k2(ibiggest) - plnew%tlag = pl%tlag(ibiggest) - end if - call plnew%set_mu(cb) - pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY - - ! Append the new merged body to the list and record how many we made - nstart = pl_adds%nbody + 1 - nend = pl_adds%nbody + plnew%nbody - call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) - pl_adds%ncomp(nstart:nend) = plnew%nbody - - call plnew%setup(0, param) - deallocate(plnew) end if + + if (param%lrotation) then + plnew%Ip(:,:) = Ip_frag(:,:) + plnew%rot(:,:) = rot_frag(:,:) + end if + if (param%ltides) then + plnew%Q = pl%Q(ibiggest) + plnew%k2 = pl%k2(ibiggest) + plnew%tlag = pl%tlag(ibiggest) + end if + call plnew%set_mu(cb) + pl%lmtiny(:) = pl%Gmass(:) > param%GMTINY + + ! Append the new merged body to the list and record how many we made + nstart = pl_adds%nbody + 1 + nend = pl_adds%nbody + plnew%nbody + call pl_adds%append(plnew, lsource_mask=[(.true., i=1, plnew%nbody)]) + pl_adds%ncomp(nstart:nend) = plnew%nbody + + call plnew%setup(0, param) + deallocate(plnew) end associate end select end select return - end function symba_fragmentation_casesupercatastrophic + end subroutine symba_fragmentation_mergeaddsub end submodule s_symba_fragmentation From 46f333eaf7e0db7d1bad53df117b155c47a58490 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 20:08:55 -0400 Subject: [PATCH 69/71] Fixed scaling issue in radial velocity step of fragmentation initialization --- src/fragmentation/fragmentation.f90 | 63 +++++++++++++++-------------- src/symba/symba_fragmentation.f90 | 5 ++- src/util/util_rescale.f90 | 1 + 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index 1fc9e9560..f23294239 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -133,24 +133,24 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, call restore_scale_factors() call calculate_system_energy(linclude_fragments=.true.) - write(*, "(' -------------------------------------------------------------------------------------')") - write(*, "(' Final diagnostic')") - write(*, "(' -------------------------------------------------------------------------------------')") - if (lfailure) then - write(*,*) "symba_frag_pos failed after: ",try," tries" - do ii = 1, nfrag - vb_frag(:, ii) = vcom(:) - end do - else - write(*,*) "symba_frag_pos succeeded after: ",try," tries" - write(*, "(' dL_tot should be very small' )") - write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before - write(*, "(' dE_tot should be negative and equal to Qloss' )") - write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) - write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) - write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) - end if - write(*, "(' -------------------------------------------------------------------------------------')") + ! write(*, "(' -------------------------------------------------------------------------------------')") + ! write(*, "(' Final diagnostic')") + ! write(*, "(' -------------------------------------------------------------------------------------')") + ! if (lfailure) then + ! write(*,*) "symba_frag_pos failed after: ",try," tries" + ! do ii = 1, nfrag + ! vb_frag(:, ii) = vcom(:) + ! end do + ! else + ! write(*,*) "symba_frag_pos succeeded after: ",try," tries" + ! write(*, "(' dL_tot should be very small' )") + ! write(*,fmtlabel) ' dL_tot |', dLmag / Lmag_before + ! write(*, "(' dE_tot should be negative and equal to Qloss' )") + ! write(*,fmtlabel) ' dE_tot |', dEtot / abs(Etot_before) + ! write(*,fmtlabel) ' Qloss |', -Qloss / abs(Etot_before) + ! write(*,fmtlabel) ' dE - Qloss |', (Etot_after - Etot_before + Qloss) / abs(Etot_before) + ! end if + ! write(*, "(' -------------------------------------------------------------------------------------')") call ieee_set_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily @@ -660,12 +660,12 @@ subroutine set_fragment_tan_vel(lerr) ! If we are over the energy budget, flag this as a failure so we can try again lerr = (ke_radial < 0.0_DP) - write(*,*) 'Tangential' - write(*,*) 'Failure? ',lerr - write(*,*) 'ke_frag_budget: ',ke_frag_budget - write(*,*) 'ke_frag_spin : ',ke_frag_spin - write(*,*) 'ke_tangential : ',ke_frag_orbit - write(*,*) 'ke_remainder : ',ke_radial + ! write(*,*) 'Tangential' + ! write(*,*) 'Failure? ',lerr + ! write(*,*) 'ke_frag_budget: ',ke_frag_budget + ! write(*,*) 'ke_frag_spin : ',ke_frag_spin + ! write(*,*) 'ke_tangential : ',ke_frag_orbit + ! write(*,*) 'ke_remainder : ',ke_radial return end subroutine set_fragment_tan_vel @@ -782,6 +782,9 @@ subroutine set_fragment_radial_velocities(lerr) v_r_mag = util_minimize_bfgs(objective_function, nfrag, v_r_initial, TOL, lerr) ! Shift the radial velocity vectors to align with the center of mass of the collisional system (the origin) vb_frag(:,1:nfrag) = vmag_to_vb(v_r_mag(1:nfrag), v_r_unit(:,1:nfrag), v_t_mag(1:nfrag), v_t_unit(:,1:nfrag), m_frag(1:nfrag), vcom(:)) + do i = 1, nfrag + v_frag(:, i) = vb_frag(:, i) - vcom(:) + end do call add_fragments_to_tmpsys() do concurrent(i = 1:nfrag) @@ -790,12 +793,12 @@ subroutine set_fragment_radial_velocities(lerr) end do ke_frag_orbit = 0.5_DP * sum(kearr(:)) ke_frag_spin = 0.5_DP * sum(kespinarr(:)) - write(*,*) 'Radial' - write(*,*) 'Failure? ',lerr - write(*,*) 'ke_frag_budget: ',ke_frag_budget - write(*,*) 'ke_frag_spin : ',ke_frag_spin - write(*,*) 'ke_frag_orbit : ',ke_frag_orbit - write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) + ! write(*,*) 'Radial' + ! write(*,*) 'Failure? ',lerr + ! write(*,*) 'ke_frag_budget: ',ke_frag_budget + ! write(*,*) 'ke_frag_spin : ',ke_frag_spin + ! write(*,*) 'ke_frag_orbit : ',ke_frag_orbit + ! write(*,*) 'ke_remainder : ',ke_frag_budget - (ke_frag_orbit + ke_frag_spin) lerr = .false. return diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index f70b36ce7..b36c54e9a 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -390,11 +390,12 @@ subroutine symba_fragmentation_mergeaddsub(system, param, family, id_frag, Ip_fr nfrag = size(m_frag(:)) lmask(:) = .false. lmask(family(:)) = .true. - pl%status(family(:)) = INACTIVE - + pl%status(family(:)) = MERGED nstart = pl_discards%nbody + 1 nend = pl_discards%nbody + nfamily call pl_discards%append(pl, lmask) + pl%ldiscard(family(:)) = .true. + pl%lcollision(family(:)) = .true. ! Record how many bodies were subtracted in this event pl_discards%ncomp(nstart:nend) = nfamily diff --git a/src/util/util_rescale.f90 b/src/util/util_rescale.f90 index 061ecf9a5..62a9409ec 100644 --- a/src/util/util_rescale.f90 +++ b/src/util/util_rescale.f90 @@ -33,6 +33,7 @@ module subroutine util_rescale_system(self, param, mscale, dscale, tscale) cb%radius = cb%radius / dscale cb%xb(:) = cb%xb(:) / dscale cb%vb(:) = cb%vb(:) / vscale + cb%rot(:) = cb%rot(:) * tscale pl%mass(1:npl) = pl%mass(1:npl) / mscale pl%Gmass(1:npl) = param%GU * pl%mass(1:npl) pl%radius(1:npl) = pl%radius(1:npl) / dscale From 3774b4040fa1b6c70522680d14133e8a6b98445c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 20:12:21 -0400 Subject: [PATCH 70/71] Commented out failure messages in fragment solver --- src/fragmentation/fragmentation.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index f23294239..73cef6240 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -104,23 +104,23 @@ module subroutine fragmentation_initialize(system, param, family, x, v, L_spin, !write(*,*) 'Trying new arrangement' end do ke_avg_deficit = ke_avg_deficit / subtry - if (lfailure) write(*,*) 'Failed to find tangential velocities' + !if (lfailure) write(*,*) 'Failed to find tangential velocities' if (.not.lfailure) then call calculate_system_energy(linclude_fragments=.true.) ke_radial = -dEtot - Qloss call set_fragment_radial_velocities(lfailure) - if (lfailure) write(*,*) 'Failed to find radial velocities' + ! if (lfailure) write(*,*) 'Failed to find radial velocities' if (.not.lfailure) then call calculate_system_energy(linclude_fragments=.true.) ! write(*,*) 'Qloss : ',Qloss ! write(*,*) '-dEtot: ',-dEtot ! write(*,*) 'delta : ',abs((dEtot + Qloss)) if ((abs(dEtot + Qloss) > Etol) .or. (dEtot > 0.0_DP)) then - write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + Qloss) / Etol + !write(*,*) 'Failed due to high energy error: ',dEtot, abs(dEtot + Qloss) / Etol lfailure = .true. else if (abs(dLmag) / Lmag_before > Ltol) then - write(*,*) 'Failed due to high angular momentum error: ', dLmag / Lmag_before + !write(*,*) 'Failed due to high angular momentum error: ', dLmag / Lmag_before lfailure = .true. end if end if From e0b071c791b39653363def563a5fb819974ca1e8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 10 Aug 2021 22:41:23 -0400 Subject: [PATCH 71/71] Simplified driver program and moved all messaging to io_dump_system. Added in Wall time messaging from the Fragmentation branch --- src/io/io.f90 | 68 ++++++++++++++++++++------------ src/main/swiftest_driver.f90 | 20 ++++------ src/modules/swiftest_classes.f90 | 6 +-- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 03fdc2e17..a80d54893 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -129,7 +129,7 @@ module subroutine io_dump_param(self, param_file_name) end subroutine io_dump_param - module subroutine io_dump_swiftest(self, param, msg) + module subroutine io_dump_swiftest(self, param) !! author: David A. Minton !! !! Dump massive body data to files @@ -140,7 +140,6 @@ module subroutine io_dump_swiftest(self, param, msg) ! Arguments class(swiftest_base), intent(inout) :: self !! Swiftest base object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation ! Internals integer(I4B) :: ierr !! Error code integer(I4B),parameter :: LUN = 7 !! Unit number for dump file @@ -168,7 +167,7 @@ module subroutine io_dump_swiftest(self, param, msg) end subroutine io_dump_swiftest - module subroutine io_dump_system(self, param, msg) + module subroutine io_dump_system(self, param) !! author: David A. Minton !! !! Dumps the state of the system to files in case the simulation is interrupted. @@ -178,35 +177,52 @@ module subroutine io_dump_system(self, param, msg) ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation ! Internals class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names !! to dump file-specific values without changing the user-defined values integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security !! in case the program halts during writing character(len=:), allocatable :: param_file_name - real(DP) :: tfrac - - allocate(dump_param, source=param) - param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) - dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) - dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) - dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) - dump_param%out_form = XV - dump_param%out_stat = 'APPEND' - dump_param%T0 = param%t - call dump_param%dump(param_file_name) - - call self%cb%dump(dump_param) - if (self%pl%nbody > 0) call self%pl%dump(dump_param) - if (self%tp%nbody > 0) call self%tp%dump(dump_param) - - idx = idx + 1 - if (idx > NDUMPFILES) idx = 1 - - ! Print the status message (format code passed in from main driver) - tfrac = (param%t - param%t0) / (param%tstop - param%t0) - write(*,msg) param%t, tfrac, self%pl%nbody, self%tp%nbody + real(DP) :: deltawall, wallperstep, tfrac + integer(I8B) :: clock_count, count_rate, count_max + character(*), parameter :: statusfmt = '("Time = ", ES12.5, "; fraction done = ", F6.3, "; Number of active pl, tp = ", I5, ", ", I5)' + character(len=*), parameter :: walltimefmt = '(" Wall time (s): ", es12.5, "; Wall time/step in this interval (s): ", es12.5)' + logical, save :: lfirst = .true. + real(DP), save :: start, finish + + if (lfirst) then + call system_clock(clock_count, count_rate, count_max) + start = clock_count / (count_rate * 1.0_DP) + finish = start + lfirst = .false. + else + allocate(dump_param, source=param) + param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) + dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) + dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) + dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) + dump_param%out_form = XV + dump_param%out_stat = 'APPEND' + dump_param%T0 = param%t + call dump_param%dump(param_file_name) + + call self%cb%dump(dump_param) + if (self%pl%nbody > 0) call self%pl%dump(dump_param) + if (self%tp%nbody > 0) call self%tp%dump(dump_param) + + idx = idx + 1 + if (idx > NDUMPFILES) idx = 1 + + tfrac = (param%t - param%t0) / (param%tstop - param%t0) + + call system_clock(clock_count, count_rate, count_max) + deltawall = clock_count / (count_rate * 1.0_DP) - finish + wallperstep = deltawall / param%istep_dump + finish = clock_count / (count_rate * 1.0_DP) + end if + write(*, statusfmt) param%t, tfrac, self%pl%nbody, self%tp%nbody + write(*, walltimefmt) finish - start, wallperstep + if (param%lenergy) call self%conservation_report(param, lterminal=.true.) return diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 3d4c35aab..5e28452e0 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -18,19 +18,13 @@ program swiftest_driver integer(I8B) :: idump !! Dump cadence counter integer(I8B) :: iout !! Output cadence counter 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 - character(*),parameter :: statusfmt = '("Time = ", ES12.5, "; fraction done = ", F6.3, "; ' // & - 'Number of active pl, tp = ", I5, ", ", I5)' - ierr = io_get_args(integrator, param_file_name) if (ierr /= 0) then write(*,*) 'Error reading in arguments from the command line' call util_exit(FAILURE) end if - !$ start_wall_time = omp_get_wtime() !> Read in the user-defined parameters file and the initial conditions of the system select case(integrator) case(symba) @@ -39,14 +33,17 @@ program swiftest_driver allocate(swiftest_parameters :: param) end select param%integrator = integrator + call setup_construct_system(nbody_system, param) call param%read_from_file(param_file_name) + associate(t => param%t, & t0 => param%t0, & dt => param%dt, & tstop => param%tstop, & istep_out => param%istep_out, & istep_dump => param%istep_dump) + call nbody_system%initialize(param) t = t0 iloop = 0 @@ -54,6 +51,8 @@ program swiftest_driver idump = istep_dump nloops = ceiling(tstop / dt, kind=I8B) if (istep_out > 0) call nbody_system%write_frame(iu, param) + call nbody_system%dump(param) + !> Define the maximum number of threads nthreads = 1 ! In the *serial* case !$ nthreads = omp_get_max_threads() ! In the *parallel* case @@ -83,18 +82,13 @@ program swiftest_driver if (istep_dump > 0) then idump = idump - 1 if (idump == 0) then - call nbody_system%dump(param, statusfmt) + call nbody_system%dump(param) idump = istep_dump end if end if - !if (t >= tstop) exit end do - - !> Dump the final state of the system to file - !call nbody_system%dump(param, t, dt, statusfmt) - !$ finish_wall_time = omp_get_wtime() - !$ write(*,*) 'Time: ', finish_wall_time - start_wall_time end associate + call util_exit(SUCCESS) stop diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fa5ec8b97..2e4bff8a2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -550,18 +550,16 @@ module subroutine io_dump_param(self, param_file_name) character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) end subroutine io_dump_param - module subroutine io_dump_swiftest(self, param, msg) + module subroutine io_dump_swiftest(self, param) implicit none class(swiftest_base), intent(inout) :: self !! Swiftest base object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine io_dump_swiftest - module subroutine io_dump_system(self, param, msg) + module subroutine io_dump_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 - character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine io_dump_system module function io_get_args(integrator, param_file_name) result(ierr)