From cec6c5549a8c19ee73f5829201fa9a8e02f1441d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 08:42:53 -0400 Subject: [PATCH 001/194] Added tides directory and placeholder acceleration method. --- Makefile | 13 +++++---- src/modules/swiftest_classes.f90 | 8 ++++++ src/tides/tides_getacch_pl.f90 | 46 ++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 src/tides/tides_getacch_pl.f90 diff --git a/Makefile b/Makefile index 0e2b361e6..e78f0ceeb 100644 --- a/Makefile +++ b/Makefile @@ -131,6 +131,11 @@ lib: ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ ln -s $(SWIFTEST_HOME)/Makefile .; \ make libdir + cd $(SWIFTEST_HOME)/src/tides; \ + rm -f Makefile.Defines Makefile; \ + ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ + ln -s $(SWIFTEST_HOME)/Makefile .; \ + make libdir cd $(SWIFTEST_HOME)/src/util; \ rm -f Makefile.Defines Makefile; \ ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ @@ -176,13 +181,6 @@ drivers: ln -s $(SWIFTEST_HOME)/Makefile .; \ make bin -#tools: -# cd $(SWIFTEST_HOME)/src/tool; \ -# rm -f Makefile.Defines Makefile; \ -# ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ -# ln -s $(SWIFTEST_HOME)/Makefile .; \ -# make bin - bin: *.f90 make $(basename $^) @@ -202,6 +200,7 @@ clean: cd $(SWIFTEST_HOME)/src/rmvs; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/setup; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/symba; rm -f Makefile.Defines Makefile *.gc* + cd $(SWIFTEST_HOME)/src/tides; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/user; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/util; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/whm; rm -f Makefile.Defines Makefile *.gc* diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 8efe47fe9..59b1ddac0 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -17,6 +17,7 @@ module swiftest_classes public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_pl, setup_tp + public :: tides_getacch_pl public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_index, util_peri_tp, util_reverse_status, util_set_beg_end_cb, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & @@ -214,6 +215,7 @@ module swiftest_classes procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix procedure, public :: eucl_irij3 => eucl_irij3_plpl !! Parallelized single loop blocking for Euclidean distance matrix calcualtion procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: accel_tides => tides_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body @@ -674,6 +676,12 @@ module subroutine setup_tp(self, n) integer, intent(in) :: n !! Number of bodies to allocate space for end subroutine setup_tp + module subroutine tides_getacch_pl(self, system) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + end subroutine tides_getacch_pl + module subroutine user_getacch_body(self, system, param, t, lbeg) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 new file mode 100644 index 000000000..c10bff7e0 --- /dev/null +++ b/src/tides/tides_getacch_pl.f90 @@ -0,0 +1,46 @@ +submodule(swiftest_classes) s_tides_getacch + use swiftest +contains + module subroutine tides_getacch_pl(self, system) + !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton + !! + !! Calculated tidal torques from central body to any planet and from any planet to central body + !! planet - planet interactions are considered negligeable + !! Adapted from Mercury-T code from Bolmont et al. 2015 + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + ! Internals + integer(I4B) :: i + real(DP) :: rmag + real(DP), dimension(NDIM) :: ej, vj, F_central + real(DP), dimension(:,:), allocatable :: F_tot + + associate(pl => self, npl => self%nbody, cb => system%cb) + allocate(F_tot, mold=pl%ah) + do i = 1, npl + ! Placeholders until model is implemented + ! *************************************** + F_tot(:,i) = 0.0_DP + F_central(:) = 0.0_DP + ! *************************************** + !rmag = norm2(pl%xh(:,i)) + !ej = pl%xh(:,i) / rmag + !vj = pl%vh(:, i) + !Ftr = + !Pto = + !Pto_central = !Eq 5 Bolmont et al. 2015 + !F_tot(:,i) = (Ftr + (Pto + Pto_central) * dot_product(vj, ej) / rmag * ej + Pto * cross_product((rotj - theta_j), ej) + Pto_central * cross_product((rot_central - theta_j), ej) !Eq 6 Bolmont et al. 2015 + !F_central = F_central + F_tot(:,i) + end do + + do i = 1, npl + pl%ah(:,i) = pl%ah(:,i) + F_tot(:,i) / pl%Gmass(i) + F_central(:) / cb%Gmass + end do + end associate + + return + + end subroutine tides_getacch_pl +end submodule s_tides_getacch \ No newline at end of file From 948670be6f3d614cad406b6414c6287f00fd8c1a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 08:45:05 -0400 Subject: [PATCH 002/194] Added tides method calls to acceleration functions in WHM and Helio --- src/helio/helio_getacch.f90 | 1 + src/whm/whm_getacch.f90 | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index 4b598f204..ce0d1a313 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -24,6 +24,7 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) cb%aoblend = cb%aobl end if if (param%lextra_force) call pl%accel_user(system, param, t) + if (param%ltides) call pl%accel_tides(system) !if (param%lgr) call pl%gr_accel(param) end associate diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index c4ee90592..daef6ea0c 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -39,7 +39,7 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) end if if (param%lextra_force) call pl%accel_user(system, param, t) if (param%lgr) call pl%accel_gr(param) - + if (param%ltides) call pl%accel_tides(system) end associate return end subroutine whm_getacch_pl From e5ec0517a4cef2a3437ed7de65a130b24ecc2561 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 10:49:38 -0400 Subject: [PATCH 003/194] Added lambda function class from the Fragmentation branch to use here for the rkf solver --- Makefile | 1 + src/modules/lambda_function.f90 | 233 ++++++++++++++++++++++++++++++++ src/modules/swiftest.f90 | 1 + src/util/util_solve.f90 | 94 +++++++++++++ 4 files changed, 329 insertions(+) create mode 100644 src/modules/lambda_function.f90 create mode 100644 src/util/util_solve.f90 diff --git a/Makefile b/Makefile index e78f0ceeb..7154c63b1 100644 --- a/Makefile +++ b/Makefile @@ -52,6 +52,7 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ helio_classes.f90 \ symba_classes.f90 \ module_nrutil.f90 \ + lambda_function.f90\ swiftest.f90 diff --git a/src/modules/lambda_function.f90 b/src/modules/lambda_function.f90 new file mode 100644 index 000000000..febfd457d --- /dev/null +++ b/src/modules/lambda_function.f90 @@ -0,0 +1,233 @@ +module lambda_function + !! author: David A. Minton + !! + !! Defines a class that can enable objects that behave like lambda functions. + !! + !! To use this class, define a type of either lambda_obj or lambda_obj_err, or extend the lambda_obj class as necessary, such that an interface that matches the function you wish to lambdafy. + !! Once defined, the lambda object can evaluate itself by calling the type-bound procedure eval. e.g. f%eval(x) (or f%eval(x, lerr), f%eval(x, [argument list], etc)) + !! + !! ******************************************************************************************************************************************************************************************** + !! Example - Defining a lambda function f(x,rval,ival) where rval and ival are a real and integer argument, respectively. This implementation uses an abstract interface, though this is not + !! strictly necessary unless you want to bind more than one function with the same interface. + !! ******************************************************************************************************************************************************************************************** + !! + !! module lambda_new + !! use swiftest ! This will bring in the lambda_function module + !! ! Define types in a module + !! + !! type, extends(lambda_obj) :: lambda_obj_ri_args + !! procedure(abstract_lambda_ri_args), pointer, nopass :: lambdaptr_ri_args => null() + !! real(DP) :: rval !! Real parameter + !! integer(I4B) :: ival !! Integer paramete + !! contains + !! generic :: init => lambda_ri_args_init + !! procedure :: eval => lambda_ri_args_eval + !! procedure, nopass :: lambda_ri_args_init + !! final :: lambda_ri_args_destroy + !! end type + !! interface lambda_obj + !! module procedure lambda_ri_args_init + !! end interface + !! + !! abstract interface + !! function abstract_lambda_ri_args(x, rval, ival) result(y) + !! !Template for the lambda function + !! import DP, I4B + !! real(DP), dimension(:), intent(in) :: x !! Dependent variable + !! real(DP), intent(in) :: rval !! Real parameter + !! integer(I4B), intent(in) :: ival !! Integer parameter + !! real(DP) :: y !! Real result + !! end function + !! end interface + !! + !! contains + !! type(lambda_obj_ri_args) function lambda_ri_args_init(lambda, rval, ival) + !! !! Initializes the lambda function parameters (can be used as a structure constructor) + !! implicit none + !! procedure(abstract_lambda_ri_args) :: lambda !! The lambda function that will be passed + !! real(DP), intent(in) :: rval !! Real parameter + !! integer(I4B), intent(in) :: ival !! Integer parameter + !! + !! ! Assign the procedure passed to this function to the procedure pointer + !! lambda_ri_args_init%lambdaptr_ri_args => lambda + !! + !! ! Assign the argument values + !! lambda_ri_args_init%rval = rval + !! lambda_ri_args_init%ival = ival + !! return + !! end function lambda_ri_args_init + !! + !! function lambda_ri_args_eval(self, x) result(y) + !! !! Defines the evaluation method, allowing the lambda function to be called with a single argument + !! implicit none + !! class(lambda_obj_ri_args), intent(inout) :: self + !! real(DP), dimension(:), intent(in) :: x + !! real(DP) :: y + !! + !! if (associated(self%lambdaptr_ri_args)) then + !! y = self%lambdaptr_ri_args(x, self%rval, self%ival) + !! self%lastval = y + !! if (allocated(self%lastarg)) deallocate(self%lastarg) + !! allocate(self%lastarg, source=x) + !! else + !! error stop "Lambda function was not initialized" + !! end if + !! end function lambda_ri_args_eval + !! + !! subroutine lambda_ri_args_destroy(self) + !! !! Finalizer method. Use this as a template for cleaning up the object upon destruction, such as nullifying pointers + !! implicit none + !! type(lambda_obj_ri_args) :: self + !! if (associated(self%lambdaptr_ri_args)) nullify(self%lambdaptr_ri_args) + !! end subroutine lambda_ri_args_destroy + !! + !! function example_function(x, rval, ival) result(y) + !! !This is the actual function you are going to use as the lambda function. Its interface must match the abstract interface previously defined + !! implicit none + !! ! Arguments + !! real(DP), dimension(:), intent(in) :: x + !! real(DP), intent(in) :: rval + !! integer(I4B), intent(in) :: ival + !! ! Result + !! real(DP) :: y + !! ! Internals + !! integer(I4B) :: i, n + !! n = size(x) + !! y = 42._DP * ival + !! do i = 1, n + !! y = y + x(i)**2 + !! end do + !! return + !! end function example_function + !! end module lambda_new + !! + !! program usage + !! use swiftest + !! use lambda_new + !! implicit none + !! type(lambda_obj_ri_args) :: f + !! real(DP) :: sigma_par + !! integer(I4B) :: iwonky, i,j + !! real(DP), dimension(12) :: xarr + !! + !! sigma_par = 3.14_DP + !! iwonky = 13 + !! + !! f = lambda_obj(example_function, sigma_par, iwonky) + !! do i = 1, 10 + !! xarr(:) = [(j * 0.25_DP / i, j=1, 12)] + !! write(*,*) i,f%eval(xarr) + !! end do + !! end program usage + !! ******************************************************************************************************************************************************************************************** + + use swiftest_globals + implicit none + public + + type :: lambda_obj + !! Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers + procedure(lambda0), pointer, nopass :: lambdaptr => null() + real(DP) :: lastval + real(DP),dimension(:), allocatable :: lastarg + contains + generic :: init => lambda_init_0 + procedure :: eval => lambda_eval_0 + procedure, nopass :: lambda_init_0 + final :: lambda_destroy + end type + + type, extends(lambda_obj) :: lambda_obj_err + !! Extended class for an lambda function object. This object takes allows for the return of a logical error flag during evaluation of the function. + procedure(lambda0err), pointer, nopass :: lambdaptr_err => null() + logical :: lerr + contains + generic :: init => lambda_init_0_err + procedure :: eval => lambda_eval_0_err + procedure, nopass :: lambda_init_0_err + end type + interface lambda_obj + module procedure lambda_init_0 + module procedure lambda_init_0_err + end interface + + abstract interface + function lambda0(x) result(y) + ! Template for a 0 argument function + import DP + real(DP), dimension(:), intent(in) :: x + real(DP) :: y + end function + function lambda0err(x, lerr) result(y) + ! Template for a 0 argument function that returns an error value + import DP + real(DP), dimension(:), intent(in) :: x + logical, intent(out) :: lerr + real(DP) :: y + end function + end interface + + contains + type(lambda_obj) function lambda_init_0(lambda) + implicit none + ! Arguments + procedure(lambda0) :: lambda + + lambda_init_0%lambdaptr => lambda + return + end function lambda_init_0 + + type(lambda_obj_err) function lambda_init_0_err(lambda, lerr) + implicit none + ! Arguments + procedure(lambda0err) :: lambda + logical, intent(in) :: lerr + lambda_init_0_err%lambdaptr_err => lambda + lambda_init_0_err%lerr = lerr + return + end function lambda_init_0_err + + function lambda_eval_0(self, x) result(y) + implicit none + ! Arguments + class(lambda_obj), intent(inout) :: self + real(DP), dimension(:), intent(in) :: x + ! Result + real(DP) :: y + + if (associated(self%lambdaptr)) then + y = self%lambdaptr(x) + self%lastval = y + if (allocated(self%lastarg)) deallocate(self%lastarg) + allocate(self%lastarg, source=x) + else + error stop "Lambda function was not initialized" + end if + end function lambda_eval_0 + + function lambda_eval_0_err(self, x) result(y) + implicit none + ! Arguments + class(lambda_obj_err), intent(inout) :: self + real(DP), dimension(:), intent(in) :: x + ! Result + real(DP) :: y + + if (associated(self%lambdaptr_err)) then + y = self%lambdaptr_err(x, self%lerr) + self%lastval = y + if (allocated(self%lastarg)) deallocate(self%lastarg) + allocate(self%lastarg, source=x) + else + error stop "Lambda function was not initialized" + end if + end function lambda_eval_0_err + + subroutine lambda_destroy(self) + implicit none + type(lambda_obj) :: self + if (associated(self%lambdaptr)) nullify(self%lambdaptr) + end subroutine lambda_destroy + +end module lambda_function + diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index fd8ffaf1b..2ab44a9d5 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -11,6 +11,7 @@ module swiftest use helio_classes use symba_classes use module_nrutil + use lambda_function !use advisor_annotate !$ use omp_lib implicit none diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 new file mode 100644 index 000000000..616ef9a4a --- /dev/null +++ b/src/util/util_solve.f90 @@ -0,0 +1,94 @@ +! submodule(swiftest_classes) s_util_solve +! use swiftest +! contains +! subroutine util_solve_rkf45(xv, dt0, tol) +! !! author: David A. Minton +! !! +! !! Implements the 4th order Runge-Kutta-Fehlberg ODE solver for initial value problemswith 5th order adaptive step size control. +! implicit none +! ! Arguments +! real(DP), dimension(:), intent(in) :: xv !! The dependent variable +! real(DP), intent(in) :: dt0, tol ! Output cadence time step (also used as initial step size guess) and error tolerance +! integer :: i, n, nsteps ! The number of steps to generate output +! integer, parameter :: maxredux = 1000 ! Maximum number of times step size can be reduced +! real(DP),dimension(:), allocatable :: y,y0,ynorm ! Internal temporary variable used to store intermediate results until total number of steps is known +! integer, parameter :: rks = 6 ! Number of RK stages +! real(DP),dimension(rks, rks - 1),parameter :: rkf45_btab = reshape( & ! Butcher tableau for Runge-Kutta-Fehlberg method +! (/ 1./4., 1./4., 0., 0., 0., 0.,& +! 3./8., 3./32., 9./32., 0., 0., 0.,& +! 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& +! 1., 439./216., -8., 3680./513., -845./4104., 0.,& +! 1./2., -8./27., 2., -3544./2565., 1859./4104., -11./40./), shape(rkf45_btab)) +! real(DP),dimension(rks),parameter :: rkf4_coeff = (/ 25./216., 0., 1408./2565. , 2197./4104. , -1./5., 0. /) +! real(DP),dimension(rks),parameter :: rkf5_coeff = (/ 16./135., 0., 6656./12825., 28561./56430., -9./50., 2./55. /) +! real(DP), dimension(:, :), allocatable :: k ! Runge-Kutta coefficient vector +! integer :: rkn ! Runge-Kutta loop index +! integer :: ndim ! Number of dimensions of the problem +! real(DP) :: dt, trem ! Current step size and total time remaining +! real(DP) :: s, yerr, yscale ! Step size reduction factor, error in dependent variable, and error scale factor +! real(DP), parameter :: dtfac = 0.95_DP ! Step size reduction safety factor (Value just under 1.0 to prevent adaptive step size control from discarding steps too aggressively) +! real(DP) :: dtmean ! Mean step size +! integer :: ntot ! Total number of steps (used in mean step size calculation) +! real(DP) :: xscale, vscale + +! ndim = size(xv, 1) +! nsteps = size(xv, 2) +! allocate(k(ndim, rks)) +! allocate(y(ndim)) +! allocate(y0(ndim)) +! allocate(ynorm(ndim)) + +! dt = dt0 +! dtmean = 0.0_DP +! ntot = 0 + +! do n = 2, nsteps +! y0(:) = xv(:, n - 1) +! trem = dt0 +! do +! yscale = norm2(y0(:)) +! xscale = norm2(y0(1:2)) +! vscale = norm2(y0(3:4)) +! do i = 1, maxredux +! do rkn = 1, rks +! y(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) +! k(:, rkn) = dt * derivs(y(:)) +! end do +! ! Now determine if the step size needs adjusting +! ynorm(:) = matmul(k(:,:), (rkf5_coeff(:) - rkf4_coeff(:))) +! ynorm(1:2) = ynorm(1:2) / xscale +! ynorm(3:4) = ynorm(3:4) / vscale +! !ynorm(:) = ynorm(:) / yscale +! yerr = norm2(ynorm(:)) +! s = (tol / (2 * yerr))**(0.25_DP) +! dt = min(s * dtfac * dt, trem) ! Alter step size either up or down +! if (s >= 1.0_DP) exit ! Good step! +! if (i == maxredux) then +! write(*,*) 'Something has gone wrong!!' +! stop +! end if +! end do + +! ! Compute new value +! y(:) = y0(:) + matmul(k(:, :), rkf4_coeff(:)) +! trem = trem - dt +! ntot = ntot + 1 +! dtmean = dtmean + dt +! if (trem <= 0._DP) exit +! y0(:) = y(:) +! end do + +! xv(:,n) = y(:) +! end do + +! dtmean = dtmean / ntot +! write(*,*) 'Total number of steps taken: ',ntot +! write(*,*) 'Mean step size: ', dtmean / (2 * pi) + +! deallocate(k,y,y0) + +! return + +! end subroutine util_solve_rkf45 + +! end submodule s_util_solve \ No newline at end of file From 91afecd8e6656068ae79fd282f775c041a1a9b07 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 11:25:51 -0400 Subject: [PATCH 004/194] Added adaptive step size Runge-Kutta-Fehlberg ODE solver function --- src/util/util_solve.f90 | 161 ++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 89 deletions(-) diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 616ef9a4a..8b1dd0992 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -1,94 +1,77 @@ -! submodule(swiftest_classes) s_util_solve -! use swiftest -! contains -! subroutine util_solve_rkf45(xv, dt0, tol) -! !! author: David A. Minton -! !! -! !! Implements the 4th order Runge-Kutta-Fehlberg ODE solver for initial value problemswith 5th order adaptive step size control. -! implicit none -! ! Arguments -! real(DP), dimension(:), intent(in) :: xv !! The dependent variable -! real(DP), intent(in) :: dt0, tol ! Output cadence time step (also used as initial step size guess) and error tolerance -! integer :: i, n, nsteps ! The number of steps to generate output -! integer, parameter :: maxredux = 1000 ! Maximum number of times step size can be reduced -! real(DP),dimension(:), allocatable :: y,y0,ynorm ! Internal temporary variable used to store intermediate results until total number of steps is known -! integer, parameter :: rks = 6 ! Number of RK stages -! real(DP),dimension(rks, rks - 1),parameter :: rkf45_btab = reshape( & ! Butcher tableau for Runge-Kutta-Fehlberg method -! (/ 1./4., 1./4., 0., 0., 0., 0.,& -! 3./8., 3./32., 9./32., 0., 0., 0.,& -! 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& -! 1., 439./216., -8., 3680./513., -845./4104., 0.,& -! 1./2., -8./27., 2., -3544./2565., 1859./4104., -11./40./), shape(rkf45_btab)) -! real(DP),dimension(rks),parameter :: rkf4_coeff = (/ 25./216., 0., 1408./2565. , 2197./4104. , -1./5., 0. /) -! real(DP),dimension(rks),parameter :: rkf5_coeff = (/ 16./135., 0., 6656./12825., 28561./56430., -9./50., 2./55. /) -! real(DP), dimension(:, :), allocatable :: k ! Runge-Kutta coefficient vector -! integer :: rkn ! Runge-Kutta loop index -! integer :: ndim ! Number of dimensions of the problem -! real(DP) :: dt, trem ! Current step size and total time remaining -! real(DP) :: s, yerr, yscale ! Step size reduction factor, error in dependent variable, and error scale factor -! real(DP), parameter :: dtfac = 0.95_DP ! Step size reduction safety factor (Value just under 1.0 to prevent adaptive step size control from discarding steps too aggressively) -! real(DP) :: dtmean ! Mean step size -! integer :: ntot ! Total number of steps (used in mean step size calculation) -! real(DP) :: xscale, vscale +submodule(swiftest_classes) s_util_solve + use swiftest +contains + function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) + !! author: David A. Minton + !! + !! Implements the 4th order Runge-Kutta-Fehlberg ODE solver for initial value problems of the form f=dy/dt, y0 = y(t=0), solving for y1 = y(t=t1). Uses a 5th order adaptive step size control. + !! Uses a lambda function object as defined in the lambda_function module + implicit none + ! Arguments + 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 + ! Result + real(DP), dimension(:), allocatable :: y1 !! Final result + ! Internals + integer(I4B), parameter :: MAXREDUX = 1000 !! Maximum number of times step size can be reduced + real(DP), parameter :: DTFAC = 0.95_DP !! Step size reduction safety factor (Value just under 1.0 to prevent adaptive step size control from discarding steps too aggressively) + integer(I4B), parameter :: RKS = 6 !! Number of RK stages + real(DP), dimension(RKS, RKS - 1), parameter :: rkf45_btab = reshape( & !! Butcher tableau for Runge-Kutta-Fehlberg method + (/ 1./4., 1./4., 0., 0., 0., 0.,& + 3./8., 3./32., 9./32., 0., 0., 0.,& + 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& + 1., 439./216., -8., 3680./513., -845./4104., 0.,& + 1./2., -8./27., 2., -3544./2565., 1859./4104., -11./40./), shape(rkf45_btab)) + real(DP), dimension(RKS), parameter :: rkf4_coeff = (/ 25./216., 0., 1408./2565. , 2197./4104. , -1./5., 0. /) + real(DP), dimension(RKS), parameter :: rkf5_coeff = (/ 16./135., 0., 6656./12825., 28561./56430., -9./50., 2./55. /) + real(DP), dimension(:, :), allocatable :: k !! Runge-Kutta coefficient vector + real(DP), dimension(:), allocatable :: ynorm !! Normalized y value used for adaptive step size control + real(DP), dimension(:), allocatable :: y0 !! Value of y at the beginning of each substep + integer(I4B) :: Nvar !! Number of variables in problem + integer(I4B) :: rkn !! Runge-Kutta loop index + real(DP) :: dt, trem !! Current step size and total time remaining + real(DP) :: s, yerr, yscale !! Step size reduction factor, error in dependent variable, and error scale factor + integer(I4B) :: i, n -! ndim = size(xv, 1) -! nsteps = size(xv, 2) -! allocate(k(ndim, rks)) -! allocate(y(ndim)) -! allocate(y0(ndim)) -! allocate(ynorm(ndim)) + allocate(y0, source=y0in) + allocate(y1, mold=y0) + allocate(ynorm, mold=y0) + Nvar = size(y0) + allocate(k(Nvar, RKS)) -! dt = dt0 -! dtmean = 0.0_DP -! ntot = 0 + dt = dt0 -! do n = 2, nsteps -! y0(:) = xv(:, n - 1) -! trem = dt0 -! do -! yscale = norm2(y0(:)) -! xscale = norm2(y0(1:2)) -! vscale = norm2(y0(3:4)) -! do i = 1, maxredux -! do rkn = 1, rks -! y(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) -! k(:, rkn) = dt * derivs(y(:)) -! end do -! ! Now determine if the step size needs adjusting -! ynorm(:) = matmul(k(:,:), (rkf5_coeff(:) - rkf4_coeff(:))) -! ynorm(1:2) = ynorm(1:2) / xscale -! ynorm(3:4) = ynorm(3:4) / vscale -! !ynorm(:) = ynorm(:) / yscale -! yerr = norm2(ynorm(:)) -! s = (tol / (2 * yerr))**(0.25_DP) -! dt = min(s * dtfac * dt, trem) ! Alter step size either up or down -! if (s >= 1.0_DP) exit ! Good step! -! if (i == maxredux) then -! write(*,*) 'Something has gone wrong!!' -! stop -! end if -! end do - -! ! Compute new value -! y(:) = y0(:) + matmul(k(:, :), rkf4_coeff(:)) -! trem = trem - dt -! ntot = ntot + 1 -! dtmean = dtmean + dt -! if (trem <= 0._DP) exit -! y0(:) = y(:) -! end do + trem = t1 + do + yscale = norm2(y0(:)) + do i = 1, MAXREDUX + do rkn = 1, RKS + y1(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) + k(:, rkn) = dt * f%eval(y1(:)) + end do + ! Now determine if the step size needs adjusting + ynorm(:) = matmul(k(:,:), (rkf5_coeff(:) - rkf4_coeff(:))) / yscale + yerr = norm2(ynorm(:)) + s = (tol / (2 * yerr))**(0.25_DP) + dt = min(s * DTFAC * dt, trem) ! Alter step size either up or down, but never bigger than the remaining time + if (s >= 1.0_DP) exit ! Good step! + if (i == MAXREDUX) then + write(*,*) "Something has gone wrong in util_solve_rkf45!! Step size reduction has gone too far this time!" + call util_exit(FAILURE) + end if + end do + + ! Compute new value then step ahead in time + y1(:) = y0(:) + matmul(k(:, :), rkf4_coeff(:)) + trem = trem - dt + if (trem <= 0._DP) exit + y0(:) = y1(:) + end do -! xv(:,n) = y(:) -! end do + return + end function util_solve_rkf45 -! dtmean = dtmean / ntot -! write(*,*) 'Total number of steps taken: ',ntot -! write(*,*) 'Mean step size: ', dtmean / (2 * pi) - -! deallocate(k,y,y0) - -! return - -! end subroutine util_solve_rkf45 - -! end submodule s_util_solve \ No newline at end of file +end submodule s_util_solve \ No newline at end of file From 90d41835c6dc0e7c98464231773ae367cb152b77 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 12:03:15 -0400 Subject: [PATCH 005/194] Added placeholder system spin stepper method. Verified that the WHM, RMVS, and Helio examples still work correctly. --- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 4 +- .../whm_swifter_comparison/cb.swiftest.in | 1 + examples/whm_swifter_comparison/pl.swifter.in | 48 +++++++++---------- .../whm_swifter_comparison/pl.swiftest.in | 32 ++++++------- examples/whm_swifter_comparison/tp.swifter.in | 16 +++---- .../whm_swifter_comparison/tp.swiftest.in | 16 +++---- src/helio/helio_step.f90 | 14 +++--- src/modules/helio_classes.f90 | 19 ++++---- src/modules/swiftest_classes.f90 | 17 +++++-- src/rmvs/rmvs_step.f90 | 1 + src/tides/tides_spin_step.f90 | 15 ++++++ src/whm/whm_step.f90 | 2 + 12 files changed, 106 insertions(+), 79 deletions(-) create mode 100644 src/tides/tides_spin_step.f90 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb index c6bb630b2..973a1d8c1 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -622,7 +622,7 @@ " 1.17040422e-11])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/examples/whm_swifter_comparison/cb.swiftest.in b/examples/whm_swifter_comparison/cb.swiftest.in index 058975b81..e4a010b1e 100644 --- a/examples/whm_swifter_comparison/cb.swiftest.in +++ b/examples/whm_swifter_comparison/cb.swiftest.in @@ -1,3 +1,4 @@ +0 39.476926408897626 0.004650467260962157 4.7535806948127355e-12 diff --git a/examples/whm_swifter_comparison/pl.swifter.in b/examples/whm_swifter_comparison/pl.swifter.in index 7412144e0..e0ef4e881 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.0014751253039664285066 +1 6.5537098095653139645e-06 0.0014751243077781048702 1.6306381826061645943e-05 -0.36019833403308620934 -0.07157757063116521046 -0.038889932331457412185 -0.012062683987023428416 10.539199589223686515 0.86012493216791845955 -2 9.663313399581537916e-05 0.006759112363391176217 +0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 +-4.2340114788918336805 10.486553514018327622 1.2453138107251555947 +2 9.663313399581537916e-05 0.006759104275397271956 4.0453784346544178454e-05 --0.71276554591539231787 0.0894943770131735733 0.042358444034962597358 --0.96047232050779632014 -7.363179644470093107 -0.045627977257453471387 -3 0.000120026935827952453094 0.010044757472678654026 +-0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 +0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 +3 0.000120026935827952453094 0.010044787321379672528 4.25875607065040958e-05 -0.27645830888837641393 -0.97837771886398083865 4.5542715832163949185e-05 -5.9448497026859876977 1.6852493323830119935 -9.895818943662129852e-05 -4 1.2739802010675941456e-05 0.007246754169100752911 +0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 +5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 +4 1.2739802010675941456e-05 0.007246743835971885302 2.265740805092889601e-05 --1.4965217056830220077 0.729867855162097956 0.052005223740499352536 --2.049353987860530548 -4.1577626275819368415 -0.03686191825212072444 -5 0.037692251088985676735 0.3552713962079929143 +-1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 +-1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 +5 0.037692251088985676735 0.35527126534549128905 0.00046732617030490929307 -4.027841704615886087 -3.0231618001306270749 -0.077559557972985263 -1.6231826570873460391 2.3366237981055781438 -0.046019759896080974796 -6 0.011285899820091272997 0.43765160695836118215 +4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 +1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 +6 0.011285899820091272997 0.4376527512949726007 0.00038925687730393611812 -6.2788354074558432316 -7.724005035333701308 -0.11559390097316769863 -1.4696075442034620881 1.282966226939726742 -0.08077393754283409384 -7 0.0017236589478267730203 0.4695227539643713788 +6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 +1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 +7 0.0017236589478267730203 0.4695362423191493196 0.00016953449859497231466 -14.869154031353570389 12.9936724365634095335 -0.1443982771709022006 --0.95437109658589562686 1.0170745961532793757 0.016089151184688745742 -8 0.0020336100526728302319 0.78127049251990261927 +14.856082147529010129 13.007589275314199284 -0.14417795763685259391 +-0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 +8 0.0020336100526728302319 0.7812870996943599397 0.000164587904124493665 -29.55509611047864027 -4.6450138458072487424 -0.585533781429422695 -0.17223467348300621534 1.1421766618084267115 -0.027457548207218328868 +29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 +0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 diff --git a/examples/whm_swifter_comparison/pl.swiftest.in b/examples/whm_swifter_comparison/pl.swiftest.in index e144eae8f..9d49cc3da 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 1.6306381826061645943e-05 -0.36019833403308620934 -0.07157757063116521046 -0.038889932331457412185 -0.012062683987023428416 10.539199589223686515 0.86012493216791845955 +0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 +-4.2340114788918336805 10.486553514018327622 1.2453138107251555947 2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.71276554591539231787 0.0894943770131735733 0.042358444034962597358 --0.96047232050779632014 -7.363179644470093107 -0.045627977257453471387 +-0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 +0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 3 0.000120026935827952453094 4.25875607065040958e-05 -0.27645830888837641393 -0.97837771886398083865 4.5542715832163949185e-05 -5.9448497026859876977 1.6852493323830119935 -9.895818943662129852e-05 +0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 +5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.4965217056830220077 0.729867855162097956 0.052005223740499352536 --2.049353987860530548 -4.1577626275819368415 -0.03686191825212072444 +-1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 +-1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 5 0.037692251088985676735 0.00046732617030490929307 -4.027841704615886087 -3.0231618001306270749 -0.077559557972985263 -1.6231826570873460391 2.3366237981055781438 -0.046019759896080974796 +4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 +1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 6 0.011285899820091272997 0.00038925687730393611812 -6.2788354074558432316 -7.724005035333701308 -0.11559390097316769863 -1.4696075442034620881 1.282966226939726742 -0.08077393754283409384 +6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 +1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 7 0.0017236589478267730203 0.00016953449859497231466 -14.869154031353570389 12.9936724365634095335 -0.1443982771709022006 --0.95437109658589562686 1.0170745961532793757 0.016089151184688745742 +14.856082147529010129 13.007589275314199284 -0.14417795763685259391 +-0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 8 0.0020336100526728302319 0.000164587904124493665 -29.55509611047864027 -4.6450138458072487424 -0.585533781429422695 -0.17223467348300621534 1.1421766618084267115 -0.027457548207218328868 +29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 +0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 diff --git a/examples/whm_swifter_comparison/tp.swifter.in b/examples/whm_swifter_comparison/tp.swifter.in index a9fa06f46..b37f04011 100644 --- a/examples/whm_swifter_comparison/tp.swifter.in +++ b/examples/whm_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.3071617894844269614 1.6438449758645010679 -0.37312906258436789875 --2.256588666826445461 2.8302735208962828827 0.50519430783805206563 +2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 +-2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 102 -3.011471099377928784 -1.1061264985150089935 0.5067865823770466571 -0.69505215270382913404 2.5183263418638507098 -1.8031340524448678953 +3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 +0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 103 --0.51350730399144917104 -3.139963346661017951 0.7339670445581878422 -3.0598116277417892524 -0.1107568728194456082 -0.09922455469700767241 +-0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 +3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 104 --2.070517783632789044 -0.7764919020604850175 0.27514297675486260042 -1.7817875607764876778 -3.94088558602991294 -0.09896621676031464546 +-2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 +1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 diff --git a/examples/whm_swifter_comparison/tp.swiftest.in b/examples/whm_swifter_comparison/tp.swiftest.in index a9fa06f46..b37f04011 100644 --- a/examples/whm_swifter_comparison/tp.swiftest.in +++ b/examples/whm_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.3071617894844269614 1.6438449758645010679 -0.37312906258436789875 --2.256588666826445461 2.8302735208962828827 0.50519430783805206563 +2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 +-2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 102 -3.011471099377928784 -1.1061264985150089935 0.5067865823770466571 -0.69505215270382913404 2.5183263418638507098 -1.8031340524448678953 +3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 +0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 103 --0.51350730399144917104 -3.139963346661017951 0.7339670445581878422 -3.0598116277417892524 -0.1107568728194456082 -0.09922455469700767241 +-0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 +3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 104 --2.070517783632789044 -0.7764919020604850175 0.27514297675486260042 -1.7817875607764876778 -3.94088558602991294 -0.09896621676031464546 +-2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 +1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 8557477f7..d37b21bbb 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -1,10 +1,14 @@ submodule(helio_classes) s_helio_step use swiftest contains + module subroutine helio_step_system(self, param, t, dt) !! author: David A. Minton !! - !! Step massive bodies and and active test particles ahead in heliocentric coordinates + !! Step massive bodies and and active test particles ahead in heliocentric coordinates. + !! + !! Currently there's no difference between this and the WHM system stepper, so this is just + !! a wrapper function to keep the method calls consistent for inherited types. !! !! Adapted from Hal Levison's Swift routine step_kdk.f !! Adapted from David E. Kaufmann's Swifter routine helio_step.f90 @@ -14,13 +18,7 @@ module subroutine helio_step_system(self, param, t, dt) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize - - associate(system => self, cb => self%cb, pl => self%pl, tp => self%tp) - tp%lfirst = pl%lfirst - call pl%set_rhill(cb) - call pl%step(system, param, t, dt) - call tp%step(system, param, t, dt) - end associate + call whm_step_system(self, param, t, dt) return end subroutine helio_step_system diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index b7bdf826c..190c354b7 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -14,6 +14,7 @@ module helio_classes !******************************************************************************************************************************** type, public, extends(whm_nbody_system) :: helio_nbody_system contains + procedure, public :: step => helio_step_system !! Advance the Helio nbody system forward in time by one step end type helio_nbody_system !******************************************************************************************************************************** @@ -151,15 +152,6 @@ module subroutine helio_kickvb_tp(self, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine helio_kickvb_tp - module subroutine helio_step_system(self, param, t, dt) - use swiftest_classes, only : swiftest_parameters - implicit none - class(helio_nbody_system), intent(inout) :: self !! Helio nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize - end subroutine helio_step_system - module subroutine helio_step_pl(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none @@ -170,6 +162,15 @@ module subroutine helio_step_pl(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine helio_step_pl + module subroutine helio_step_system(self, param, t, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_nbody_system), intent(inout) :: self !! Helio nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + end subroutine helio_step_system + module subroutine helio_step_tp(self, system, param, t, dt) use swiftest_classes, only : swiftest_cb, swiftest_parameters, swiftest_nbody_system implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 59b1ddac0..63af68fe8 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -17,7 +17,7 @@ module swiftest_classes public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_pl, setup_tp - public :: tides_getacch_pl + public :: tides_getacch_pl, tides_step_spin_system public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_index, util_peri_tp, util_reverse_status, util_set_beg_end_cb, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & @@ -286,9 +286,10 @@ module swiftest_classes procedure, public :: dump => io_dump_system !! Dump the state of the system to a file procedure, public :: initialize => io_read_initialize_system !! Initialize the system from an input file procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file - procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. + procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system abstract interface @@ -682,11 +683,19 @@ module subroutine tides_getacch_pl(self, system) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object end subroutine tides_getacch_pl + module subroutine tides_step_spin_system(self, param, t, dt) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + end subroutine tides_step_spin_system + module subroutine user_getacch_body(self, system, param, t, lbeg) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of user parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine user_getacch_body @@ -744,7 +753,7 @@ end subroutine util_fill_tp module subroutine util_index(arr, index) implicit none integer(I4B), dimension(:), intent(out) :: index - real(DP), dimension(:), intent(in) :: arr + real(DP), dimension(:), intent(in) :: arr end subroutine util_index module subroutine util_peri_tp(self, system, param) diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index bb6c0d843..c3aa9dd8b 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -50,6 +50,7 @@ module subroutine rmvs_step_system(self, param, t, dt) where (tp%status(:) == INACTIVE) tp%status(:) = ACTIVE pl%lfirst = lfirstpl tp%lfirst = lfirsttp + if (param%ltides) call system%step_spin(param, t, dt) else call whm_step_system(system, param, t, dt) end if diff --git a/src/tides/tides_spin_step.f90 b/src/tides/tides_spin_step.f90 new file mode 100644 index 000000000..52f2bae0f --- /dev/null +++ b/src/tides/tides_spin_step.f90 @@ -0,0 +1,15 @@ +submodule(swiftest_classes) s_tides_step_spin + use swiftest +contains + module subroutine tides_step_spin_system(self, param, t, dt) + !! author: Jennifer L.L. Pouplin and David A. Minton + !! + !! Integrates the spin equations for central and massive bodies of the system subjected to tides. + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + return + end subroutine tides_step_spin_system +end submodule s_tides_step_spin \ No newline at end of file diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ce00b86b1..22dd16387 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -17,8 +17,10 @@ module subroutine whm_step_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize associate(system => self, cb => self%cb, pl => self%pl, tp => self%tp) + tp%lfirst = pl%lfirst call pl%step(system, param, t, dt) call tp%step(system, param, t, dt) + if (param%ltides) call system%step_spin(param, t, dt) end associate return end subroutine whm_step_system From c1b3a7e53caa085984df8f34b2f14f4266cb63ad Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 14:14:08 -0400 Subject: [PATCH 006/194] Added explicit interfaces to util and fill routines and added tidal lag angle to swiftest_pl --- src/modules/swiftest_classes.f90 | 2 + src/setup/setup.f90 | 10 ++ src/tides/tides_getacch_pl.f90 | 14 +- src/util/util_spill_and_fill.f90 | 215 ++++++++++++++++++------------- 4 files changed, 148 insertions(+), 93 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 63af68fe8..3a9ebfc8f 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -121,6 +121,7 @@ module swiftest_classes real(DP), dimension(NDIM) :: rot = 0.0_DP !! Body rotation vector in inertial coordinate frame (units rad / TU) real(DP) :: k2 = 0.0_DP !! Tidal Love number real(DP) :: Q = 0.0_DP !! Tidal quality factor + real(DP) :: tlag = 0.0_DP !! Tidal phase lag angle real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body contains @@ -205,6 +206,7 @@ module swiftest_classes real(DP), dimension(:,:), allocatable :: rot !! Body rotation vector in inertial coordinate frame (units rad / TU) real(DP), dimension(:), allocatable :: k2 !! Tidal Love number real(DP), dimension(:), allocatable :: Q !! Tidal quality factor + real(DP), dimension(:), allocatable :: tlag !! Tidal phase lag !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_pl and util_spill_pl contains diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 402ef62a4..dab78a875 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -146,12 +146,22 @@ module subroutine setup_pl(self,n) allocate(self%rhill(n)) allocate(self%radius(n)) allocate(self%density(n)) + allocate(self%rot(NDIM, n)) + allocate(self%Ip(NDIM, n)) + allocate(self%k2(n)) + allocate(self%Q(n)) + allocate(self%tlag(n)) self%mass(:) = 0.0_DP self%Gmass(:) = 0.0_DP self%rhill(:) = 0.0_DP self%radius(:) = 0.0_DP self%density(:) = 0.0_DP + self%rot(:,:) = 0.0_DP + self%Ip(:,:) = 0.0_DP + self%k2(:) = 0.0_DP + self%Q(:) = 0.0_DP + self%tlag(:) = 0.0_DP self%num_comparisons = 0 return end subroutine setup_pl diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index c10bff7e0..27a105764 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -13,8 +13,8 @@ module subroutine tides_getacch_pl(self, system) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object ! Internals integer(I4B) :: i - real(DP) :: rmag - real(DP), dimension(NDIM) :: ej, vj, F_central + real(DP) :: rmag, vmag + real(DP), dimension(NDIM) :: r_unit, v_unit, h_unit, vj, F_central real(DP), dimension(:,:), allocatable :: F_tot associate(pl => self, npl => self%nbody, cb => system%cb) @@ -25,9 +25,13 @@ module subroutine tides_getacch_pl(self, system) F_tot(:,i) = 0.0_DP F_central(:) = 0.0_DP ! *************************************** - !rmag = norm2(pl%xh(:,i)) - !ej = pl%xh(:,i) / rmag - !vj = pl%vh(:, i) + rmag = norm2(pl%xh(:,i)) + vmag = norm2(pl%vh(:,i)) + r_unit(:) = pl%xh(:,i) / rmag + v_unit(:) = pl%vh(:,i) / vmag + h_unit(:) = r_unit(:) .cross. v_unit(:) + + !Ftr = !Pto = !Pto_central = !Eq 5 Bolmont et al. 2015 diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 1a51c06c5..d66abdf96 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -150,134 +150,173 @@ module subroutine util_fill_body(self, inserts, lfill_list) end subroutine util_fill_body - module procedure util_spill_pl + module subroutine util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) Swiftest massive body structure from active list to discard list !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 implicit none - + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse + ! Internals integer(I4B) :: i associate(keeps => self) select type (discards) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) - discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) - discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) - discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) - discards%density(:) = pack(keeps%density(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) - keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) - keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) - keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) - keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) - end if - - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' - end select - end associate - return - - end procedure util_spill_pl - - module procedure util_fill_pl + class is (swiftest_pl) + !> Spill components specific to the massive body class + discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) + discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) + discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) + discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) + discards%density(:) = pack(keeps%density(:), lspill_list(:)) + discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) + discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) + discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) + do i = 1, NDIM + discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) + discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) + end do + if (count(.not.lspill_list(:)) > 0) then + keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) + keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) + keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) + keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) + keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + end if + + call util_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' + end select + end associate + return + end subroutine util_spill_pl + + module subroutine util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new Swiftest massive body structure into an old one. !! This is the inverse of a fill operation. implicit none - + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals integer(I4B) :: i associate(keeps => self) - select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - keeps%mass(:) = unpack(keeps%mass(:),.not.lfill_list(:), keeps%mass(:)) - keeps%mass(:) = unpack(inserts%mass(:),lfill_list(:), keeps%mass(:)) - - keeps%Gmass(:) = unpack(keeps%Gmass(:),.not.lfill_list(:), keeps%Gmass(:)) - keeps%Gmass(:) = unpack(inserts%Gmass(:),lfill_list(:), keeps%Gmass(:)) - - keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) - keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - - keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) - keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) - - keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) - keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' - end select - end associate - return - - end procedure util_fill_pl - - module procedure util_spill_tp + select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components + class is (swiftest_pl) + !> Spill components specific to the massive body class + keeps%mass(:) = unpack(keeps%mass(:),.not.lfill_list(:), keeps%mass(:)) + keeps%mass(:) = unpack(inserts%mass(:),lfill_list(:), keeps%mass(:)) + + keeps%Gmass(:) = unpack(keeps%Gmass(:),.not.lfill_list(:), keeps%Gmass(:)) + keeps%Gmass(:) = unpack(inserts%Gmass(:),lfill_list(:), keeps%Gmass(:)) + + keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) + keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) + + keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) + keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) + + keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) + keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + + keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) + keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + + keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) + keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + + keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) + keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + + do i = 1, NDIM + keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) + keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + + keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) + keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) + end do + keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) + + call util_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' + end select + end associate + return + end subroutine util_fill_pl + + module subroutine util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) Swiftest test particle structure from active list to discard list !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse associate(keeps => self, ntp => self%nbody) select type(discards) - class is (swiftest_tp) - !> Spill components specific to the test particle class - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - end if - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' - end select + class is (swiftest_tp) + !> Spill components specific to the test particle class + discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) + discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) + discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + if (count(.not.lspill_list(:)) > 0) then + keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) + keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) + keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) + end if + call util_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' + end select end associate return - end procedure util_spill_tp + end subroutine util_spill_tp - module procedure util_fill_tp + module subroutine util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new Swiftest test particle structure into an old one. !! This is the inverse of a fill operation. implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps associate(keeps => self) select type(inserts) - class is (swiftest_tp) - !> Spill components specific to the test particle class - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' - end select + class is (swiftest_tp) + !> Spill components specific to the test particle class + keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) + keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) + + keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) + keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) + + keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) + keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + + call util_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' + end select end associate return - end procedure util_fill_tp + end subroutine util_fill_tp end submodule s_util_spill_and_fill From 3204af08b940a0d1a28ac1bfb96db56c614b7d25 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 14:16:58 -0400 Subject: [PATCH 007/194] Formatting and added reference to Mercury-T --- src/modules/swiftest_classes.f90 | 2 +- src/tides/tides_getacch_pl.f90 | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 3a9ebfc8f..83b45c4a5 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -121,7 +121,7 @@ module swiftest_classes real(DP), dimension(NDIM) :: rot = 0.0_DP !! Body rotation vector in inertial coordinate frame (units rad / TU) real(DP) :: k2 = 0.0_DP !! Tidal Love number real(DP) :: Q = 0.0_DP !! Tidal quality factor - real(DP) :: tlag = 0.0_DP !! Tidal phase lag angle + real(DP) :: tlag = 0.0_DP !! Tidal phase lag angle real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body contains diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index 27a105764..beaf5f74c 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -5,8 +5,15 @@ module subroutine tides_getacch_pl(self, system) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! !! Calculated tidal torques from central body to any planet and from any planet to central body - !! planet - planet interactions are considered negligeable - !! Adapted from Mercury-T code from Bolmont et al. 2015 + !! planet - planet interactions are considered negligable. + !! This is a constant time lag model. + !! + !! Adapted from Mercury-T code from Bolmont et al. (2015) + !! + !! Reference: + !! Bolmont, E., Raymond, S.N., Leconte, J., Hersant, F., Correia, A.C.M., 2015. + !! Mercury-T : A new code to study tidally evolving multi-planet systems. + !! Applications to Kepler-62. A&A 583, A116. https://doi.org/10.1051/0004-6361/201525909 implicit none ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object @@ -30,7 +37,7 @@ module subroutine tides_getacch_pl(self, system) r_unit(:) = pl%xh(:,i) / rmag v_unit(:) = pl%vh(:,i) / vmag h_unit(:) = r_unit(:) .cross. v_unit(:) - + !Ftr = !Pto = From 1181c9a8997b0d1428baa8efff3a7b97db1a822f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 15:39:46 -0400 Subject: [PATCH 008/194] Created basic tidal acceleration model. Currently there is no feedback between the tide and oblateness acceleration models, so this should be done in the near future once the spin integration is done --- src/helio/helio_getacch.f90 | 6 +- src/modules/rmvs_classes.f90 | 7 +- src/modules/swiftest_classes.f90 | 54 +- src/modules/symba.f90 | 869 ------------------------------- src/rmvs/rmvs_setup.f90 | 2 + src/rmvs/rmvs_step.f90 | 28 +- src/tides/tides_getacch_pl.f90 | 37 +- src/util/util_set.f90 | 16 - src/util/util_spill_and_fill.f90 | 5 + src/whm/whm_getacch.f90 | 10 +- 10 files changed, 97 insertions(+), 937 deletions(-) delete mode 100644 src/modules/symba.f90 diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index ce0d1a313..ca6f09fc1 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -22,9 +22,13 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) cb%aoblbeg = cb%aobl call pl%accel_obl(system) cb%aoblend = cb%aobl + if (param%ltides) then + cb%atidebeg = cb%atide + call pl%accel_tides(system) + cb%atideend = cb%atide + end if end if if (param%lextra_force) call pl%accel_user(system, param, t) - if (param%ltides) call pl%accel_tides(system) !if (param%lgr) call pl%gr_accel(param) end associate diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 7ea5ad2c2..a523e8643 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -31,9 +31,10 @@ module rmvs_classes end type rmvs_nbody_system type, private :: rmvs_interp - real(DP), dimension(:, :), allocatable :: x !! interpolated heliocentric planet position for outer encounter - real(DP), dimension(:, :), allocatable :: v !! interpolated heliocentric planet velocity for outer encounter - real(DP), dimension(:, :), allocatable :: aobl !! Encountering planet's oblateness acceleration value + real(DP), dimension(:, :), allocatable :: x !! interpolated heliocentric planet position for outer encounter + real(DP), dimension(:, :), allocatable :: v !! interpolated heliocentric planet velocity for outer encounter + real(DP), dimension(:, :), allocatable :: aobl !! Encountering planet's oblateness acceleration value + real(DP), dimension(:, :), allocatable :: atide !! Encountering planet's tidal acceleration value end type rmvs_interp !******************************************************************************************************************************** diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 83b45c4a5..13ee255cc 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -20,7 +20,7 @@ module swiftest_classes public :: tides_getacch_pl, tides_step_spin_system public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & - util_index, util_peri_tp, util_reverse_status, util_set_beg_end_cb, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & + util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & util_set_mu_tp, util_set_rhill, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** @@ -104,32 +104,34 @@ module swiftest_classes !> A concrete lass for the central body in a Swiftest simulation type, abstract, public, extends(swiftest_base) :: swiftest_cb character(len=STRMAX) :: name !! Non-unique name - integer(I4B) :: id = 0 !! External identifier (unique) - real(DP) :: mass = 0.0_DP !! Central body mass (units MU) - real(DP) :: Gmass = 0.0_DP !! Central mass gravitational term G * mass (units GU * MU) - real(DP) :: radius = 0.0_DP !! Central body radius (units DU) - real(DP) :: density = 1.0_DP !! Central body mass density - calculated internally (units MU / DU**3) - real(DP) :: j2rp2 = 0.0_DP !! J2*R^2 term for central body - real(DP) :: j4rp4 = 0.0_DP !! J4*R^2 term for central body - real(DP), dimension(NDIM) :: aobl = 0.0_DP !! Barycentric acceleration due to central body oblatenes - real(DP), dimension(NDIM) :: aoblbeg = 0.0_DP !! Barycentric acceleration due to central body oblatenes at beginning of step - real(DP), dimension(NDIM) :: aoblend = 0.0_DP !! Barycentric acceleration due to central body oblatenes at end of step - real(DP), dimension(NDIM) :: xb = 0.0_DP !! Barycentric position (units DU) - real(DP), dimension(NDIM) :: vb = 0.0_DP !! Barycentric velocity (units DU / TU) - real(DP), dimension(NDIM) :: agr = 0.0_DP !! Acceleration due to post-Newtonian correction - real(DP), dimension(NDIM) :: Ip = 0.0_DP !! Unitless principal moments of inertia (I1, I2, I3) / (MR**2). Principal axis rotation assumed. - real(DP), dimension(NDIM) :: rot = 0.0_DP !! Body rotation vector in inertial coordinate frame (units rad / TU) - real(DP) :: k2 = 0.0_DP !! Tidal Love number - real(DP) :: Q = 0.0_DP !! Tidal quality factor - real(DP) :: tlag = 0.0_DP !! Tidal phase lag angle - real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body - real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body + integer(I4B) :: id = 0 !! External identifier (unique) + real(DP) :: mass = 0.0_DP !! Central body mass (units MU) + real(DP) :: Gmass = 0.0_DP !! Central mass gravitational term G * mass (units GU * MU) + real(DP) :: radius = 0.0_DP !! Central body radius (units DU) + real(DP) :: density = 1.0_DP !! Central body mass density - calculated internally (units MU / DU**3) + real(DP) :: j2rp2 = 0.0_DP !! J2*R^2 term for central body + real(DP) :: j4rp4 = 0.0_DP !! J4*R^2 term for central body + real(DP), dimension(NDIM) :: aobl = 0.0_DP !! Barycentric acceleration due to central body oblatenes + real(DP), dimension(NDIM) :: atide = 0.0_DP !! Barycentric acceleration due to central body oblatenes + real(DP), dimension(NDIM) :: aoblbeg = 0.0_DP !! Barycentric acceleration due to central body oblatenes at beginning of step + real(DP), dimension(NDIM) :: aoblend = 0.0_DP !! Barycentric acceleration due to central body oblatenes at end of step + real(DP), dimension(NDIM) :: atidebeg = 0.0_DP !! Barycentric acceleration due to central body oblatenes at beginning of step + real(DP), dimension(NDIM) :: atideend = 0.0_DP !! Barycentric acceleration due to central body oblatenes at end of step + real(DP), dimension(NDIM) :: xb = 0.0_DP !! Barycentric position (units DU) + real(DP), dimension(NDIM) :: vb = 0.0_DP !! Barycentric velocity (units DU / TU) + real(DP), dimension(NDIM) :: agr = 0.0_DP !! Acceleration due to post-Newtonian correction + real(DP), dimension(NDIM) :: Ip = 0.0_DP !! Unitless principal moments of inertia (I1, I2, I3) / (MR**2). Principal axis rotation assumed. + real(DP), dimension(NDIM) :: rot = 0.0_DP !! Body rotation vector in inertial coordinate frame (units rad / TU) + real(DP) :: k2 = 0.0_DP !! Tidal Love number + real(DP) :: Q = 0.0_DP !! Tidal quality factor + real(DP) :: tlag = 0.0_DP !! Tidal phase lag angle + real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body + real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body contains private procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body procedure, public :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body - procedure, public :: set_beg_end => util_set_beg_end_cb !! Sets the beginning and ending oblateness acceleration term end type swiftest_cb !******************************************************************************************************************************** @@ -150,6 +152,7 @@ module swiftest_classes real(DP), dimension(:,:), allocatable :: vb !! Barycentric velocity real(DP), dimension(:,:), allocatable :: ah !! Total heliocentric acceleration real(DP), dimension(:,:), allocatable :: aobl !! Barycentric accelerations of bodies due to central body oblatenes + real(DP), dimension(:,:), allocatable :: atide !! Tanngential component of acceleration of bodies due to tides real(DP), dimension(:,:), allocatable :: agr !! Acceleration due to post-Newtonian correction real(DP), dimension(:), allocatable :: ir3h !! Inverse heliocentric radius term (1/rh**3) real(DP), dimension(:), allocatable :: a !! Semimajor axis (pericentric distance for a parabolic orbit) @@ -770,13 +773,6 @@ module subroutine util_reverse_status(self) class(swiftest_body), intent(inout) :: self !! Swiftest body object end subroutine util_reverse_status - module subroutine util_set_beg_end_cb(self, aoblbeg, aoblend) - implicit none - class(swiftest_cb), intent(inout) :: self !! Swiftest central body object - real(DP), dimension(:), intent(in), optional :: aoblbeg !! Oblateness acceleration term at beginning of step - real(DP), dimension(:), intent(in), optional :: aoblend !! Oblateness acceleration term at end of step - end subroutine util_set_beg_end_cb - module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba.f90 b/src/modules/symba.f90 deleted file mode 100644 index 41f2de81a..000000000 --- a/src/modules/symba.f90 +++ /dev/null @@ -1,869 +0,0 @@ -module symba - !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott - !! - !! Definition of classes and methods specific to the Symplectic Massive Body Algorithm - !! - !! Adapted from David E. Kaufmann's Swifter routine: symba.f90 - use swiftest_globals - use helio - implicit none - - integer(I4B), private, parameter :: NENMAX = 32767 - integer(I4B), private, parameter :: NTENC = 3 - real(DP), private, parameter :: RHSCALE = 6.5_DP - real(DP), private, parameter :: RSHELL = 0.48075_DP - - !******************************************************************************************************************************** - ! symba_tp class definitions and method interfaces - !******************************************************************************************************************************* - - !! SyMBA test particle class - type, public, extends(helio_pl) :: symba_tp - integer(I4B), dimension(:), allocatable :: nplenc !! Number of encounters with massive bodies this time step - integer(I4B), dimension(:), allocatable :: levelg !! Level at which this particle should be moved - integer(I4B), dimension(:), allocatable :: levelm !! Deepest encounter level achieved this time step - contains - procedure, public :: alloc => symba_allocate_tp - final :: symba_deallocate_tp - end type symba_tp - - !******************************************************************************************************************************** - ! symba_pl class definitions and method interfaces - !******************************************************************************************************************************* - - !! SyMBA massive body particle class - type, public, extends(symba_tp) :: symba_pl - real(DP) :: eoffset !! Energy offset (net energy lost in mergers) - logical, dimension(:), allocatable :: lmerged !! Flag indicating whether body has merged with another this time step - integer(I4B), dimension(:), allocatable :: ntpenc !! Number of encounters with test particles this time step - integer(I4B), dimension(:), allocatable :: nchild !! Number of children in merger list - integer(I4B), dimension(:), allocatable :: index_parent !! Position of the parent of id - integer(I4B), dimension(:,:), allocatable :: index_child !! Position of the children of id - contains - procedure, public :: alloc => symba_allocate_pl - final :: symba_deallocate_pl - end type symba_pl - - !******************************************************************************************************************************** - ! symba_encounter class definitions and method interfaces - !******************************************************************************************************************************* - - - !! Generic abstract class structure for a SyMBA encounter class - type, private, extends(swiftest_body) :: symba_encounter - logical , dimension(:), allocatable :: lvdotr !! Relative vdotr flag - integer(I4B), dimension(:), allocatable :: level !! Encounter recursion level - contains - procedure :: alloc => symba_allocate_encounter - procedure :: set_from_file => symba_encounter_dummy_input - final :: symba_deallocate_encounter - end type symba_encounter - - !******************************************************************************************************************************** - ! symba_plplenc class definitions and method interfaces - !******************************************************************************************************************************* - - !! Class structure for a massive body-massive body encounter - type, public, extends(symba_encounter) :: symba_plplenc - integer(I4B), dimension(:), allocatable :: index1 !! Position of the first massive body in encounter - integer(I4B), dimension(:), allocatable :: index2 !! Position of the second massive body in encounter - integer(I4B), dimension(:), allocatable :: enc_child !! The child of the encounter - integer(I4B), dimension(:), allocatable :: enc_parent !! The child of the encounter - contains - procedure :: alloc => symba_allocate_plplenc - final :: symba_deallocate_plplenc - end type symba_plplenc - - !******************************************************************************************************************************** - ! symba_pltpenc class definitions and method interfaces - !******************************************************************************************************************************* - - !! Class structure for a massive body-test particle encounter - type, public, extends(symba_encounter) :: symba_pltpenc - integer(I4B), dimension(:), allocatable :: indexpl !! Index position within the main symba structure for the first massive body in an encounter - integer(I4B), dimension(:), allocatable :: indextp !! Index position within the main symba structure for the second massive body in an encounter - contains - procedure :: alloc => symba_pltpenc_allocate - final :: symba_deallocate_pltpenc - end type symba_pltpenc - - !******************************************************************************************************************************** - ! symba_merger class definitions and method interfaces - !******************************************************************************************************************************** - - !! Class structure for merger structure - type, public, extends(swiftest_pl) :: symba_merger - integer(I4B), dimension(:), allocatable :: index_ps !! Index position within the main symba structure for the body being merged - integer(I4B), dimension(:), allocatable :: ncomp !! Number of component bodies in this one during this merger - contains - procedure :: alloc => symba_allocate_merger - final :: symba_deallocate_merger - end type symba_merger - -!> Only the constructor and destructor method implementations are listed here. All other methods are implemented in the symba submodules. -interface -!! Interfaces for all helio particle methods that are implemented in separate submodules - - module subroutine io_discard_write_symba(t, mtiny, npl, ntp, nsppl, nsptp, nmergeadd, nmergesub, symba_plA, & - discard_plA, discard_tpA, mergeadd_list, mergesub_list, fname, lbig_discard) - implicit none - logical , intent(in) :: lbig_discard - integer(I4B), intent(in) :: npl, ntp, nsppl, nsptp, nmergeadd, nmergesub - real(DP), intent(in) :: t, mtiny - character(*), intent(in) :: fname - type(symba_pl), intent(inout) :: symba_plA - type(swiftest_tp), intent(inout) :: discard_tpA - type(swiftest_pl), intent(inout) :: discard_plA - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - end subroutine io_discard_write_symba - - module subroutine symba_casedisruption (t, dt, index_enc, nmergeadd, nmergesub, mergeadd_list, mergesub_list, eoffset, vbs, & - symba_plA, nplplenc, plplenc_list, fragmax, mres, rres, m1, m2, rad1, rad2, x1, x2, v1, v2, param) - implicit none - integer(I4B), intent(in) :: index_enc - integer(I4B), intent(inout) :: nmergeadd, nmergesub, nplplenc, fragmax - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset, m1, m2, rad1, rad2 - real(DP), dimension(:), intent(inout) :: mres, rres - real(DP), dimension(:), intent(in) :: vbs - real(DP), dimension(:), intent(inout) :: x1, x2, v1, v2 - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - type(swiftest_parameters) :: param - - end subroutine symba_casedisruption - - module subroutine symba_casehitandrun (t, dt, index_enc, nmergeadd, nmergesub, mergeadd_list, mergesub_list, eoffset, vbs, & - symba_plA, nplplenc, plplenc_list, fragmax, mres, rres, m1, m2, rad1, rad2, x1, x2, v1, v2, param) - implicit none - integer(I4B), intent(in) :: index_enc - integer(I4B), intent(inout) :: nmergeadd, nmergesub, nplplenc, fragmax - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset, m1, m2, rad1, rad2 - real(DP), dimension(:), intent(inout) :: mres, rres - real(DP), dimension(:), intent(in) :: vbs - real(DP), dimension(:), intent(inout) :: x1, x2, v1, v2 - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - - end subroutine symba_casehitandrun - - module subroutine symba_casemerge (t, index_enc, nmergeadd, nmergesub, mergeadd_list, mergesub_list, eoffset, vbs, npl, & - symba_plA, nplplenc, plplenc_list, array_index1_child, array_index2_child, m1, m2, rad1, rad2, x1, x2, v1, v2) - implicit none - integer(I4B), intent(in) :: index_enc - integer(I4B), intent(inout) :: npl, nmergeadd, nmergesub, nplplenc - real(DP), intent(in) :: t - real(DP), intent(inout) :: eoffset, m1, m2, rad1, rad2 - real(DP), dimension(:), intent(in) :: vbs - real(DP), dimension(:), intent(inout) :: x1, x2, v1, v2 - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - integer(I4B), dimension(npl), intent(inout) :: array_index1_child, array_index2_child - end subroutine symba_casemerge - - module subroutine symba_caseresolve (t, dt, index_enc, nmergeadd, nmergesub, mergeadd_list, mergesub_list, & - eoffset, vbs, & - npl, symba_plA, nplplenc, plplenc_list, regime, param%nplmax, param%ntpmax, fragmax, mres, rres, array_index1_child, & - array_index2_child, m1, m2, rad1, rad2, x1, x2, v1, v2) - implicit none - integer(I4B), intent(in) :: index_enc, param%nplmax, param%ntpmax - integer(I4B), intent(inout) :: npl, nmergeadd, nmergesub, nplplenc, fragmax - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset, m1, m2, rad1, rad2 - real(DP), dimension(:), intent(inout) :: mres, rres - real(DP), dimension(:), intent(in) :: vbs - real(DP), dimension(:), intent(inout) :: x1, x2, v1, v2 - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - integer(I4B), intent(in) :: regime - integer(I4B), dimension(npl), intent(inout) :: array_index1_child, array_index2_child - end subroutine symba_caseresolve - - module subroutine symba_casesupercatastrophic (t, dt, index_enc, nmergeadd, nmergesub, mergeadd_list, mergesub_list, & - eoffset, vbs, & - symba_plA, nplplenc, plplenc_list, param%nplmax, param%ntpmax, fragmax, mres, rres, m1, m2, rad1, rad2, x1, x2, v1, v2) - implicit none - integer(I4B), intent(in) :: index_enc, param%nplmax, param%ntpmax - integer(I4B), intent(inout) :: nmergeadd, nmergesub, nplplenc, fragmax - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset, m1, m2, rad1, rad2 - real(DP), dimension(:), intent(inout) :: mres, rres - real(DP), dimension(:), intent(in) :: vbs - real(DP), dimension(:), intent(inout) :: x1, x2, v1, v2 - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - TYPE(symba_pl), INTENT(INOUT) :: symba_plA - end subroutine symba_casesupercatastrophic - - module subroutine symba_chk(xr, vr, rhill1, rhill2, dt, irec, lencounter, lvdotr) - implicit none - logical , intent(out) :: lencounter, lvdotr - integer(I4B), intent(in) :: irec - real(DP), intent(in) :: rhill1, rhill2, dt - real(DP), dimension(:), intent(in) :: xr, vr - end subroutine symba_chk - - module subroutine symba_chk_eucl(num_encounters, k_plpl, symba_plA, dt, lencounter, lvdotr, nplplenc) - implicit none - type(symba_pl), intent(in) :: symba_plA - integer(I4B), dimension(num_encounters), intent(out) :: lencounter, lvdotr - integer(I4B), intent(in) :: num_encounters - integer(I4B), dimension(2,num_encounters),intent(in) :: k_plpl - real(DP), intent(in) :: dt - integer(I4B), intent(inout) :: nplplenc - end subroutine symba_chk_eucl - - module subroutine symba_chk_eucl_pltp(num_encounters, k_pltp, symba_plA, symba_tpA, dt, lencounter, lvdotr, npltpenc) - implicit none - type(symba_pl), intent(in) :: symba_plA - type(symba_tp), intent(in) :: symba_tpA - integer(I4B), dimension(num_encounters), intent(out) :: lencounter, lvdotr - integer(I4B), intent(in) :: num_encounters - integer(I4B), dimension(2,num_encounters),intent(in) :: k_pltp - real(DP), intent(in) :: dt - integer(I4B), intent(inout) :: npltpenc - end subroutine symba_chk_eucl_pltp - - module subroutine symba_discard_merge_pl(t, npl, symba_plA, nplplenc, plplenc_list) - implicit none - integer(I4B), intent(in) :: nplplenc - integer(I4B), intent(inout) :: npl - real(DP), intent(in) :: t - type(symba_pl) :: symba_plA - type(symba_plplenc), intent(in) :: plplenc_list - end subroutine symba_discard_merge_pl - - module subroutine symba_discard_peri_pl(t, npl, symba_plA, msys, qmin, qmin_alo, qmin_ahi, qmin_coord, ldiscards) - implicit none - logical , intent(inout) :: ldiscards - integer(I4B), intent(in) :: npl - real(DP), intent(in) :: t, msys, qmin, qmin_alo, qmin_ahi - character(*), intent(in) :: qmin_coord - type(symba_pl), intent(inout) :: symba_plA - end subroutine symba_discard_peri_pl - - module subroutine symba_discard_pl(t, npl, param%nplmax, nsp, symba_plA, rmin, rmax, param%rmaxu, qmin, qmin_coord, & - qmin_alo, qmin_ahi, param%j2rp2, param%j4rp4, eoffset) - implicit none - integer(I4B), intent(in) :: param%nplmax - integer(I4B), intent(inout) :: npl, nsp - real(DP), intent(in) :: t, rmin, rmax, param%rmaxu, qmin, qmin_alo, qmin_ahi, param%j2rp2, param%j4rp4 - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: qmin_coord - type(symba_pl), intent(inout) :: symba_plA - end subroutine symba_discard_pl - - module subroutine symba_discard_sun_pl(t, npl, msys, swiftest_plA, rmin, rmax, param%rmaxu, ldiscards) - implicit none - logical , intent(inout) :: ldiscards - integer(I4B), intent(in) :: npl - real(DP), intent(in) :: t, msys, rmin, rmax, param%rmaxu - type(swiftest_pl), intent(inout) :: swiftest_plA - end subroutine symba_discard_sun_pl - - module subroutine symba_discard_tp(t, npl, ntp, nsp, symba_plA, symba_tpA, dt, & - rmin, rmax, param%rmaxu, qmin, qmin_coord, qmin_alo, qmin_ahi, lclose, lrhill_present) - implicit none - logical , intent(in) :: lclose, lrhill_present - integer(I4B), intent(in) :: npl - integer(I4B), intent(inout) :: ntp, nsp - real(DP), intent(in) :: t, dt, rmin, rmax, param%rmaxu, qmin, qmin_alo, qmin_ahi - character(*), intent(in) :: qmin_coord - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_discard_tp - - module subroutine symba_energy(npl, param%nplmax, swiftest_plA, param%j2rp2, param%j4rp4, ke, pe, te, htot) - implicit none - integer(I4B), intent(in) :: npl, param%nplmax - real(DP), intent(in) :: param%j2rp2, param%j4rp4 - real(DP), intent(out) :: ke, pe, te - real(DP), dimension(NDIM), intent(out) :: htot - type(swiftest_pl), intent(inout) :: swiftest_plA - end subroutine symba_energy - - module subroutine symba_fragmentation(t, dt, index_enc, nmergeadd, nmergesub, mergeadd_list, & - mergesub_list, eoffset, vbs, encounter_file, out_type, npl, ntp, & - symba_plA, symba_tpA, nplplenc, npltpenc, pltpenc_list, plplenc_list, & - param%nplmax, param%ntpmax, fragmax) - implicit none - integer(I4B), intent(in) :: index_enc, param%nplmax, param%ntpmax - integer(I4B), intent(inout) :: nmergeadd, nmergesub, nplplenc, npltpenc, fragmax - integer(I4B), intent(inout) :: npl, ntp - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset - real(DP), dimension(NDIM), intent(in) :: vbs - character(*), intent(in) :: encounter_file, out_type - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_fragmentation - - module subroutine symba_getacch(lextra_force, t, npl, nplm, param%nplmax, symba_plA, param%j2rp2, param%j4rp4, nplplenc, & - plplenc_list) - implicit none - logical , intent(in) :: lextra_force - integer(I4B), intent(in) :: npl, nplm, param%nplmax, nplplenc - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - type(symba_pl), intent(inout) :: symba_plA - type(symba_plplenc), intent(in) :: plplenc_list - end subroutine symba_getacch - - module subroutine symba_getacch_tp(lextra_force, t, npl, nplm, param%nplmax, ntp, param%ntpmax, symba_plA, symba_tpA, & - xh, param%j2rp2, param%j4rp4, & - npltpenc, pltpenc_list) - implicit none - logical , intent(in) :: lextra_force - integer(I4B), intent(in) :: npl, nplm, param%nplmax, ntp, param%ntpmax, npltpenc - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - real(DP), dimension(npl, NDIM), intent(in) :: xh - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_pltpenc), intent(in) :: pltpenc_list - end subroutine symba_getacch_tp - - module subroutine symba_getacch_eucl(lextra_force, t, npl, nplm, param%nplmax, symba_plA, param%j2rp2, param%j4rp4, nplplenc, & - plplenc_list, num_plpl_comparisons, k_plpl) - implicit none - logical , intent(in) :: lextra_force - integer(I4B), intent(in) :: npl, nplm, param%nplmax, nplplenc, num_plpl_comparisons - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - type(symba_pl), intent(inout) :: symba_plA - type(symba_plplenc), intent(in) :: plplenc_list - integer(I4B), dimension(num_plpl_comparisons,2),intent(in) :: k_plpl - end subroutine symba_getacch_eucl - - module subroutine symba_getacch_tp_eucl(lextra_force, t, npl, nplm, param%nplmax, ntp, param%ntpmax, symba_plA, symba_tpA, & - xh, param%j2rp2, param%j4rp4, npltpenc, pltpenc_list, num_pltp_comparisons, k_pltp) - implicit none - logical , intent(in) :: lextra_force - integer(I4B), intent(in) :: npl, nplm, param%nplmax, ntp, param%ntpmax, npltpenc, num_pltp_comparisons - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - real(DP), dimension(npl, NDIM), intent(in) :: xh - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_pltpenc), intent(in) :: pltpenc_list - integer(I4B), dimension(num_pltp_comparisons,2), intent(in) :: k_pltp - end subroutine symba_getacch_tp_eucl - - module subroutine symba_helio_drift(irec, npl, symba_plA, dt) - implicit none - integer(I4B), intent(in) :: irec, npl - real(DP), intent(in) :: dt - type(symba_pl), intent(inout) :: symba_plA - end subroutine symba_helio_drift - - module subroutine symba_helio_drift_tp(irec, ntp, symba_tpA, mu, dt) - implicit none - integer(I4B), intent(in) :: irec, ntp - real(DP), intent(in) :: mu, dt - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_helio_drift_tp - - module subroutine symba_helio_getacch(lflag, lextra_force, t, npl, nplm, param%nplmax, helio_plA, param%j2rp2, param%j4rp4) - implicit none - logical , intent(in) :: lflag, lextra_force - integer(I4B), intent(in) :: npl, nplm, param%nplmax - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - type(helio_pl), intent(inout) :: helio_plA - end subroutine symba_helio_getacch - - module subroutine symba_helio_getacch_int(npl, nplm, helio_plA) - implicit none - integer(I4B), intent(in) :: npl, nplm - type(helio_pl), intent(inout) :: helio_plA - end subroutine symba_helio_getacch_int - - module subroutine symba_kick(irec, nplplenc, npltpenc, plplenc_list, pltpenc_list, dt, sgn, symba_plA, & - symba_tpA) - implicit none - integer(I4B), intent(in) :: irec, nplplenc, npltpenc - real(DP), intent(in) :: dt, sgn - type(symba_plplenc), intent(in) :: plplenc_list - type(symba_pltpenc), intent(in) :: pltpenc_list - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_kick - - module subroutine symba_merge_pl(t, dt, index_enc, nplplenc, plplenc_list, nmergeadd, nmergesub, & - mergeadd_list, mergesub_list, eoffset, vbs, encounter_file, out_type, npl, symba_plA, & - symba_tpA) - implicit none - integer(I4B), intent(in) :: index_enc, nplplenc - integer(I4B), intent(inout) :: nmergeadd, nmergesub, npl - real(DP), intent(in) :: t, dt - real(DP), intent(inout) :: eoffset - real(DP), dimension(NDIM), intent(in) :: vbs - character(*), intent(in) :: encounter_file, out_type - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_merge_pl - - module subroutine symba_merge_tp(t, dt, index_enc, npltpenc, pltpenc_list, vbs, encounter_file, out_type, symba_plA, symba_tpA) - implicit none - integer(I4B), intent(in) :: index_enc, npltpenc - real(DP), intent(in) :: t, dt - real(DP), dimension(NDIM), intent(in) :: vbs - character(*), intent(in) :: encounter_file, out_type - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_merge_tp - - module subroutine symba_peri(lfirst, npl, symba_plA, msys, qmin_coord) - implicit none - logical , intent(in) :: lfirst - integer(I4B), intent(in) :: npl - real(DP), intent(in) :: msys - character(*), intent(in) :: qmin_coord - type(symba_pl), intent(inout) :: symba_plA - end subroutine symba_peri - - module subroutine symba_rearray(t, npl, ntp, nsppl, nsptp, symba_plA, symba_tpA, nmergeadd, & - mergeadd_list, discard_plA, discard_tpA, param%nplmax, param%j2rp2, param%j4rp4) - implicit none - integer(I4B), intent(inout) :: npl, ntp, nsppl, nsptp, nmergeadd, param%nplmax !change to fragadd - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4 - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(swiftest_tp), intent(inout) :: discard_tpA - type(swiftest_pl), intent(inout) :: discard_plA - type(symba_merger), intent(inout) :: mergeadd_list !change to fragadd_list - - end subroutine symba_rearray - - module subroutine symba_reorder_pl(npl, symba_plA) - implicit none - integer(I4B), intent(in) :: npl - type(symba_pl), intent(inout) :: symba_plA - integer(I4B) :: i - integer(I4B), dimension(:), allocatable :: index - real(DP), dimension(:), allocatable :: mass - real(DP), dimension(:,:), allocatable :: symba_plwkspa - integer(I4B), dimension(:,:), allocatable :: symba_plwkspa_id_status - end subroutine symba_reorder_pl - - !> Initializes the SyMBA aprticles - module subroutine symba_set_initial_conditions(symba_plA, symba_tpA, param) - implicit none - type(symba_pl), intent(inout) :: symba_plA !! SyMBA massive body structure - type(symba_tp), intent(inout) :: symba_tpA !! SyMBA test particle structure - type(swiftest_parameters) :: param !! Current run configuration parameters of on parameters - end subroutine symba_set_initial_conditions - - !> Method to remove the inactive symba test particles and spill them to a discard object - module subroutine symba_spill_tp(self,discard) - implicit none - class(symba_tp), intent(inout) :: self !! Swiftest test particle object to input - class(symba_tp), intent(inout) :: discard !! Discarded body list - end subroutine symba_spill_tp - - !> Method to remove the inactive symba massive bodies and spill them to a discard object - module subroutine symba_spill_pl(self,discard) - implicit none - class(symba_pl), intent(inout) :: self !! Swiftest test particle object to input - class(symba_pl), intent(inout) :: discard !! Discarded body list - end subroutine symba_spill_pl - - module subroutine symba_step_eucl(lfirst, lextra_force, lclose, t, npl, param%nplmax, ntp, param%ntpmax, symba_plA, symba_tpA, param%j2rp2, param%j4rp4,& - dt,nplplenc, npltpenc, plplenc_list, pltpenc_list, nmergeadd, nmergesub, mergeadd_list, mergesub_list, eoffset,& - mtiny,encounter_file, out_type, num_plpl_comparisons, k_plpl, num_pltp_comparisons, k_pltp) - implicit none - logical , intent(in) :: lextra_force, lclose - logical , intent(inout) :: lfirst - integer(I4B), intent(in) :: npl, param%nplmax, ntp, param%ntpmax - integer(I4B), intent(inout) :: nplplenc, npltpenc, nmergeadd, nmergesub - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt, mtiny - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: encounter_file, out_type - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - integer(I4B), intent(in) :: num_plpl_comparisons, num_pltp_comparisons - integer(I4B), dimension(2,num_plpl_comparisons),intent(in) :: k_plpl - integer(I4B), dimension(2,num_pltp_comparisons),intent(in) :: k_pltp - end subroutine symba_step_eucl - - module subroutine symba_step(lfirst, lextra_force, lclose, t, npl, param%nplmax, ntp, param%ntpmax, symba_plA, & - symba_tpA, param%j2rp2, param%j4rp4, dt, nplplenc, npltpenc, plplenc_list, pltpenc_list, nmergeadd, & - nmergesub, mergeadd_list, mergesub_list, eoffset, mtiny, encounter_file, out_type, & - fragmax) - implicit none - logical , intent(in) :: lextra_force, lclose - logical , intent(inout) :: lfirst - integer(I4B), intent(in) :: npl, param%nplmax, ntp, param%ntpmax - integer(I4B), intent(inout) :: nplplenc, npltpenc, nmergeadd, nmergesub, fragmax - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt, mtiny - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: encounter_file, out_type - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - end subroutine symba_step - - ! for testing purposes only _ use with symba_step_test - module subroutine symba_step_helio(lfirst, lextra_force, t, npl, nplm, param%nplmax, ntp, param%ntpmax, helio_plA, helio_tpA, param%j2rp2, & - param%j4rp4, dt) - implicit none - logical , intent(in) :: lextra_force - logical , intent(inout) :: lfirst - integer(I4B), intent(in) :: npl, nplm, param%nplmax, ntp, param%ntpmax - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt - type(helio_pl), intent(inout) :: helio_plA - type(helio_tp), intent(inout) :: helio_tpA - end subroutine symba_step_helio - - module subroutine symba_step_helio_pl(lfirst, lextra_force, t, npl, nplm, param%nplmax, helio_plA, param%j2rp2, param%j4rp4, dt, xbeg, xend, & - ptbeg, ptend) - implicit none - logical , intent(in) :: lextra_force - logical , intent(inout) :: lfirst - integer(I4B), intent(in) :: npl, nplm, param%nplmax - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt - real(DP), dimension(npl, NDIMm), intent(out) :: xbeg, xend - real(DP), dimension(NDIM), intent(out) :: ptbeg, ptend - type(helio_pl), intent(inout) :: helio_plA - end subroutine symba_step_helio_pl - - module subroutine symba_step_interp_eucl(lextra_force, lclose, t, npl, nplm, param%nplmax, ntp, param%ntpmax, symba_plA, symba_tpA, param%j2rp2,& - param%j4rp4, dt, eoffset, mtiny, nplplenc, npltpenc, plplenc_list, pltpenc_list, nmergeadd, nmergesub, mergeadd_list,& - mergesub_list, encounter_file, out_type, num_plpl_comparisons, k_plpl, num_pltp_comparisons, k_pltp) - implicit none - logical , intent(in) :: lextra_force, lclose - integer(I4B), intent(in) :: npl, nplm, param%nplmax, ntp, param%ntpmax, nplplenc, npltpenc, num_pltp_comparisons - integer(I4B), intent(inout) :: nmergeadd, nmergesub - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt, mtiny - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: encounter_file, out_type - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - integer(I4B), intent(in) :: num_plpl_comparisons - integer(I4B), dimension(num_plpl_comparisons,2),intent(in) :: k_plpl - integer(I4B), dimension(2,num_pltp_comparisons),intent(in) :: k_pltp - end subroutine symba_step_interp_eucl - - module subroutine symba_step_interp(lextra_force, lclose, t, npl, nplm, param%nplmax, ntp, param%ntpmax, symba_plA, symba_tpA, param%j2rp2, & - param%j4rp4, dt, eoffset, mtiny, nplplenc, npltpenc, plplenc_list, pltpenc_list, nmergeadd, nmergesub, mergeadd_list, & - mergesub_list, encounter_file, out_type, fragmax) - implicit none - logical , intent(in) :: lextra_force, lclose - integer(I4B), intent(in) :: npl, nplm, param%nplmax, ntp, param%ntpmax, nplplenc, npltpenc - integer(I4B), intent(inout) :: nmergeadd, nmergesub, fragmax - real(DP), intent(in) :: t, param%j2rp2, param%j4rp4, dt, mtiny - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: encounter_file, out_type - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - end subroutine symba_step_interp - - recursive module subroutine symba_step_recur(lclose, t, ireci, npl, nplm, ntp, symba_plA, symba_tpA, dt0, eoffset, nplplenc, & - npltpenc, plplenc_list, pltpenc_list, nmergeadd, nmergesub, mergeadd_list, mergesub_list, encounter_file, & - out_type, param%nplmax, param%ntpmax, fragmax) - implicit none - logical , intent(in) :: lclose - integer(I4B), intent(in) :: ireci, npl, nplm, ntp, nplplenc, npltpenc, param%nplmax, param%ntpmax, fragmax - integer(I4B), intent(inout) :: nmergeadd, nmergesub - real(DP), intent(in) :: t, dt0 - real(DP), intent(inout) :: eoffset - character(*), intent(in) :: encounter_file, out_type - type(symba_pl), intent(inout) :: symba_plA - type(symba_tp), intent(inout) :: symba_tpA - type(symba_plplenc), intent(inout) :: plplenc_list - type(symba_pltpenc), intent(inout) :: pltpenc_list - type(symba_merger), intent(inout) :: mergeadd_list, mergesub_list - end subroutine symba_step_recur - - module subroutine symba_user_getacch(t, npl, symba_plA) - implicit none - integer(I4B), intent(in) :: npl - real(DP), intent(in) :: t - type(symba_pl), intent(inout):: symba_plA - end subroutine symba_user_getacch - - module subroutine symba_user_getacch_tp(t, ntp, symba_tpA) - implicit none - integer(I4B), intent(in) :: ntp - real(DP), intent(in) :: t - type(symba_tp), intent(inout) :: symba_tpA - end subroutine symba_user_getacch_tp - -end interface - -contains - !! SyMBA constructor and desctructor methods - subroutine symba_allocate_tp(self,n) - !! SyMBA test particle constructor method - implicit none - - class(symba_tp), intent(inout) :: self !! Symba test particle object - integer, intent(in) :: n !! Number of test particles to allocate - - call self%helio_tp%alloc(n) - - if (self%is_allocated) then - write(*,*) 'Symba test particle structure already alllocated' - return - end if - write(*,*) 'Allocating the Swiftest test particle structure' - - if (n <= 0) return - allocate(self%nplenc(n)) - allocate(self%levelg(n)) - allocate(self%levelm(n)) - - self%nplenc(:) = 0 - self%levelg(:) = 0 - self%levelm(:) = 0 - return - end subroutine symba_allocate_tp - - subroutine symba_deallocate_tp(self) - !! SyMBA test particle destructor/finalizer - implicit none - - type(symba_tp), intent(inout) :: self - - if (self%is_allocated) then - deallocate(self%nplenc) - deallocate(self%levelg) - deallocate(self%levelm) - end if - return - end subroutine symba_deallocate_tp - - subroutine symba_allocate_pl(self,n) - !! SyMBA massive body constructor method - implicit none - - class(symba_pl), intent(inout) :: self !! SyMBA massive body particle object - integer, intent(in) :: n !! Number of massive body particles to allocate - - call self%helio_pl%alloc(n) - - if (self%is_allocated) then - write(*,*) 'Symba massive body structure already alllocated' - return - end if - if (n <= 0) return - allocate(self%lmerged(n)) - allocate(self%nplenc(n)) - allocate(self%ntpenc(n)) - allocate(self%levelg(n)) - allocate(self%levelm(n)) - allocate(self%nchild(n)) - allocate(self%index_parent(n)) - allocate(self%index_child(n,n)) - - self%lmerged(:) = .false. - self%nplenc(:) = 0 - self%ntpenc(:) = 0 - self%levelg(:) = 0 - self%levelm(:) = 0 - self%nchild(:) = 0 - self%index_parent(:) = 1 - self%index_child(:,:) = 1 - - return - end subroutine symba_allocate_pl - - subroutine symba_deallocate_pl(self) - !! SyMBA massive body destructor/finalizer - implicit none - - type(symba_pl), intent(inout) :: self - if (self%is_allocated) then - deallocate(self%lmerged) - deallocate(self%nplenc) - deallocate(self%ntpenc) - deallocate(self%levelg) - deallocate(self%levelm) - deallocate(self%nchild) - deallocate(self%index_parent) - deallocate(self%index_child) - end if - return - end subroutine symba_deallocate_pl - - subroutine symba_allocate_encounter(self,n) - !! Basic Symba encounter structure constructor method - implicit none - - class(symba_encounter), intent(inout) :: self !! SyMBA encounter super class - integer, intent(in) :: n !! Number of test particles to allocate - - call self%swiftest_body%alloc(n) - if (n <= 0) return - - if (self%is_allocated) then - write(*,*) 'SyMBA encounter structure already alllocated' - return - end if - write(*,*) 'Allocating the Symba encounter superclass' - - allocate(self%lvdotr(n)) - allocate(self%level(n)) - - self%lvdotr(:) = .false. - self%level(:) = 0 - - return - end subroutine symba_allocate_encounter - - subroutine symba_deallocate_encounter(self) - !! SyMBA encounter superclass destructor/finalizer - implicit none - - type(symba_encounter), intent(inout) :: self - - if (self%is_allocated) then - deallocate(self%lvdotr) - deallocate(self%level) - end if - return - end subroutine symba_deallocate_encounter - - subroutine symba_encounter_dummy_input(self,param) - !! This method is needed in order to extend the abstract type swiftest_body. It does nothing - implicit none - class(symba_encounter), intent(inout) :: self !! SyMBA encounter data structure - type(swiftest_parameters),intent(in) :: param !! Current run configuration parameters of on parameters - return - end subroutine symba_encounter_dummy_input - - subroutine symba_pltpenc_allocate(self,n) - !! SyMBA massive body-test particle encounter structure constructor method - implicit none - - class(symba_pltpenc), intent(inout) :: self !! SyMBA massive body-test particle encounter class - integer, intent(in) :: n !! Number of encounter slots to allocate - - call self%symba_encounter%alloc(n) - if (n <= 0) return - - if (self%is_allocated) then - write(*,*) 'SyMBA pl-tp encounter structure already alllocated' - return - end if - write(*,*) 'Allocating the Symba pl-tp encounter class' - - allocate(self%indexpl(n)) - allocate(self%indextp(n)) - - self%indexpl(:) = 1 - self%indextp(:) = 1 - end subroutine symba_pltpenc_allocate - - subroutine symba_deallocate_pltpenc(self) - !! SyMBA massive body-test particle encounter destructor/finalizer - implicit none - - type(symba_pltpenc), intent(inout) :: self - - if (self%is_allocated) then - deallocate(self%indexpl) - deallocate(self%indextp) - end if - return - end subroutine symba_deallocate_pltpenc - - subroutine symba_allocate_plplenc(self,n) - !! SyMBA massive body-massive body particle encounter structure constructor method - implicit none - - class(symba_plplenc), intent(inout) :: self !! SyMBA massive body-massive body encounter class - integer, intent(in) :: n !! Number of encounter slots to allocate - - call self%symba_encounter%alloc(n) - if (n <= 0) return - - if (self%is_allocated) then - write(*,*) 'SyMBA pl-pl encounter structure already alllocated' - return - end if - write(*,*) 'Allocating the Symba pl-pl encounter class' - - allocate(self%index1(n)) - allocate(self%index2(n)) - allocate(self%enc_child(n)) - allocate(self%enc_parent(n)) - - self%index1(:) = 1 - self%index2(:) = 1 - self%enc_child(:) = 1 - self%enc_parent(:) = 1 - - return - end subroutine symba_allocate_plplenc - - subroutine symba_deallocate_plplenc(self) - !! SyMBA massive body-massive body encounter destructor/finalizer - implicit none - - type(symba_plplenc), intent(inout) :: self - - if (self%is_allocated) then - deallocate(self%index1) - deallocate(self%index2) - deallocate(self%enc_child) - deallocate(self%enc_parent) - end if - return - end subroutine symba_deallocate_plplenc - - subroutine symba_allocate_merger(self,n) - !! SyMBA merger encounter structure constructor method - implicit none - - class(symba_merger), intent(inout) :: self !! SyMBA merger class - integer, intent(in) :: n !! Number of encounter slots to allocate - - call self%swiftest_pl%alloc(n) - if (n <= 0) return - - if (self%is_allocated) then - write(*,*) 'SyMBA merger structure already alllocated' - return - end if - write(*,*) 'Allocating the SyMBA merger class' - - allocate(self%index_ps(n)) - allocate(self%ncomp(n)) - - self%index_ps(:) = 1 - self%ncomp(:) = 0 - - end subroutine symba_allocate_merger - - subroutine symba_deallocate_merger(self) - !! SyMBA merger destructor/finalizer - implicit none - - type(symba_merger), intent(inout) :: self - - if (self%is_allocated) then - deallocate(self%index_ps) - deallocate(self%ncomp) - end if - return - end subroutine symba_deallocate_merger - -end module symba diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 4607bfbb0..4cda7bd6f 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -35,9 +35,11 @@ module subroutine rmvs_setup_pl(self,n) allocate(pl%inner(i)%x(NDIM, n)) allocate(pl%inner(i)%v(NDIM, n)) allocate(pl%inner(i)%aobl(NDIM, n)) + allocate(pl%inner(i)%atide(NDIM, n)) pl%inner(i)%x(:,:) = 0.0_DP pl%inner(i)%v(:,:) = 0.0_DP pl%inner(i)%aobl(:,:) = 0.0_DP + pl%inner(i)%atide(:,:) = 0.0_DP end do end if end associate diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index c3aa9dd8b..fce9a2927 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -245,6 +245,10 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:, :) = xtmp(:, :) ! Temporarily replace heliocentric position with inner substep values to calculate the oblateness terms call pl%accel_obl(system) pl%inner(0)%aobl(:, :) = pl%aobl(:, :) ! Save the oblateness acceleration on the planet for this substep + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(0)%atide(:, :) = pl%atide(:, :) ! Save the oblateness acceleration on the planet for this substep + end if end if do inner_index = 1, NTPHENC - 1 @@ -295,6 +299,10 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(inner_index)%x(:, :) call pl%accel_obl(system) pl%inner(inner_index)%aobl(:, :) = pl%aobl(:, :) + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(inner_index)%atide(:, :) = pl%atide(:, :) + end if end if end do if (param%loblatecb) then @@ -302,6 +310,10 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(NTPHENC)%x(:, :) call pl%accel_obl(system) pl%inner(NTPHENC)%aobl(:, :) = pl%aobl(:, :) + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(NTPHENC)%atide(:, :) = pl%atide(:, :) + end if ! Put the planet positions back into place call move_alloc(xh_original, pl%xh) end if @@ -354,8 +366,16 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) plenci%xh(:,:) = plenci%inner(inner_index - 1)%x(:,:) call plenci%set_beg_end(xbeg = plenci%inner(inner_index - 1)%x, & xend = plenci%inner(inner_index)%x) - call cbenci%set_beg_end(aoblbeg = cbenci%inner(inner_index - 1)%aobl(:, 1), & - aoblend = cbenci%inner(inner_index )%aobl(:, 1)) + + if (param%loblatecb) then + cbenci%aoblbeg = cbenci%inner(inner_index - 1)%aobl(:, 1) + cbenci%aoblend = cbenci%inner(inner_index )%aobl(:, 1) + if (param%ltides) then + cbenci%atidebeg = cbenci%inner(inner_index - 1)%atide(:, 1) + cbenci%atideend = cbenci%inner(inner_index )%atide(:, 1) + end if + end if + call tpenci%step(planetocen_system, param, inner_time, dti) do j = 1, pl%nenc(i) tpenci%xheliocentric(:, j) = tpenci%xh(:, j) + pl%inner(inner_index)%x(:,i) @@ -427,12 +447,15 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) allocate(plenci%inner(inner_index)%x, mold=pl%inner(inner_index)%x) allocate(plenci%inner(inner_index)%v, mold=pl%inner(inner_index)%x) allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) + allocate(plenci%inner(inner_index)%atide, mold=pl%inner(inner_index)%atide) allocate(cbenci%inner(inner_index)%x(NDIM,1)) allocate(cbenci%inner(inner_index)%v(NDIM,1)) allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) + allocate(cbenci%inner(inner_index)%atide(NDIM,1)) cbenci%inner(inner_index)%x(:,1) = pl%inner(inner_index)%x(:, i) cbenci%inner(inner_index)%v(:,1) = pl%inner(inner_index)%v(:, i) cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) + cbenci%inner(inner_index)%atide(:,1) = pl%inner(inner_index)%atide(:, i) plenci%inner(inner_index)%x(:,1) = -cbenci%inner(inner_index)%x(:,1) plenci%inner(inner_index)%v(:,1) = -cbenci%inner(inner_index)%v(:,1) do j = 2, npl @@ -578,6 +601,7 @@ subroutine rmvs_end_planetocentric(pl, tp) deallocate(plenci%inner(inner_index)%x) deallocate(plenci%inner(inner_index)%v) deallocate(plenci%inner(inner_index)%aobl) + deallocate(plenci%inner(inner_index)%atide) end do end select end select diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index beaf5f74c..ff9d554ef 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -21,33 +21,40 @@ module subroutine tides_getacch_pl(self, system) ! Internals integer(I4B) :: i real(DP) :: rmag, vmag - real(DP), dimension(NDIM) :: r_unit, v_unit, h_unit, vj, F_central - real(DP), dimension(:,:), allocatable :: F_tot + real(DP), dimension(NDIM) :: r_unit, v_unit, h_unit, theta_unit, theta_dot, F_T + real(DP) :: Ftr, Ptopl, Ptocb, r5cbterm, r5plterm associate(pl => self, npl => self%nbody, cb => system%cb) - allocate(F_tot, mold=pl%ah) + pl%atide(:,:) = 0.0_DP + cb%atide(:) = 0.0_DP do i = 1, npl - ! Placeholders until model is implemented - ! *************************************** - F_tot(:,i) = 0.0_DP - F_central(:) = 0.0_DP - ! *************************************** rmag = norm2(pl%xh(:,i)) vmag = norm2(pl%vh(:,i)) r_unit(:) = pl%xh(:,i) / rmag v_unit(:) = pl%vh(:,i) / vmag h_unit(:) = r_unit(:) .cross. v_unit(:) + theta_unit(:) = h_unit(:) .cross. r_unit(:) + theta_dot = dot_product(pl%vh(:,i), theta_unit(:)) - - !Ftr = - !Pto = - !Pto_central = !Eq 5 Bolmont et al. 2015 - !F_tot(:,i) = (Ftr + (Pto + Pto_central) * dot_product(vj, ej) / rmag * ej + Pto * cross_product((rotj - theta_j), ej) + Pto_central * cross_product((rot_central - theta_j), ej) !Eq 6 Bolmont et al. 2015 - !F_central = F_central + F_tot(:,i) + ! First calculate the tangential component of the force vector (eq. 5 & 6 of Bolmont et al. 2015) + ! The radial component is already computed in the obl_acc methods + r5cbterm = pl%Gmass(i)**2 * cb%k2 * cb%radius**5 + r5plterm = cb%Gmass**2 * pl%k2(i) * pl%radius(i)**5 + + Ptopl = 3 * r5plterm * pl%tlag(i) / rmag**7 + Ptocb = 3 * r5cbterm * cb%tlag / rmag**7 + + Ftr = -3 / rmag**7 * (r5cbterm + r5plterm) - 3 * vmag / rmag * (Ptocb + Ptopl) + + F_T(:) = (Ftr + (Ptocb + Ptopl) * dot_product(v_unit, r_unit) / rmag) * r_unit(:) & + + Ptopl * (pl%rot(:,i) - theta_dot(:)) .cross. r_unit(:) & + + Ptocb * (cb%rot(:) - theta_dot(:)) .cross. r_unit(:) + cb%atide(:) = cb%atide(:) + F_T(:) / cb%Gmass + pl%atide(:,i) = F_T(:) / pl%Gmass(i) end do do i = 1, npl - pl%ah(:,i) = pl%ah(:,i) + F_tot(:,i) / pl%Gmass(i) + F_central(:) / cb%Gmass + pl%ah(:,i) = pl%ah(:,i) + pl%atide(:,i) + cb%atide(:) end do end associate diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index b77579de1..b690f37b2 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -4,22 +4,6 @@ use swiftest contains - module subroutine util_set_beg_end_cb(self, aoblbeg, aoblend) - !! author: David A. Minton - !! - !! Sets one or more of the values of aoblbeg and aoblend - implicit none - ! Arguments - class(swiftest_cb), intent(inout) :: self !! Swiftest central body object - real(DP), dimension(:), intent(in), optional :: aoblbeg !! Oblateness acceleration term at beginning of step - real(DP), dimension(:), intent(in), optional :: aoblend !! Oblateness acceleration term at end of step - - if (present(aoblbeg)) self%aoblbeg = aoblbeg - if (present(aoblend)) self%aoblend = aoblend - return - - end subroutine util_set_beg_end_cb - module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) !! author: David A. Minton !! diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index d66abdf96..7cd4b6c7d 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -33,6 +33,7 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) + discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) end do if (count(.not.lspill_list(:)) > 0) then @@ -53,6 +54,7 @@ module subroutine util_spill_body(self, discards, lspill_list) keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) + keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) end do end if @@ -118,6 +120,9 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) + keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) end do diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index daef6ea0c..4d761fc02 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -36,10 +36,16 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) cb%aoblbeg = cb%aobl call pl%accel_obl(system) cb%aoblend = cb%aobl + if (param%ltides) then + cb%atidebeg = cb%aobl + call pl%accel_tides(system) + cb%atideend = cb%atide + end if end if - if (param%lextra_force) call pl%accel_user(system, param, t) + if (param%lgr) call pl%accel_gr(param) - if (param%ltides) call pl%accel_tides(system) + + if (param%lextra_force) call pl%accel_user(system, param, t) end associate return end subroutine whm_getacch_pl From d0126da35c2da980e0ceaf80be926e803257cdeb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 17:23:21 -0400 Subject: [PATCH 009/194] Created the structure needed to send spin equations into the adaptive RKF45 solver --- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 4 +- src/modules/lambda_function.f90 | 46 +++++++- src/tides/tides_spin_step.f90 | 110 ++++++++++++++++++ src/util/util_solve.f90 | 27 ++++- 4 files changed, 176 insertions(+), 11 deletions(-) diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb index 973a1d8c1..d0d223ce7 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -622,7 +622,7 @@ " 1.17040422e-11])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/src/modules/lambda_function.f90 b/src/modules/lambda_function.f90 index febfd457d..cd7e180cb 100644 --- a/src/modules/lambda_function.f90 +++ b/src/modules/lambda_function.f90 @@ -146,9 +146,19 @@ module lambda_function procedure :: eval => lambda_eval_0_err procedure, nopass :: lambda_init_0_err end type + + type, extends(lambda_obj) :: lambda_obj_tvar + !! Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers + procedure(lambda0tvar), pointer, nopass :: lambdaptr_tvar => null() + contains + generic :: init => lambda_init_tvar + procedure :: evalt => lambda_eval_tvar + procedure, nopass :: lambda_init_tvar + end type interface lambda_obj module procedure lambda_init_0 module procedure lambda_init_0_err + module procedure lambda_init_tvar end interface abstract interface @@ -158,6 +168,7 @@ function lambda0(x) result(y) real(DP), dimension(:), intent(in) :: x real(DP) :: y end function + function lambda0err(x, lerr) result(y) ! Template for a 0 argument function that returns an error value import DP @@ -165,6 +176,14 @@ function lambda0err(x, lerr) result(y) logical, intent(out) :: lerr real(DP) :: y end function + + function lambda0tvar(x, t) result(y) + ! Template for a 0 argument function that returns an error value + import DP + real(DP), dimension(:), intent(in) :: x + real(DP), intent(in) :: t + real(DP), dimension(:), allocatable :: y + end function end interface contains @@ -172,7 +191,6 @@ type(lambda_obj) function lambda_init_0(lambda) implicit none ! Arguments procedure(lambda0) :: lambda - lambda_init_0%lambdaptr => lambda return end function lambda_init_0 @@ -186,6 +204,15 @@ type(lambda_obj_err) function lambda_init_0_err(lambda, lerr) lambda_init_0_err%lerr = lerr return end function lambda_init_0_err + + type(lambda_obj_tvar) function lambda_init_tvar(lambda, t) + implicit none + ! Arguments + procedure(lambda0tvar) :: lambda + real(DP), intent(in) :: t + lambda_init_tvar%lambdaptr_tvar => lambda + return + end function lambda_init_tvar function lambda_eval_0(self, x) result(y) implicit none @@ -194,7 +221,6 @@ function lambda_eval_0(self, x) result(y) real(DP), dimension(:), intent(in) :: x ! Result real(DP) :: y - if (associated(self%lambdaptr)) then y = self%lambdaptr(x) self%lastval = y @@ -212,7 +238,6 @@ function lambda_eval_0_err(self, x) result(y) real(DP), dimension(:), intent(in) :: x ! Result real(DP) :: y - if (associated(self%lambdaptr_err)) then y = self%lambdaptr_err(x, self%lerr) self%lastval = y @@ -223,6 +248,21 @@ function lambda_eval_0_err(self, x) result(y) end if end function lambda_eval_0_err + function lambda_eval_tvar(self, x, t) result(y) + implicit none + ! Arguments + class(lambda_obj_tvar), intent(inout) :: self + real(DP), dimension(:), intent(in) :: x + real(DP), intent(in) :: t + ! Result + real(DP), dimension(:), allocatable :: y + if (associated(self%lambdaptr_tvar)) then + y = self%lambdaptr_tvar(x,t) + else + error stop "Lambda function was not initialized" + end if + end function lambda_eval_tvar + subroutine lambda_destroy(self) implicit none type(lambda_obj) :: self diff --git a/src/tides/tides_spin_step.f90 b/src/tides/tides_spin_step.f90 index 52f2bae0f..d6029a7e4 100644 --- a/src/tides/tides_spin_step.f90 +++ b/src/tides/tides_spin_step.f90 @@ -1,15 +1,125 @@ submodule(swiftest_classes) s_tides_step_spin use swiftest + + type, extends(lambda_obj_tvar) :: tides_derivs_func + !! Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers + procedure(tidederiv), pointer, nopass :: lambdaptr_tides_deriv + real(DP), dimension(:,:), allocatable :: xbeg + real(DP), dimension(:,:), allocatable :: xend + real(DP) :: dt + contains + generic :: init => tides_derivs_init + procedure :: evalt => tides_derivs_eval + procedure, nopass :: tides_derivs_init + end type + interface lambda_obj + module procedure tides_derivs_init + end interface + abstract interface + function tidederiv(x, t, dt, xbeg, xend) result(y) + ! Template for a 0 argument function + import DP, swiftest_nbody_system + real(DP), dimension(:), intent(in) :: x + real(DP), intent(in) :: t + real(DP), intent(in) :: dt + real(DP), dimension(:,:), intent(in) :: xbeg + real(DP), dimension(:,:), intent(in) :: xend + real(DP), dimension(:), allocatable :: y + end function + end interface + contains module subroutine tides_step_spin_system(self, param, t, dt) !! author: Jennifer L.L. Pouplin and David A. Minton !! !! Integrates the spin equations for central and massive bodies of the system subjected to tides. implicit none + ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + ! Internals + real(DP), dimension(:), allocatable :: rot0, rot1 + real(DP) :: subt + real(DP), parameter :: tol=1e-6_DP !! Just a guess at the moment + real(DP) :: subdt + + associate(pl => self%pl, npl => self%pl%nbody, cb => self%cb) + allocate(rot0(NDIM*(npl+1))) + rot0 = [pack(pl%rot(:,1:npl),.true.), pack(cb%rot(:),.true.)] + ! Use this space call the ode_solver, passing tides_spin_derivs as the function: + subdt = dt / 20._DP + !rot1(:) = util_solve_rkf45(lambda_obj(tides_spin_derivs, subdt, pl%xbeg, pl%xend), rot0, dt, subdt tol) + ! Recover with unpack + !pl%rot(:,1:npl) = unpack(rot1... + !cb%rot(:) = unpack(rot1... + end associate + return end subroutine tides_step_spin_system + + function tides_spin_derivs(rot_pl_cb, t, dt, xbeg, xend) result(drot) !! Need to add more arguments so we can pull in mass, radius, Ip, J2, etc... + !! author: Jennifer L.L. Pouplin and David A. Minton + !! + !! function used to calculate the derivatives that are fed to the ODE solver + implicit none + ! Arguments + real(DP), dimension(:,:), intent(in) :: rot_pl_cb !! Array of rotations. The last element is the central body, and all others are massive bodies + real(DP), intent(in) :: t !! Current time, which is used to interpolate the massive body positions + real(DP), intent(in) :: dt !! Total step size + real(DP), dimension(:,:), intent(in) :: xbeg + real(DP), dimension(:,:), intent(in) :: xend + ! Internals + real(DP), dimension(:,:), allocatable :: drot + real(DP), dimension(:), allocatable :: flatrot + real(DP), dimension(NDIM) :: N_Tcb, N_Rcb, N_Tpl, N_Rpl, xinterp + real(DP) :: C_cb, C_pl, r_dot_rot_cb, r_dot_rot_pl, rmag + integer(I4B) :: i, n + + + n = size(rot_pl_cb,2) + if (allocated(drot)) deallocate(drot) + allocate(drot, mold=rot_pl_cb) + drot(:,:) = 0.0_DP + do i = 1,n-1 + xinterp(:) = xbeg(:,i) + t / dt * (xend(:,i) - xbeg(:,i)) + ! Calculate Ncb and Npl as a function of xinterp + !drot(:,i) = -Mcb / (Mcb + Mpl(i)) * (N_Tpl + N_Rpl) + !drot(:,n) = drot(:,n) - Mcb / (Mcb + Mpl(i) * (N_Tcb + N_Rcb) + ! + end do + + end function tides_spin_derivs + + function tides_derivs_eval(self, x, t) result(y) + implicit none + ! Arguments + class(tides_derivs_func), intent(inout) :: self + real(DP), dimension(:), intent(in) :: x + real(DP), intent(in) :: t + ! Result + real(DP), dimension(:), allocatable :: y + if (associated(self%lambdaptr_tides_deriv)) then + y = self%lambdaptr_tides_deriv(x, t, self%dt, self%xbeg, self%xend) + else + error stop "Lambda function was not initialized" + end if + end function tides_derivs_eval + + function tides_derivs_init(lambda, dt, xbeg, xend) result(f) + implicit none + ! Arguments + procedure(tidederiv) :: lambda + real(DP), intent(in) :: dt + real(DP), dimension(:,:), intent(in) :: xbeg + real(DP), dimension(:,:), intent(in) :: xend + ! Result + type(tides_derivs_func) :: f + f%lambdaptr_tides_deriv => lambda + f%dt = dt + allocate(f%xbeg, source = xbeg) + allocate(f%xend, source = xend) + return + end function tides_derivs_init end submodule s_tides_step_spin \ No newline at end of file diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 8b1dd0992..255137f3d 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -29,10 +29,10 @@ function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) real(DP), dimension(RKS), parameter :: rkf5_coeff = (/ 16./135., 0., 6656./12825., 28561./56430., -9./50., 2./55. /) real(DP), dimension(:, :), allocatable :: k !! Runge-Kutta coefficient vector real(DP), dimension(:), allocatable :: ynorm !! Normalized y value used for adaptive step size control - real(DP), dimension(:), allocatable :: y0 !! Value of y at the beginning of each substep + real(DP), dimension(:), allocatable :: y0 !! Value of y at the beginning of each substep integer(I4B) :: Nvar !! Number of variables in problem integer(I4B) :: rkn !! Runge-Kutta loop index - real(DP) :: dt, trem !! Current step size and total time remaining + real(DP) :: t, x1, dt, trem !! Current time, step size and total time remaining real(DP) :: s, yerr, yscale !! Step size reduction factor, error in dependent variable, and error scale factor integer(I4B) :: i, n @@ -45,13 +45,27 @@ function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) dt = dt0 trem = t1 + t = 0._DP do yscale = norm2(y0(:)) do i = 1, MAXREDUX - do rkn = 1, RKS - y1(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) - k(:, rkn) = dt * f%eval(y1(:)) - end do + select type(f) + class is (lambda_obj_tvar) + do rkn = 1, RKS + y1(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) + if (rkn == 1) then + x1 = t + else + x1 = t + rkf45_btab(1,rkn-1) + end if + k(:, rkn) = dt * f%evalt(y1(:), t) + end do + class is (lambda_obj) + do rkn = 1, RKS + y1(:) = y0(:) + matmul(k(:, 1:rkn - 1), rkf45_btab(2:rkn, rkn - 1)) + k(:, rkn) = dt * f%eval(y1(:)) + end do + end select ! Now determine if the step size needs adjusting ynorm(:) = matmul(k(:,:), (rkf5_coeff(:) - rkf4_coeff(:))) / yscale yerr = norm2(ynorm(:)) @@ -67,6 +81,7 @@ function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) ! Compute new value then step ahead in time y1(:) = y0(:) + matmul(k(:, :), rkf4_coeff(:)) trem = trem - dt + t = t + dt if (trem <= 0._DP) exit y0(:) = y1(:) end do From 5a9a0782dcc71e4107323db1630bdeb810e2432b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 13 Jul 2021 23:16:03 -0400 Subject: [PATCH 010/194] Started putting in symba step interpolator --- src/symba/symba_step.f90 | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index b04caa74e..14a82cc4e 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -37,11 +37,35 @@ end subroutine symba_step_system module subroutine symba_step_interp_system(self, param, t, dt) implicit none + ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + ! Internals + real(DP) :: dth + dth = 0.5_DP * dt + select type(pl => self%pl) + class is (symba_pl) + select type(tp => self%tp) + class is (symba_tp) + call pl%vh2vb(cb) + call pl%lindrift(cb, dth, lbeg=.true.) + if (tp%nbody > 0) then + call tp%vh2vb(vbcb = -cb%ptbeg) + call tp%lindrift(cb, dth, lbeg=.true.) + call pl%set_beg_end(xbeg = pl%xh) + end if + call pl%accel(system, param, t) + call tp%accel(system, param, t, lbeg=.true.) + call pl%kick(dth) + call tp%kick(dth) + call pl%drift(system, param, dt) + call tp%drift(system, param, dt + + end select + end select return end subroutine symba_step_interp_system end submodule s_symba_step From c49e3180d5299a496b9144ef7543ceb50e9263f3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 14 Jul 2021 22:03:18 -0400 Subject: [PATCH 011/194] Added io routine from other branch so I can develop here and it won't break running scripts --- python/swiftest/swiftest/io.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index ceab9a74f..caf1c0e39 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -466,7 +466,8 @@ def swiftest_stream(f, param): npl = f.read_ints() ntp = f.read_ints() iout_form = f.read_reals('c') - cbid = f.read_ints() + #cbid = f.read_ints() + cbid = np.array([0]) Mcb = f.read_reals(np.float64) Rcb = f.read_reals(np.float64) J2cb = f.read_reals(np.float64) From ae0a82e902f7c118d39e874bbc60da98bc30a43f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 14 Jul 2021 22:57:01 -0400 Subject: [PATCH 012/194] Fleshed out symba_step_interp and started adding symba_step_recur --- src/modules/symba_classes.f90 | 28 ++++++++---- src/symba/symba_step.f90 | 85 +++++++++++++++++++++++++++-------- 2 files changed, 85 insertions(+), 28 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 5b712c9de..fd477da40 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -140,9 +140,11 @@ module symba_classes class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure contains private - procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps - procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step - procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps + procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step + procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current + !! recursion level, if applicable, and descend to the next deeper level if necessarye end type symba_nbody_system interface @@ -246,6 +248,12 @@ module subroutine symba_setup_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_setup_system + module subroutine symba_setup_tp(self,n) + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + integer(I4B), intent(in) :: n !! Number of test particles to allocate + end subroutine symba_setup_tp + module subroutine symba_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none @@ -255,12 +263,6 @@ module subroutine symba_step_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_system - module subroutine symba_setup_tp(self,n) - implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of test particles to allocate - end subroutine symba_setup_tp - module subroutine symba_step_interp_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none @@ -269,5 +271,13 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system + + module recursive subroutine symba_step_recur_system(self, param, t, dt) + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + end subroutine symba_step_recur_system end interface end module symba_classes \ No newline at end of file diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 14a82cc4e..e0709a7f8 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -36,36 +36,83 @@ module subroutine symba_step_system(self, param, t, dt) end subroutine symba_step_system module subroutine symba_step_interp_system(self, param, t, dt) + !! author: David A. Minton + !! + !! Step planets and active test particles ahead in democratic heliocentric coordinates, calling the recursive + !! subroutine to descend to the appropriate level to handle close encounters + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_step_interp.f90 + !! Adapted from Hal Levison's Swift routine symba5_step_interp.f implicit none ! Arguments - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth + integer(I4B) :: irec dth = 0.5_DP * dt - select type(pl => self%pl) - class is (symba_pl) - select type(tp => self%tp) - class is (symba_tp) - call pl%vh2vb(cb) - call pl%lindrift(cb, dth, lbeg=.true.) - if (tp%nbody > 0) then - call tp%vh2vb(vbcb = -cb%ptbeg) - call tp%lindrift(cb, dth, lbeg=.true.) - call pl%set_beg_end(xbeg = pl%xh) - end if - call pl%accel(system, param, t) - call tp%accel(system, param, t, lbeg=.true.) - call pl%kick(dth) - call tp%kick(dth) - call pl%drift(system, param, dt) - call tp%drift(system, param, dt + associate(system => self) + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + select type(cb => system%cb) + class is (symba_cb) + call pl%vh2vb(cb) + call pl%lindrift(cb, dth, lbeg=.true.) + call tp%vh2vb(vbcb = -cb%ptbeg) + call tp%lindrift(cb, dth, lbeg=.true.) + + call pl%set_beg_end(xbeg = pl%xh) + call pl%accel(system, param, t) + call tp%accel(system, param, t, lbeg=.true.) + + call pl%kick(dth) + call tp%kick(dth) + + irec = -1 + call pl%drift(system, param, dt) + call tp%drift(system, param, dt) + irec = 0 + call system%recursive_step(param, t, dt) + + call pl%set_beg_end(xend = pl%xh) + call pl%accel(system, param, t + dt) + call tp%accel(system, param, t + dt, lbeg=.false.) + + call pl%kick(dth) + call tp%kick(dth) + + call pl%vh2vb(cb) + call pl%lindrift(cb, dth, lbeg=.false.) + call tp%vh2vb(vbcb = -cb%ptend) + call tp%lindrift(cb, dth, lbeg=.false.) + end select + end select end select - end select + end associate return end subroutine symba_step_interp_system + + module recursive subroutine symba_step_recur_system(self, param, t, dt) + !! author: David A. Minton + !! + !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current + !! recursion level, if applicable, and descend to the next deeper level if necessarys + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_step_recur.f90 + !! Adapted from Hal Levison's Swift routine symba5_step_recur.f + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + ! Internals + end subroutine symba_step_recur_system + end submodule s_symba_step From f2eea054395fa9b9c18e9a839cc47d7cbacafc02 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 14 Jul 2021 22:59:05 -0400 Subject: [PATCH 013/194] Moved irec to be internal component of the system object --- src/modules/symba_classes.f90 | 1 + src/symba/symba_step.f90 | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index fd477da40..306153379 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -138,6 +138,7 @@ module symba_classes class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure + integer(I4B) :: irec !! Recursion level contains private procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index e0709a7f8..3e14686ac 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -51,7 +51,6 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth - integer(I4B) :: irec dth = 0.5_DP * dt associate(system => self) @@ -73,10 +72,10 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%kick(dth) call tp%kick(dth) - irec = -1 + system%irec = -1 call pl%drift(system, param, dt) call tp%drift(system, param, dt) - irec = 0 + system%irec = 0 call system%recursive_step(param, t, dt) From 84d22ea39c9b4abf7a8a94587ed8c612fd2e037e Mon Sep 17 00:00:00 2001 From: David Minton Date: Wed, 21 Jul 2021 15:30:26 -0400 Subject: [PATCH 014/194] Grabbed the bug fix to the parameter file dump method from the OOPrestructure branch --- src/io/io.f90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 2bb46ae0e..e74255466 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -429,14 +429,14 @@ module subroutine io_dump_system(self, param, msg) !! so that if a dump file gets corrupted during writing, the user can restart from the older one. implicit none ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + character(*), optional, intent(in) :: msg !! Message to display with dump operation ! Internals - class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names - !! to dump file-specific values without changing the user-defined values - integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security - !! in case the program halts during writing + 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 @@ -447,6 +447,7 @@ module subroutine io_dump_system(self, param, msg) 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) From 9ace669f465e235b9d89829fea6eceec632e9930 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 10:40:32 -0400 Subject: [PATCH 015/194] Setting up rhill approximate and started putting interfaces back onto the operator implementations --- src/operators/operator_cross.f90 | 8 ++++++-- src/util/util_set.f90 | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/operators/operator_cross.f90 b/src/operators/operator_cross.f90 index d6fd82944..235294a3e 100644 --- a/src/operators/operator_cross.f90 +++ b/src/operators/operator_cross.f90 @@ -120,8 +120,12 @@ return end procedure operator_cross_el_i4b - module procedure operator_cross_el_i8b + module pure function operator_cross_el_i8b(A, B) result(C) implicit none + ! Arguments + integer(I8B), dimension(:,:), intent(in) :: A, B + integer(I8B), dimension(:,:), allocatable :: C + ! Internals integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -131,6 +135,6 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_i8b + end function operator_cross_el_i8b end submodule operator_cross_implementation \ No newline at end of file diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index b690f37b2..edc6a1bb5 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -72,8 +72,9 @@ module subroutine util_set_rhill(self,cb) !! !! Sets the value of the Hill's radius implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest massive body object + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object if (self%nbody > 0) then call self%xv2el(cb) @@ -83,6 +84,26 @@ module subroutine util_set_rhill(self,cb) return end subroutine util_set_rhill + + module subroutine util_set_approximate_rhill(self,cb) + !! author: David A. Minton + !! + !! Sets the approximate value of the Hill's radius using the heliocentric radius instead of computing the semimajor axis + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + ! Internals + real(DP) :: rh + + if (self%nbody > 0) then + call self%xv2el(cb) + self%rhill(:) = self%a(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD + end if + + return + end subroutine util_set_approximate_rhill + module subroutine util_set_ir3h(self) !! author: David A. Minton !! From 23239eead8fddb5f2f0c2806d9e92dbc86ca2236 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 22 Jul 2021 11:17:25 -0400 Subject: [PATCH 016/194] Added explicit interfaces to cross product operators and defined the approximate rhill procedure --- src/modules/swiftest_classes.f90 | 10 ++++- src/operators/operator_cross.f90 | 74 ++++++++++++++++++++------------ src/util/util_set.f90 | 56 +++++++++++++----------- 3 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 13ee255cc..db9e72b0d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,7 @@ module swiftest_classes public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -806,8 +806,14 @@ end subroutine util_set_mu_tp module subroutine util_set_rhill(self,cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine util_set_rhill + + module subroutine util_set_rhill_approximate(self,cb) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + end subroutine util_set_rhill_approximate end interface interface util_sort diff --git a/src/operators/operator_cross.f90 b/src/operators/operator_cross.f90 index 235294a3e..1efce2359 100644 --- a/src/operators/operator_cross.f90 +++ b/src/operators/operator_cross.f90 @@ -1,4 +1,4 @@ -submodule(swiftest_operators) operator_cross_implementation +submodule(swiftest_operators) s_operator_cross use swiftest !! author: David A. Minton !! @@ -7,56 +7,70 @@ !! Vector list implementations: C(1:3, :) = A(1:3, :) .cross. B(1:3, :) contains - module procedure operator_cross_sp + module pure function operator_cross_sp(A, B) result(C) implicit none + real(SP), dimension(:), intent(in) :: A, B + real(SP), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_sp + end function operator_cross_sp - module procedure operator_cross_dp + module pure function operator_cross_dp(A, B) result(C) implicit none + real(DP), dimension(:), intent(in) :: A, B + real(DP), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_dp + end function operator_cross_dp - module procedure operator_cross_i1b + module pure function operator_cross_i1b(A, B) result(C) implicit none + integer(I1B), dimension(:), intent(in) :: A, B + integer(I1B), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_i1b + end function operator_cross_i1b - module procedure operator_cross_i2b + module pure function operator_cross_i2b(A, B) result(C) implicit none + integer(I2B), dimension(:), intent(in) :: A, B + integer(I2B), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_i2b + end function operator_cross_i2b - module procedure operator_cross_i4b + module pure function operator_cross_i4b(A, B) result(C) implicit none + integer(I4B), dimension(:), intent(in) :: A, B + integer(I4B), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_i4b + end function operator_cross_i4b - module procedure operator_cross_i8b + module pure function operator_cross_i8b(A, B) result(C) implicit none + integer(I8B), dimension(:), intent(in) :: A, B + integer(I8B), dimension(3) :: C C(1) = A(2) * B(3) - A(3) * B(2) C(2) = A(3) * B(1) - A(1) * B(3) C(3) = A(1) * B(2) - A(2) * B(1) return - end procedure operator_cross_i8b + end function operator_cross_i8b - module procedure operator_cross_el_sp + module pure function operator_cross_el_sp(A, B) result(C) implicit none + real(SP), dimension(:,:), intent(in) :: A, B + real(SP), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -66,10 +80,12 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_sp + end function operator_cross_el_sp - module procedure operator_cross_el_dp + module pure function operator_cross_el_dp(A, B) result(C) implicit none + real(DP), dimension(:,:), intent(in) :: A, B + real(DP), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -79,10 +95,12 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_dp + end function operator_cross_el_dp - module procedure operator_cross_el_i1b - implicit none + module pure function operator_cross_el_i1b(A, B) result(C) + implicit none + integer(I1B), dimension(:,:), intent(in) :: A, B + integer(I1B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -92,10 +110,12 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_i1b + end function operator_cross_el_i1b - module procedure operator_cross_el_i2b + module pure function operator_cross_el_i2b(A, B) result(C) implicit none + integer(I2B), dimension(:,:), intent(in) :: A, B + integer(I2B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -105,10 +125,12 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_i2b + end function operator_cross_el_i2b - module procedure operator_cross_el_i4b + module pure function operator_cross_el_i4b(A, B) result(C) implicit none + integer(I4B), dimension(:,:), intent(in) :: A, B + integer(I4B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -118,14 +140,12 @@ C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) end do return - end procedure operator_cross_el_i4b + end function operator_cross_el_i4b module pure function operator_cross_el_i8b(A, B) result(C) implicit none - ! Arguments integer(I8B), dimension(:,:), intent(in) :: A, B integer(I8B), dimension(:,:), allocatable :: C - ! Internals integer(I4B) :: i, n n = size(A, 2) allocate(C, mold = A) @@ -137,4 +157,4 @@ module pure function operator_cross_el_i8b(A, B) result(C) return end function operator_cross_el_i8b -end submodule operator_cross_implementation \ No newline at end of file +end submodule s_operator_cross \ No newline at end of file diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index edc6a1bb5..dbaae3ea3 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -30,12 +30,37 @@ module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) end subroutine util_set_beg_end_pl + module subroutine util_set_ir3h(self) + !! author: David A. Minton + !! + !! Sets the inverse heliocentric radius term (1/rh**3) for all bodies in a structure + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + ! Internals + integer(I4B) :: i + real(DP) :: r2, irh + + if (self%nbody > 0) then + + do i = 1, self%nbody + r2 = dot_product(self%xh(:, i), self%xh(:, i)) + irh = 1.0_DP / sqrt(r2) + self%ir3h(i) = irh / r2 + end do + end if + + return + end subroutine util_set_ir3h + module subroutine util_set_msys(self) !! author: David A. Minton !! !! Sets the value of msys and the vector mass quantities based on the total mass of the system implicit none - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system objec + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nobdy system object + self%msys = self%cb%mass + sum(self%pl%mass(1:self%pl%nbody)) return @@ -46,11 +71,11 @@ module subroutine util_set_mu_pl(self, cb) !! !! Computes G * (M + m) for each massive body implicit none + ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object if (self%nbody > 0) self%mu(:) = cb%Gmass + self%Gmass(:) - return end subroutine util_set_mu_pl @@ -59,6 +84,7 @@ module subroutine util_set_mu_tp(self, cb) !! !! Converts certain scalar values to arrays so that they can be used in elemental functions implicit none + ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object @@ -84,8 +110,7 @@ module subroutine util_set_rhill(self,cb) return end subroutine util_set_rhill - - module subroutine util_set_approximate_rhill(self,cb) + module subroutine util_set_rhill_approximate(self,cb) !! author: David A. Minton !! !! Sets the approximate value of the Hill's radius using the heliocentric radius instead of computing the semimajor axis @@ -102,27 +127,6 @@ module subroutine util_set_approximate_rhill(self,cb) end if return - end subroutine util_set_approximate_rhill + end subroutine util_set_rhill_approximate - module subroutine util_set_ir3h(self) - !! author: David A. Minton - !! - !! Sets the inverse heliocentric radius term (1/rh**3) for all bodies in a structure - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - - integer(I4B) :: i - real(DP) :: r2, irh - - if (self%nbody > 0) then - - do i = 1, self%nbody - r2 = dot_product(self%xh(:, i), self%xh(:, i)) - irh = 1.0_DP / sqrt(r2) - self%ir3h(i) = irh / r2 - end do - end if - - return - end subroutine util_set_ir3h end submodule s_util_set \ No newline at end of file From 3a5d874b61b2e18c97a23f4f6a7e7f0e3ceb6019 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 22 Jul 2021 11:38:49 -0400 Subject: [PATCH 017/194] Added mag operator --- src/modules/swiftest_operators.f90 | 54 ++++++++++++++++++++++++ src/operators/operator_cross.f90 | 32 ++++++++++++++ src/operators/operator_mag.f90 | 68 ++++++++++++++++++++++++++++++ src/util/util_set.f90 | 5 ++- 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 src/operators/operator_mag.f90 diff --git a/src/modules/swiftest_operators.f90 b/src/modules/swiftest_operators.f90 index b5b4ce078..2c982f09c 100644 --- a/src/modules/swiftest_operators.f90 +++ b/src/modules/swiftest_operators.f90 @@ -26,6 +26,12 @@ module pure function operator_cross_dp(A, B) result(C) real(DP), dimension(3) :: C end function operator_cross_dp + module pure function operator_cross_qp(A, B) result(C) + implicit none + real(QP), dimension(:), intent(in) :: A, B + real(QP), dimension(3) :: C + end function operator_cross_qp + module pure function operator_cross_i1b(A, B) result(C) implicit none integer(I1B), dimension(:), intent(in) :: A, B @@ -62,6 +68,12 @@ module pure function operator_cross_el_dp(A, B) result(C) real(DP), dimension(:,:), allocatable :: C end function operator_cross_el_dp + module pure function operator_cross_el_qp(A, B) result(C) + implicit none + real(QP), dimension(:,:), intent(in) :: A, B + real(QP), dimension(:,:), allocatable :: C + end function operator_cross_el_qp + module pure function operator_cross_el_i1b(A, B) result(C) implicit none integer(I1B), dimension(:,:), intent(in) :: A, B @@ -87,4 +99,46 @@ module pure function operator_cross_el_i8b(A, B) result(C) end function operator_cross_el_i8b end interface + !******************************************************************************************************************************** + ! Interfaces for .mag. operator + !******************************************************************************************************************************** + + interface operator(.mag.) + module pure function operator_mag_sp(A) result(B) + implicit none + real(SP), dimension(:), intent(in) :: A + real(SP) :: B + end function operator_mag_sp + + module pure function operator_mag_dp(A) result(B) + implicit none + real(DP), dimension(:), intent(in) :: A + real(DP) :: B + end function operator_mag_dp + + module pure function operator_mag_qp(A) result(B) + implicit none + real(QP), dimension(:), intent(in) :: A + real(QP) :: B + end function operator_mag_qp + + module pure function operator_mag_el_sp(A) result(B) + implicit none + real(SP), dimension(:,:), intent(in) :: A + real(SP), dimension(:), allocatable :: B + end function operator_mag_el_sp + + module pure function operator_mag_el_dp(A) result(B) + implicit none + real(DP), dimension(:,:), intent(in) :: A + real(DP), dimension(:), allocatable :: B + end function operator_mag_el_dp + + module pure function operator_mag_el_qp(A) result(B) + implicit none + real(QP), dimension(:,:), intent(in) :: A + real(QP), dimension(:), allocatable :: B + end function operator_mag_el_qp + end interface + end module swiftest_operators diff --git a/src/operators/operator_cross.f90 b/src/operators/operator_cross.f90 index 1efce2359..736dc2696 100644 --- a/src/operators/operator_cross.f90 +++ b/src/operators/operator_cross.f90 @@ -27,6 +27,16 @@ module pure function operator_cross_dp(A, B) result(C) return end function operator_cross_dp + module pure function operator_cross_qp(A, B) result(C) + implicit none + real(QP), dimension(:), intent(in) :: A, B + real(QP), dimension(3) :: C + C(1) = A(2) * B(3) - A(3) * B(2) + C(2) = A(3) * B(1) - A(1) * B(3) + C(3) = A(1) * B(2) - A(2) * B(1) + return + end function operator_cross_qp + module pure function operator_cross_i1b(A, B) result(C) implicit none integer(I1B), dimension(:), intent(in) :: A, B @@ -73,6 +83,7 @@ module pure function operator_cross_el_sp(A, B) result(C) real(SP), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) @@ -88,6 +99,7 @@ module pure function operator_cross_el_dp(A, B) result(C) real(DP), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) @@ -97,12 +109,29 @@ module pure function operator_cross_el_dp(A, B) result(C) return end function operator_cross_el_dp + module pure function operator_cross_el_qp(A, B) result(C) + implicit none + real(QP), dimension(:,:), intent(in) :: A, B + real(QP), dimension(:,:), allocatable :: C + integer(I4B) :: i, n + n = size(A, 2) + if (allocated(C)) deallocate(C) + allocate(C, mold = A) + do concurrent (i = 1:n) + C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) + C(2, i) = A(3, i) * B(1, i) - A(1, i) * B(3, i) + C(3, i) = A(1, i) * B(2, i) - A(2, i) * B(1, i) + end do + return + end function operator_cross_el_qp + module pure function operator_cross_el_i1b(A, B) result(C) implicit none integer(I1B), dimension(:,:), intent(in) :: A, B integer(I1B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) @@ -118,6 +147,7 @@ module pure function operator_cross_el_i2b(A, B) result(C) integer(I2B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) @@ -133,6 +163,7 @@ module pure function operator_cross_el_i4b(A, B) result(C) integer(I4B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) @@ -148,6 +179,7 @@ module pure function operator_cross_el_i8b(A, B) result(C) integer(I8B), dimension(:,:), allocatable :: C integer(I4B) :: i, n n = size(A, 2) + if (allocated(C)) deallocate(C) allocate(C, mold = A) do concurrent (i = 1:n) C(1, i) = A(2, i) * B(3, i) - A(3, i) * B(2, i) diff --git a/src/operators/operator_mag.f90 b/src/operators/operator_mag.f90 new file mode 100644 index 000000000..5a054d5ce --- /dev/null +++ b/src/operators/operator_mag.f90 @@ -0,0 +1,68 @@ +submodule(swiftest_operators) s_operator_mag + !! author: David A. Minton + !! + !! Contains implementations for the .mag. operator for all defined real types + !! Single vector implementations: B = .mag. A(1:3) + !! Vector list implementations: B(:) = .mag. A(1:3, :) + contains + + module pure function operator_mag_sp(A) result(B) + implicit none + real(SP), dimension(:), intent(in) :: A + real(SP) :: B + B = norm2(A(:)) + return + end function operator_mag_sp + + module pure function operator_mag_dp(A) result(B) + implicit none + real(DP), dimension(:), intent(in) :: A + real(DP) :: B + B = norm2(A(:)) + return + end function operator_mag_dp + + module pure function operator_mag_el_sp(A) result(B) + implicit none + real(SP), dimension(:,:), intent(in) :: A + real(SP), dimension(:), allocatable :: B + integer(I4B) :: i,n + n = size(A, 2) + if (allocated(B)) deallocate(B) + allocate(B(n)) + do concurrent (i=1:n) + B(i) = norm2(A(:, i)) + end do + return + end function operator_mag_el_sp + + module pure function operator_mag_el_dp(A) result(B) + implicit none + real(DP), dimension(:,:), intent(in) :: A + real(DP), dimension(:), allocatable :: B + integer(I4B) :: i,n + n = size(A, 2) + if (allocated(B)) deallocate(B) + allocate(B(n)) + do concurrent (i=1:n) + B(i) = norm2(A(:, i)) + end do + return + end function operator_mag_el_dp + + module pure function operator_mag_el_qp(A) result(B) + implicit none + real(QP), dimension(:,:), intent(in) :: A + real(QP), dimension(:), allocatable :: B + integer(I4B) :: i,n + n = size(A, 2) + if (allocated(B)) deallocate(B) + allocate(B(n)) + do concurrent (i=1:n) + B(i) = norm2(A(:, i)) + end do + return + end function operator_mag_el_qp + +end submodule s_operator_mag + diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index dbaae3ea3..7442d1517 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -119,10 +119,11 @@ module subroutine util_set_rhill_approximate(self,cb) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object ! Internals - real(DP) :: rh + real(DP), dimension(:), allocatable :: rh if (self%nbody > 0) then - call self%xv2el(cb) + allocate(rh, mold=self%rhill) + self%rhill(:) = self%a(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD end if From 4ea98628b70ab454302e48e9b3141f8d838484f1 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 22 Jul 2021 11:40:23 -0400 Subject: [PATCH 018/194] Use the mag operator for the approximate rhill calculation --- src/util/util_set.f90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 7442d1517..7a082648a 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -122,9 +122,8 @@ module subroutine util_set_rhill_approximate(self,cb) real(DP), dimension(:), allocatable :: rh if (self%nbody > 0) then - allocate(rh, mold=self%rhill) - - self%rhill(:) = self%a(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD + rh(:) = .mag. self%xh(:,:) + self%rhill(:) = rh():) * (self%Gmass(:) / cb%Gmass / 3)**THIRD end if return From ba010184dbeac865ec1da9920c20fa94f43ec5c5 Mon Sep 17 00:00:00 2001 From: David Minton Date: Thu, 22 Jul 2021 11:40:46 -0400 Subject: [PATCH 019/194] Fixed typo --- src/util/util_set.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 7a082648a..2c52c86df 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -123,7 +123,7 @@ module subroutine util_set_rhill_approximate(self,cb) if (self%nbody > 0) then rh(:) = .mag. self%xh(:,:) - self%rhill(:) = rh():) * (self%Gmass(:) / cb%Gmass / 3)**THIRD + self%rhill(:) = rh(:) * (self%Gmass(:) / cb%Gmass / 3)**THIRD end if return From 72c31ff999144f2f9f866b5e2abb3e54d6e95a4f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 13:53:14 -0400 Subject: [PATCH 020/194] Updated formatting and changed the definition of VSMALL to use pre-defined epsilon --- src/modules/swiftest_globals.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index 256c4124b..a1f0d7511 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -100,10 +100,10 @@ module swiftest_globals !> Standard file names integer(I4B), parameter :: NDUMPFILES = 2 - character(*), dimension(2), parameter :: DUMP_CB_FILE = (/ 'dump_cb1.bin', 'dump_cb2.bin' /) - character(*), dimension(2), parameter :: DUMP_PL_FILE = (/ 'dump_pl1.bin', 'dump_pl2.bin' /) - character(*), dimension(2), parameter :: DUMP_TP_FILE = (/ 'dump_tp1.bin', 'dump_tp2.bin' /) - character(*), dimension(2), parameter :: DUMP_PARAM_FILE = (/ 'dump_param1.dat', 'dump_param2.dat' /) + character(*), dimension(2), parameter :: DUMP_CB_FILE = ['dump_cb1.bin', 'dump_cb2.bin' ] + character(*), dimension(2), parameter :: DUMP_PL_FILE = ['dump_pl1.bin', 'dump_pl2.bin' ] + character(*), dimension(2), parameter :: DUMP_TP_FILE = ['dump_tp1.bin', 'dump_tp2.bin' ] + character(*), dimension(2), parameter :: DUMP_PARAM_FILE = ['dump_param1.dat', 'dump_param2.dat'] !> Default file names that can be changed by the user in the parameters file character(*), parameter :: ENC_OUTFILE = 'encounter.out' @@ -116,11 +116,11 @@ module swiftest_globals integer(I4B), parameter :: BINUNIT = 20 !! File unit number for the binary output file !> Miscellaneous constants: - integer(I4B), parameter :: NDIM = 3 !! Number of dimensions in our reality - integer(I4B), parameter :: NDIM2 = 2 * NDIM !! 2x the number of dimensions - real(DP), parameter :: VSMALL = 4.0E-15_DP + integer(I4B), parameter :: NDIM = 3 !! Number of dimensions in our reality + integer(I4B), parameter :: NDIM2 = 2 * NDIM !! 2x the number of dimensions + real(DP), parameter :: VSMALL = 2 * epsilon(1._DP) !! Very small number used to prevent floating underflow - real(DP), parameter :: GC = 6.6743E-11_DP !! Universal gravitational constant in SI units + real(DP), parameter :: GC = 6.6743E-11_DP !! Universal gravitational constant in SI units real(DP), parameter :: einsteinC = 299792458.0_DP !! Speed of light in SI units end module swiftest_globals From b91f7ea0b1bbce268c292574804fe61a1e0659f7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 14:21:05 -0400 Subject: [PATCH 021/194] Moved drift routine to be a Swiftest body method that WHM overrides. Fixed up some formatting and comments --- src/drift/drift.f90 | 52 ++++++++++++++++++++++++++++++++ src/modules/swiftest_classes.f90 | 37 ++++++++++++++--------- src/modules/whm_classes.f90 | 26 +++++----------- src/whm/whm_drift.f90 | 52 +------------------------------- 4 files changed, 84 insertions(+), 83 deletions(-) diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 8bba1a273..2ddb03500 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -9,6 +9,57 @@ integer(I2B), parameter :: NLAG2 = 40 contains + + module subroutine drift_body(self, system, param, dt) + !! author: David A. Minton + !! + !! Loop bodies and call Danby drift routine on the heliocentric position and velocities. + !! + !! Adapted from Hal Levison's Swift routine drift_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_drift_tp.f90 + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + ! Internals + integer(I4B) :: i + real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation + integer(I4B), dimension(:), allocatable :: iflag + real(DP), dimension(:), allocatable :: dtp + + associate(n => self%nbody) + if (n == 0) return + allocate(iflag(n)) + iflag(:) = 0 + allocate(dtp(n)) + if (param%lgr) then + do i = 1, n + rmag = norm2(self%xh(:, i)) + vmag2 = dot_product(self%vh(:, i), self%vh(:, i)) + energy = 0.5_DP * vmag2 - self%mu(i) / rmag + dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) + end do + else + dtp(:) = dt + end if + do concurrent(i = 1:n, self%status(i) == ACTIVE) + call drift_one(self%mu(i), self%xh(1,i), self%xh(2,i), self%xh(3,i), & + self%vh(1,i), self%vh(2,i), self%vh(3,i), & + dtp(i), iflag(i)) + end do + if (any(iflag(1:n) /= 0)) then + where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR + do i = 1, n + if (iflag(i) /= 0) write(*, *) "Particle ", self%id(i), " lost due to error in Danby drift" + end do + end if + end associate + + return + end subroutine drift_body + module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -406,4 +457,5 @@ pure subroutine drift_kepu_stumpff(x, c0, c1, c2, c3) return end subroutine drift_kepu_stumpff + end submodule drift_implementation diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index db9e72b0d..e924d2546 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -7,7 +7,7 @@ module swiftest_classes implicit none private public :: discard_pl, discard_system, discard_tp - public :: drift_one + public :: drift_body, drift_one public :: eucl_dist_index_plpl, eucl_dist_index_pltp, eucl_irij3_plpl public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & @@ -173,6 +173,7 @@ module swiftest_classes procedure(abstract_step_body), public, deferred :: step procedure(abstract_accel), public, deferred :: accel ! These are concrete because the implementation is the same for all types of particles + procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file @@ -247,16 +248,16 @@ module swiftest_classes private ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and - procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -309,7 +310,7 @@ subroutine abstract_accel(self, system, param, t, lbeg) import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP class(swiftest_body), intent(inout) :: self !! Swiftest body data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine abstract_accel @@ -383,6 +384,14 @@ module subroutine discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine discard_tp + module subroutine drift_body(self, system, param, dt) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + end subroutine drift_body + module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) implicit none real(DP), intent(in) :: mu !! G * (Mcb + m), G = gravitational constant, Mcb = mass of central body, m = mass of body to drift @@ -434,7 +443,7 @@ end subroutine gr_pseudovel2vel module pure subroutine gr_pv2vh_body(self, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_pv2vh_body module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) @@ -449,7 +458,7 @@ end subroutine gr_vel2pseudovel module pure subroutine gr_vh2pv_body(self, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_vh2pv_body module subroutine io_dump_param(self, param_file_name) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 6107a719d..21811cf38 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -33,7 +33,7 @@ module whm_classes procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine + procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates procedure, public :: fill => whm_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: accel => whm_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure, public :: accel_gr => whm_gr_getacch_pl !! Acceleration term arising from the post-Newtonian correction @@ -55,7 +55,6 @@ module whm_classes !! component list, such as whm_setup_tp and whm_spill_tp contains private - procedure, public :: drift => whm_drift_tp !! Loop through test particles and call Danby drift routine procedure, public :: accel => whm_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: accel_gr => whm_gr_getacch_tp !! Acceleration term arising from the post-Newtonian correction procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction @@ -102,19 +101,10 @@ module subroutine whm_drift_pl(self, system, param, dt) implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize end subroutine whm_drift_pl - module subroutine whm_drift_tp(self, system, param, dt) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of - real(DP), intent(in) :: dt !! Stepsize - end subroutine whm_drift_tp - module subroutine whm_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none @@ -129,7 +119,7 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine whm_getacch_pl @@ -140,7 +130,7 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine whm_getacch_tp @@ -149,7 +139,7 @@ module subroutine whm_gr_getacch_pl(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_gr_getacch_pl module subroutine whm_gr_getacch_tp(self, param) @@ -163,7 +153,7 @@ module pure subroutine whm_gr_p4_pl(self, param, dt) use swiftest_classes, only : swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Step size end subroutine whm_gr_p4_pl @@ -171,7 +161,7 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) use swiftest_classes, only : swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Step size end subroutine whm_gr_p4_tp @@ -198,7 +188,7 @@ module subroutine whm_setup_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(whm_nbody_system), intent(inout) :: self !! WHM nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine whm_setup_system !> Reads WHM test particle object in from file diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index a27897cfa..ed72cd7f3 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -12,7 +12,7 @@ module subroutine whm_drift_pl(self, system, param, dt) ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize ! Internals integer(I4B) :: i @@ -59,54 +59,4 @@ module subroutine whm_drift_pl(self, system, param, dt) end subroutine whm_drift_pl - module subroutine whm_drift_tp(self, system, param, dt) - !! author: David A. Minton - !! - !! Loop through test particles and call Danby drift routine - !! - !! Adapted from Hal Levison's Swift routine drift_tp.f - !! Includes - !! Adapted from David E. Kaufmann's Swifter routine whm_drift_tp.f90 - implicit none - ! Arguments - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of - real(DP), intent(in) :: dt !! Stepsize - ! Internals - integer(I4B) :: i - real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation - integer(I4B), dimension(:), allocatable :: iflag - real(DP), dimension(:), allocatable :: dtp - - associate(tp => self, ntp => self%nbody) - if (ntp == 0) return - allocate(iflag(ntp)) - iflag(:) = 0 - allocate(dtp(ntp)) - if (param%lgr) then - do i = 1, ntp - rmag = norm2(tp%xh(:, i)) - vmag2 = dot_product(tp%vh(:, i), tp%vh(:, i)) - energy = 0.5_DP * vmag2 - tp%mu(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - dtp(:) = dt - end if - do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) - call drift_one(tp%mu(i), tp%xh(1,i), tp%xh(2,i), tp%xh(3,i), & - tp%vh(1,i), tp%vh(2,i), tp%vh(3,i), & - dtp(i), iflag(i)) - end do - if (any(iflag(1:ntp) /= 0)) then - where(iflag(1:ntp) /= 0) tp%status(1:ntp) = DISCARDED_DRIFTERR - do i = 1, ntp - if (iflag(i) /= 0) write(*, *) "Particle ", self%id(i), " lost due to error in Danby drift" - end do - end if - end associate - - return - end subroutine whm_drift_tp end submodule whm_drift From 645df4c2a9e0580f2493e3c4d3dab1fd1d96ba6d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 14:21:17 -0400 Subject: [PATCH 022/194] Fixed up formatting and some comments --- src/gr/gr.f90 | 4 ++-- src/helio/helio_drift.f90 | 4 ++-- src/helio/helio_getacch.f90 | 6 +++--- src/modules/helio_classes.f90 | 6 +++--- src/symba/symba_step.f90 | 1 + src/user/user_getacch.f90 | 2 +- src/whm/whm_getacch.f90 | 4 ++-- src/whm/whm_gr.f90 | 6 +++--- src/whm/whm_setup.f90 | 2 +- src/whm/whm_step.f90 | 2 +- 10 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index 8831a93d5..7d794bf2b 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -108,7 +108,7 @@ module pure subroutine gr_pv2vh_body(self, param) implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i real(DP), dimension(:,:), allocatable :: vh !! Temporary holder of pseudovelocity for in-place conversion @@ -207,7 +207,7 @@ module pure subroutine gr_vh2pv_body(self, param) implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i real(DP), dimension(:,:), allocatable :: pv !! Temporary holder of pseudovelocity for in-place conversion diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 40da379ee..3f64905b0 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -14,7 +14,7 @@ module subroutine helio_drift_pl(self, system, param, dt) ! Arguments class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize) ! Internals integer(I4B) :: i !! Loop counter @@ -104,7 +104,7 @@ module subroutine helio_drift_tp(self, system, param, dt) ! Arguments class(helio_tp), intent(inout) :: self !! Helio test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize ! Internals integer(I4B) :: i !! Loop counter diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index ca6f09fc1..e7a84108e 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -12,7 +12,7 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) ! Arguments class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step @@ -46,7 +46,7 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) ! Arguments class(helio_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step ! Internals @@ -110,7 +110,7 @@ subroutine helio_getacch_int_tp(tp, system, param, t) ! Arguments class(helio_tp), intent(inout) :: tp !! Helio test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current times ! Internals integer(I4B) :: i, j diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 190c354b7..8d23d2f8c 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -91,7 +91,7 @@ module subroutine helio_drift_pl(self, system, param, dt) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize end subroutine helio_drift_pl @@ -100,7 +100,7 @@ module subroutine helio_drift_tp(self, system, param, dt) implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize end subroutine helio_drift_tp @@ -125,7 +125,7 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine helio_getacch_pl diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 3e14686ac..bfd36b7f5 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -112,6 +112,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize ! Internals + !associate() end subroutine symba_step_recur_system end submodule s_symba_step diff --git a/src/user/user_getacch.f90 b/src/user/user_getacch.f90 index c54c21693..16a2f0916 100644 --- a/src/user/user_getacch.f90 +++ b/src/user/user_getacch.f90 @@ -11,7 +11,7 @@ module subroutine user_getacch_body(self, system, param, t, lbeg) ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of user parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters user parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the ste diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index 4d761fc02..f393bd60e 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -12,7 +12,7 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step ! Internals @@ -61,7 +61,7 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) ! Arguments class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step ! Internals diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index 3cf159504..62c7fb2b5 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -10,7 +10,7 @@ module subroutine whm_gr_getacch_pl(self, param) !! author: David A. Minton implicit none ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i real(DP), dimension(NDIM) :: suma @@ -71,7 +71,7 @@ module pure subroutine whm_gr_p4_pl(self, param, dt) implicit none ! Arguments class(whm_pl), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Step size ! Internals integer(I4B) :: i @@ -96,7 +96,7 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) implicit none ! Arguments class(whm_tp), intent(inout) :: self !! Swiftest particle object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Step size ! Internals integer(I4B) :: i diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 9f0f9b1b7..50f0618bb 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -79,7 +79,7 @@ module subroutine whm_setup_system(self, param) implicit none ! Arguments class(whm_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters call io_read_initialize_system(self, param) ! Make sure that the discard list gets allocated initially diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 22dd16387..9296a179c 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -12,7 +12,7 @@ module subroutine whm_step_system(self, param, t, dt) implicit none ! Arguments class(whm_nbody_system), intent(inout) :: self !! WHM nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters of on parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time real(DP), intent(in) :: dt !! Current stepsize From 1af1dfb48679e113aea6abcfb5d2a6bebbf77e02 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 14:49:48 -0400 Subject: [PATCH 023/194] Updated drift routines to use mask --- .../swiftest_vs_swifter.ipynb | 54 +++++------ python/swiftest/swiftest/io.py | 3 +- src/drift/drift.f90 | 9 +- src/helio/helio_drift.f90 | 92 +++++-------------- src/helio/helio_step.f90 | 4 +- src/modules/helio_classes.f90 | 13 +-- src/modules/swiftest_classes.f90 | 3 +- src/modules/whm_classes.f90 | 3 +- src/symba/symba_step.f90 | 4 +- src/whm/whm_drift.f90 | 16 ++-- src/whm/whm_step.f90 | 4 +- 11 files changed, 72 insertions(+), 133 deletions(-) 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 52568fd84..4c9361b73 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 @@ -42,11 +42,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.506e-01\n", - "Creating Dataset\n", - "Successfully converted 221 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" + "Reading Swiftest file param.swiftest.in\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Size obtained (4) is not a multiple of the dtypes given (8).", + "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 134\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 135\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--> 136\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 137\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 138\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 600\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 601\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--> 602\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 603\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 604\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 469\u001b[0m \u001b[0;31m#cbid = f.read_ints()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 470\u001b[0m \u001b[0mcbid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\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--> 471\u001b[0;31m \u001b[0mMcb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\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 472\u001b[0m \u001b[0mRcb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 473\u001b[0m \u001b[0mJ2cb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/scipy/io/_fortran.py\u001b[0m in \u001b[0;36mread_reals\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 337\u001b[0m \"\"\"\n\u001b[0;32m--> 338\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_record\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\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 339\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\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[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/scipy/io/_fortran.py\u001b[0m in \u001b[0;36mread_record\u001b[0;34m(self, *dtypes, **kwargs)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mremainder\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 259\u001b[0m raise ValueError('Size obtained ({0}) is not a multiple of the '\n\u001b[0;32m--> 260\u001b[0;31m 'dtypes given ({1}).'.format(first_size, block_size))\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypes\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfirst_size\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mblock_size\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: Size obtained (4) is not a multiple of the dtypes given (8)." ] } ], @@ -57,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -75,33 +87,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "swiftdiff['px'].plot.line(x=\"time (y)\")" ] diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index caf1c0e39..ceab9a74f 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -466,8 +466,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) diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 2ddb03500..ce9f66761 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -10,7 +10,7 @@ contains - module subroutine drift_body(self, system, param, dt) + module subroutine drift_body(self, system, param, dt, mask) !! author: David A. Minton !! !! Loop bodies and call Danby drift routine on the heliocentric position and velocities. @@ -23,6 +23,7 @@ module subroutine drift_body(self, system, param, dt) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation @@ -35,16 +36,16 @@ module subroutine drift_body(self, system, param, dt) iflag(:) = 0 allocate(dtp(n)) if (param%lgr) then - do i = 1, n + do concurrent(i = 1:n, mask(i)) rmag = norm2(self%xh(:, i)) vmag2 = dot_product(self%vh(:, i), self%vh(:, i)) energy = 0.5_DP * vmag2 - self%mu(i) / rmag dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) end do else - dtp(:) = dt + where(mask(1:n)) dtp(1:n) = dt end if - do concurrent(i = 1:n, self%status(i) == ACTIVE) + do concurrent(i = 1:n, mask(i)) call drift_one(self%mu(i), self%xh(1,i), self%xh(2,i), self%xh(3,i), & self%vh(1,i), self%vh(2,i), self%vh(3,i), & dtp(i), iflag(i)) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 3f64905b0..7ae65feab 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -1,7 +1,7 @@ submodule (helio_classes) s_helio_drift use swiftest contains - module subroutine helio_drift_pl(self, system, param, dt) + module subroutine helio_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! @@ -13,9 +13,10 @@ module subroutine helio_drift_pl(self, system, param, dt) implicit none ! Arguments class(helio_pl), intent(inout) :: self !! Helio massive body object - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: dt !! Stepsize) + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i !! Loop counter real(DP) :: rmag, vmag2, energy @@ -29,33 +30,39 @@ module subroutine helio_drift_pl(self, system, param, dt) iflag(:) = 0 allocate(dtp(npl)) allocate(mu(npl)) - mu = cb%Gmass + mu(:) = cb%Gmass if (param%lgr) then - do i = 1,npl - rmag = norm2(pl%xh(:, i)) - vmag2 = dot_product(pl%vb(:, i), pl%vb(:, i)) - energy = 0.5_DP * vmag2 - pl%mu(i) / rmag + do concurrent(i = 1:npl, mask(i)) + rmag = norm2(pl%xb(:, i)) + vmag2 = dot_product(pl%vb(:, i), pl%vb(:, i)) + energy = 0.5_DP * vmag2 - mu(i) / rmag dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) end do else - dtp(:) = dt + where(mask(1:npl)) dtp(1:npl) = dt end if - call drift_one(mu(1:npl), pl%xh(1,1:npl), pl%xh(2,1:npl), pl%xh(3,1:npl), & - pl%vb(1,1:npl), pl%vb(2,1:npl), pl%vb(3,1:npl), & - dtp(1:npl), iflag(1:npl)) + do concurrent(i = 1:npl, mask(i)) + call drift_one(mu(i), pl%xb(1,i), pl%xb(2,i), pl%xb(3,i), & + pl%vb(1,i), pl%vb(2,i), pl%vb(3,i), & + dtp(i), iflag(i)) + end do if (any(iflag(1:npl) /= 0)) then do i = 1, npl - write(*, *) " Planet ", pl%id(i), " is lost!!!!!!!!!!" - write(*, *) pl%xh(:,i) - write(*, *) pl%vb(:,i) - write(*, *) " stopping " - call util_exit(FAILURE) + if (iflag(i) /= 0) then + write(*, *) " Planet ", self%id(i), " is lost!!!!!!!!!!" + write(*, *) pl%xb(:,i) + write(*, *) pl%vb(:,i) + write(*, *) " stopping " + call util_exit(FAILURE) + end if end do end if end associate + return + end subroutine helio_drift_pl module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) @@ -93,57 +100,6 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) return end subroutine helio_drift_linear_pl - module subroutine helio_drift_tp(self, system, param, dt) - !! author: David A. Minton - !! - !! Loop through test particles and call Danby drift routine - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_drift_tp.f90 - !! Adapted from Hal Levison's Swift routine drift_tp.f - implicit none - ! Arguments - class(helio_tp), intent(inout) :: self !! Helio test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: dt !! Stepsize - ! Internals - integer(I4B) :: i !! Loop counter - real(DP) :: rmag, vmag2, energy - real(DP), dimension(:), allocatable :: dtp, mu - integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag - - associate(tp => self, ntp => self%nbody, cb => system%cb) - if (ntp == 0) return - allocate(iflag(ntp)) - allocate(dtp(ntp)) - iflag(:) = 0 - allocate(mu(ntp)) - mu = cb%Gmass - - if (param%lgr) then - do i = 1,ntp - rmag = norm2(tp%xh(:, i)) - vmag2 = dot_product(tp%vh(:, i), tp%vh(:, i)) - energy = 0.5_DP * vmag2 - tp%mu(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - dtp(:) = dt - end if - call drift_one(mu(1:ntp), tp%xh(1,1:ntp), tp%xh(2,1:ntp), tp%xh(3,1:ntp), & - tp%vb(1,1:ntp), tp%vb(2,1:ntp), tp%vb(3,1:ntp), & - dtp(1:ntp), iflag(1:ntp)) - if (any(iflag(1:ntp) /= 0)) then - tp%status = DISCARDED_DRIFTERR - do i = 1, ntp - if (iflag(i) /= 0) write(*, *) "Particle ", tp%id(i), " lost due to error in Danby drift" - end do - end if - end associate - - return - end subroutine helio_drift_tp - module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) !! author: David A. Minton !! diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index d37b21bbb..511ffacb6 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -53,7 +53,7 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%accel(system, param, t) call pl%kick(dth) call pl%set_beg_end(xbeg = pl%xh) - call pl%drift(system, param, dt) + call pl%drift(system, param, dt, pl%status(:) == ACTIVE) call pl%set_beg_end(xend = pl%xh) call pl%accel(system, param, t + dt) call pl%kick(dth) @@ -97,7 +97,7 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%lindrift(cb, dth, lbeg=.true.) call tp%accel(system, param, t, lbeg=.true.) call tp%kick(dth) - call tp%drift(system, param, dt) + call tp%drift(system, param, dt, tp%status(:) == ACTIVE) call tp%accel(system, param, t + dt, lbeg=.false.) call tp%kick(dth) call tp%lindrift(cb, dth, lbeg=.false.) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 8d23d2f8c..ae0de83a7 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -52,7 +52,6 @@ module helio_classes contains procedure, public :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) - procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun procedure, public :: accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities @@ -86,24 +85,16 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body end subroutine helio_coord_vh2vb_tp - module subroutine helio_drift_pl(self, system, param, dt) + module subroutine helio_drift_pl(self, system, param, dt, mask) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_pl - module subroutine helio_drift_tp(self, system, param, dt) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(helio_tp), intent(inout) :: self !! Helio test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: dt !! Stepsize - end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index e924d2546..d07f39f5a 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -384,12 +384,13 @@ module subroutine discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine discard_tp - module subroutine drift_body(self, system, param, dt) + module subroutine drift_body(self, system, param, dt, mask) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine drift_body module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 21811cf38..a1f501a10 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -96,13 +96,14 @@ module subroutine whm_coord_vh2vj_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body particle data structuree end subroutine whm_coord_vh2vj_pl - module subroutine whm_drift_pl(self, system, param, dt) + module subroutine whm_drift_pl(self, system, param, dt, mask) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine whm_drift_pl module subroutine whm_fill_pl(self, inserts, lfill_list) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index bfd36b7f5..43d11125c 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -73,8 +73,8 @@ module subroutine symba_step_interp_system(self, param, t, dt) call tp%kick(dth) system%irec = -1 - call pl%drift(system, param, dt) - call tp%drift(system, param, dt) + call pl%drift(system, param, dt, pl%status(:) == ACTIVE) + call tp%drift(system, param, dt, tp%status(:) == ACTIVE) system%irec = 0 call system%recursive_step(param, t, dt) diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index ed72cd7f3..12d8494a8 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -1,7 +1,7 @@ submodule(whm_classes) whm_drift use swiftest contains - module subroutine whm_drift_pl(self, system, param, dt) + module subroutine whm_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! !! Loop through planets and call Danby drift routine @@ -14,6 +14,7 @@ module subroutine whm_drift_pl(self, system, param, dt) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift ! Internals integer(I4B) :: i real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation @@ -21,7 +22,6 @@ module subroutine whm_drift_pl(self, system, param, dt) real(DP), dimension(:), allocatable :: dtp associate(pl => self, npl => self%nbody) - if (npl == 0) return allocate(iflag(npl)) @@ -29,19 +29,21 @@ module subroutine whm_drift_pl(self, system, param, dt) allocate(dtp(npl)) if (param%lgr) then - do i = 1,npl + do concurrent(i = 1:npl, mask(i)) rmag = norm2(pl%xj(:, i)) vmag2 = dot_product(pl%vj(:, i), pl%vj(:, i)) energy = 0.5_DP * vmag2 - pl%muj(i) / rmag dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) end do else - dtp(:) = dt + where(mask(1:npl)) dtp(1:npl) = dt end if - call drift_one(pl%muj(1:npl), pl%xj(1,1:npl), pl%xj(2,1:npl), pl%xj(3,1:npl), & - pl%vj(1,1:npl), pl%vj(2,1:npl), pl%vj(3,1:npl), & - dtp(1:npl), iflag(1:npl)) + do concurrent(i = 1:npl, mask(i)) + call drift_one(pl%muj(i), pl%xj(1,i), pl%xj(2,i), pl%xj(3,i), & + pl%vj(1,i), pl%vj(2,i), pl%vj(3,i), & + dtp(i), iflag(i)) + end do if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /= 0) then diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 9296a179c..64415f15d 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -56,7 +56,7 @@ module subroutine whm_step_pl(self, system, param, t, dt) call pl%kick(dth) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) - call pl%drift(system, param, dt) + call pl%drift(system, param, dt, pl%status(:) == ACTIVE) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) call pl%accel(system, param, t + dt) @@ -95,7 +95,7 @@ module subroutine whm_step_tp(self, system, param, t, dt) end if call tp%kick(dth) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%drift(system, param, dt) + call tp%drift(system, param, dt, tp%status(:) == ACTIVE) if (param%lgr) call tp%gr_pos_kick(param, dth) call tp%accel(system, param, t + dt, lbeg=.false.) call tp%kick(dth) From e7ecc65a470d0d01401ff99dadb39e2aeaba00c3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 15:23:47 -0400 Subject: [PATCH 024/194] Updated examples --- .../swiftest_vs_swifter.ipynb | 54 +++++++++++-------- examples/whm_gr_test/init_cond.py | 2 +- examples/whm_gr_test/param.swifter.in | 2 +- examples/whm_gr_test/param.swiftest.in | 2 +- examples/whm_gr_test/pl.swifter.in | 48 ++++++++--------- examples/whm_gr_test/pl.swiftest.in | 32 +++++------ .../whm_gr_test/swiftest_relativity.ipynb | 39 ++++++++------ 7 files changed, 99 insertions(+), 80 deletions(-) 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 4c9361b73..98b32fc30 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 @@ -42,23 +42,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Reading Swiftest file param.swiftest.in\n" - ] - }, - { - "ename": "ValueError", - "evalue": "Size obtained (4) is not a multiple of the dtypes given (8).", - "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 134\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 135\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--> 136\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 137\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 138\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 600\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 601\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--> 602\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 603\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 604\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 469\u001b[0m \u001b[0;31m#cbid = f.read_ints()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 470\u001b[0m \u001b[0mcbid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\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--> 471\u001b[0;31m \u001b[0mMcb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\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 472\u001b[0m \u001b[0mRcb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 473\u001b[0m \u001b[0mJ2cb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_reals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/scipy/io/_fortran.py\u001b[0m in \u001b[0;36mread_reals\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 337\u001b[0m \"\"\"\n\u001b[0;32m--> 338\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_record\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\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 339\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\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[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/scipy/io/_fortran.py\u001b[0m in \u001b[0;36mread_record\u001b[0;34m(self, *dtypes, **kwargs)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mremainder\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 259\u001b[0m raise ValueError('Size obtained ({0}) is not a multiple of the '\n\u001b[0;32m--> 260\u001b[0;31m 'dtypes given ({1}).'.format(first_size, block_size))\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypes\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfirst_size\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mblock_size\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: Size obtained (4) is not a multiple of the dtypes given (8)." + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.506e-01\n", + "Creating Dataset\n", + "Successfully converted 221 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" ] } ], @@ -69,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -78,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -87,9 +75,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAEGCAYAAABGnrPVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAWKklEQVR4nO3dfbBV9X3v8fe3gFIrPosePFhoQAuoMeRcJA9jGgkdJCkksU0lacTE1DHGJK3Xm0tvpjftH02YSXOvSaVxUONgmlsm1yQ+ZFBL1Ew6phhRo4iEQH3i4KkSEo1er4/53j/2lrs5bGBz9m/vtZH3a2YPe631/a31PZuzzuestfZZOzITSZJK+a2qG5AkvbEYLJKkogwWSVJRBoskqSiDRZJU1OiqG+imY445JidNmlR1G5K0X7n33nt/kZnHtlp/QAXLpEmTWLt2bdVtSNJ+JSIe35d6T4VJkooyWCRJRRkskqSiDqhrLJK0J6+88gqDg4O8+OKLVbdSibFjx9Lf38+YMWPaWo/BIkl1g4ODjBs3jkmTJhERVbfTVZnJ9u3bGRwcZPLkyW2ty1NhklT34osvcvTRRx9woQIQERx99NFFjtYMFklqcCCGyutKfe0GiySpKINFkir09re/ven8888/n+uvv77L3ZRhsEhShX784x9X3UJxvitMkip06KGH8vzzz5OZfPrTn+aOO+5g8uTJ7M+f7usRiyT1gO9973ts3LiRdevWcdVVV+3XRzIGiyT1gB/96EcsWrSIUaNGMWHCBM4666yqWxoxg0WSesQb5a3OBosk9YAzzzyTlStX8tprrzE0NMSdd95ZdUsj5sV7SeoBH/jAB7jjjjs49dRTOemkk3jXu95VdUsjZrBIUoWef/55oHYa7Iorrqi4mzI8FSZJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiyT1kC1btvDud7+badOmMWPGDL761a/uUpOZfOYzn2HKlCmcdtpp3HfffRV0unv+HYsk9ZDRo0fzla98hZkzZ/Lcc8/x1re+lblz5zJ9+vQdNbfccgubNm1i06ZN3H333Xzyk5/k7rvvrrDrnVV6xBIR8yJiY0RsjoglTZZHRHytvvzBiJg5bPmoiLg/Ir7fva4lqXP6+vqYObP2o27cuHFMmzaNrVu37lRz4403ct555xERzJ49m2eeeYahoaEq2m2qsiOWiBgFLAPmAoPAPRFxU2Y+3FB2NjC1/jgD+Hr939d9FtgAHNaVpiUdMP725vU8/OSvi65z+oTD+MIfzWi5/rHHHuP+++/njDPO2Gn+1q1bmThx4o7p/v5+tm7dSl9fX7Fe21HlEcssYHNmPpKZLwMrgYXDahYC12XNGuCIiOgDiIh+4L3A1d1sWpK64fnnn+ecc87h8ssv57DDdv7dudmHgPXSnZGrvMZyArClYXqQnY9GdldzAjAEXA58Dhi3p41ExIXAhQAnnnhiWw1LOnDsy5FFaa+88grnnHMOH/nIR/jgBz+4y/L+/n62bPn/PxoHBweZMGFCN1vcoyqPWJrF6/AYbloTEe8Dns7Me/e2kcxcnpkDmTlw7LHHjqRPSeqazOSCCy5g2rRpXHrppU1rFixYwHXXXUdmsmbNGg4//PCeOQ0G1R6xDAITG6b7gSdbrPljYEFEzAfGAodFxD9l5p91sF9J6ri77rqLb37zm5x66qmcfvrpAHzxi1/kiSeeAOCiiy5i/vz5rFq1iilTpnDIIYdw7bXXVtjxrqoMlnuAqRExGdgKnAt8eFjNTcAlEbGS2mmyZzNzCPir+oOI+APgMkNF0hvBO9/5zqbXUBpFBMuWLetSR/uusmDJzFcj4hLgNmAU8I3MXB8RF9WXXwmsAuYDm4EXgI9V1a8kqTWV/oFkZq6iFh6N865seJ7Ap/ayjh8CP+xAe5KkEfCWLpKkogwWSVJRBoskqSiDRZJUlMEiST3k4x//OOPHj+eUU07ZMe+Xv/wlc+fOZerUqcydO5df/epXO5Z96UtfYsqUKZx88sncdtttTde5p/GdYLBIUg85//zzufXWW3eat3TpUubMmcOmTZuYM2cOS5cuBeDhhx9m5cqVrF+/nltvvZWLL76Y1157bZd17m58pxgsktRDzjzzTI466qid5t14440sXrwYgMWLF3PDDTfsmH/uuedy8MEHM3nyZKZMmcJPfvKTXda5u/Gd4gd9SVIztyyB/1hXdp3Hnwpn7/vRwlNPPbXjXmB9fX08/fTTQO32+bNnz95R9/rt81sd3ykesUjSfqpXb5/vEYskNTOCI4tOOe644xgaGqKvr4+hoSHGjx8PtH77/N2N7xSPWCSpxy1YsIAVK1YAsGLFChYuXLhj/sqVK3nppZd49NFH2bRpE7NmzWp5fKcYLJLUQxYtWsTb3vY2Nm7cSH9/P9dccw1Llixh9erVTJ06ldWrV7NkyRIAZsyYwYc+9CGmT5/OvHnzWLZsGaNGjQLgE5/4BGvXrgXY7fhOib3dnvmNZGBgIF9/oSVpuA0bNjBt2rSq26hUs9cgIu7NzIFW1+ERiySpKINFklSUwSJJDQ6kywPDlfraDRZJqhs7dizbt28/IMMlM9m+fTtjx45te13+HYsk1fX39zM4OMi2bduqbqUSY8eOpb+/v+31GCySVDdmzBgmT55cdRv7PU+FSZKKMlgkSUUZLJKkogwWSVJRBoskqSiDRZJUlMEiSSrKYJEkFWWwSJKKMlgkSUUZLJKkoioNloiYFxEbI2JzROzyWZlR87X68gcjYmZ9/sSIuDMiNkTE+oj4bPe7lyQ1U1mwRMQoYBlwNjAdWBQR04eVnQ1MrT8uBL5en/8q8J8zcxowG/hUk7GSpApUecQyC9icmY9k5svASmDhsJqFwHVZswY4IiL6MnMoM+8DyMzngA3ACd1sXpLUXJXBcgKwpWF6kF3DYa81ETEJeAtwd/kWJUn7qspgiSbzhn9s2x5rIuJQ4DvAX2Tmr5tuJOLCiFgbEWsP1A/vkaRuqjJYBoGJDdP9wJOt1kTEGGqh8q3M/O7uNpKZyzNzIDMHjj322CKNS5J2r8pguQeYGhGTI+Ig4FzgpmE1NwHn1d8dNht4NjOHIiKAa4ANmfk/utu2JGlPKvto4sx8NSIuAW4DRgHfyMz1EXFRffmVwCpgPrAZeAH4WH34O4CPAusi4qf1ef8tM1d18UuQJDURmcMva7xxDQwM5Nq1a6tuQ5L2KxFxb2YOtFrvX95LkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKqqlYImIC4ZNj4qIL7S78YiYFxEbI2JzRCxpsjwi4mv15Q9GxMxWx0qSqtHqEcuciFgVEX0RcQqwBhjXzoYjYhSwDDgbmA4siojpw8rOBqbWHxcCX9+HsZKkCoxupSgzPxwRfwqsA14AFmXmXW1uexawOTMfAYiIlcBC4OGGmoXAdZmZwJqIOCIi+oBJLYwtZs0//jnjntnQiVVLUkc9PvpNrDj8IqZPOIwv/NGMrmyz1VNhU4HPAt8BHgM+GhGHtLntE4AtDdOD9Xmt1LQyFoCIuDAi1kbE2m3btrXZsiRpb1o6YgFuBj6VmbdHRAB/CdwDtBN/0WRetljTytjazMzlwHKAgYGBpjV7M/viq0YyTJIqNwOY3+VttnqNZRbw5oj4LnA9tR/i57a57UFgYsN0P/BkizWtjJUkVaDVYLmaWvD9A3AFMA346za3fQ8wNSImR8RB1ILqpmE1NwHn1d8dNht4NjOHWhwrSapAq6fCTs7MNzdM3xkRD7Sz4cx8NSIuAW4DRgHfyMz1EXFRffmVwCpqR3Gbqb1p4GN7GttOP5KkMloNlvsjYnZmrgGIiDOAdt8VRmauohYejfOubHiewKdaHStJql6rwXIGtVNST9SnTwQ2RMQ6aj//T+tId5Kk/U6rwTKvo11Ikt4wWv0Dycc73Ygk6Y3Bm1BKkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiKgmWiDgqIlZHxKb6v0fupm5eRGyMiM0RsaRh/pcj4mcR8WBEfC8ijuha85KkParqiGUJcHtmTgVur0/vJCJGAcuAs4HpwKKImF5fvBo4JTNPA34O/FVXupYk7VVVwbIQWFF/vgJ4f5OaWcDmzHwkM18GVtbHkZn/kpmv1uvWAP2dbVeS1KqqguW4zBwCqP87vknNCcCWhunB+rzhPg7cUrxDSdKIjO7UiiPiB8DxTRZ9vtVVNJmXw7bxeeBV4Ft76ONC4EKAE088scVNS5JGqmPBkpnv2d2yiHgqIvoycygi+oCnm5QNAhMbpvuBJxvWsRh4HzAnM5PdyMzlwHKAgYGB3dZJksqo6lTYTcDi+vPFwI1Nau4BpkbE5Ig4CDi3Po6ImAf8V2BBZr7QhX4lSS2qKliWAnMjYhMwtz5NREyIiFUA9YvzlwC3ARuAb2fm+vr4K4BxwOqI+GlEXNntL0CS1FzHToXtSWZuB+Y0mf8kML9hehWwqkndlI42KEkaMf/yXpJUlMEiSSrKYJEkFWWwSJKKMlgkSUUZLJKkogwWSVJRBoskqSiDRZJUlMEiSSrKYJEkFWWwSJKKMlgkSUUZLJKkogwWSVJRBoskqSiDRZJUlMEiSSrKYJEkFWWwSJKKMlgkSUUZLJKkogwWSVJRBoskqSiDRZJUlMEiSSrKYJEkFWWwSJKKMlgkSUUZLJKkogwWSVJRlQRLRBwVEasjYlP93yN3UzcvIjZGxOaIWNJk+WURkRFxTOe7liS1oqojliXA7Zk5Fbi9Pr2TiBgFLAPOBqYDiyJiesPyicBc4ImudCxJaklVwbIQWFF/vgJ4f5OaWcDmzHwkM18GVtbHve5/Ap8DsoN9SpL2UVXBclxmDgHU/x3fpOYEYEvD9GB9HhGxANiamQ/sbUMRcWFErI2Itdu2bWu/c0nSHo3u1Ioj4gfA8U0Wfb7VVTSZlxFxSH0df9jKSjJzObAcYGBgwKMbSeqwjgVLZr5nd8si4qmI6MvMoYjoA55uUjYITGyY7geeBN4ETAYeiIjX598XEbMy8z+KfQGSpBGp6lTYTcDi+vPFwI1Nau4BpkbE5Ig4CDgXuCkz12Xm+MyclJmTqAXQTENFknpDVcGyFJgbEZuovbNrKUBETIiIVQCZ+SpwCXAbsAH4dmaur6hfSVKLOnYqbE8yczswp8n8J4H5DdOrgFV7Wdek0v1JkkbOv7yXJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqKjKz6h66JiK2AY+PcPgxwC8KttMN9twd9twd9twdzXr+3cw8ttUVHFDB0o6IWJuZA1X3sS/suTvsuTvsuTtK9OypMElSUQaLJKkog6V1y6tuYATsuTvsuTvsuTva7tlrLJKkojxikSQVZbBIkooyWICImBcRGyNic0QsabI8IuJr9eUPRsTMVsf2Ws8RMTEi7oyIDRGxPiI+28v9NiwfFRH3R8T3u9Fvuz1HxBERcX1E/Kz+Wr9tP+j5L+vfEw9FxD9HxNge6fn3I+LfIuKliLhsX8b2Ws9V7X/t9NywvPV9MDMP6AcwCvh34PeAg4AHgOnDauYDtwABzAbubnVsD/bcB8ysPx8H/LzTPbfTb8PyS4H/BXy/178v6stWAJ+oPz8IOKKXewZOAB4Ffrs+/W3g/B7peTzwn4C/Ay7bl7E92HPX9792e25Y3vI+6BELzAI2Z+YjmfkysBJYOKxmIXBd1qwBjoiIvhbH9lTPmTmUmfcBZOZzwAZqP1R6sl+AiOgH3gtc3eE+i/QcEYcBZwLXAGTmy5n5TC/3XF82GvjtiBgNHAI82Qs9Z+bTmXkP8Mq+ju21niva/9rqGfZ9HzRYav+pWxqmB9n1P3p3Na2M7YR2et4hIiYBbwHuLt/ivvWyl5rLgc8Bv+lQf8200/PvAduAa+unDq6OiN/pZLN76WevNZm5Ffh74AlgCHg2M/+lg73usZ8ujG1Hke12cf+D9nu+nH3YBw2W2imB4Ya/B3t3Na2M7YR2eq4tjDgU+A7wF5n564K9NTPifiPifcDTmXlv+bb2qJ3XeDQwE/h6Zr4F+D9AN87/t/M6H0ntN9jJwATgdyLizwr310w7+1Av7397XkF39z9oo+eR7IMGSy25JzZM97PrKYDd1bQythPa6ZmIGEPtm/pbmfndDva5115aqHkHsCAiHqN2+H5WRPxT51rdaz+t1AwCg5n5+m+i11MLmk5rp+f3AI9m5rbMfAX4LvD2Dva6t346PbYdbW23gv0P2ut53/fBTl806vUHtd8uH6H2m9rrF7VmDKt5Lztf8PxJq2N7sOcArgMu3x9e42E1f0D3Lt631TPwr8DJ9ed/A3y5l3sGzgDWU7u2EtTefPDpXui5ofZv2PlCeM/uf3vouev7X7s9D1vW0j7YtS+slx/U3inzc2rvmvh8fd5FwEUN3wzL6svXAQN7GtvLPQPvpHYI/CDw0/pjfq/2O2wdLX1T90LPwOnA2vrrfANw5H7Q898CPwMeAr4JHNwjPR9P7TfuXwPP1J8ftruxvdxzVftfu69zwzpa2ge9pYskqSivsUiSijJYJElFGSySpKIMFklSUQaLJKkog0UaofodjC9umJ4QEdd3aFvvj4j/vpeav4+IszqxfWlf+HZjaYTq93r6fmae0oVt/RhYkJm/2EPN7wJXZeYfdrofaU88YpFGbinwpoj4aUR8OSImRcRDABFxfkTcEBE3R8SjEXFJRFxavynlmog4ql73poi4NSLujYh/jYjfH76RiDgJeCkzfxER4+rrG1NfdlhEPBYRYzLzceDoiDi+i6+BtAuDRRq5JcC/Z+bpmflfmiw/BfgwtVuW/x3wQtZuSvlvwHn1muXUbp3yVuAy4B+brOcdQOOt1n9I7dYsAOcC38na/b2o172jza9LasvoqhuQ3sDurAfBcxHxLHBzff464LT6HW7fDvzviB03nz24yXr6qN2G/3VXU7uF+Q3Ax4A/b1j2NLW7E0uVMVikznmp4flvGqZ/Q23f+y3gmcw8fS/r+b/A4a9PZOZd9dNu7wJGZeZDDbVj6/VSZTwVJo3cc9Q+XnZEsvY5HI9GxJ/Ajs+jf3OT0g3AlGHzrgP+Gbh22PyTqN1EUqqMwSKNUGZuB+6KiIci4ssjXM1HgAsi4gFqt61v9tG6PwLeEg3ny4BvAUdSCxdgx+d8TKF2V2WpMr7dWNoPRMRXgZsz8wf16T8GFmbmRxtqPgDMzMy/rqhNCfAai7S/+CK1D+MiIv4BOJva52s0Gg18pct9SbvwiEWSVJTXWCRJRRkskqSiDBZJUlEGiySpKINFklTU/wPoW2iXk/7T8QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "swiftdiff['px'].plot.line(x=\"time (y)\")" ] diff --git a/examples/whm_gr_test/init_cond.py b/examples/whm_gr_test/init_cond.py index 57b0fb534..8d197c6f4 100755 --- a/examples/whm_gr_test/init_cond.py +++ b/examples/whm_gr_test/init_cond.py @@ -13,7 +13,7 @@ sim.param['DU2M'] = swiftest.AU2M sim.param['T0'] = 0.0 sim.param['DT'] = 0.25 * swiftest.JD2S / swiftest.YR2S -sim.param['TSTOP'] = 100.0 +sim.param['TSTOP'] = 1000.0 sim.param['ISTEP_OUT'] = 1461 sim.param['ISTEP_DUMP'] = 1461 sim.param['CHK_QMIN_COORD'] = "HELIO" diff --git a/examples/whm_gr_test/param.swifter.in b/examples/whm_gr_test/param.swifter.in index 6addd694c..789250f41 100644 --- a/examples/whm_gr_test/param.swifter.in +++ b/examples/whm_gr_test/param.swifter.in @@ -1,6 +1,6 @@ ! VERSION Swifter parameter file converted from Swiftest T0 0.0 -TSTOP 100.0 +TSTOP 1000.0 DT 0.0006844626967830253 ISTEP_OUT 1461 ISTEP_DUMP 1461 diff --git a/examples/whm_gr_test/param.swiftest.in b/examples/whm_gr_test/param.swiftest.in index c9b7462f0..ace6f3cad 100644 --- a/examples/whm_gr_test/param.swiftest.in +++ b/examples/whm_gr_test/param.swiftest.in @@ -1,6 +1,6 @@ ! VERSION Swiftest parameter input T0 0.0 -TSTOP 100.0 +TSTOP 1000.0 DT 0.0006844626967830253 ISTEP_OUT 1461 ISTEP_DUMP 1461 diff --git a/examples/whm_gr_test/pl.swifter.in b/examples/whm_gr_test/pl.swifter.in index e0ef4e881..782e57140 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.0014751243077781048702 +1 6.5537098095653139645e-06 0.0014751234419554511911 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 -2 9.663313399581537916e-05 0.006759104275397271956 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +2 9.663313399581537916e-05 0.00675908960945781479 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 -3 0.000120026935827952453094 0.010044787321379672528 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +3 0.000120026935827952453094 0.010044837538502923644 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 -4 1.2739802010675941456e-05 0.007246743835971885302 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +4 1.2739802010675941456e-05 0.0072467236860282326973 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 -5 0.037692251088985676735 0.35527126534549128905 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +5 0.037692251088985676735 0.35527094075555771578 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 -6 0.011285899820091272997 0.4376527512949726007 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +6 0.011285899820091272997 0.43765464106459166412 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 -7 0.0017236589478267730203 0.4695362423191493196 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +7 0.0017236589478267730203 0.46956055286931676728 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 -8 0.0020336100526728302319 0.7812870996943599397 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +8 0.0020336100526728302319 0.7813163071687303693 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/whm_gr_test/pl.swiftest.in b/examples/whm_gr_test/pl.swiftest.in index 9d49cc3da..10d425453 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.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 2 9.663313399581537916e-05 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 3 0.000120026935827952453094 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 4 1.2739802010675941456e-05 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 5 0.037692251088985676735 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 6 0.011285899820091272997 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 7 0.0017236589478267730203 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 8 0.0020336100526728302319 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/whm_gr_test/swiftest_relativity.ipynb b/examples/whm_gr_test/swiftest_relativity.ipynb index 0d8111fea..53c4e5453 100644 --- a/examples/whm_gr_test/swiftest_relativity.ipynb +++ b/examples/whm_gr_test/swiftest_relativity.ipynb @@ -22,9 +22,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 1.000e+02\n", + "Reading in time 1.000e+03\n", "Creating Dataset\n", - "Successfully converted 101 output frames.\n", + "Successfully converted 1001 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -45,9 +45,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.000e+02\n", + "Reading in time 1.000e+03\n", "Creating Dataset\n", - "Successfully converted 101 output frames.\n", + "Successfully converted 1001 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -70,12 +70,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "obj = Horizons(id='1', id_type='majorbody',location='@sun',\n", - " epochs={'start':'2021-01-28', 'stop':'2121-02-05',\n", + " epochs={'start':'2021-01-28', 'stop':'3021-02-05',\n", " 'step':'1y'})\n", "el = obj.elements()\n", "t = (el['datetime_jd']-el['datetime_jd'][0]) / 365.25\n", @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -114,17 +114,17 @@ "output_type": "stream", "text": [ "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", - "JPL Horizons : 573.8351991142854\n", - "Swifter GR : 579.5897815748845\n", - "Swiftest GR : 579.5897815748845\n", - "Obs - Swifter : -5.754582460598964\n", - "Obs - Swiftest : -5.754582460598964\n", - "Swiftest - Swifter: 0.0\n" + "JPL Horizons : 571.3210506300043\n", + "Swifter GR : 571.6183105524942\n", + "Swiftest GR : 571.6183105392645\n", + "Obs - Swifter : -0.2972599224899675\n", + "Obs - Swiftest : -0.29725990926022927\n", + "Swiftest - Swifter: -1.3229737305664457e-08\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -153,6 +153,13 @@ "print(f'Swiftest - Swifter: {np.mean(dvarpi_swiftest - dvarpi_swifter)}')" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, From b22433539be49c418cbb9d7202aa1b24605cacf6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 17:07:33 -0400 Subject: [PATCH 025/194] Added new setup classes for SyMBA data structures --- src/modules/helio_classes.f90 | 8 +-- src/modules/symba_classes.f90 | 24 +++++++- src/symba/symba_setup.f90 | 105 ++++++++++++++++++++++++++++------ src/symba/symba_step.f90 | 49 ++++++++++++++++ 4 files changed, 163 insertions(+), 23 deletions(-) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index ae0de83a7..ae2693167 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -156,10 +156,10 @@ end subroutine helio_step_pl module subroutine helio_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none - class(helio_nbody_system), intent(inout) :: self !! Helio nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize + class(helio_nbody_system), intent(inout) :: self !! Helio nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize end subroutine helio_step_system module subroutine helio_step_tp(self, system, param, t, dt) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 306153379..8b33960cb 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -116,6 +116,8 @@ module symba_classes integer(I4B), dimension(:), allocatable :: level !! encounter recursion level integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter + contains + procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays end type symba_pltpenc !******************************************************************************************************************************** @@ -127,6 +129,8 @@ module symba_classes real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter + contains + procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays end type symba_plplenc !******************************************************************************************************************************** @@ -145,7 +149,8 @@ module symba_classes procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current - !! recursion level, if applicable, and descend to the next deeper level if necessarye + !! recursion level, if applicable, and descend to the next deeper level if necessary + procedure, public :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system interface @@ -242,6 +247,18 @@ module subroutine symba_setup_pl(self,n) integer(I4B), intent(in) :: n !! Number of massive bodies to allocate end subroutine symba_setup_pl + module subroutine symba_setup_pltpenc(self,n) + implicit none + class(symba_pltpenc), intent(inout) :: self !! Symba pl-tp encounter structure + integer, intent(in) :: n !! Number of encounters to allocate space for + end subroutine symba_setup_pltpenc + + module subroutine symba_setup_plplenc(self,n) + implicit none + class(symba_plplenc), intent(inout) :: self !! Symba pl-tp encounter structure + integer, intent(in) :: n !! Number of encounters to allocate space for + end subroutine symba_setup_plplenc + module subroutine symba_setup_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none @@ -280,5 +297,10 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_recur_system + + module subroutine symba_step_reset_system(self) + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + end subroutine symba_step_reset_system end interface end module symba_classes \ No newline at end of file diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 6449013dd..5a56e1b79 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -12,14 +12,84 @@ module subroutine symba_setup_pl(self,n) class(symba_pl), intent(inout) :: self !! SyMBA test particle object integer(I4B), intent(in) :: n !! Number of massive bodies to allocate ! Internals - integer(I4B) :: i,j + integer(I4B) :: i !> Call allocation method for parent class - !call helio_setup_pl(self, n) call setup_pl(self, n) if (n <= 0) return + allocate(self%lcollision(n)) + allocate(self%lencounter(n)) + allocate(self%nplenc(n)) + allocate(self%ntpenc(n)) + allocate(self%levelg(n)) + allocate(self%levelm(n)) + allocate(self%isperi(n)) + allocate(self%peri(n)) + allocate(self%atp(n)) + allocate(self%kin(n)) + allocate(self%info(n)) + + self%lcollision(:) = .false. + self%lencounter(:) = .false. + self%nplenc(:) = 0 + self%ntpenc(:) = 0 + self%levelg(:) = -1 + self%levelm(:) = -1 + self%isperi(:) = 0 + self%peri(:) = 0.0_DP + self%atp(:) = 0.0_DP + self%kin(:)%nchild = 0 + self%kin(:)%parent = [(i, i=1, n)] + return + end subroutine symba_setup_pl + + module subroutine symba_setup_pltpenc(self,n) + !! author: David A. Minton + !! + !! A constructor that sets the number of encounters and allocates and initializes all arrays + !! + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! Symba pl-tp encounter structure + integer, intent(in) :: n !! Number of encounters to allocate space for + + self%nenc = n + if (n == 0) return + allocate(self%lvdotr(n)) + allocate(self%status(n)) + allocate(self%level(n)) + allocate(self%index1(n)) + allocate(self%index2(n)) + self%lvdotr(:) = .false. + self%status(:) = INACTIVE + self%level(:) = -1 + self%index1(:) = 0 + self%index2(:) = 0 + return + end subroutine symba_setup_pltpenc + + module subroutine symba_setup_plplenc(self,n) + !! author: David A. Minton + !! + !! A constructor that sets the number of encounters and allocates and initializes all arrays + ! + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! Symba pl-tp encounter structure + integer, intent(in) :: n !! Number of encounters to allocate space for + + call symba_setup_pltpenc(self, n) + if (n == 0) return + allocate(self%xh1(NDIM,n)) + allocate(self%xh2(NDIM,n)) + allocate(self%vb1(NDIM,n)) + allocate(self%vb2(NDIM,n)) + self%xh1(:,:) = 0.0_DP + self%xh2(:,:) = 0.0_DP + self%vb1(:,:) = 0.0_DP + self%vb2(:,:) = 0.0_DP return - end subroutine symba_setup_pl + end subroutine symba_setup_plplenc module subroutine symba_setup_system(self, param) !! author: David A. Minton @@ -34,20 +104,14 @@ module subroutine symba_setup_system(self, param) integer(I4B) :: i, j ! Call parent method - call whm_setup_system(self, param) - - select type(pl => self%pl) - class is(symba_pl) - select type(cb => self%cb) - class is (symba_cb) - select type (tp => self%tp) - class is (symba_tp) - - - end select - end select - end select - + associate(system => self) + call whm_setup_system(system, param) + call system%mergeadd_list%setup(1) + call system%mergesub_list%setup(1) + call system%pltpenc_list%setup(1) + call system%plplenc_list%setup(1) + end associate + return end subroutine symba_setup_system module subroutine symba_setup_tp(self,n) @@ -62,9 +126,14 @@ module subroutine symba_setup_tp(self,n) integer, intent(in) :: n !! Number of test particles to allocate !> Call allocation method for parent class - !call helio_setup_tp(self, n) call setup_tp(self, n) if (n <= 0) return + allocate(self%nplenc(n)) + allocate(self%levelg(n)) + allocate(self%levelm(n)) + self%nplenc(:) = 0 + self%levelg(:) = -1 + self%levelm(:) = -1 return end subroutine symba_setup_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 43d11125c..3ddde3377 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -54,6 +54,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) dth = 0.5_DP * dt associate(system => self) + call system%reset() select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -115,4 +116,52 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt) !associate() end subroutine symba_step_recur_system + module subroutine symba_step_reset_system(self) + !! author: David A. Minton + !! + !! Resets pl, tp,and encounter structures at the start of a new step + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + ! Internals + integer(I4B) :: i + + associate(system => self, pltpenc_list => self%pltpenc_list, plplenc_list => self%plplenc_list, mergeadd_list => self%mergeadd_list, mergesub_list => self%mergesub_list) + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + system%irec = -1 + pl%lcollision(:) = .false. + pl%kin(:)%parent = [(i, i=1, pl%nbody)] + pl%kin(:)%nchild = 0 + do i = 1, pl%nbody + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do + pl%nplenc(:) = 0 + pl%ntpenc(:) = 0 + pl%levelg(:) = 0 + pl%levelm(:) = 0 + pl%lencounter = .false. + pl%lcollision = .false. + + tp%nplenc(:) = 0 + tp%levelg(:) = 0 + tp%levelm(:) = 0 + + plplenc_list%nenc = 0 + pltpenc_list%nenc = 0 + + mergeadd_list%nbody = 0 + mergesub_list%nbody = 0 + end select + end select + end associate + + + end subroutine symba_step_reset_system + + + end submodule s_symba_step From 1ae0953bff97515ac98774fac7c5748768bc5e0c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 17:48:11 -0400 Subject: [PATCH 026/194] Began developing encounter checks for SyMBA --- src/modules/rmvs_classes.f90 | 6 +++++ src/modules/symba_classes.f90 | 11 ++++---- src/rmvs/rmvs_encounter_check.f90 | 2 +- src/symba/symba_step.f90 | 45 +++++++++++++++++++++---------- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index a523e8643..bf2a0cebd 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -98,6 +98,12 @@ module rmvs_classes end type rmvs_pl interface + module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) + implicit none + real(DP), intent(in) :: r2, v2, vdotr, dt, r2crit + logical :: lflag + end function rmvs_chk_ind + module subroutine rmvs_discard_tp(self, system, param) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 8b33960cb..9e3ae30e4 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -6,12 +6,13 @@ module symba_classes use swiftest_globals use swiftest_classes, only : swiftest_parameters, swiftest_base use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system + use rmvs_classes, only : rmvs_chk_ind implicit none !integer(I4B), parameter :: NENMAX = 32767 - !integer(I4B), parameter :: NTENC = 3 - !real(DP), parameter :: RHSCALE = 6.5_DP - !real(DP), parameter :: RSHELL = 0.48075_DP + integer(I4B), private, parameter :: NTENC = 3 + real(DP), private, parameter :: RHSCALE = 6.5_DP + real(DP), private, parameter :: RSHELL = 0.48075_DP character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file @@ -142,7 +143,6 @@ module symba_classes class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure - integer(I4B) :: irec !! Recursion level contains private procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps @@ -290,12 +290,13 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt) + module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + integer(I4B), value, intent(in) :: ireci !! input recursion level end subroutine symba_step_recur_system module subroutine symba_step_reset_system(self) diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index bead4c21b..64b5b59d9 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -46,7 +46,7 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) return end function rmvs_encounter_check_tp - elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) + module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) !! author: David A. Minton !! !! Determine whether a test particle and planet are having or will have an encounter within the next time step diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 3ddde3377..9830e3704 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -18,6 +18,7 @@ module subroutine symba_step_system(self, param, t, dt) ! Internals logical :: lencounter_pl, lencounter_tp, lencounter + call self%reset() select type(pl => self%pl) class is (symba_pl) select type(tp => self%tp) @@ -45,16 +46,16 @@ module subroutine symba_step_interp_system(self, param, t, dt) !! Adapted from Hal Levison's Swift routine symba5_step_interp.f implicit none ! Arguments - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize - ! Internals - real(DP) :: dth + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + ! Internals + real(DP) :: dth !! Half step size + integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) - call system%reset() select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -73,12 +74,10 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%kick(dth) call tp%kick(dth) - system%irec = -1 call pl%drift(system, param, dt, pl%status(:) == ACTIVE) call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - system%irec = 0 - - call system%recursive_step(param, t, dt) + irec = 0 + call system%recursive_step(param, t, dt, irec) call pl%set_beg_end(xend = pl%xh) call pl%accel(system, param, t + dt) @@ -98,7 +97,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) return end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt) + module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -112,8 +111,27 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + integer(I4B), value, intent(in) :: ireci !! input recursion level ! Internals - !associate() + integer(I4B) :: i, j, irecp, icflg, index_i, index_j, index_pl, index_tp + real(DP) :: dtl, dth,sgn + + associate(plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + dtl = param%dt / (NTENC**ireci) + dth = 0.5_DP * dtl + IF (dtl / param%dt < VSMALL) THEN + WRITE(*, *) "SWIFTEST Warning:" + WRITE(*, *) " In symba_step_recur_system, local time step is too small" + WRITE(*, *) " Roundoff error will be important!" + call util_exit(FAILURE) + END IF + irecp = ireci + 1 + if (ireci == 0) then + icflg = 0 + + end if + end associate + end subroutine symba_step_recur_system module subroutine symba_step_reset_system(self) @@ -132,7 +150,6 @@ module subroutine symba_step_reset_system(self) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - system%irec = -1 pl%lcollision(:) = .false. pl%kin(:)%parent = [(i, i=1, pl%nbody)] pl%kin(:)%nchild = 0 From 4c0dd0c7ec124a03b05db78fa5a2d5ddbe82a74c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 18:27:42 -0400 Subject: [PATCH 027/194] More work on encounters --- src/eucl/eucl.f90 | 20 ++++++++++---------- src/modules/symba_classes.f90 | 5 ++++- src/symba/symba_encounter_check.f90 | 25 +++++++++++++++++++++++-- src/symba/symba_setup.f90 | 8 ++++++++ src/symba/symba_step.f90 | 2 +- 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index 519a38d76..e17aadd4d 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -14,22 +14,22 @@ module subroutine eucl_dist_index_plpl(self) ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body objec ! Internals - integer(I4B) :: i, j, k, kp, p + integer(I8B) :: i, j, counter, npl - associate(npl => self%nbody, num_comparisons => self%num_comparisons, k_eucl => self%k_eucl) + npl = int(self%nbody, kind=I8B) + associate(num_comparisons => self%num_comparisons, k_eucl => self%k_eucl) num_comparisons = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column if (allocated(self%k_eucl)) deallocate(self%k_eucl) ! Reset the index array if it's been set previously if (allocated(self%irij3)) deallocate(self%irij3) allocate(self%k_eucl(2, num_comparisons)) allocate(self%irij3(num_comparisons)) - !do concurrent(k = 1:num_comparisons) !shared(num_comparisons, k_eucl, npl) local(kp, i, j, p) - do k = 1, num_comparisons - kp = npl * (npl - 1) / 2 - k - p = floor((sqrt(1._DP + 8 * kp) - 1._DP) / 2._DP) - i = k - (npl - 1) * (npl - 2) / 2 + p * (p + 1) / 2 + 1 - j = npl - 1 - p - k_eucl(1, k) = i - k_eucl(2, k) = j + do i = 1, npl + counter = (i - 1_I8B) * npl - i * (i - 1_I8B) / 2_I8B + 1_I8B + do j = i + 1_I8B, npl + self%k_eucl(1, counter) = i + self%k_eucl(2, counter) = j + counter = counter + 1_I8B + end do end do end associate return diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 9e3ae30e4..471019127 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -75,6 +75,8 @@ module symba_classes type, public, 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(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 @@ -170,12 +172,13 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_tp - module function symba_encounter_check_pl(self, system, dt) result(lencounter) + module function symba_encounter_check_pl(self, system, dt, irec) result(lencounter) implicit none class(symba_pl), intent(inout) :: self !! SyMBA test particle object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object real(DP), intent(in) :: dt !! step size logical :: lencounter !! Returns true if there is at least one close encounter + integer(I4B), intent(in) :: irec !! Current recursion level end function symba_encounter_check_pl module function symba_encounter_check_tp(self, system, dt) result(lencounter) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index ce4b53dff..c6151e788 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -1,16 +1,37 @@ submodule (symba_classes) s_symba_encounter_check use swiftest contains - module function symba_encounter_check_pl(self, system, dt) result(lencounter) + module function symba_encounter_check_pl(self, system, dt, irec) result(lencounter) implicit none ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA test particle object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level ! Result logical :: lencounter !! Returns true if there is at least one close encounter + ! Internals + integer(I4B) :: i, j + real(DP) :: r2, v2, vdotr + real(DP), dimension(NDIM) :: xr, vr + real(DP) :: rcrit, r2crit + logical :: lflag - lencounter = .false. + associate(pl => self, npl => self%nbody) + lencounter = .false. + do concurrent(j = 1:npl, pl%lminty(j)) + do i = 1, npl + rcrit = (pl%rhill(i) + pl%rhill(j)) * RHSCALE * (RSHELL**(irec)) + r2crit = r2crit**2 + xr(:) = pl%xh(:, j) - pl%xh(:, i) + vr(:) = pl%vh(:, j) - pl%vh(:, i) + v2 = dot_product(vr(:), vr(:)) + vdotr = dot_product(vr(:), xr(:)) + lflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) + if (lflag) lencounter = .true. + end do + end do + end associate return end function symba_encounter_check_pl diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 5a56e1b79..94921f767 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -110,6 +110,14 @@ module subroutine symba_setup_system(self, param) call system%mergesub_list%setup(1) call system%pltpenc_list%setup(1) call system%plplenc_list%setup(1) + select type(pl => system%pl) + class is (symba_pl) + select type(param) + class is (symba_parameters) + pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%nplm = count(pl%lmtiny(:)) + end select + end select end associate return end subroutine symba_setup_system diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 9830e3704..631c8c087 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -23,7 +23,7 @@ module subroutine symba_step_system(self, param, t, dt) class is (symba_pl) select type(tp => self%tp) class is (symba_tp) - lencounter = pl%encounter_check(self, dt) .or. tp%encounter_check(self, dt) + lencounter = pl%encounter_check(self, dt, 0) .or. tp%encounter_check(self, dt) if (lencounter) then call self%interp(param, t, dt) else From 2a2700f7c08222fa5463f1b9665052710f87ca09 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 20:43:51 -0400 Subject: [PATCH 028/194] Fixed typo --- src/symba/symba_encounter_check.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index c6151e788..fc38cce69 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -19,7 +19,7 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lencount associate(pl => self, npl => self%nbody) lencounter = .false. - do concurrent(j = 1:npl, pl%lminty(j)) + do concurrent(j = 1:npl, pl%lmtiny(j)) do i = 1, npl rcrit = (pl%rhill(i) + pl%rhill(j)) * RHSCALE * (RSHELL**(irec)) r2crit = r2crit**2 From 2107b343783edd2aaa68c7dc6a19a8b45b8f073c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 20:44:43 -0400 Subject: [PATCH 029/194] Flipped boolean to correct condition --- src/symba/symba_encounter_check.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index fc38cce69..4e71bf648 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -19,7 +19,7 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lencount associate(pl => self, npl => self%nbody) lencounter = .false. - do concurrent(j = 1:npl, pl%lmtiny(j)) + do concurrent(j = 1:npl, .not.pl%lmtiny(j)) do i = 1, npl rcrit = (pl%rhill(i) + pl%rhill(j)) * RHSCALE * (RSHELL**(irec)) r2crit = r2crit**2 From 95af4879534d78b60ffc94639b9a745737b114c8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 23:18:40 -0400 Subject: [PATCH 030/194] Moved initialize_system from io to setup where it belongs --- src/io/io.f90 | 20 ------------------ src/modules/swiftest_classes.f90 | 32 ++++++++++++++--------------- src/setup/setup.f90 | 23 ++++++++++++++++++++- src/symba/symba_encounter_check.f90 | 8 ++++---- src/whm/whm_setup.f90 | 2 +- 5 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e74255466..cf4772a8f 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -976,26 +976,6 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr - module subroutine io_read_initialize_system(self, param) - !! author: David A. Minton - !! - !! Wrapper method to initialize a basic Swiftest nbody system from files - !! - implicit none - ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - - call self%cb%initialize(param) - call self%pl%initialize(param) - if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) - call self%tp%initialize(param) - call self%set_msys() - call self%pl%set_mu(self%cb) - call self%tp%set_mu(self%cb) - - end subroutine io_read_initialize_system - module subroutine io_toupper(string) !! author: David A. Minton !! diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d07f39f5a..85986fec4 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -11,12 +11,12 @@ module swiftest_classes public :: eucl_dist_index_plpl, eucl_dist_index_pltp, eucl_irij3_plpl public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & - io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, io_read_initialize_system, & + io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system public :: kickvh_body public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt - public :: setup_body, setup_construct_system, setup_pl, setup_tp + public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp public :: tides_getacch_pl, tides_step_spin_system public :: user_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & @@ -288,14 +288,14 @@ module swiftest_classes procedure(abstract_step_system), public, deferred :: step ! Concrete classes that are common to the basic integrator (only test particles considered for discard) - procedure, public :: discard => discard_system !! Perform a discard step on the system - procedure, public :: dump => io_dump_system !! Dump the state of the system to a file - procedure, public :: initialize => io_read_initialize_system !! Initialize the system from an input file - procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file - procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file - procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file - procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. - procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. + procedure, public :: discard => discard_system !! Perform a discard step on the system + procedure, public :: dump => io_dump_system !! Dump the state of the system to a file + procedure, public :: initialize => setup_initialize_system !! Initialize the system from input files + procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file + procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file + procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. + procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system abstract interface @@ -565,12 +565,6 @@ module subroutine io_read_frame_system(self, iu, param, form, ierr) integer(I4B), intent(out) :: ierr !! Error code end subroutine io_read_frame_system - module subroutine io_read_initialize_system(self, param) - implicit none - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine io_read_initialize_system - module subroutine io_write_discard(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object @@ -680,6 +674,12 @@ module subroutine setup_construct_system(system, param) type(swiftest_parameters), intent(in) :: param !! Swiftest parameters end subroutine setup_construct_system + module subroutine setup_initialize_system(self, param) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + end subroutine setup_initialize_system + module subroutine setup_pl(self,n) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index dab78a875..0c89d613b 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -69,6 +69,28 @@ module subroutine setup_construct_system(system, param) return end subroutine setup_construct_system + + module subroutine setup_initialize_system(self, param) + !! author: David A. Minton + !! + !! Wrapper method to initialize a basic Swiftest nbody system from files + !! + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + + call self%cb%initialize(param) + call self%pl%initialize(param) + if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) + call self%tp%initialize(param) + call self%set_msys() + call self%pl%set_mu(self%cb) + call self%tp%set_mu(self%cb) + call self%pl%eucl_index() + return + end subroutine setup_initialize_system + module subroutine setup_body(self,n) !! author: David A. Minton !! @@ -83,7 +105,6 @@ module subroutine setup_body(self,n) if (n <= 0) return self%lfirst = .true. - !write(*,*) 'Allocating the basic Swiftest particle' allocate(self%id(n)) allocate(self%name(n)) allocate(self%status(n)) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 4e71bf648..633973dba 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -19,8 +19,8 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lencount associate(pl => self, npl => self%nbody) lencounter = .false. - do concurrent(j = 1:npl, .not.pl%lmtiny(j)) - do i = 1, npl + !do concurrent(j = 1:npl, .not.pl%lmtiny(j)) + ! do i = 1, npl rcrit = (pl%rhill(i) + pl%rhill(j)) * RHSCALE * (RSHELL**(irec)) r2crit = r2crit**2 xr(:) = pl%xh(:, j) - pl%xh(:, i) @@ -29,8 +29,8 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lencount vdotr = dot_product(vr(:), xr(:)) lflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) if (lflag) lencounter = .true. - end do - end do + ! end do + !end do end associate return end function symba_encounter_check_pl diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 50f0618bb..1f098df26 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -81,7 +81,7 @@ module subroutine whm_setup_system(self, param) class(whm_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - call io_read_initialize_system(self, param) + call setup_initialize_system(self, param) ! Make sure that the discard list gets allocated initially call self%tp_discards%setup(self%tp%nbody) call self%pl%set_mu(self%cb) From 05570b95619dd67e51ff33b433997c9b4af8af47 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 22 Jul 2021 23:23:45 -0400 Subject: [PATCH 031/194] Small changes to the plpl flattener --- src/eucl/eucl.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index e17aadd4d..306110635 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -17,7 +17,7 @@ module subroutine eucl_dist_index_plpl(self) integer(I8B) :: i, j, counter, npl npl = int(self%nbody, kind=I8B) - associate(num_comparisons => self%num_comparisons, k_eucl => self%k_eucl) + associate(num_comparisons => self%num_comparisons) num_comparisons = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column if (allocated(self%k_eucl)) deallocate(self%k_eucl) ! Reset the index array if it's been set previously if (allocated(self%irij3)) deallocate(self%irij3) From 4836fcbb45602611036a812c2480f07b3c9dd112 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 10:10:00 -0400 Subject: [PATCH 032/194] Refactored num_comparisons to more compact nplpl, and added nplplm for the SyMBA case with MTINY bodies --- src/eucl/eucl.f90 | 10 +++++----- src/modules/swiftest_classes.f90 | 2 +- src/modules/symba_classes.f90 | 1 + src/setup/setup.f90 | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index 306110635..09ff2eb63 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -17,12 +17,12 @@ module subroutine eucl_dist_index_plpl(self) integer(I8B) :: i, j, counter, npl npl = int(self%nbody, kind=I8B) - associate(num_comparisons => self%num_comparisons) - num_comparisons = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column + associate(nplpl => self%nplpl) + nplpl = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column if (allocated(self%k_eucl)) deallocate(self%k_eucl) ! Reset the index array if it's been set previously if (allocated(self%irij3)) deallocate(self%irij3) - allocate(self%k_eucl(2, num_comparisons)) - allocate(self%irij3(num_comparisons)) + allocate(self%k_eucl(2, nplpl)) + allocate(self%irij3(nplpl)) do i = 1, npl counter = (i - 1_I8B) * npl - i * (i - 1_I8B) / 2_I8B + 1_I8B do j = i + 1_I8B, npl @@ -61,7 +61,7 @@ module subroutine eucl_irij3_plpl(self) real(DP), dimension(NDIM) :: dx real(DP) :: rji2 - associate(k_eucl => self%k_eucl, xh => self%xh, irij3 => self%irij3, nk => self%num_comparisons) + associate(k_eucl => self%k_eucl, xh => self%xh, irij3 => self%irij3, nk => self%nplpl) do k = 1, nk i = k_eucl(1, k) j = k_eucl(2, k) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 85986fec4..c70d3159a 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -163,7 +163,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: capm !! Mean anomaly real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) integer(I4B), dimension(:,:), allocatable :: k_eucl !! Index array used to convert flattened the body-body comparison upper triangular matrix - integer(I8B) :: num_comparisons !! Number of body-body comparisons in the flattened upper triangular matrix + integer(I8B) :: nplpl !! Number of body-body comparisons in the flattened upper triangular matrix !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 471019127..d8fc75707 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -77,6 +77,7 @@ module symba_classes 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 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/setup/setup.f90 b/src/setup/setup.f90 index 0c89d613b..e85f9754a 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -183,7 +183,7 @@ module subroutine setup_pl(self,n) self%k2(:) = 0.0_DP self%Q(:) = 0.0_DP self%tlag(:) = 0.0_DP - self%num_comparisons = 0 + self%nplpl = 0 return end subroutine setup_pl From 7566551b62073b901d5b113fd231a1768f188579 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 10:12:35 -0400 Subject: [PATCH 033/194] Tidying up the formatting a bit --- src/modules/symba_classes.f90 | 83 +++++++++++++++++------------------ 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index d8fc75707..1388cfbf4 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -9,18 +9,18 @@ module symba_classes use rmvs_classes, only : rmvs_chk_ind implicit none - !integer(I4B), parameter :: NENMAX = 32767 - integer(I4B), private, parameter :: NTENC = 3 - real(DP), private, parameter :: RHSCALE = 6.5_DP - real(DP), private, parameter :: RSHELL = 0.48075_DP - character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' - integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file + integer(I4B), private, parameter :: NENMAX = 32767 + integer(I4B), private, parameter :: NTENC = 3 + real(DP), private, parameter :: RHSCALE = 6.5_DP + real(DP), private, parameter :: RSHELL = 0.48075_DP + character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' + integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file type, public, extends(swiftest_parameters) :: symba_parameters - character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file - real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating - integer(I4B), dimension(:), allocatable :: seed !! Random seeds - logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. + character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file + real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating + integer(I4B), dimension(:), allocatable :: seed !! Random seeds + logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. contains private procedure, public :: reader => symba_io_param_reader @@ -32,10 +32,10 @@ module symba_classes !******************************************************************************************************************************* !> SyMBA central body particle class type, public, 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 + real(DP) :: M0 = 0.0_DP !! Initial mass of the central body + real(DP) :: dM = 0.0_DP !! Change in mass of the central body + real(DP) :: R0 = 0.0_DP !! Initial radius of the central body + real(DP) :: dR = 0.0_DP !! Change in the radius of the central body contains private end type symba_cb @@ -73,20 +73,20 @@ module symba_classes !******************************************************************************************************************************* !> SyMBA massive body class type, public, 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 - 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 - integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step - integer(I4B), dimension(:), allocatable :: isperi !! perihelion passage flag - real(DP), dimension(:), allocatable :: peri !! perihelion distance - real(DP), dimension(:), allocatable :: atp !! semimajor axis following perihelion passage - type(symba_kinship), dimension(:), allocatable :: kin !! Array of merger relationship structures that can account for multiple pairwise mergers in a single step - type(symba_particle_info), dimension(:), allocatable :: info + 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 + 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 + integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step + integer(I4B), dimension(:), allocatable :: isperi !! perihelion passage flag + real(DP), dimension(:), allocatable :: peri !! perihelion distance + real(DP), dimension(:), allocatable :: atp !! semimajor axis following perihelion passage + type(symba_kinship), dimension(:), allocatable :: kin !! Array of merger relationship structures that can account for multiple pairwise mergers in a single step + type(symba_particle_info), dimension(:), allocatable :: info contains private procedure, public :: discard => symba_discard_pl !! Process massive body discards @@ -151,8 +151,7 @@ module symba_classes procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system - procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current - !! recursion level, if applicable, and descend to the next deeper level if necessary + procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary procedure, public :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system @@ -241,8 +240,8 @@ 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 + 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_pl(self,n) @@ -266,8 +265,8 @@ end subroutine symba_setup_plplenc module subroutine symba_setup_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + class(symba_nbody_system), intent(inout) :: self !! SyMBA system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_setup_system module subroutine symba_setup_tp(self,n) @@ -279,19 +278,19 @@ end subroutine symba_setup_tp module subroutine symba_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_system module subroutine symba_step_interp_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) From 5cb07aa57e5a37ab87132a84694b919c75ab415e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 10:13:07 -0400 Subject: [PATCH 034/194] Tidying up the formatting a bit --- src/modules/symba_classes.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 1388cfbf4..a25304a26 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -63,9 +63,9 @@ module symba_classes !******************************************************************************************************************************* !> Class definition for the kinship relationships used in bookkeeping multiple collisions bodies in a single time step. type symba_kinship - integer(I4B) :: parent ! Index of parent particle - integer(I4B) :: nchild ! number of children in merger list - integer(I4B), dimension(:), allocatable :: child ! Index of children particles + integer(I4B) :: parent !! Index of parent particle + integer(I4B) :: nchild !! number of children in merger list + integer(I4B), dimension(:), allocatable :: child !! Index of children particles end type symba_kinship !******************************************************************************************************************************** From e47a6f1566bdec10d51b6bebaebd2f00d972fdb9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 10:34:20 -0400 Subject: [PATCH 035/194] Converted the cross term in the WHM accelration to use the flattened array. Tests pass --- src/whm/whm_getacch.f90 | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index f393bd60e..0aa438a5e 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -187,17 +187,16 @@ pure subroutine whm_getacch_ah3(pl) implicit none class(whm_pl), intent(inout) :: pl - integer(I4B) :: i, j + integer(I4B) :: k real(DP) :: rji2, irij3, faci, facj real(DP), dimension(NDIM) :: dx real(DP), dimension(:,:), allocatable :: ah3 - associate(npl => pl%nbody) + associate(npl => pl%nbody, nplpl => pl%nplpl) allocate(ah3, mold=pl%ah) ah3(:, :) = 0.0_DP - - do i = 1, npl - 1 - do j = i + 1, npl + do k = 1, nplpl + associate(i => pl%k_eucl(1, k), j => pl%k_eucl(2, k)) dx(:) = pl%xh(:, j) - pl%xh(:, i) rji2 = dot_product(dx(:), dx(:)) irij3 = 1.0_DP / (rji2 * sqrt(rji2)) @@ -205,10 +204,10 @@ pure subroutine whm_getacch_ah3(pl) facj = pl%Gmass(j) * irij3 ah3(:, i) = ah3(:, i) + facj * dx(:) ah3(:, j) = ah3(:, j) - faci * dx(:) - end do + end associate end do - do i = 1, NDIM - pl%ah(i, 1:npl) = pl%ah(i, 1:npl) + ah3(i, 1:npl) + do concurrent (k = 1:npl) + pl%ah(:, k) = pl%ah(:, k) + ah3(:, k) end do deallocate(ah3) end associate From 8070dc52710e8426d55ee40339c719e8f6502179 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 11:18:54 -0400 Subject: [PATCH 036/194] Rearranging loops for efficiency --- src/obl/obl.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 8792f2399..f027908f9 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -57,8 +57,8 @@ module subroutine obl_acc_pl(self, system) cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl)) / cb%Gmass end do - do i = 1, NDIM - pl%ah(i, 1:npl) = pl%ah(i, 1:npl) + pl%aobl(i, 1:npl) - cb%aobl(i) + do i = 1, npl + pl%ah(:, i) = pl%ah(:, i) + pl%aobl(:, i) - cb%aobl(:) end do end associate @@ -89,8 +89,8 @@ module subroutine obl_acc_tp(self, system) aoblcb = cb%aoblend end if - do i = 1, NDIM - tp%ah(i, 1:ntp) = tp%ah(i, 1:ntp) + tp%aobl(i, 1:ntp) - aoblcb(i) + do i = 1, ntp + tp%ah(:, i) = tp%ah(:, i) + tp%aobl(:, i) - aoblcb(:) end do end associate From 4efd05b8a06f23ac9217c27f0473419845b6961a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 16:16:55 -0400 Subject: [PATCH 037/194] Moved interaction acceleration to the main kick submodule, as the algorithm is shared by multiple integrators --- .../swiftest_vs_swifter.ipynb | 4 +- src/eucl/eucl.f90 | 27 ------ src/helio/helio_getacch.f90 | 91 ++----------------- src/kick/kick.f90 | 72 ++++++++++++++- src/modules/swiftest_classes.f90 | 35 ++++--- src/whm/whm_getacch.f90 | 90 +++--------------- 6 files changed, 112 insertions(+), 207 deletions(-) diff --git a/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb index 82bd3d63f..7740f02c8 100644 --- a/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb @@ -107,7 +107,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -167,7 +167,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index 09ff2eb63..fb8afa131 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -20,9 +20,7 @@ module subroutine eucl_dist_index_plpl(self) associate(nplpl => self%nplpl) nplpl = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column if (allocated(self%k_eucl)) deallocate(self%k_eucl) ! Reset the index array if it's been set previously - if (allocated(self%irij3)) deallocate(self%irij3) allocate(self%k_eucl(2, nplpl)) - allocate(self%irij3(nplpl)) do i = 1, npl counter = (i - 1_I8B) * npl - i * (i - 1_I8B) / 2_I8B + 1_I8B do j = i + 1_I8B, npl @@ -49,29 +47,4 @@ module subroutine eucl_dist_index_pltp(self, pl) class(swiftest_pl), intent(inout) :: pl !! Swiftest massive body object end subroutine eucl_dist_index_pltp - module subroutine eucl_irij3_plpl(self) - !! author: Jacob R. Elliott and David A. Minton - !! - !! Efficient parallel loop-blocking algrorithm for evaluating the Euclidean distance matrix for planet-planet - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - ! Internals - integer(I4B) :: k, i, j - real(DP), dimension(NDIM) :: dx - real(DP) :: rji2 - - associate(k_eucl => self%k_eucl, xh => self%xh, irij3 => self%irij3, nk => self%nplpl) - do k = 1, nk - i = k_eucl(1, k) - j = k_eucl(2, k) - dx(:) = xh(:, j) - xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - irij3(k) = 1.0_DP / (rji2 * sqrt(rji2)) - end do - end associate - - return - end subroutine eucl_irij3_plpl - end submodule s_eucl diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index e7a84108e..9b00b698b 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -17,7 +17,8 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step associate(cb => system%cb, pl => self, npl => self%nbody) - call helio_getacch_int_pl(pl, t) + pl%ah(:,:) = 0.0_DP + call pl%accel_int() if (param%loblatecb) then cb%aoblbeg = cb%aobl call pl%accel_obl(system) @@ -49,15 +50,14 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - ! Internals - logical, save :: lmalloc = .true. - integer(I4B) :: i - real(DP) :: r2, mu - real(DP), dimension(:), allocatable, save :: irh, irht - associate(tp => self, ntp => self%nbody, cb => system%cb, npl => system%pl%nbody) + associate(tp => self, ntp => self%nbody, cb => system%cb, pl => system%pl, npl => system%pl%nbody) if (present(lbeg)) system%lbeg = lbeg - call helio_getacch_int_tp(tp, system, param, t) + if (lbeg) then + call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) + else + call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) + end if if (param%loblatecb) call tp%accel_obl(system) if (param%lextra_force) call tp%accel_user(system, param, t) !if (param%lgr) call tp%gr_accel(param) @@ -65,79 +65,4 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) return end subroutine helio_getacch_tp - subroutine helio_getacch_int_pl(pl, t) - !! author: David A. Minton - !! - !! Compute direct cross term heliocentric accelerations of massive bodiese - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch_int.f90 - !! Adapted from Hal Levison's Swift routine getacch_ah3.f - implicit none - ! Arguments - class(helio_pl), intent(inout) :: pl !! Helio massive body particle data structure - real(DP), intent(in) :: t !! Current time - ! Internals - integer(I4B) :: i, j - real(DP) :: rji2, irij3, faci, facj - real(DP), dimension(NDIM) :: dx - - associate(npl => pl%nbody) - pl%ah(:,:) = 0.0_DP - do i = 1, npl - 1 - do j = i + 1, npl - dx(:) = pl%xh(:,j) - pl%xh(:,i) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - faci = pl%Gmass(i) * irij3 - facj = pl%Gmass(j) * irij3 - pl%ah(:,i) = pl%ah(:,i) + facj * dx(:) - pl%ah(:,j) = pl%ah(:,j) - faci * dx(:) - end do - end do - end associate - - return - end subroutine helio_getacch_int_pl - - subroutine helio_getacch_int_tp(tp, system, param, t) - !! author: David A. Minton - !! - !! Compute direct cross term heliocentric accelerations of test particles - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch_int_tp.f90 - !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f - implicit none - ! Arguments - class(helio_tp), intent(inout) :: tp !! Helio test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current times - ! Internals - integer(I4B) :: i, j - real(DP) :: r2, fac - real(DP), dimension(NDIM) :: dx - real(DP), dimension(:, :), allocatable :: xhp - - associate(ntp => tp%nbody, pl => system%pl, npl => system%pl%nbody, lbeg => system%lbeg) - if (lbeg) then - allocate(xhp, source=pl%xbeg) - else - allocate(xhp, source=pl%xend) - end if - - tp%ah(:,:) = 0.0_DP - do i = 1, ntp - if (tp%status(i) == ACTIVE) then - do j = 1, npl - dx(:) = tp%xh(:,i) - xhp(:,j) - r2 = dot_product(dx(:), dx(:)) - fac = pl%Gmass(j) / (r2 * sqrt(r2)) - tp%ah(:,i) = tp%ah(:,i) - fac * dx(:) - end do - end if - end do - end associate - return - end subroutine helio_getacch_int_tp - end submodule s_helio_getacch diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index a54677dcd..2cb6dcde8 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -1,7 +1,73 @@ submodule(swiftest_classes) s_kick use swiftest contains - module subroutine kickvh_body(self, dt) + module pure subroutine kick_getacch_int_pl(self) + !! author: David A. Minton + !! + !! Compute direct cross (third) term heliocentric accelerations of massive bodies + !! + !! Adapted from Hal Levison's Swift routine getacch_ah3.f + !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int.f90 + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self + ! Internals + integer(I4B) :: k + real(DP) :: rji2, irij3, faci, facj + real(DP), dimension(NDIM) :: dx + + associate(pl => self, npl => self%nbody, nplpl => self%nplpl) + do k = 1, nplpl + associate(i => pl%k_eucl(1, k), j => pl%k_eucl(2, k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + end associate + end do + end associate + + return + end subroutine kick_getacch_int_pl + + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) + !! author: David A. Minton + !! + !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + !! + !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int_tp.f90 + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle + real(DP), dimension(:), intent(in) :: GMpl !! Massive body masses + real(DP), dimension(:,:), intent(in) :: xhp !! Massive body position vectors + integer(I4B), intent(in) :: npl !! Number of active massive bodies + ! Internals + integer(I4B) :: i, j + real(DP) :: rji2, irij3, fac + real(DP), dimension(NDIM) :: dx, acc + + associate(tp => self, ntp => self%nbody) + do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) + acc(:) = 0.0_DP + do j = 1, npl + dx(:) = tp%xh(:,i) - xhp(:, j) + rji2 = dot_product(dx(:), dx(:)) + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + fac = GMpl(j) * irij3 + acc(:) = acc(:) - fac * dx(:) + end do + tp%ah(:, i) = tp%ah(:, i) + acc(:) + end do + end associate + return + end subroutine kick_getacch_int_tp + + module subroutine kick_vh_body(self, dt) !! author: David A. Minton !! !! Kick heliocentric velocities of bodies @@ -23,6 +89,8 @@ module subroutine kickvh_body(self, dt) end associate return - end subroutine kickvh_body + end subroutine kick_vh_body + + end submodule s_kick diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index c70d3159a..c1accb768 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -8,12 +8,12 @@ module swiftest_classes private public :: discard_pl, discard_system, discard_tp public :: drift_body, drift_one - public :: eucl_dist_index_plpl, eucl_dist_index_pltp, eucl_irij3_plpl + public :: eucl_dist_index_plpl, eucl_dist_index_pltp public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kickvh_body + public :: kick_getacch_int_pl, kick_vh_body public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp @@ -179,7 +179,7 @@ module swiftest_classes procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: kick => kickvh_body !! Kicks the heliocentric velocities + procedure, public :: kick => kick_vh_body !! Kicks the heliocentric velocities procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements @@ -201,7 +201,6 @@ module swiftest_classes real(DP), dimension(:), allocatable :: Gmass !! Mass gravitational term G * mass (units GU * MU) real(DP), dimension(:), allocatable :: rhill !! Body mass (units MU) real(DP), dimension(:), allocatable :: radius !! Body radius (units DU) - real(DP), dimension(:), allocatable :: irij3 !! 1.0_DP / (rji2 * sqrt(rji2)) where rji2 is the square of the Euclidean distance real(DP), dimension(:,:), allocatable :: xbeg !! Position at beginning of step real(DP), dimension(:,:), allocatable :: xend !! Position at end of step real(DP), dimension(:,:), allocatable :: vbeg !! Velocity at beginning of step @@ -219,10 +218,10 @@ module swiftest_classes ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: eucl_irij3 => eucl_irij3_plpl !! Parallelized single loop blocking for Euclidean distance matrix calcualtion + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: accel_tides => tides_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure, public :: accel_tides => tides_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) @@ -241,7 +240,6 @@ module swiftest_classes integer(I4B), dimension(:), allocatable :: isperi !! Perihelion passage flag real(DP), dimension(:), allocatable :: peri !! Perihelion distance real(DP), dimension(:), allocatable :: atp !! Semimajor axis following perihelion passage - real(DP), dimension(:, :), allocatable :: irij3 !! 1.0_DP / (rji2 * sqrt(rji2)) where rji2 is the square of the Euclidean distance betwen each pl-tp !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_tp and util_spill_tp contains @@ -250,6 +248,7 @@ module swiftest_classes ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass @@ -412,11 +411,6 @@ module subroutine eucl_dist_index_pltp(self, pl) class(swiftest_pl), intent(inout) :: pl !! Swiftest massive body object end subroutine - module subroutine eucl_irij3_plpl(self) - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - end subroutine eucl_irij3_plpl - module pure subroutine gr_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -606,11 +600,24 @@ module subroutine io_write_frame_system(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_system - module subroutine kickvh_body(self, dt) + module pure subroutine kick_getacch_int_pl(self) + implicit none + class(swiftest_pl), intent(inout) :: self + end subroutine kick_getacch_int_pl + + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle + real(DP), dimension(:), intent(in) :: GMpl !! Massive body masses + real(DP), dimension(:,:), intent(in) :: xhp !! Massive body position vectors + integer(I4B), intent(in) :: npl !! Number of active massive bodies + end subroutine kick_getacch_int_tp + + module subroutine kick_vh_body(self, dt) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object real(DP), intent(in) :: dt !! Stepsize - end subroutine kickvh_body + end subroutine kick_vh_body module subroutine obl_acc_body(self, system) implicit none diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_getacch.f90 index 0aa438a5e..e950d855c 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_getacch.f90 @@ -30,7 +30,7 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) call whm_getacch_ah1(cb, pl) call whm_getacch_ah2(cb, pl) - call whm_getacch_ah3(pl) + call pl%accel_int() if (param%loblatecb) then cb%aoblbeg = cb%aobl @@ -67,23 +67,25 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) ! Internals integer(I4B) :: i real(DP), dimension(NDIM) :: ah0 - real(DP), dimension(:,:), allocatable :: xhp associate(tp => self, ntp => self%nbody, pl => system%pl, cb => system%cb, npl => system%pl%nbody) if (ntp == 0 .or. npl == 0) return if (present(lbeg)) system%lbeg = lbeg if (system%lbeg) then - allocate(xhp, source=pl%xbeg) + ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) + do i = 1, ntp + tp%ah(:, i) = ah0(:) + end do + call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else - allocate(xhp, source=pl%xend) + ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) + do i = 1, ntp + tp%ah(:, i) = ah0(:) + end do + call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) end if - ah0(:) = whm_getacch_ah0(pl%Gmass(:), xhp(:,:), npl) - do i = 1, ntp - tp%ah(:, i) = ah0(:) - end do - call whm_getacch_ah3_tp(system, xhp) if (param%loblatecb) call tp%accel_obl(system) if (param%lextra_force) call tp%accel_user(system, param, t) if (param%lgr) call tp%accel_gr(param) @@ -177,74 +179,4 @@ pure subroutine whm_getacch_ah2(cb, pl) return end subroutine whm_getacch_ah2 - pure subroutine whm_getacch_ah3(pl) - !! author: David A. Minton - !! - !! Compute direct cross (third) term heliocentric accelerations of planets - !! - !! Adapted from Hal Levison's Swift routine getacch_ah3.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 - implicit none - - class(whm_pl), intent(inout) :: pl - integer(I4B) :: k - real(DP) :: rji2, irij3, faci, facj - real(DP), dimension(NDIM) :: dx - real(DP), dimension(:,:), allocatable :: ah3 - - associate(npl => pl%nbody, nplpl => pl%nplpl) - allocate(ah3, mold=pl%ah) - ah3(:, :) = 0.0_DP - do k = 1, nplpl - associate(i => pl%k_eucl(1, k), j => pl%k_eucl(2, k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - faci = pl%Gmass(i) * irij3 - facj = pl%Gmass(j) * irij3 - ah3(:, i) = ah3(:, i) + facj * dx(:) - ah3(:, j) = ah3(:, j) - faci * dx(:) - end associate - end do - do concurrent (k = 1:npl) - pl%ah(:, k) = pl%ah(:, k) + ah3(:, k) - end do - deallocate(ah3) - end associate - - return - end subroutine whm_getacch_ah3 - - pure subroutine whm_getacch_ah3_tp(system, xhp) - !! author: David A. Minton - !! - !! Compute direct cross (third) term heliocentric accelerations of test particles - !! - !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 - implicit none - ! Arguments - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object - real(DP), dimension(:,:), intent(in) :: xhp !! Heliocentric positions of planets at the current substep - ! Internals - integer(I4B) :: i, j - real(DP) :: rji2, irij3, fac - real(DP), dimension(NDIM) :: dx, acc - - associate(ntp => system%tp%nbody, npl => system%pl%nbody, tp => system%tp, pl => system%pl) - if (ntp == 0) return - do i = 1, ntp - acc(:) = 0.0_DP - do j = 1, npl - dx(:) = tp%xh(:, i) - xhp(:, j) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - fac = pl%Gmass(j) * irij3 - acc(:) = acc(:) - fac * dx(:) - end do - tp%ah(:, i) = tp%ah(:, i) + acc(:) - end do - end associate - return - end subroutine whm_getacch_ah3_tp end submodule s_whm_getacch From f6cf54d12935b2af5337461607c4e3b84353e097 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 16:23:05 -0400 Subject: [PATCH 038/194] Corrected position vector for massive bodies from xb to xh --- src/helio/helio_drift.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 7ae65feab..7a6d4db06 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -34,7 +34,7 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) if (param%lgr) then do concurrent(i = 1:npl, mask(i)) - rmag = norm2(pl%xb(:, i)) + rmag = norm2(pl%xh(:, i)) vmag2 = dot_product(pl%vb(:, i), pl%vb(:, i)) energy = 0.5_DP * vmag2 - mu(i) / rmag dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) @@ -44,7 +44,7 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) end if do concurrent(i = 1:npl, mask(i)) - call drift_one(mu(i), pl%xb(1,i), pl%xb(2,i), pl%xb(3,i), & + call drift_one(mu(i), pl%xh(1,i), pl%xh(2,i), pl%xh(3,i), & pl%vb(1,i), pl%vb(2,i), pl%vb(3,i), & dtp(i), iflag(i)) end do @@ -52,7 +52,7 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) do i = 1, npl if (iflag(i) /= 0) then write(*, *) " Planet ", self%id(i), " is lost!!!!!!!!!!" - write(*, *) pl%xb(:,i) + write(*, *) pl%xh(:,i) write(*, *) pl%vb(:,i) write(*, *) " stopping " call util_exit(FAILURE) From 5d55ac1b35a108042d8b1bd410dbd4feb281a571 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 17:26:23 -0400 Subject: [PATCH 039/194] Wrote the helio drift subroutine for swiftest_body type and then wrapped it with interfaces so that they can be used as type-bound procedures for helio_pl and helio_tp --- src/helio/helio_drift.f90 | 41 ++++++++++++++++++++++++++++++----- src/helio/helio_getacch.f90 | 5 +++-- src/kick/kick.f90 | 10 +++++---- src/modules/helio_classes.f90 | 23 +++++++++++++++++++- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 7a6d4db06..38e156e32 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -1,18 +1,17 @@ submodule (helio_classes) s_helio_drift use swiftest contains - module subroutine helio_drift_pl(self, system, param, dt, mask) + module subroutine helio_drift_body(self, system, param, dt, mask) !! author: David A. Minton !! - !! Loop through massive bodies and call Danby drift routine - !! New vectorized version included + !! Loop through bodies and call Danby drift routine on democratic heliocentric coordinates !! !! Adapted from David E. Kaufmann's Swifter routine helio_drift.f90 !! Adapted from Hal Levison's Swift routine drift.f implicit none ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize @@ -51,7 +50,7 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /= 0) then - write(*, *) " Planet ", self%id(i), " is lost!!!!!!!!!!" + write(*, *) " Body", self%id(i), " is lost!!!!!!!!!!" write(*, *) pl%xh(:,i) write(*, *) pl%vb(:,i) write(*, *) " stopping " @@ -63,7 +62,39 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) return + end subroutine helio_drift_body + + module subroutine helio_drift_pl(self, system, param, dt, mask) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a helio_pl structure + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. + + call helio_drift_body(self, system, param, dt, mask) + return end subroutine helio_drift_pl + + module subroutine helio_drift_tp(self, system, param, dt, mask) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a helio_pl structure + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. + + call helio_drift_body(self, system, param, dt, mask) + return + end subroutine helio_drift_tp module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) !! author: David A. Minton diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index 9b00b698b..098549eff 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -51,9 +51,10 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - associate(tp => self, ntp => self%nbody, cb => system%cb, pl => system%pl, npl => system%pl%nbody) + associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) + tp%ah(:,:) = 0.0_DP if (present(lbeg)) system%lbeg = lbeg - if (lbeg) then + if (system%lbeg) then call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 2cb6dcde8..61cd560bb 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -48,7 +48,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) integer(I4B), intent(in) :: npl !! Number of active massive bodies ! Internals integer(I4B) :: i, j - real(DP) :: rji2, irij3, fac + real(DP) :: rji2, irij3, fac, r2 real(DP), dimension(NDIM) :: dx, acc associate(tp => self, ntp => self%nbody) @@ -56,9 +56,11 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) acc(:) = 0.0_DP do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - fac = GMpl(j) * irij3 + !rji2 = dot_product(dx(:), dx(:)) + !irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + !fac = GMpl(j) * irij3 + r2 = dot_product(dx(:), dx(:)) + fac = GMpl(j) / (r2 * sqrt(r2)) acc(:) = acc(:) - fac * dx(:) end do tp%ah(:, i) = tp%ah(:, i) + acc(:) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index ae2693167..17366e88f 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -53,6 +53,7 @@ module helio_classes procedure, public :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates procedure, public :: accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize @@ -84,6 +85,16 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body end subroutine helio_coord_vh2vb_tp + + module subroutine helio_drift_body(self, system, param, dt, mask) + use swiftest_classes, only : swiftest_body, swiftest_nbody_system, swiftest_parameters + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift + end subroutine helio_drift_body module subroutine helio_drift_pl(self, system, param, dt, mask) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters @@ -92,9 +103,19 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_pl + module subroutine helio_drift_tp(self, system, param, dt, mask) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(helio_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift + end subroutine helio_drift_tp + module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object From 205e666e956dd392069c7f50553085d4802b38d5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 17:31:48 -0400 Subject: [PATCH 040/194] Refactored to remove associate statements since the helio_drift routine is generic to any kind of body --- src/helio/helio_drift.f90 | 65 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 38e156e32..11d642159 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -22,46 +22,43 @@ module subroutine helio_drift_body(self, system, param, dt, mask) integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag real(DP), dimension(:), allocatable :: dtp, mu - associate(pl => self, npl => self%nbody, cb => system%cb) - if (npl == 0) return + if (self%nbody == 0) return - allocate(iflag(npl)) - iflag(:) = 0 - allocate(dtp(npl)) - allocate(mu(npl)) - mu(:) = cb%Gmass + allocate(iflag(self%nbody)) + iflag(:) = 0 + allocate(dtp(self%nbody)) + allocate(mu(self%nbody)) + mu(:) = system%cb%Gmass - if (param%lgr) then - do concurrent(i = 1:npl, mask(i)) - rmag = norm2(pl%xh(:, i)) - vmag2 = dot_product(pl%vb(:, i), pl%vb(:, i)) - energy = 0.5_DP * vmag2 - mu(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - where(mask(1:npl)) dtp(1:npl) = dt - end if + if (param%lgr) then + do concurrent(i = 1:self%nbody, mask(i)) + rmag = norm2(self%xh(:, i)) + vmag2 = dot_product(self%vb(:, i), self%vb(:, i)) + energy = 0.5_DP * vmag2 - mu(i) / rmag + dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) + end do + else + where(mask(1:self%nbody)) dtp(1:self%nbody) = dt + end if - do concurrent(i = 1:npl, mask(i)) - call drift_one(mu(i), pl%xh(1,i), pl%xh(2,i), pl%xh(3,i), & - pl%vb(1,i), pl%vb(2,i), pl%vb(3,i), & - dtp(i), iflag(i)) + do concurrent(i = 1:self%nbody, mask(i)) + call drift_one(mu(i), self%xh(1,i), self%xh(2,i), self%xh(3,i), & + self%vb(1,i), self%vb(2,i), self%vb(3,i), & + dtp(i), iflag(i)) + end do + if (any(iflag(1:self%nbody) /= 0)) then + do i = 1, self%nbody + if (iflag(i) /= 0) then + write(*, *) " Body", self%id(i), " is lost!!!!!!!!!!" + write(*, *) self%xh(:,i) + write(*, *) self%vb(:,i) + write(*, *) " stopping " + call util_exit(FAILURE) + end if end do - if (any(iflag(1:npl) /= 0)) then - do i = 1, npl - if (iflag(i) /= 0) then - write(*, *) " Body", self%id(i), " is lost!!!!!!!!!!" - write(*, *) pl%xh(:,i) - write(*, *) pl%vb(:,i) - write(*, *) " stopping " - call util_exit(FAILURE) - end if - end do - end if - end associate + end if return - end subroutine helio_drift_body module subroutine helio_drift_pl(self, system, param, dt, mask) From 2ef93640899308cf891377f6d423b58820795ae8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 23 Jul 2021 17:50:12 -0400 Subject: [PATCH 041/194] Consolidated redundant drift subroutines into one single shared algorithm. Each type-bound procedure now feeds the correct position and velocities to the universal drift_all function --- .../swiftest_vs_swifter.ipynb | 99 +++---------------- src/drift/drift.f90 | 63 ++++++++---- src/helio/helio_drift.f90 | 48 +++------ src/modules/swiftest_classes.f90 | 13 ++- src/whm/whm_drift.f90 | 35 ++----- 5 files changed, 93 insertions(+), 165 deletions(-) diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 7f0b1d4b9..c5a777669 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -21,10 +21,7 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 1.000e+00\n", - "Creating Dataset\n", - "Successfully converted 1462 output frames.\n", - "Swifter simulation data stored as xarray DataSet .ds\n" + "Reading in time 2.580e-01" ] } ], @@ -35,21 +32,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.001e+00\n", - "Creating Dataset\n", - "Successfully converted 1463 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" - ] - } - ], + "outputs": [], "source": [ "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", "swiftestsim.bin2xr()" @@ -57,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -75,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -85,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -95,22 +80,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "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=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -122,22 +94,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 +107,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 +120,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/src/drift/drift.f90 b/src/drift/drift.f90 index ce9f66761..4d9988f93 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -26,34 +26,16 @@ module subroutine drift_body(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i - real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation integer(I4B), dimension(:), allocatable :: iflag - real(DP), dimension(:), allocatable :: dtp associate(n => self%nbody) - if (n == 0) return allocate(iflag(n)) iflag(:) = 0 - allocate(dtp(n)) - if (param%lgr) then - do concurrent(i = 1:n, mask(i)) - rmag = norm2(self%xh(:, i)) - vmag2 = dot_product(self%vh(:, i), self%vh(:, i)) - energy = 0.5_DP * vmag2 - self%mu(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - where(mask(1:n)) dtp(1:n) = dt - end if - do concurrent(i = 1:n, mask(i)) - call drift_one(self%mu(i), self%xh(1,i), self%xh(2,i), self%xh(3,i), & - self%vh(1,i), self%vh(2,i), self%vh(3,i), & - dtp(i), iflag(i)) - end do + call drift_all(self%mu, self%xh, self%vh, self%nbody, param, dt, mask, iflag) if (any(iflag(1:n) /= 0)) then where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR do i = 1, n - if (iflag(i) /= 0) write(*, *) "Particle ", self%id(i), " lost due to error in Danby drift" + if (iflag(i) /= 0) write(*, *) " Body ", self%id(i), " lost due to error in Danby drift" end do end if end associate @@ -61,6 +43,47 @@ module subroutine drift_body(self, system, param, dt, mask) return end subroutine drift_body + module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) + !! author: David A. Minton + !! + !! Loop bodies and call Danby drift routine on all bodies for the given position and velocity vector. + !! + !! Adapted from Hal Levison's Swift routine drift_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_drift_tp.f9 + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: mu !! Vector of gravitational constants + real(DP), dimension(:,:), intent(inout) :: x, v !! Position and velocity vectors + integer(I4B), intent(in) :: n !! number of bodies + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. + integer(I4B), dimension(:), intent(out) :: iflag !! Vector of error flags. 0 means no problem + ! Internals + integer(I4B) :: i + real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation + real(DP), dimension(:), allocatable :: dtp + + if (n == 0) return + + allocate(dtp(n)) + if (param%lgr) then + do concurrent(i = 1:n, mask(i)) + rmag = norm2(x(:, i)) + vmag2 = dot_product(v(:, i), v(:, i)) + energy = 0.5_DP * vmag2 - mu(i) / rmag + dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) + end do + else + where(mask(1:n)) dtp(1:n) = dt + end if + do concurrent(i = 1:n, mask(i)) + call drift_one(mu(i), x(1,i), x(2,i), x(3,i), v(1,i), v(2,i), v(3,i), dtp(i), iflag(i)) + end do + + return + end subroutine drift_all + module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 11d642159..0c146eea5 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -22,41 +22,19 @@ module subroutine helio_drift_body(self, system, param, dt, mask) integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag real(DP), dimension(:), allocatable :: dtp, mu - if (self%nbody == 0) return - - allocate(iflag(self%nbody)) - iflag(:) = 0 - allocate(dtp(self%nbody)) - allocate(mu(self%nbody)) - mu(:) = system%cb%Gmass - - if (param%lgr) then - do concurrent(i = 1:self%nbody, mask(i)) - rmag = norm2(self%xh(:, i)) - vmag2 = dot_product(self%vb(:, i), self%vb(:, i)) - energy = 0.5_DP * vmag2 - mu(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - where(mask(1:self%nbody)) dtp(1:self%nbody) = dt - end if - - do concurrent(i = 1:self%nbody, mask(i)) - call drift_one(mu(i), self%xh(1,i), self%xh(2,i), self%xh(3,i), & - self%vb(1,i), self%vb(2,i), self%vb(3,i), & - dtp(i), iflag(i)) - end do - if (any(iflag(1:self%nbody) /= 0)) then - do i = 1, self%nbody - if (iflag(i) /= 0) then - write(*, *) " Body", self%id(i), " is lost!!!!!!!!!!" - write(*, *) self%xh(:,i) - write(*, *) self%vb(:,i) - write(*, *) " stopping " - call util_exit(FAILURE) - end if - end do - end if + associate(n => self%nbody) + allocate(iflag(n)) + iflag(:) = 0 + allocate(mu(n)) + mu(:) = system%cb%Gmass + call drift_all(mu, self%xh, self%vb, self%nbody, param, dt, mask, iflag) + if (any(iflag(1:n) /= 0)) then + where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR + do i = 1, n + if (iflag(i) /= 0) write(*, *) " Body ", self%id(i), " lost due to error in Danby drift" + end do + end if + end associate return end subroutine helio_drift_body diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index c1accb768..fc2ca4d39 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -7,7 +7,7 @@ module swiftest_classes implicit none private public :: discard_pl, discard_system, discard_tp - public :: drift_body, drift_one + public :: drift_all, drift_body, drift_one public :: eucl_dist_index_plpl, eucl_dist_index_pltp public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & @@ -383,6 +383,17 @@ module subroutine discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine discard_tp + module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) + implicit none + real(DP), dimension(:), intent(in) :: mu !! Vector of gravitational constants + real(DP), dimension(:,:), intent(inout) :: x, v !! Position and velocity vectors + integer(I4B), intent(in) :: n !! number of bodies + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. + integer(I4B), dimension(:), intent(out) :: iflag !! Vector of error flags. 0 means no problem + end subroutine drift_all + module subroutine drift_body(self, system, param, dt, mask) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle data structure diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index 12d8494a8..454e1bc53 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -17,43 +17,26 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift ! Internals integer(I4B) :: i - real(DP) :: energy, vmag2, rmag !! Variables used in GR calculation integer(I4B), dimension(:), allocatable :: iflag - real(DP), dimension(:), allocatable :: dtp associate(pl => self, npl => self%nbody) if (npl == 0) return allocate(iflag(npl)) iflag(:) = 0 - allocate(dtp(npl)) - - if (param%lgr) then - do concurrent(i = 1:npl, mask(i)) - rmag = norm2(pl%xj(:, i)) - vmag2 = dot_product(pl%vj(:, i), pl%vj(:, i)) - energy = 0.5_DP * vmag2 - pl%muj(i) / rmag - dtp(i) = dt * (1.0_DP + 3 * param%inv_c2 * energy) - end do - else - where(mask(1:npl)) dtp(1:npl) = dt - end if - - do concurrent(i = 1:npl, mask(i)) - call drift_one(pl%muj(i), pl%xj(1,i), pl%xj(2,i), pl%xj(3,i), & - pl%vj(1,i), pl%vj(2,i), pl%vj(3,i), & - dtp(i), iflag(i)) - end do + call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, mask, iflag) if (any(iflag(1:npl) /= 0)) then + where(iflag(1:npl) /= 0) pl%status(1:npl) = DISCARDED_DRIFTERR do i = 1, npl - if (iflag(i) /= 0) then - write(*, *) " Planet ", self%id(i), " is lost!!!!!!!!!!" - write(*, *) pl%xj(:,i) - write(*, *) pl%vj(:,i) - write(*, *) " stopping " - call util_exit(FAILURE) + if (iflag(i) /= 0) then + write(*, *) " Planet ", pl%id(i), " is lost!!!!!!!!!!!!" + WRITE(*, *) pl%muj(i), dt + WRITE(*, *) pl%xj(:,i) + WRITE(*, *) pl%vj(:,i) + WRITE(*, *) " STOPPING " end if end do + call util_exit(FAILURE) end if end associate From 4f30c8e5b40ed431f1cfa1474f774e3288f87b0c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 01:53:46 -0400 Subject: [PATCH 042/194] Added plpl encounter check adapted from Fragmentation branch --- .../swiftest_vs_swifter.ipynb | 99 ++++++++++++++++--- src/eucl/eucl.f90 | 21 +--- src/kick/kick.f90 | 2 +- src/modules/rmvs_classes.f90 | 26 ++--- src/modules/swiftest_classes.f90 | 17 +--- src/modules/symba_classes.f90 | 26 ++++- ...{rmvs_spill_and_fill.f90 => rmvs_util.f90} | 20 ++-- src/symba/symba_encounter_check.f90 | 82 ++++++++++----- src/symba/symba_setup.f90 | 13 ++- src/symba/symba_util.f90 | 67 +++++++++++++ 10 files changed, 277 insertions(+), 96 deletions(-) rename src/rmvs/{rmvs_spill_and_fill.f90 => rmvs_util.f90} (91%) create mode 100644 src/symba/symba_util.f90 diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index c5a777669..7f0b1d4b9 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -21,7 +21,10 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 2.580e-01" + "Reading in time 1.000e+00\n", + "Creating Dataset\n", + "Successfully converted 1462 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" ] } ], @@ -32,9 +35,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.001e+00\n", + "Creating Dataset\n", + "Successfully converted 1463 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], "source": [ "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", "swiftestsim.bin2xr()" @@ -42,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -60,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -70,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -80,9 +95,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "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" + } + ], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['dr'].sel(id=plidx).plot.line(x=\"time (y)\", ax=ax)\n", @@ -94,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", @@ -107,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", @@ -120,9 +174,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAElCAYAAADDUxRwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAiMElEQVR4nO3dfZxWdZ3/8ddbRCeBRAUVHHFQMSVN1FlvysW7KNGU/FX+pDLvyqylbS0XJmvzrhI3+9W66rqablCtbGoitqQixE/TNLFQRGJFEJkYFVC8DRX97B/nYBfjNTPXdc33mplr5v18PObBdc75nnM+B/R6z/fcfI8iAjMzs87aorsLMDOz3sGBYmZmSThQzMwsCQeKmZkl4UAxM7MkHChmZpaEA8WsCEkXSvpZ/nmEpFck9atgO9dI+qf0FZr1PA4U65UkPSXpw63mnS7pt+VuKyKejoiBEfFWBeueExGXlNJW0k8kfafcfaRS6d+P2SYOFLM+QNKWvWEf1rM5UKzPkjRc0i2S1khaIenv22jXICk2fWHm682S9LykZZK+0M4+3ul1SDpSUrOkr0t6TlKLpDPyZWcDnwEm56fXbu+oRknvkTRN0guSlkiaLKm5YPlTkqZIehR4VdKWkpokPSnpZUmPSzopb7sPcA1wWL7/9fn8bSVNz/e/UtK3JG2RLztd0n2SfijpeeDCSv8trHfwbxTWJ+VfircDtwETgXrgbklLI+LODla/EVgMDAf2BuZIWh4Rc0vY9c7AtsAuwDjgZkkzI+JaSR8EmiPiWyXWeAHQAOwODABmF9nfROB4YG1EbJT0JPC3wDPAp4CfSdozIpZIOgf4fEQcXrD+v+b17g7sANwFtADX58sPAWYAOwL9Szh+68XcQ7HebKak9Zt+gKsLlv0NMDQiLo6INyJiOXAdcEp7G5S0K3A4MCUiNkTEQuDHwKkl1vQmcHFEvBkRs4FXgPe10bajGk8GvhcRL0REM3BFkW1cERGrIuIvABFxU0Ssjoi3I+K/gCeAg9s41n7A/wW+EREvR8RTwA9aHevqiPjXiNi4aR/Wd7mHYr3ZxyPi7k0Tkk4HPp9P7gYM33RqJ9cPuLeDbQ4Hno+IlwvmrQQaS6xpXURsLJh+DRjYRtuOahwOrCpYVvi56DxJnwO+RtazId/3kDb2PwTYiuz4NllJ1rtqb5/WRzlQrK9aBayIiFFlrrca2F7SoIJQGQH8OUFNrYf+7qjGFrLTYI/n07u2t01Ju5H1cI4BfhcRb0laCKiN/a8l61HtVrCP1sfq4crtHT7lZX3V74GX8ovW75HUT9K+kv6mvZUiYhVwP3CppDpJHwDOAn6eoKZnya5VlFrjL4BvSNpO0i7ApA62P4AsANYA5DcE7Ntq//WStgLIb5P+BfBdSYPyQPoa8LPOHab1Vg4U65PyL8sTgDHACrLfxn9MdgG6IxPJThmtBm4FLoiIOQnKuh4YnV/zmVlCjRcDzfmyu4Gbgdfb2nhEPE52DeR3ZOGxH3BfQZN5ZDcbPCNpbT7vK8CrwHLgt8B/Ajd09kCtd5JfsGXWO0j6EnBKRBzR3bVY3+QeilmNkjRM0ockbSHpfcDXyXpMZt3CF+XNatdWwL8DI4H1ZM+DXN3eCmbV5FNeZmaWhE95mZlZEg4Usx5I0mck3VVCu3eG2e8JunvEZOteDhSrefrr+0o2/YSkVwum/7aCbb5r+PtWy4+U9Ha+/ZclLd000GMF+9ps8EmAiPh5RHykku2ZdRdflLeaFxFPUzB8iaQA9o+IZVXe9eqIqJckYALZQI8P5s97lEQe8t16EfdQrFeTtLWkyyU9LelZZW9QfE++bIikX+UPEj4v6d78Ftyfkg0xcnveA5nc3j4iMxN4gezBxOMl/VHSS5JWSbqwoJ5NvZGzJD1N9jDhPfni9fn+DlOrl11Jer+kOXmdz0o6v43jPVTS/fkxPSLpyIJlp0tanveoVkj6TDt/Zz+StDr/+ZGkrfNlbQ7BX2Q7j0k6oWC6v6S1ksa09/dptcuBYr3dZcBeZE+b70k2sOG382VfJ3vSfCiwE3A+WT6cCjwNnJC/qfGf29tBHkInAYOBRWRPln8unz4e+JKkj7da7QhgH+CjwNh83uB8f79rtf1BZE/C30E2IOSewLuGys+HX/lv4DvA9sB5wC2ShkoaQDYa8fiIGAR8EFjYxiF9EziU7O9sf7LRiL9VsLxwCP6zgKskbVdkO9OBzxZMHwe05CM0Wy/kQLFeKz8V9QXg3IjYNELw9/jr8O9vAsOA3fLh5O+N8u6j3zQS8Fqyd5OcGhFLI2J+RCzKh4h/lOz9Ka2fXr8wIl4tccj3jwHPRMQP8iHzX46IB4u0+ywwOyJm5/ueAywg+yIHeBvYV9J7IqIlIha3sb/PkA2x/1xErAEuYvMh60sdgv9nwHGS3ptPnwr8tITjtRrlQLHebCiwDfCw/vpOlDvy+QDfB5YBd+WngprK3P7qiBgcEdtHxJiImAEg6RBJv1H2lsMXgXN49xDx5Qz7vivwZAntdgM+pc3fAXM4MCwiXiV7t8k5QIuk/5a0dxvbGc67h6wfXjBd0hD8EbGabKywT0gaDIwnzSCa1kM5UKw3Wwv8BXh//sU/OCK2jYiBAPlv+l+PiN3JBmH8mqRj8nU788TvfwKzgF0jYluyV+uqVZto43Mxq4A9StjvKuCnBcc6OCIGRMRUgIi4MyLGkfXK/kQ2lH0xq8nCaZMR+bxKTCPrOX2KbMj8FMP8Ww/lQLFeKyLeJvvS/KGkHSG7ziDpo/nnj0naMz819hLwVv4D7x5KvhyDyF7CtUHSwcCnO2i/hux0VFv7+xWws6R/yC+YD5J0SJF2PwNOkPRRZUPd1+UX0esl7STpxPxayutkp6neKrINyE7RfSu/9jKE7JpTpc+6zAQOBL5Kdk3FejEHivV2U8hOaz0g6SWyi9ubzvePyqdfIRvS/eqImJ8vu5TsS3W9pPPK3OeXgYslvUz2ZfyL9hpHxGvAd4H78v0d2mr5y2Tvnz+B7F3wTwBHFdnOKrLbl88nC6lVwD+S/X++BdlNCKuB58mu6Xy5jZK+Q3bt5VGymwz+kM8rW36N6Bay8cZ+Wck2rHZ4LC8zqypJ3wb2iojPdtjYapofqjKzqpG0Pdmtxad21NZqn095mVlVSPoC2Wm3X0fEPR21t9rnU15mZpaEeyhmZpZEn76GMmTIkGhoaOjuMszMasrDDz+8NiKGtp7fpwOloaGBBQsWdHcZZmY1RdLKYvN9ysvMzJJwoJiZWRIOFDMzS6JPX0MxM0vhzTffpLm5mQ0bNnR3KUnV1dVRX19P//79S2rvQDEz66Tm5mYGDRpEQ0MD2VijtS8iWLduHc3NzYwcObKkdXzKy8yskzZs2MAOO+zQa8IEQBI77LBDWb0uB4qZWQK9KUw2KfeYHChmZpaEA8XMrIf74Ac/WHT+6aefzs0339zF1bTNgWJm1sPdf//93V1CSXyXl5lZDzdw4EBeeeUVIoKvfOUrzJs3j5EjR9LTRot3D8XMrEbceuutLF26lEWLFnHdddf1uJ6LA8XMrEbcc889TJw4kX79+jF8+HCOPvro7i5pMw4UM7Ma0pNvT3agmJnViLFjxzJjxgzeeustWlpa+M1vftPdJW3GF+XNzGrESSedxLx589hvv/3Ya6+9OOKII7q7pM04UMzMerhXXnkFyE53XXnlld1cTdt8ysvMzJJwoJiZWRIOFDMzS8KBYmZmSThQzMwsCQeKmZkl4UAxM+sFzjzzTHbccUf23Xffd+Y9//zzjBs3jlGjRjFu3DheeOEFANatW8dRRx3FwIEDmTRpUrIaHChmZr3A6aefzh133LHZvKlTp3LMMcfwxBNPcMwxxzB16lQA6urquOSSS7j88suT1tCjAkXSsZKWSlomqanIckm6Il/+qKQDWy3vJ+mPkn7VdVWbmXW/sWPHsv32228277bbbuO0004D4LTTTmPmzJkADBgwgMMPP5y6urqkNfSYJ+Ul9QOuAsYBzcBDkmZFxOMFzcYDo/KfQ4B/y//c5KvAEuC9XVK0mVkrF92+mMdXv5R0m6OHv5cLTnh/2es9++yzDBs2DIBhw4bx3HPPJa2rtZ7UQzkYWBYRyyPiDWAGMKFVmwnA9Mg8AAyWNAxAUj1wPPDjrizazMwyPaaHAuwCrCqYbmbz3kdbbXYBWoAfAZOBQe3tRNLZwNkAI0aM6FTBZmatVdKTqJaddtqJlpYWhg0bRktLCzvuuGNV99eTeijFBvlv/X7Lom0kfQx4LiIe7mgnEXFtRDRGROPQoUMrqdPMrCaceOKJTJs2DYBp06YxYULrkz5p9aQeSjOwa8F0PbC6xDafBE6UdBxQB7xX0s8i4rNVrNfMrMeYOHEi8+fPZ+3atdTX13PRRRfR1NTEySefzPXXX8+IESO46aab3mnf0NDASy+9xBtvvMHMmTO56667GD16dKdq6EmB8hAwStJI4M/AKcCnW7WZBUySNIPsdNiLEdECfCP/QdKRwHkOEzPrS2688cai8+fOnVt0/lNPPZW8hh4TKBGxUdIk4E6gH3BDRCyWdE6+/BpgNnAcsAx4DTiju+o1M7PN9ZhAAYiI2WShUTjvmoLPAfxdB9uYD8yvQnlmZtaOnnRR3szMapgDxczMknCgmJlZEg4UMzNLwoFiZtYLlDN8/Zw5czjooIPYb7/9OOigg5g3b16SGhwoZma9QDnD1w8ZMoTbb7+dRYsWMW3aNE499dQkNThQzMx6gXKGrz/ggAMYPnw4AO9///vZsGEDr7/+eqdr6FHPoZiZ1bxfN8Ezi9Juc+f9YPzUslcrZfj6W265hQMOOICtt96602U6UMzM+qjFixczZcoU7rrrriTbc6CYmaVUQU+iWtobvr65uZmTTjqJ6dOns8ceeyTZn6+hmJn1Um0NX79+/XqOP/54Lr30Uj70oQ8l258DxcysF5g4cSKHHXYYS5cupb6+nuuvv56mpibmzJnDqFGjmDNnDk1NTQBceeWVLFu2jEsuuYQxY8YwZsyYJK8HVjbeYt/U2NgYCxYs6O4yzKzGLVmyhH322ae7y6iKYscm6eGIaGzd1j0UMzNLwoFiZmZJOFDMzCwJB4qZmSXhQDEzsyQcKGZmloQDxcysFyhn+Prf//737zx/sv/++3PrrbcmqcGBYmbWC5QzfP2+++7LggULWLhwIXfccQdf/OIX2bhxY6drcKCYmfUC5Qxfv80227DlltlQjhs2bEBSkho8OKSZWUKX/f4y/vT8n5Juc+/t92bKwVPKXq+94esffPBBzjzzTFauXMlPf/rTdwKmM9xDMTPrgw455BAWL17MQw89xKWXXsqGDRs6vU33UMzMEqqkJ1Et7Q1fv8k+++zDgAEDeOyxx2hsfNfwXGVxD8XMrJdqa/j6FStWvHMRfuXKlSxdupSGhoZO7889FDOzXmDixInMnz+ftWvXUl9fz0UXXURTUxMnn3wy119/PSNGjOCmm24C4Le//S1Tp06lf//+bLHFFlx99dUMGTKk0zV4+HoPX29mneTh6zM+5WVmZkk4UMzMLIkeFSiSjpW0VNIySU1FlkvSFfnyRyUdmM/fVdJvJC2RtFjSV7u+ejOzvq3HBIqkfsBVwHhgNDBR0uhWzcYDo/Kfs4F/y+dvBL4eEfsAhwJ/V2RdMzOroh4TKMDBwLKIWB4RbwAzgAmt2kwApkfmAWCwpGER0RIRfwCIiJeBJcAuXVm8mVlf15MCZRdgVcF0M+8OhQ7bSGoADgAeTF+imZm1pScFSrHRyVrf09xuG0kDgVuAf4iIl4ruRDpb0gJJC9asWVNxsWZmPUk5w9dv8vTTTzNw4EAuv/zyJDV0GCiSRpT4895O1tIM7FowXQ+sLrWNpP5kYfLziPhlWzuJiGsjojEiGocOHdrJks3MeoZyhq/f5Nxzz2X8+PHJaijlSflpZL2A9sY3DuAnwPRO1PIQMErSSODPwCnAp1u1mQVMkjQDOAR4MSJalI29fD2wJCL+XydqMDOrSWPHjuWpp57abN5tt93G/PnzgWz4+iOPPJLLLrsMgJkzZ7L77rszYMCAZDV0GCgRcVTreZJ2johnklWR7WejpEnAnUA/4IaIWCzpnHz5NcBs4DhgGfAacEa++oeAU4FFkhbm886PiNkpazQz68gz3/sery9JO3z91vvszc7nn1/2em0NX//qq69y2WWXMWfOnGSnu6Dysbw+B/xzsipyeQDMbjXvmoLPAfxdkfV+S/s9KDMzy11wwQWce+65DBw4MOl2Kw2UCZJeA+ZExNKUBZmZ1bJKehLV0tbw9Q8++CA333wzkydPZv369WyxxRbU1dUxadKkTu2v0kD5P2S35p4kac+I+HynqjAzs+Q2DV/f1NS02fD199577zttLrzwQgYOHNjpMIEKAyUingXuyH/MzKyblTN8fbVUFCiSrgIGRMTpkj4SEXclrsvMzMpw4403Fp0/d+7cdte78MILk9VQ6YONbwDL889HJ6rFzMxqWKWB8hqwbf4w4YiE9ZiZWY2q9KL888BfyEYHvi9dOWZmtSkiyJ6x7j3KfaNvWT0USYMl/QfwiXzWdOBdr4E0M+tL6urqWLduXdlfwD1ZRLBu3Trq6upKXqesHkpErJc0FWgA1gIfANocN8vMrC+or6+nubmZ3jbgbF1dHfX19SW3r+SU11nAioi4E3i4gvXNzHqV/v37M3LkyO4uo9tVEigvAOdIeh/wCLAwIv6YtiwzM6s1ZQdKRFwqaS7wP8AYYCzgQDEz6+PKDhRJF5ONBryQrHcyP3FNZmZWgyrpoXxb0k5kY3l9QtIeEfGF9KWZmVktqfQ5lC8C/x4RHsvLzMyAygPlBuBLkgaQvXJ3YbqSzMysFlU69Mrfk4XRlsAV6coxM7NaVWmgPAnUAbdFxNiE9ZiZWY2qNFAWA/OAsyQ9lLAeMzOrUZVeQ9kLWANcS/ago5mZ9XGV9lD2JnuY8Tzg7HTlmJlZrao0UAYDU4DJwIZk1ZiZWc2q9JTXxcDeEbFU0tspCzIzs9pUUg9FUj9JLZI+DxARzRFxd/65qZoFmplZbSgpUCLiLeAxYI/qlmNmZrWqnFNe2wCTJY0DVufzIiImpC/LzMxqTTmBclj+54H5D0Dved+lmZl1SjmB4teRmZlZm0oOlIhYWc1CzMystlX6HIqZmdlmHChmZpZE2YEi6YRqFJJv+1hJSyUtk/Su51uUuSJf/qikA0td18zMqquSHsp3k1dB9vAkcBUwHhgNTJQ0ulWz8cCo/Ods4N/KWNfMzKqokqFXlLyKzMHAsohYDiBpBjABeLygzQRgekQE8ICkwZKGAQ0lrJvMf513Ilv/aUU1Nm1m1iW2/ewZHHXK15Jus5JAqdazJ7sAqwqmm4FDSmizS4nrAiDpbPIRkkeMGFFRofHierZ9YWNF65qZ9QSvv5z+zSOVDg5ZDcV6Pq3Dq602paybzYy4luw9LjQ2NlYUjqdcd08lq5mZ9Wo9KVCagV0Lpuv56xAvHbXZqoR1zcysiiq5KP9s8ioyDwGjJI2UtBVwCjCrVZtZwOfyu70OBV6MiJYS1zUzsyoqu4cSEeOqUUhEbJQ0CbgT6AfcEBGLJZ2TL78GmA0cBywDXgPOaG/datRpZmbFKbthqm9qbGyMBQsWdHcZZmY1RdLDEdHYer6flDczsyQqChRJXyv4/L505ZiZWa0q6xqKpMHAD4G9JW0AHgXOIr+WYWZmfVdZgRIR64EzJB0PPAN8BPhlFeoyM7MaU+k1lCPIbh8+FKjKXV9mZlZbKg2UwcAUYDKwIVk1ZmZWsyp9Uv5iYO+IWCrp7ZQFmZlZbaooUCKimWwYFCLC7x4xM7OKbxu+StJP8s8fSVqRmZnVpEqvobwBLM8/H52oFjMzq2GVBsprwLaS+gOVvVTEzMx6lUovyj8P/IXstbv3pSvHzMxqVVk9lPyVu/8BfCKfNR141wBhZmbW95T9pLykqWTvcF8LfAA/KW9mZlR2yussYEVE3Ak8nLgeMzOrUZUEygvAOfkow48ACyPij2nLMjOzWlPJGxsvlTQX+B9gDDAWcKCYmfVxZQeKpIvJXrO7kKx3Mj9xTWZmVoPKfg4lIr4NvJ6v+wlJ1yWvyszMak6lDzbeAOwD7ABcna4cMzOrVZUGyt+TnS7bEviXdOWYmVmtqjRQngTqgNsiYmzCeszMrEZVGiiLgXnAWZIeSliPmZnVqErH8tqD7HmUa/M/zcysj6s0UFZFxDxJw4DnUhZkZma1qdJTXsdKqgeuAX6YsB4zM6tRlQbKYGAKMJnsmRQzM+vjKj3ldTGwd0QslfRWyoLMzKw2ldRDkdRPUoukzwNERHNE3J1/bqpmgWZmVhtKCpSIeAt4jOzuLjMzs3cp5xrKNsBkSQskzcp/bktRhKTtJc2R9ET+53ZttDtW0lJJyyQ1Fcz/vqQ/SXpU0q2SBqeoy8zMSldOoBwGCDgQ+FjBTwpNwNyIGAXMzac3I6kf2TvsxwOjgYmSRueL5wD7RsQHyIbV/0aiuszMrETlXJQfWbUqYAJwZP55GjCf7C6yQgcDyyJiOYCkGfl6j0fEXQXtHgA+WcVazcysiA4DRdKI/GN0sHx9RLxUYR07RUQLQES0SNqxSJtdgFUF083AIUXanQn8V4V1mJlZhUrpoUwjCxO10yaAnwDT22og6W5g5yKLvllCDbSx/81CTtI3gY3Az9up42zgbIARI0a01czMzMrUYaBExFEpdhQRH25rmaRnJQ3LeydtDefSDOxaMF0PrC7Yxmlk13SOiYiivam8jmvJxiCjsbGxzXZmZlaeSp+UT20WcFr++TSg2N1jDwGjJI2UtBVwSr4eko4lu+ZyYkS81gX1mplZKz0lUKYC4yQ9AYzLp5E0XNJsgIjYCEwC7gSWAL+IiMX5+lcCg4A5khZKuqarD8DMrK+rdOiVpCJiHXBMkfmrgeMKpmcDs4u027OqBZqZWYd6Sg/FzMxqnAPFzMyScKCYmVkSDhQzM0vCgWJmZkk4UMzMLAkHipmZJeFAMTOzJBwoZmaWhAPFzMyScKCYmVkSDhQzM0vCgWJmZkk4UMzMLAkHipmZJeFAMTOzJBwoZmaWhAPFzMyScKCYmVkSDhQzM0vCgWJmZkk4UMzMLAkHipmZJeFAMTOzJBwoZmaWhAPFzMyScKCYmVkSDhQzM0vCgWJmZkk4UMzMLAkHipmZJdEjAkXS9pLmSHoi/3O7NtodK2mppGWSmoosP09SSBpS/arNzKxQjwgUoAmYGxGjgLn59GYk9QOuAsYDo4GJkkYXLN8VGAc83SUVm5nZZnpKoEwApuWfpwEfL9LmYGBZRCyPiDeAGfl6m/wQmAxEFes0M7M29JRA2SkiWgDyP3cs0mYXYFXBdHM+D0knAn+OiEc62pGksyUtkLRgzZo1na/czMwA2LKrdiTpbmDnIou+WeomiswLSdvk2/hIKRuJiGuBawEaGxvdmzEzS6TLAiUiPtzWMknPShoWES2ShgHPFWnWDOxaMF0PrAb2AEYCj0jaNP8Pkg6OiGeSHYCZmbWrp5zymgWcln8+DbitSJuHgFGSRkraCjgFmBURiyJix4hoiIgGsuA50GFiZta1ekqgTAXGSXqC7E6tqQCShkuaDRARG4FJwJ3AEuAXEbG4m+o1M7NWuuyUV3siYh1wTJH5q4HjCqZnA7M72FZD6vrMzKxjPaWHYmZmNc6BYmZmSThQzMwsCQeKmZkl4UAxM7MkHChmZpaEA8XMzJJwoJiZWRIOFDMzS8KBYmZmSThQzMwsCQeKmZkl4UAxM7MkHChmZpaEA8XMzJJwoJiZWRIOFDMzS8KBYmZmSThQzMwsCQeKmZkl4UAxM7MkHChmZpaEA8XMzJJwoJiZWRKKiO6uodtIWgOsrHD1IcDahOXUAh9z3+Bj7hs6c8y7RcTQ1jP7dKB0hqQFEdHY3XV0JR9z3+Bj7huqccw+5WVmZkk4UMzMLAkHSuWu7e4CuoGPuW/wMfcNyY/Z11DMzCwJ91DMzCwJB4qZmSXhQOmApGMlLZW0TFJTkeWSdEW+/FFJB3ZHnSmVcMyfyY/1UUn3S9q/O+pMqaNjLmj3N5LekvTJrqwvtVKOV9KRkhZKWizp/3d1jamV8N/1tpJul/RIfsxndEedKUm6QdJzkh5rY3na76+I8E8bP0A/4Elgd2Ar4BFgdKs2xwG/BgQcCjzY3XV3wTF/ENgu/zy+LxxzQbt5wGzgk91dd5X/jQcDjwMj8ukdu7vuLjjm84HL8s9DgeeBrbq79k4e91jgQOCxNpYn/f5yD6V9BwPLImJ5RLwBzAAmtGozAZgemQeAwZKGdXWhCXV4zBFxf0S8kE8+ANR3cY2plfLvDPAV4Bbgua4srgpKOd5PA7+MiKcBIqIvHHMAgyQJGEgWKBu7tsy0IuIesuNoS9LvLwdK+3YBVhVMN+fzym1TS8o9nrPIfsOpZR0es6RdgJOAa7qwrmop5d94L2A7SfMlPSzpc11WXXWUcsxXAvsAq4FFwFcj4u2uKa/bJP3+2rLT5fRuKjKv9X3WpbSpJSUfj6SjyALl8KpWVH2lHPOPgCkR8Vb2C2xNK+V4twQOAo4B3gP8TtIDEfE/1S6uSko55o8CC4GjgT2AOZLujYiXqlxbd0r6/eVAaV8zsGvBdD3Zby/ltqklJR2PpA8APwbGR8S6LqqtWko55kZgRh4mQ4DjJG2MiJldUmFapf53vTYiXgVelXQPsD9Qq4FSyjGfAUyN7OLCMkkrgL2B33dNid0i6feXT3m17yFglKSRkrYCTgFmtWozC/hcfrfEocCLEdHS1YUm1OExSxoB/BI4tYZ/Yy3U4TFHxMiIaIiIBuBm4Ms1GiZQ2n/XtwF/K2lLSdsAhwBLurjOlEo55qfJemRI2gl4H7C8S6vsekm/v9xDaUdEbJQ0CbiT7C6RGyJisaRz8uXXkN3xcxywDHiN7LecmlXiMX8b2AG4Ov+NfWPU8EitJR5zr1HK8UbEEkl3AI8CbwM/joiit57WghL/jS8BfiJpEdmpoCkRUdND2ku6ETgSGCKpGbgA6A/V+f7y0CtmZpaET3mZmVkSDhQzM0vCgWJmZkk4UMzMLAkHipmZJeFAMUtE0mBJXy6YHi7p5irt6+OSvt1Bm8slHV2N/ZsV49uGzRKR1AD8KiL27YJ93Q+c2N5zEpJ2A66LiI9Uux4zcA/FLKWpwB75O0S+L6lh03soJJ0uaWb+vo0VkiZJ+pqkP0p6QNL2ebs9JN2RD8h4r6S9W+9E0l7A6xGxVtKgfHv982XvlfSUpP4RsRLYQdLOXfh3YH2YA8UsnSbgyYgYExH/WGT5vmTDwh8MfBd4LSIOAH4HbBrN91rgKxFxEHAecHWR7XwI+ANARLwMzAeOz5edAtwSEW/m03/I25tVnYdeMes6v8kD4GVJLwK35/MXAR+QNJDs5WU3FYxovHWR7QwD1hRM/xiYDMwkGzrjCwXLngOGpzoAs/Y4UMy6zusFn98umH6b7P/FLYD1ETGmg+38Bdh200RE3JefXjsC6NdqzK26vL1Z1fmUl1k6LwODKl05f+/GCkmfgnfe971/kaZLgD1bzZsO3Aj8R6v5ewE1O6ij1RYHilki+Xth7pP0mKTvV7iZzwBnSXoEWEzxVxHfAxygzd/09XNgO7JQASC/UL8nsKDCWszK4tuGzWqQpH8Bbo+Iu/PpTwITIuLUgjYnAQdGxD91U5nWx/gaillt+h7ZS6+Q9K/AeLL3WhTaEvhBF9dlfZh7KGZmloSvoZiZWRIOFDMzS8KBYmZmSThQzMwsCQeKmZkl8b+j0m08j6dtgAAAAABJRU5ErkJggg==\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", diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index fb8afa131..24af7fd6e 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -19,13 +19,13 @@ module subroutine eucl_dist_index_plpl(self) npl = int(self%nbody, kind=I8B) associate(nplpl => self%nplpl) nplpl = (npl * (npl - 1) / 2) ! number of entries in a strict lower triangle, nplm x npl, minus first column - if (allocated(self%k_eucl)) deallocate(self%k_eucl) ! Reset the index array if it's been set previously - allocate(self%k_eucl(2, nplpl)) + if (allocated(self%k_plpl)) deallocate(self%k_plpl) ! Reset the index array if it's been set previously + allocate(self%k_plpl(2, nplpl)) do i = 1, npl counter = (i - 1_I8B) * npl - i * (i - 1_I8B) / 2_I8B + 1_I8B do j = i + 1_I8B, npl - self%k_eucl(1, counter) = i - self%k_eucl(2, counter) = j + self%k_plpl(1, counter) = i + self%k_plpl(2, counter) = j counter = counter + 1_I8B end do end do @@ -34,17 +34,4 @@ module subroutine eucl_dist_index_plpl(self) end subroutine eucl_dist_index_plpl - module subroutine eucl_dist_index_pltp(self, pl) - !! author: Jacob R. Elliott and David A. Minton - !! - !! Turns i,j indices into k index for use in the Euclidean distance matrix - !! - !! Reference: - !! - !! Mélodie Angeletti, Jean-Marie Bonny, Jonas Koko. Parallel Euclidean distance matrix computation on big datasets *. - !! 2019. hal-0204751 implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_pl), intent(inout) :: pl !! Swiftest massive body object - end subroutine eucl_dist_index_pltp - end submodule s_eucl diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 61cd560bb..efad4702a 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -18,7 +18,7 @@ module pure subroutine kick_getacch_int_pl(self) associate(pl => self, npl => self%nbody, nplpl => self%nplpl) do k = 1, nplpl - associate(i => pl%k_eucl(1, k), j => pl%k_eucl(2, k)) + associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) dx(:) = pl%xh(:, j) - pl%xh(:, i) rji2 = dot_product(dx(:), dx(:)) irij3 = 1.0_DP / (rji2 * sqrt(rji2)) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index bf2a0cebd..8d0fb1f18 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -54,7 +54,7 @@ module rmvs_classes !! RMVS test particle class type, public, extends(whm_tp) :: rmvs_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as rmvs_setup_tp and rmvs_spill_tp + !! component list, such as rmvs_setup_tp and rmvs_util_spill_tp ! encounter steps) logical, dimension(:), allocatable :: lperi !! planetocentric pericenter passage flag (persistent for a full rmvs time step) over a full RMVS time step) integer(I4B), dimension(:), allocatable :: plperP !! index of planet associated with pericenter distance peri (persistent over a full RMVS time step) @@ -70,11 +70,11 @@ module rmvs_classes private procedure, public :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered procedure, public :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: fill => rmvs_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: accel => rmvs_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -92,9 +92,9 @@ module rmvs_classes logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains private - procedure, public :: fill => rmvs_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface @@ -120,21 +120,21 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) logical :: lencounter !! Returns true if there is at least one close encounter end function rmvs_encounter_check_tp - module subroutine rmvs_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(inout) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_fill_pl + end subroutine rmvs_util_fill_pl - module subroutine rmvs_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_tp), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(inout) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_fill_tp + end subroutine rmvs_util_fill_tp module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters @@ -165,21 +165,21 @@ module subroutine rmvs_setup_tp(self,n) integer, intent(in) :: n !! Number of test particles to allocate end subroutine rmvs_setup_tp - module subroutine rmvs_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_spill_pl + end subroutine rmvs_util_spill_pl - module subroutine rmvs_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_spill_tp(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_spill_tp + end subroutine rmvs_util_spill_tp module subroutine rmvs_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fc2ca4d39..5c6b83bdc 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -8,7 +8,7 @@ module swiftest_classes private public :: discard_pl, discard_system, discard_tp public :: drift_all, drift_body, drift_one - public :: eucl_dist_index_plpl, eucl_dist_index_pltp + public :: eucl_dist_index_plpl public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & @@ -162,8 +162,6 @@ module swiftest_classes real(DP), dimension(:), allocatable :: omega !! Argument of pericenter real(DP), dimension(:), allocatable :: capm !! Mean anomaly real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) - integer(I4B), dimension(:,:), allocatable :: k_eucl !! Index array used to convert flattened the body-body comparison upper triangular matrix - integer(I8B) :: nplpl !! Number of body-body comparisons in the flattened upper triangular matrix !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains @@ -209,7 +207,9 @@ module swiftest_classes real(DP), dimension(:,:), allocatable :: rot !! Body rotation vector in inertial coordinate frame (units rad / TU) real(DP), dimension(:), allocatable :: k2 !! Tidal Love number real(DP), dimension(:), allocatable :: Q !! Tidal quality factor - real(DP), dimension(:), allocatable :: tlag !! Tidal phase lag + real(DP), dimension(:), allocatable :: tlag !! Tidal phase lag + integer(I4B), dimension(:,:), allocatable :: k_plpl !! Index array used to convert flattened the body-body comparison upper triangular matrix + integer(I8B) :: nplpl !! Number of body-body comparisons in the flattened upper triangular matrix !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_pl and util_spill_pl contains @@ -247,7 +247,6 @@ module swiftest_classes ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: eucl_index => eucl_dist_index_pltp !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and @@ -388,7 +387,7 @@ module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) real(DP), dimension(:), intent(in) :: mu !! Vector of gravitational constants real(DP), dimension(:,:), intent(inout) :: x, v !! Position and velocity vectors integer(I4B), intent(in) :: n !! number of bodies - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. integer(I4B), dimension(:), intent(out) :: iflag !! Vector of error flags. 0 means no problem @@ -416,12 +415,6 @@ module subroutine eucl_dist_index_plpl(self) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object end subroutine - module subroutine eucl_dist_index_pltp(self, pl) - implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_pl), intent(inout) :: pl !! Swiftest massive body object - end subroutine - module pure subroutine gr_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index a25304a26..16e8de302 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -121,7 +121,9 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains - procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** @@ -134,7 +136,8 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** @@ -306,5 +309,24 @@ module subroutine symba_step_reset_system(self) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object end subroutine symba_step_reset_system + + module subroutine symba_util_copy_pltpenc(self, source) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + end subroutine symba_util_copy_pltpenc + + module subroutine symba_util_copy_plplenc(self, source) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + end subroutine symba_util_copy_plplenc + + module subroutine symba_util_resize_pltpenc(self, nrequested) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + integer(I4B), intent(in) :: nrequested !! New size of list needed + end subroutine symba_util_resize_pltpenc + end interface end module symba_classes \ No newline at end of file diff --git a/src/rmvs/rmvs_spill_and_fill.f90 b/src/rmvs/rmvs_util.f90 similarity index 91% rename from src/rmvs/rmvs_spill_and_fill.f90 rename to src/rmvs/rmvs_util.f90 index ae0ff563b..e950ab714 100644 --- a/src/rmvs/rmvs_spill_and_fill.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -1,7 +1,7 @@ -submodule(rmvs_classes) s_rmvs_spill_and_fill +submodule(rmvs_classes) s_rmvs_util use swiftest contains - module subroutine rmvs_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -31,9 +31,9 @@ module subroutine rmvs_spill_pl(self, discards, lspill_list) return - end subroutine rmvs_spill_pl + end subroutine rmvs_util_spill_pl - module subroutine rmvs_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS massive body structure into an old one. @@ -62,9 +62,9 @@ module subroutine rmvs_fill_pl(self, inserts, lfill_list) return - end subroutine rmvs_fill_pl + end subroutine rmvs_util_fill_pl - module subroutine rmvs_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -98,9 +98,9 @@ module subroutine rmvs_spill_tp(self, discards, lspill_list) return - end subroutine rmvs_spill_tp + end subroutine rmvs_util_spill_tp - module subroutine rmvs_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS test particle structure into an old one. @@ -133,6 +133,6 @@ module subroutine rmvs_fill_tp(self, inserts, lfill_list) return - end subroutine rmvs_fill_tp + end subroutine rmvs_util_fill_tp -end submodule s_rmvs_spill_and_fill +end submodule s_rmvs_util diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 633973dba..bbbb798de 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -1,36 +1,72 @@ submodule (symba_classes) s_symba_encounter_check use swiftest contains - module function symba_encounter_check_pl(self, system, dt, irec) result(lencounter) + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA test particle object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level + class(symba_pl), intent(inout) :: self !! SyMBA test particle object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level ! Result - logical :: lencounter !! Returns true if there is at least one close encounter + logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - integer(I4B) :: i, j - real(DP) :: r2, v2, vdotr - real(DP), dimension(NDIM) :: xr, vr - real(DP) :: rcrit, r2crit - logical :: lflag - - associate(pl => self, npl => self%nbody) - lencounter = .false. - !do concurrent(j = 1:npl, .not.pl%lmtiny(j)) - ! do i = 1, npl - rcrit = (pl%rhill(i) + pl%rhill(j)) * RHSCALE * (RSHELL**(irec)) - r2crit = r2crit**2 + real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 + integer(I4B) :: j, nenc_old + integer(I8B) :: k + real(DP), dimension(NDIM) :: xr, vr + integer(I4B), dimension(:,:), allocatable :: ind + logical, dimension(:), allocatable :: lencounter, loc_lvdotr + + associate(pl => self, npl => self%nbody, nplpl => self%nplpl) + allocate(lencounter(nplpl), loc_lvdotr(nplpl)) + lencounter(:) = .false. + + term2 = RHSCALE * (RSHELL**irec) + + do k = 1, nplpl + associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) xr(:) = pl%xh(:, j) - pl%xh(:, i) + r2 = dot_product(xr(:), xr(:)) + r2crit = ((pl%rhill(i) + pl%rhill(i)) * term2)**2 vr(:) = pl%vh(:, j) - pl%vh(:, i) - v2 = dot_product(vr(:), vr(:)) vdotr = dot_product(vr(:), xr(:)) - lflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) - if (lflag) lencounter = .true. - ! end do - !end do + if (r2 < r2crit) then + lencounter(k) = .true. + loc_lvdotr(k) = (vdotr < 0.0_DP) + else + if (vdotr < 0.0_DP) then + v2 = dot_product(vr(:), vr(:)) + tmin = -vdotr / v2 + if (tmin < dt) then + r2min = r2 - vdotr * vdotr / v2 + else + r2min = r2 + 2 * vdotr * dt + v2 * dt * dt + end if + r2min = min(r2min, r2) + if (r2min <= r2crit) then + lencounter(k) = .true. + loc_lvdotr(k) = (vdotr < 0.0_DP) + end if + end if + end if + end associate + end do + + lany_encounter = any(lencounter(:)) + if (lany_encounter) then + associate(plplenc_list => system%plplenc_list, nenc => system%plplenc_list%nenc) + nenc_old = nenc + call plplenc_list%resize(nenc_old + count(lencounter(:))) + plplenc_list%status(nenc_old+1:nenc) = ACTIVE + plplenc_list%level(nenc_old+1:nenc) = irec + plplenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:), lencounter(:)) + plplenc_list%index1(nenc_old+1:nenc) = pack(pl%k_plpl(1,:), lencounter(:)) + plplenc_list%index2(nenc_old+1:nenc) = pack(pl%k_plpl(2,:), lencounter(:)) + pl%lencounter(plplenc_list%index1(nenc_old+1:nenc)) = .true. + pl%lencounter(plplenc_list%index2(nenc_old+1:nenc)) = .true. + end associate + end if end associate return end function symba_encounter_check_pl diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 94921f767..5ac26c220 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -1,7 +1,7 @@ submodule(symba_classes) s_symba_setup use swiftest contains - module subroutine symba_setup_pl(self,n) + module subroutine symba_setup_pl(self, n) !! author: David A. Minton !! !! Allocate SyMBA test particle structure @@ -43,7 +43,7 @@ module subroutine symba_setup_pl(self,n) return end subroutine symba_setup_pl - module subroutine symba_setup_pltpenc(self,n) + module subroutine symba_setup_pltpenc(self, n) !! author: David A. Minton !! !! A constructor that sets the number of encounters and allocates and initializes all arrays @@ -55,6 +55,11 @@ module subroutine symba_setup_pltpenc(self,n) self%nenc = n if (n == 0) return + if (allocated(self%lvdotr)) deallocate(self%lvdotr) + if (allocated(self%status)) deallocate(self%status) + if (allocated(self%level)) deallocate(self%level) + if (allocated(self%index1)) deallocate(self%index1) + if (allocated(self%index2)) deallocate(self%index2) allocate(self%lvdotr(n)) allocate(self%status(n)) allocate(self%level(n)) @@ -80,6 +85,10 @@ module subroutine symba_setup_plplenc(self,n) call symba_setup_pltpenc(self, n) if (n == 0) return + if (allocated(self%xh1)) deallocate(self%xh1) + if (allocated(self%xh2)) deallocate(self%xh2) + if (allocated(self%vb1)) deallocate(self%vb1) + if (allocated(self%vb2)) deallocate(self%vb2) allocate(self%xh1(NDIM,n)) allocate(self%xh2(NDIM,n)) allocate(self%vb1(NDIM,n)) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 new file mode 100644 index 000000000..81b351e65 --- /dev/null +++ b/src/symba/symba_util.f90 @@ -0,0 +1,67 @@ +submodule(symba_classes) s_symba_util + use swiftest +contains + module subroutine symba_util_copy_pltpenc(self, source) + !! author: David A. Minton + !! + !! Copies elements from the source encounter list into self. + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + + associate(n => source%nenc) + self%nenc = n + self%lvdotr(1:n) = source%lvdotr(1:n) + self%status(1:n) = source%status(1:n) + self%level(1:n) = source%level(1:n) + self%index1(1:n) = source%index1(1:n) + self%index2(1:n) = source%index2(1:n) + end associate + end subroutine symba_util_copy_pltpenc + + module subroutine symba_util_copy_plplenc(self, source) + !! author: David A. Minton + !! + !! Copies elements from the source encounter list into self. + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + + call symba_util_copy_pltpenc(self, source) + associate(n => source%nenc) + select type(source) + class is (symba_plplenc) + self%xh1(:,1:n) = source%xh1(:,1:n) + self%xh2(:,1:n) = source%xh2(:,1:n) + self%vb1(:,1:n) = source%vb1(:,1:n) + self%vb2(:,1:n) = source%vb2(:,1:n) + end select + end associate + end subroutine symba_util_copy_plplenc + + module subroutine symba_util_resize_pltpenc(self, nrequested) + !! author: David A. Minton + !! + !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. + !! Polymorphic method works on both symba_pltpenc and symba_plplenc types + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + integer(I4B), intent(in) :: nrequested !! New size of list needed + ! Internals + class(symba_pltpenc), allocatable :: enc_temp + integer(I4B) :: nold + + nold = size(self%status) + if (nrequested <= nold) return + allocate(enc_temp, source=self) + call self%setup(2 * nrequested) + call self%copy(enc_temp) + deallocate(enc_temp) + return + end subroutine symba_util_resize_pltpenc + + +end submodule s_symba_util \ No newline at end of file From aa715db71d3e92b71ddea1e0e22f7469ac6078a8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 01:56:51 -0400 Subject: [PATCH 043/194] Refactored whm spill and fill methods as part of a util submodule --- src/modules/whm_classes.f90 | 16 ++++++++-------- src/rmvs/rmvs_util.f90 | 4 ++-- src/whm/{whm_spill_and_fill.f90 => whm_util.f90} | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) rename src/whm/{whm_spill_and_fill.f90 => whm_util.f90} (93%) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index a1f501a10..ef2487aa6 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -28,13 +28,13 @@ module whm_classes real(DP), dimension(:), allocatable :: muj !! Jacobi mu: GMcb * eta(i) / eta(i - 1) real(DP), dimension(:), allocatable :: ir3j !! Third term of heliocentric acceleration !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_setup_pl and whm_spill_pl + !! component list, such as whm_setup_pl and whm_util_spill_pl contains procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure, public :: fill => whm_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: accel => whm_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure, public :: accel_gr => whm_gr_getacch_pl !! Acceleration term arising from the post-Newtonian correction procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction @@ -42,7 +42,7 @@ module whm_classes procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. procedure, public :: set_ir3 => whm_setup_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize - procedure, public :: spill => whm_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -52,7 +52,7 @@ module whm_classes !! WHM test particle class type, public, extends(swiftest_tp) :: whm_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_setup_tp and whm_spill_tp + !! component list, such as whm_setup_tp and whm_util_spill_tp contains private procedure, public :: accel => whm_getacch_tp !! Compute heliocentric accelerations of test particles @@ -106,13 +106,13 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine whm_drift_pl - module subroutine whm_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(inout) :: inserts !! inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine whm_fill_pl + end subroutine whm_util_fill_pl !> Get heliocentric accelration of massive bodies module subroutine whm_getacch_pl(self, system, param, t, lbeg) @@ -219,13 +219,13 @@ module subroutine whm_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_step_tp - module subroutine whm_spill_pl(self, discards, lspill_list) + module subroutine whm_util_spill_pl(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine whm_spill_pl + end subroutine whm_util_spill_pl !> Steps the Swiftest nbody system forward in time one stepsize module subroutine whm_step_system(self, param, t, dt) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index e950ab714..0781c6429 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -23,7 +23,7 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) if (count(.not.lspill_list(:)) > 0) then keeps%nenc(:) = pack(keeps%nenc(:), .not. lspill_list(:)) end if - call whm_spill_pl(keeps, discards, lspill_list) + call whm_util_spill_pl(keeps, discards, lspill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select @@ -54,7 +54,7 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) keeps%nenc(:) = unpack(keeps%nenc(:), .not.lfill_list(:), keeps%nenc(:)) keeps%nenc(:) = unpack(inserts%nenc(:), lfill_list(:), keeps%nenc(:)) - call whm_fill_pl(keeps, inserts, lfill_list) + call whm_util_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select diff --git a/src/whm/whm_spill_and_fill.f90 b/src/whm/whm_util.f90 similarity index 93% rename from src/whm/whm_spill_and_fill.f90 rename to src/whm/whm_util.f90 index f5edf894c..275130df9 100644 --- a/src/whm/whm_spill_and_fill.f90 +++ b/src/whm/whm_util.f90 @@ -1,7 +1,7 @@ -submodule(whm_classes) s_whm_spill_and_fill +submodule(whm_classes) s_whm_util use swiftest contains - module subroutine whm_spill_pl(self, discards, lspill_list) + module subroutine whm_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) WHM test particle structure from active list to discard list @@ -42,9 +42,9 @@ module subroutine whm_spill_pl(self, discards, lspill_list) return - end subroutine whm_spill_pl + end subroutine whm_util_spill_pl - module subroutine whm_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new WHM test particle structure into an old one. @@ -87,6 +87,6 @@ module subroutine whm_fill_pl(self, inserts, lfill_list) return - end subroutine whm_fill_pl + end subroutine whm_util_fill_pl -end submodule s_whm_spill_and_fill +end submodule s_whm_util From 9a201c484770c9905a33732ebca76647f1f0f157 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 02:33:06 -0400 Subject: [PATCH 044/194] Added pl-tp close encounter code --- src/modules/symba_classes.f90 | 9 ++-- src/symba/symba_encounter_check.f90 | 69 ++++++++++++++++++++++++++--- src/symba/symba_step.f90 | 11 +++-- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 16e8de302..4edad0767 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -175,21 +175,22 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_tp - module function symba_encounter_check_pl(self, system, dt, irec) result(lencounter) + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) implicit none class(symba_pl), intent(inout) :: self !! SyMBA test particle object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object real(DP), intent(in) :: dt !! step size - logical :: lencounter !! Returns true if there is at least one close encounter integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_pl - module function symba_encounter_check_tp(self, system, dt) result(lencounter) + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object real(DP), intent(in) :: dt !! step size - logical :: lencounter !! Returns true if there is at least one close encounter + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp module subroutine symba_io_dump_particle_info(self, param, msg) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index bbbb798de..e188e57ac 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -12,10 +12,9 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 - integer(I4B) :: j, nenc_old + integer(I4B) :: nenc_old integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr - integer(I4B), dimension(:,:), allocatable :: ind logical, dimension(:), allocatable :: lencounter, loc_lvdotr associate(pl => self, npl => self%nbody, nplpl => self%nplpl) @@ -71,16 +70,76 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl - module function symba_encounter_check_tp(self, system, dt) result(lencounter) + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) implicit none ! Arguments class(symba_tp), intent(inout) :: self !! SyMBA test particle object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level ! Result - logical :: lencounter !! Returns true if there is at least one close encounter + logical :: lany_encounter !! Returns true if there is at least one close encounter + ! Internals + real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 + integer(I4B) :: i, j, nenc_old + real(DP), dimension(NDIM) :: xr, vr + logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr + + associate(tp => self, ntp => self%nbody, pl => system%pl, npl => system%pl%nbody) + allocate(lencounter(npl, ntp), loc_lvdotr(npl, ntp)) + lencounter(:,:) = .false. + + term2 = RHSCALE * (RSHELL**irec) + + do j = 1, ntp + do i = 1, npl + xr(:) = tp%xh(:, j) - pl%xh(:, i) + r2 = dot_product(xr(:), xr(:)) + r2crit = (pl%rhill(i) * term2)**2 + vr(:) = tp%vh(:, j) - pl%vh(:, i) + vdotr = dot_product(vr(:), xr(:)) + if (r2 < r2crit) then + lencounter(i,j) = .true. + loc_lvdotr(i,j) = (vdotr < 0.0_DP) + else + if (vdotr < 0.0_DP) then + v2 = dot_product(vr(:), vr(:)) + tmin = -vdotr / v2 + if (tmin < dt) then + r2min = r2 - vdotr * vdotr / v2 + else + r2min = r2 + 2 * vdotr * dt + v2 * dt * dt + end if + r2min = min(r2min, r2) + if (r2min <= r2crit) then + lencounter(i,j) = .true. + loc_lvdotr(i,j) = (vdotr < 0.0_DP) + end if + end if + end if + end do + end do - lencounter = .false. + lany_encounter = any(lencounter(:,:)) + if (lany_encounter) then + associate(pltpenc_list => system%pltpenc_list, nenc => system%pltpenc_list%nenc) + nenc_old = nenc + call pltpenc_list%resize(nenc_old + count(lencounter(:,:))) + pltpenc_list%status(nenc_old+1:nenc) = ACTIVE + pltpenc_list%level(nenc_old+1:nenc) = irec + pltpenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) + !********************************************************************************************************* + ! This needs to be tested + pltpenc_list%index1(nenc_old+1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) + pltpenc_list%index2(nenc_old+1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) + !********************************************************************************************************* + select type(pl) + class is (symba_pl) + pl%lencounter(pltpenc_list%index1(nenc_old+1:nenc)) = .true. + end select + end associate + end if + end associate return end function symba_encounter_check_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 631c8c087..3f042fbd6 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -16,14 +16,14 @@ module subroutine symba_step_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize ! Internals - logical :: lencounter_pl, lencounter_tp, lencounter + logical :: lencounter call self%reset() select type(pl => self%pl) class is (symba_pl) select type(tp => self%tp) class is (symba_tp) - lencounter = pl%encounter_check(self, dt, 0) .or. tp%encounter_check(self, dt) + lencounter = pl%encounter_check(self, dt, 0) .or. tp%encounter_check(self, dt, 0) if (lencounter) then call self%interp(param, t, dt) else @@ -120,15 +120,14 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) dtl = param%dt / (NTENC**ireci) dth = 0.5_DP * dtl IF (dtl / param%dt < VSMALL) THEN - WRITE(*, *) "SWIFTEST Warning:" - WRITE(*, *) " In symba_step_recur_system, local time step is too small" - WRITE(*, *) " Roundoff error will be important!" + write(*, *) "SWIFTEST Warning:" + write(*, *) " In symba_step_recur_system, local time step is too small" + write(*, *) " Roundoff error will be important!" call util_exit(FAILURE) END IF irecp = ireci + 1 if (ireci == 0) then icflg = 0 - end if end associate From eb8fbe08605bbf2bfb6549289675469f351123da Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 10:56:31 -0400 Subject: [PATCH 045/194] Added new SyMBA examples and fixed bugs in encounter list resizing. --- .../1pl_1tp_encounter/.idea/.gitignore | 3 + .../1pl_1tp_encounter/cb.swiftest.in | Bin 0 -> 80 bytes .../1pl_1tp_encounter/init_cond.py | 178 +++++ .../1pl_1tp_encounter/param.swifter.in | 26 + .../1pl_1tp_encounter/param.swiftest.in | 29 + .../1pl_1tp_encounter/pl.swifter.in | 8 + .../1pl_1tp_encounter/pl.swiftest.in | Bin 0 -> 160 bytes .../swiftest_vs_swifter.ipynb | 138 ++++ .../1pl_1tp_encounter/tp.swifter.in | 4 + .../1pl_1tp_encounter/tp.swiftest.in | Bin 0 -> 128 bytes .../9pl_18tp_encounters/.idea/.gitignore | 3 + .../9pl_18tp_encounters/cb.in | 5 + .../9pl_18tp_encounters/cb.swiftest.in | 5 + .../9pl_18tp_encounters/init_cond.py | 132 +++ .../9pl_18tp_encounters/param.swifter.in | 26 + .../9pl_18tp_encounters/param.swiftest.in | 35 + .../9pl_18tp_encounters/pl.in | 33 + .../9pl_18tp_encounters/pl.swifter.in | 36 + .../9pl_18tp_encounters/pl.swiftest.in | 33 + .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 753 ++++++++++++++++++ .../9pl_18tp_encounters/tp.in | 49 ++ 21 files changed, 1496 insertions(+) create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/.idea/.gitignore create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in create mode 100755 examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swiftest.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in create mode 100755 examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/.idea/.gitignore b/examples/symba_swifter_comparison/1pl_1tp_encounter/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..96c7f920c5e7fef09dc566576eaaa5d9558f556a GIT binary patch literal 80 zcmd;JKmZOP6NHU2HoW29>+AsI-}OJ>6US3*592@Z;<0ya=(U6Km+C}0t1mX$2jT+& D!jTPC literal 0 HcmV?d00001 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py new file mode 100755 index 000000000..b292ed42f --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +""" +For testing RMVS, the code generates clones of test particles based on one that is fated to impact Mercury. +To use the script, modify the variables just after the "if __name__ == '__main__':" line +""" +import numpy as np +import swiftest +from scipy.io import FortranFile +import sys + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_tp = "tp.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_tp = "tp.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.dat" +swiftest_enc = "enc.swiftest.dat" + +MU2KG = swiftest.MSun +TU2S = swiftest.YR2S +DU2M = swiftest.AU2M + +GMSun = swiftest.GMSunSI * TU2S**2 / DU2M**3 + +# Simple initial conditions of a circular planet with one test particle in a close encounter state +# Simulation start, stop, and output cadence times +t_0 = 0 # simulation start time +deltaT = 0.25 * swiftest.JD2S / TU2S # simulation step size +end_sim = 0.15 +t_print = deltaT #output interval to print results + +iout = int(np.ceil(t_print / deltaT)) +rmin = swiftest.RSun / swiftest.AU2M +rmax = 1000.0 + +npl = 1 +plid = 2 +tpid = 100 + +radius = np.double(4.25875607065041e-05) +mass = np.double(0.00012002693582795244940133) +apl = np.longdouble(1.0) +atp = np.longdouble(1.01) +vpl = np.longdouble(2 * np.pi) +vtp = np.longdouble(2 * np.pi / np.sqrt(atp)) + +p_pl = np.array([apl, 0.0, 0.0], dtype=np.double) +v_pl = np.array([0.0, vpl, 0.0], dtype=np.double) + +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 + +#Make Swifter files +plfile = open(swifter_pl, 'w') +print(npl+1, f'! Planet input file generated using init_cond.py',file=plfile) +print(1,GMSun,file=plfile) +print('0.0 0.0 0.0',file=plfile) +print('0.0 0.0 0.0',file=plfile) +print(plid,"{:.23g}".format(mass),Rhill, file=plfile) +print(radius, file=plfile) +print(*p_pl, file=plfile) +print(*v_pl, file=plfile) +plfile.close() + +tpfile = open(swifter_tp, 'w') +print(1,file=tpfile) +print(tpid, file=tpfile) +print(*p_tp, file=tpfile) +print(*v_tp, file=tpfile) +tpfile.close() + +sys.stdout = open(swifter_input, "w") +print(f'! Swifter input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'PL_IN {swifter_pl}') +print(f'TP_IN {swifter_tp}') +print(f'IN_TYPE ASCII') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swifter_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT UNKNOWN') +print(f'J2 {swiftest.J2Sun}') +print(f'J4 {swiftest.J4Sun}') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swifter_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'RHILL_PRESENT yes') +sys.stdout = sys.__stdout__ + +#Now make Swiftest files +cbfile = FortranFile(swiftest_cb, 'w') +Msun = np.double(1.0) +cbfile.write_record(0) +cbfile.write_record(np.double(GMSun)) +cbfile.write_record(np.double(rmin)) +cbfile.write_record(np.double(swiftest.J2Sun)) +cbfile.write_record(np.double(swiftest.J4Sun)) +cbfile.close() + +plfile = FortranFile(swiftest_pl, 'w') +plfile.write_record(npl) + +plfile.write_record(plid) +plfile.write_record(p_pl[0]) +plfile.write_record(p_pl[1]) +plfile.write_record(p_pl[2]) +plfile.write_record(v_pl[0]) +plfile.write_record(v_pl[1]) +plfile.write_record(v_pl[2]) +plfile.write_record(mass) +plfile.write_record(radius) +plfile.close() +tpfile = FortranFile(swiftest_tp, 'w') +ntp = 1 +tpfile.write_record(ntp) +tpfile.write_record(tpid) +tpfile.write_record(p_tp[0]) +tpfile.write_record(p_tp[1]) +tpfile.write_record(p_tp[2]) +tpfile.write_record(v_tp[0]) +tpfile.write_record(v_tp[1]) +tpfile.write_record(v_tp[2]) + +tpfile.close() + +sys.stdout = open(swiftest_input, "w") +print(f'! Swiftest input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'CB_IN {swiftest_cb}') +print(f'PL_IN {swiftest_pl}') +print(f'TP_IN {swiftest_tp}') +print(f'IN_TYPE REAL8') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swiftest_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT REPLACE') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swiftest_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'ROTATION no') +print(f'GR no') +print(f'MU2KG {MU2KG}') +print(f'DU2M {DU2M}') +print(f'TU2S {TU2S}') + + + + + diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in new file mode 100644 index 000000000..d1a0c9f27 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in @@ -0,0 +1,26 @@ +! Swifter input file generated using init_cond.py +T0 0 +TSTOP 0.15 +DT 0.0006844626967830253 +PL_IN pl.swifter.in +TP_IN tp.swifter.in +IN_TYPE ASCII +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swifter.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT UNKNOWN +J2 2.198e-07 +J4 -4.805e-09 +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swifter.dat +EXTRA_FORCE no +BIG_DISCARD no +RHILL_PRESENT yes diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in new file mode 100644 index 000000000..36937896f --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -0,0 +1,29 @@ +! Swiftest input file generated using init_cond.py +T0 0 +TSTOP 0.15 +DT 0.0006844626967830253 +CB_IN cb.swiftest.in +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +IN_TYPE REAL8 +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swiftest.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT REPLACE +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swiftest.dat +EXTRA_FORCE no +BIG_DISCARD no +ROTATION no +GR no +MU2KG 1.988409870698051e+30 +DU2M 149597870700.0 +TU2S 31557600.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in new file mode 100644 index 000000000..95513c9fd --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in @@ -0,0 +1,8 @@ +2 ! Planet input file generated using init_cond.py +1 39.476926408897625196 +0.0 0.0 0.0 +0.0 0.0 0.0 +2 0.00012002693582795244940133 0.010044724833237891545 +4.25875607065041e-05 +1.0 0.0 0.0 +0.0 6.283185307179586 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..6f4bc1337f56833a126ada00c5685c950d805447 GIT binary patch literal 160 zcmd;JU|?VbVi4efVkR&T!G~}^*u&(Z(s1>J_!7DiVUnUPXU&wqy KA!7&|m=6Gu{s@Zz literal 0 HcmV?d00001 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 new file mode 100644 index 000000000..2c1c7d294 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -0,0 +1,138 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import swiftest\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 1.355e-01\n", + "Creating Dataset\n", + "Successfully converted 199 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftersim = swiftest.Simulation(param_file=\"param.swifter.in\", codename=\"Swifter\")\n", + "swiftersim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.506e-01\n", + "Creating Dataset\n", + "Successfully converted 221 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", + "swiftestsim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestsim.ds - swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (y)'})\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvVUlEQVR4nO3dd3hUZdrH8e+dAqGEFhIIhCZF6RBCQEAQEaWoCChNkSqLiorIuuzq+trWuq66KxZkUVQwIgqCIFhAERElIIo0pUogEDqEEjKZ+/1jRjZigEzIyZTcn+vKlTnnPM/ML2Vy57TnEVXFGGOMya8wfwcwxhgTXKxwGGOM8YkVDmOMMT6xwmGMMcYnVjiMMcb4JMLfAQpT5cqVtXbt2v6OYYwxQWPlypX7VDXWlz4hVThq165Namqqv2MYY0zQEJHtvvaxQ1XGGGN8YoXDGGOMT6xwGGOM8Ymj5zhEpBvwAhAOTFbVJ8/Y3gt4FHADLmCsqi71btsGHAVyAJeqJhUkQ3Z2NmlpaZw8ebLAX0cgioqKIiEhgcjISH9HMcYUM44VDhEJByYCXYE0YIWIzFHVdbmafQ7MUVUVkWbADOCSXNs7q+q+C8mRlpZGdHQ0tWvXRkQu5KkChqqyf/9+0tLSqFOnjr/jGGOKGScPVSUDm1R1i6qeAlKAXrkbqGqm/m+UxTJAoY+4ePLkSWJiYkKmaACICDExMSG3F2WMCQ5OFo7qwI5cy2nedb8jIr1FZAMwDxiea5MCn4jIShEZdbYXEZFRIpIqIql79+49W5uC5A9oofg1GWOCg5OFI6+/bH/Yo1DVWap6CXA9nvMdv2mvqolAd+AOEemY14uo6iRVTVLVpNhYn+5hMcaY4JXjggV/hcNpRf7SThaONKBGruUEYNfZGqvqEqCuiFT2Lu/yfs4AZuE59BVw2rVrl+f6oUOHMnPmzCJOY4wpNr54HJa/BNuXFflLO1k4VgD1RaSOiJQABgBzcjcQkXriPeYiIolACWC/iJQRkWjv+jLAVcBPDmYtsGXLiv6HZowp5n75FL56FhJvgWb9ivzlHbuqSlVdIjIGWIjnctwpqrpWREZ7t78C9AVuEZFs4ATQ33uFVRVglremRADTVXWBU1kvRNmyZcnMzERVufPOO1m0aBF16tTBZlY0xjjicBp8MAqqNIHuT+PKcXPS5aZsyaIbQcrRV1LV+cD8M9a9kuvxU8BTefTbAjR3MlthmzVrFhs3bmTNmjXs2bOHRo0aMXz48PN3NMaY/MrJhveGeT7fOBUiS/H43HUs3bSXWbe3p0wRFQ+7c7yQLFmyhIEDBxIeHk61atW44oor/B3JGBNqFt4Pad/Bdf+GyvWY/u2vTPl6Kx3qxRZZ0QArHIXKLpE1xjjmhxT47lW4dAw06cOyTft48MOfuPziWP7W45Lz9y9EVjgKSceOHUlJSSEnJ4f09HQWL17s70jGmFCR/gPMvRtqXwZXPszWfce4bdoq6lQuw78HtiQivGj/lIfUfBz+1Lt3bxYtWkTTpk1p0KABnTp18nckY0woOH4A3r0ZSsfADa9zKMvNiDdWECbw3yGtKRdV9OPVWeG4QJmZmYDnMNWLL77o5zTGmJDizoGZw+Hobhi2gFNRMYye8i1pB0/w9sg21Iwp7ZdYdqjKGGMC1aJHYcti6PksWj2RB2avYfmWAzx1Q1OS61TyWywrHMYYE4jWfQhLn4NWQyHxFl75cgszUtO4q0t9erdM8Gs0KxzGGBNoMjbA7NshoTV0f5r5a9J5asEGrm1ejXuurO/vdFY4jDEmoBw/AO8MgMjS0O9NVqef4J53V5NYswLP3NAsIC77t5PjxhgTKHKy4b0hcGQnDJ3HTndFRk79mtjokky6JYmoyHB/JwRsj8MYYwLHwvth6xK49gWOxrZkxBsryMrO4fWhralctqS/051mhcNhO3bsoHPnzjRs2JDGjRvzwgsv+DuSMSYQrXzj9J3hrqYDuPOd7/klI5OXbk6kfpVof6f7HTtU5bCIiAieffZZEhMTOXr0KK1ataJr1640atTI39GMMYFi+zKYNx7qdoErH+axeev5YuNe/tG7CZfVD7wJ6myPw2Hx8fEkJiYCEB0dTcOGDdm5c6efUxljAsahXz13hlesBTdMYeq3abyxbBsjO9Thpja1/J0uT8Vqj+PhuWtZt+tIoT5no2rl+L9rG+er7bZt2/j+++9p06ZNoWYwxgSprEx4Z6BnGtiBKSzefoqH567lyoZV+GuPhv5Od1a2x1FEMjMz6du3L88//zzlypXzdxxjjL+53TD7NshYBzdOYX12FcZMX0XD+HK8MKAF4WH+v+z2bIrVHkd+9wwKW3Z2Nn379uWmm26iT58+fslgjAkwXz4F6+fAVf8gPbY9wyYuo2xUBP8d0rpI59YoCNvjcJiqMmLECBo2bMi4ceP8HccYEwjWzoYvn4QWN3G05SiGvb6CzCwXrw9Npmr5KH+nOy8rHA77+uuveeutt1i0aBEtWrSgRYsWzJ8///wdjTGhKf1HzyGqhGSyuz/L7dO/Z1NGJi/dlEijasFxGNvR/SER6Qa8AIQDk1X1yTO29wIeBdyACxirqkvz0zdYdOjQAVX1dwxjTCA4ku4ZTqRURbT/W/x1zs989cs+nr6hGR0bBN5lt2fj2B6HiIQDE4HuQCNgoIicefPC50BzVW0BDAcm+9DXGGOCx6ljnqJx4hAMTOGFb48wc2Uad3epT7+kGv5O5xMnD1UlA5tUdYuqngJSgF65G6hqpv7v3/EygOa3rzHGBA23Gz4YBbt/hBum8N7Oijz/2S/0TUxgbACMdusrJwtHdWBHruU077rfEZHeIrIBmIdnryPffY0xJih8/hBs+Aiufpyvwlrx1w/W0KFeZZ7o0zQgRrv1lZOFI6/vxh8O9qvqLFW9BLgez/mOfPcFEJFRIpIqIql79+4taFZjjHHGyqnw9QvQeiTraw7itrdXUS+uLC/dnEiJiOC8PsnJ1GlA7gN3CcCuszVW1SVAXRGp7EtfVZ2kqkmqmhQbGzwnl4wxxcCWL2DeOKjbhfR2DzHsjVTKlozg9WGtKRcV6e90BeZk4VgB1BeROiJSAhgAzMndQETqiXc/TUQSgRLA/vz0NcaYgLZ3I7x7C8TU58i1rzFs6veeezWGtSa+fCl/p7sgjhUOVXUBY4CFwHpghqquFZHRIjLa26wv8JOIrMZzFVV/9cizr1NZnTZ8+HDi4uJo0qTJ6XUHDhyga9eu1K9fn65du3Lw4MHT25544gnq1avHxRdfzMKFC/0R2RhzIY7tg+n9IKIE2QNSuH3mJjZlZPLyzYk0jA+OezXOxdEDbKo6X1UbqGpdVf2Hd90rqvqK9/FTqtpYVVuo6qW/3cNxtr7BaujQoSxYsOB365588km6dOnCL7/8QpcuXXjySc9tKuvWrSMlJYW1a9eyYMECbr/9dnJycvwR2xhTEK4sSLkJju5GB0znr4sOs3TTPp7o0zQgh0gviOA8MxNkOnbsSKVKlX637sMPP2TIkCEADBkyhNmzZ59eP2DAAEqWLEmdOnWoV68e3333XVFHNsYUhCp8OAZ2LIfrX+bZdeVP36txY5Ddq3EugT2SVmH7eALsXlO4z1m1KXT3/ab2PXv2EB8fD3jm7MjIyABg586dtG3b9nS7hIQEm7/DmGDx5VOwZgZc8XemHknkxcVrGZhcIyjv1TgX2+MIMHkNTxKM13kbU+x8Pw2+eAKaD2Je+UE85J1X49FeTULuPVy89jgKsGfglCpVqpCenk58fDzp6enExcUBnj2MHTv+d+9jWloa1apV81dMY0x+bPoc5t4FF13O8sYPcs/U1bSqWZEXB7UkIjz0/j8Pva8oSFx33XVMnToVgKlTp9KrV6/T61NSUsjKymLr1q388ssvJCcn+zOqMeZcdq+BGUOg8sVs6DiRW6f9SK2Y0kwekkRUZLi/0zmieO1x+MnAgQP54osv2LdvHwkJCTz88MNMmDCBfv368d///peaNWvy3nvvAdC4cWP69etHo0aNiIiIYOLEiYSHh+YvnzFB73AaTLsRSkazq+ebDH57A2WjIpg6PJkKpUv4O51jJJSG/E5KStLU1NTfrVu/fj0NGwbu3L0XIpS/NmMC3olDMKUbHNnJoQFz6PP+YfZlZjHztnY0qBLt73T5JiIrVTXJlz62x2GMMb5yZcG7N8P+TZzs/y5D5h9n56ETTBvZJqiKRkHZOQ5jjPHFb/dqbPsK17X/ZvSyaNakHeLFQYkk1a50/v4hoFgUjlA6HPebUPyajAkKnz8Ca2agnR/gvl8a8cXGvTzeuyldG1Xxd7IiE/KFIyoqiv3794fUH1pVZf/+/URFBf6k9saElNQpsPRf0GooTx7ryQerdjKuawMGJNf0d7IiFfLnOBISEkhLSyPU5uqIiooiISHB3zGMKT42LoB590L9q5lSfgyvzv+ZwW1rcecV9fydrMiFfOGIjIykTp06/o5hjAlmaakwcxhUbcaH9R/lkQ9+pnuTqjx0XeOQuys8P0L+UJUxxlyQvT977tUoG8eXSRMZN3sz7evF8Fz/FoSHFb+iAVY4jDHm7A7vhLf7QFg4qzq9zq2zdtCkenleHRy6d4XnR8gfqjLGmAI5cRDe7gsnDvFzjxRumbWXWpVK88bQ1pQtWbz/dBbvr94YY/KSfQKmD4ADm9nZ8y36zzlOhdKRvDWiDRXLhO5QIvllhcMYY3LLccF7w2DHt+zv8Sp9F0QSHqa8PaINVcvbJfBg5ziMMeZ/VOGju+Hnjzna5QluWFKF46dcvDUimdqVy/g7XcCwwmGMMb/5/BH4/m1OtruX/quasPvwSV4f1pqG8eX8nSygOFo4RKSbiGwUkU0iMiGP7TeJyI/ej2Ui0jzXtm0iskZEVotI6pl9jTGmUC1/GZb+C1eLIQze3IVfMo7yyuBWtKpVPMaf8oVj5zhEJByYCHQF0oAVIjJHVdflarYV6KSqB0WkOzAJaJNre2dV3edURmOMAWDNTFgwAffF1zDqwEBSfz3AiwMT6dQg1t/JApKTexzJwCZV3aKqp4AUoFfuBqq6TFUPeheXAzaGhjGmaG36DGaNRmu2Y6xrDIt+PsA/rm9Kz2bx/k4WsJwsHNWBHbmW07zrzmYE8HGuZQU+EZGVIjLqbJ1EZJSIpIpIaqiNR2WMcdj2byDlZjTuEu6P+htz1h7ggZ4NGdSmeA1a6CsnL8fN6178PIeoFZHOeApHh1yr26vqLhGJAz4VkQ2quuQPT6g6Cc8hLpKSkkJnCFxjjLPSf4Dp/dDy1Xmi0uNMX3WEcV0bMPKyi/ydLOA5uceRBtTItZwA7DqzkYg0AyYDvVR1/2/rVXWX93MGMAvPoS9jjLlw+36Bt/qgJcvxn2rPMGnVUUZ3qlssR7otCCcLxwqgvojUEZESwABgTu4GIlIT+AAYrKo/51pfRkSif3sMXAX85GBWY0xxcWgHvHk9iPB63ef414oTDG1Xm790u7hYjnRbEI4dqlJVl4iMARYC4cAUVV0rIqO9218BHgRigJe8PzCXd9L0KsAs77oIYLqqLnAqqzGmmMjMgDd7QdZRZjR9lUeWZtMvKYEHr2lkRcMHEkoz4yUlJWlqqt3yYYzJw4mD8Ma1cGAz81q8xB1fleC65tWK9fDoACKy0vsPe77ZWFXGmNB36hhM6wf7NvJFq/9wx5ISdG1UhWf7NS/WRaOgrHAYY0KbKwtSboKdqXzX+jmGfRVNxwaxvDioJZHhNupSQVjhMMaErhwXvD8CtixmTdITDFwaR+vaFXn15laUjCi+EzFdKCu3xpjQ5M6BD++A9XPZ0OJv9F5Wm2YJ5ZkytDWlSljRuBBWOIwxocftho/Gwo8pbGpyD9euaErj6uWZOjy52M/eVxjsO2iMCS2q8PGfYdWbbGt0Oz2+b0PD+GjeHJ5MuahIf6cLCbbHYYwJHaqw8H5YMZkdDUdy1Q+X0aBqWd4a3obypaxoFBYrHMaY0KDqmYhp+UR2XnwLXdZ0oV5cNG+PaEP50lY0CpMVDmNMaPjyaVj6L3bXG8AVa7tzUeWyTBvZhgqlS/g7WcixwmGMCX5Ln4MvHiejbl86b7yO2jGeolGxjBUNJ9jJcWNMcPvmJfjsIfbVvpbOP99AQsUyTLu1DTFlS/o7WciyPQ5jTPBaMRkW/pUDtbrRectAqlYozfRb21LZioajrHAYY4LTqrdg3r0cSOhC562DiS1XhndubUtstBUNp1nhMMYEn1VvwZw7ORh/GZdvH0JshWhS/tSWuHJR/k5WLFjhMMYEl1VvwpwxHIjvQMcdtxJfqSIpo9oSF21Fo6jYyXFjTPBY+QbMvZv98R3ptGMkNWIrMW1kGyrZ1VNFyvY4jDHBIfV1mHs3+6p2pNOvI6kVV4npVjT8wgqHMSbwpU6Bj8aSUbUTHX8dQd34GKaPbGv3afiJHaoyxgS2Ff+FeePIqNKJTr+O4JKEyky1AQv9ytE9DhHpJiIbRWSTiEzIY/tNIvKj92OZiDTPb19jTDGwYjLMG8fuKp3otGMEjWvE2ii3AcCxwiEi4cBEoDvQCBgoIo3OaLYV6KSqzYBHgUk+9DXGhLLvXoN595JepROX/zqcZrXimDo8mWgrGn7n5B5HMrBJVbeo6ikgBeiVu4GqLlPVg97F5UBCfvsaY0LYd6/B/PGkxXqKRuJFVXl9WGvK2CRMAcHJwlEd2JFrOc277mxGAB8XsK8xJlQsexHmj2db5U503jGCDhdXZ8rQ1pQuYUUjUDj5k5A81mmeDUU64ykcHQrQdxQwCqBmzZq+pzTGBAZVWPJPWPwYG2O6cE3aEK5uVoPn+rcgMtwuAA0kTv400oAauZYTgF1nNhKRZsBkoJeq7velL4CqTlLVJFVNio2NLZTgxpgipgqfPwyLH+OHSt3osXMovZNq88KAllY0ApCTP5EVQH0RqSMiJYABwJzcDUSkJvABMFhVf/alrzEmRKjCggmw9Dm+rXQd1++6mVva1+XJPs0ID8vr4IPxN8cOVamqS0TGAAuBcGCKqq4VkdHe7a8ADwIxwEsiAuDy7j3k2deprMYYP3HnwEf3wKqpLK54A8N29ebOK+ozrmsDvH8TTAAS1TxPHQSlpKQkTU1N9XcMY0x+5Lhg9m2wZgYflR/EmD09mdC9IaM71fV3smJFRFaqapIvfewyBWNM0XOdgvdHwPo5zCg3hPv2XM2j1zdhcNta/k5m8sEKhzGmaGWfhBm3wC8LmVJ2FI/tvZx/9WtOn8SE8/c1AcEKhzGm6GRlQsogdOsS/h11OxMPduSlm1rQrUm8v5MZH1jhMMYUjeMHYNqN6K5VPBZ5JynH2/PGsCTa1avs72TGR1Y4jDHOO7IL3uqN+8BWxst4vnQnkzIqmaYJ5f2dzBSAFQ5jjLP2b4Y3r8d1/AAjs//CpjItmTmiDXUql/F3MlNAVjiMMc5J/wHe7ktWtosBx//G8cpNeX9EMlXK2fzgwSxfd46LyIgzlsNF5P+ciWSMCQnbvoY3riEzJ4IemfcTntCSGX+61IpGCMjvkCNdRGS+iMSLSBM8Q6BHO5jLGBPMNn6Mvt2H/WExdD30N2o3aMFbI9pQvrTNpREK8nWoSlUHiUh/YA1wHBioql87mswYE5xWv4N+eAc7SzXg2gN3c0ViI57s29QGKwwh+T1UVR+4G3gf2AYMFpHSDuYyxgSjb16C2aPZGNWcqw+M58aOLfjnjc2saISY/J4cnwvcoaqfi2fksXvwjGDb2LFkxpjgoQqfPwJL/8U3Jdsz5OAo7uvZjJGXXeTvZMYB+S0cycBIEbkDz4RKS/EMdW6MKe5cp2DOnfBjCnMirua+Y0N4blAiPZvZ3eChKr+FYzJwFPiPd3kgcCnQz4lQxpggcfIIzBgMW75gYthAJrl689bI1rSuXcnfyYyD8ls4LlbV5rmWF4vID04EMsYEiSPpMO1G3Bnr+Zv7dpaW6sr7w5KpF1fW38mMw/JbOL4XkbaquhxARNoAdlWVMcXV3o3wdl+yM/czIms8B+I78MHQ1sRF2z0axUF+C0cb4BYR+dW7XBNYLyJrAFXVZo6kM8YEnu3foO8M4FhOOP2P309sg2TeHZRImZI2EEVxkd+fdDdHUxhjgsO6D9H3byUjvAp9M++lQ1Iij13fhAi73LZYye8NgNudDmKMCXDfvop+/Bd+jmxI/yN3M6JrK8ZcUc/mBi+GbN/SGHNu7hz49EH45kWWhrfh9uN38Ej/VvRuaTP2FVeO7l+KSDcR2Sgim0RkQh7bLxGRb0QkS0TGn7Ftm4isEZHVIpLqZE5jzFmcOgbvDoZvXuQdunGPjuP1Wy+zolHMObbHISLhwESgK5AGrBCROaq6LlezA8BdwPVneZrOqrrPqYzGmHM4sgveGYA7fQ2PuobwVaW+fDCkNTVjbLSh4s7JQ1XJwCZV3QIgIilAL+B04VDVDCBDRHo6mMMY46v0H9DpAzh17BB/OnUvOXW78v6gRMqXstFtjbOHqqoDO3Itp3nX5ZcCn4jIShEZdbZGIjJKRFJFJHXv3r0FjGqMOW3jx+iU7hw87qLXiQdJSO7F60NbW9Ewpzm5x5HXpRbqQ//2qrpLROKAT0Vkg6ou+cMTqk4CJgEkJSX58vzGmNxUYflL6ML7+Tm8HrccH8tt17RnSLvaduWU+R0nC0caUCPXcgKwK7+dVXWX93OGiMzCc+jrD4XDGFMIcrLh4/sgdQqLpS33ue7gmSFt6XxJnL+TmQDkZOFYAdQXkTrATjyj6Q7KT0cRKQOEqepR7+OrgEccS2pMcXbyMLw3FDYvYpL7Ot4sNYS3hyVzSdVy/k5mApRjhUNVXSIyBlgIhANTVHWtiIz2bn9FRKoCqUA5wC0iY4FGQGVglnf3OAKYrqoLnMpqTLG1fzP6zkDc+zcxIXsU22v0YfbNiVQuW9LfyUwAc/QGQFWdD8w/Y90ruR7vxnMI60xHgOZ5rDfGFJbNi9AZQ8nMVkZlTaBucnfevqYxJSJs+BBzbnbnuDHFzW8nwT95gK0kMOLUvYy6/goGJtf0dzITJKxwGFOcuLLgo3tg9TQ+12QejriL525tT5JNvGR8YIXDmOLi6G405WZk5wqed/VhcZVhzLilNfHlS/k7mQkyVjiMKQ52rsT9ziCyjx3i7lNjKdW8N+/2aUpUZLi/k5kgZIXDmFC3+h3cc+8mw12e4Vn/R5/u3RjRoY7d1GcKzAqHMaHKdQoW/hVWTGalNuK+sHE8MuxyLqsf6+9kJshZ4TAmFB3Zhc64BUlbwWuuHsyvMpq3bm5NQkUb2dZcOCscxoSabV+TM2MI2SeOMv7UnVRI7k/KNY0oGWHnM0zhsMJhTKhQheUvo588wE6N4/acRxl+Qw/6JNqkS6ZwWeEwJhScOobOuQv5aSafuZN4vuw9PHtLRxtvyjjCCocxwW7fJnLeHYzsXc8z2f3YcvGtvNOvJeWibP4M4wwrHMYEszUzyZlzF5muMO7KnkD7q2/k5csuskttjaOscBgTjLJPogv+iqycwmq9mAcj7+WB4Vdyad0YfyczxYAVDmOCzf7N5MwYQvieNbziupbltW/jjf5JxEbbUOimaFjhMCaYrJ1FzuwxHMuGcdl/JrHrAKZ0rEtYmB2aMkXHCocxwcCVhS68H1nxGj+66/NI1HjuH3qVjWpr/MIKhzGBbv9mXDOGEbHnB15z9SC13l283q8VFUqX8HcyU0xZ4TAmUKnC6unkzBvPMVcYf3HdS3K3wbzSvrZdNWX8ygqHMYHo5GFy5owlfN0HrHA35Nmy4/n7oCtpllDB38mMscJhTMDZsYLsGcMIO7qTZ7L7cTDxdqZe25TSJeztagKDo7PSi0g3EdkoIptEZEIe2y8RkW9EJEtExvvS15iQ485Bv3wG95Sr2XPkJMPlEZoOfJTH+7a0omECimO/jSISDkwEugJpwAoRmaOq63I1OwDcBVxfgL7GhI7DO8meeSuRO75mTk475tX8M0/3b0eVclH+TmbMHzj5b0wysElVtwCISArQCzj9x19VM4AMEenpa19jQoIqrHkP19xxZGdn84DrNupfdSuvdLjI7s0wAcvJwlEd2JFrOQ1oU9h9RWQUMAqgZs2avqc0xl+OHyB7zlgiN3zIancD/lNuHH8Z1JNG1WxEWxPYnCwcef27pIXdV1UnAZMAkpKS8vv8xvjXL59y6oPbkRMHeNrVH/eld/HqVQ2JirTJlkzgc7JwpAE1ci0nALuKoK8xgSsrE9fCB4hY9Tpb3DX4Z+mnGT2gt90BboKKk4VjBVBfROoAO4EBwKAi6GtMYNrxHVkzRhJ59FdedfUko9W9/Ltnc7tiygQdx35jVdUlImOAhUA4MEVV14rIaO/2V0SkKpAKlAPcIjIWaKSqR/Lq61RWYxyVfQLXon8Q9s1EMjSGJ0o+yk03D6R9vcr+TmZMgYhq6JwWSEpK0tTUVH/HMOZ/fl3OyZmjiTqylemuzmxo+hf+3CuJaJudzwQIEVmpqkm+9LF9ZGOccOoY2Z88TETqJPZqZZ4p8TB9Bg5i0MVx/k5mzAWzwmFMYdu6hBPv306pzB284bqanYnjebxnImVL2tvNhAb7TTamsGQdJevjByi5+g12u6vwfJnHubn/QIbaFVMmxFjhMKYQ6Ib5nPxwHCVP7GZyTg+OXvoXnura1O7LMCHJCocxF+LILo5/eC+lN89nu7sGkyo8w4gB/Whcrby/kxnjGCscxhSEOwfXt6/h/uwRxJXNszqICl3G8nSH+kSEOzrotDF+Z4XDGF+l/0DmzDsou38NX+Y049M693F7nyupVqGUv5MZUySscBiTX1mZnPjkUUqunMQJjeaZEuPo1P9PPNawqr+TGVOkrHAYcz6quH/6gJMfTaB0VgbTc7qwt80EJlzVilIl7OS3KX6scBhzLnvWcWTWPZTbvZwt7tqkxP6LW/r1o0GVaH8nM8ZvrHAYk5eTh8lc+Bilvp9Mjpbm6cg/0fCaO3m0eQIiNsGSKd6scBiTm9tN9qppZC98kNKnDvKuduFgm/sY07WVjWJrjJe9E4zx0rRUDn9wLxUOrGaNux4Laj7O4D69qFGptL+jGRNQrHAYc+hXDs39OxU2zyZby/N0qbtp12cMf2tgAxIakxcrHKb4OnmEI589RamVrxLlhslhfSl1xb3c074hkXYTnzFnZYXDFD85Lk58OwX3oscp5zrIh+4O7Gp1Hzdd3Y5yNk+GMedlhcMUH6pkb/yEzLkTqHhsC9+5L2Fp3ScZ0KuX3fVtjA+scJhiwb19OQfm3E/l/akcdlfhjdgH6dp7BOMSKvg7mjFBxwqHCWm6ew17P/w7cemLUS3PxNKjaXzNnYxtVN3uxzCmgBwtHCLSDXgBCAcmq+qTZ2wX7/YewHFgqKqu8m7bBhwFcgCXr3PimuJN929h75z/o/L2uZTUUrxWcjDVrx7LbS3rEhZmBcOYC+FY4RCRcGAi0BVIA1aIyBxVXZerWXegvvejDfCy9/NvOqvqPqcymhB0ZBcZ8x6j0sYUojWcaRG9KdvlXoa1aWTDnRtTSJzc40gGNqnqFgARSQF6AbkLRy/gTVVVYLmIVBCReFVNdzCXCUWH09jz8ZNU3JBCBXXzQXhXpON4+nVIpGSEDURoTGFysnBUB3bkWk7j93sTZ2tTHUgHFPhERBR4VVUn5fUiIjIKGAVQs2bNwklugoYe3M6e+U8S88t7VFI3c8M6c6Lt3fS5or2NXGuMQ5wsHHkdSFYf2rRX1V0iEgd8KiIbVHXJHxp7CsokgKSkpDOf34QoPbCV9HmPE7f5fSopzAnvguvSsVzXqa0VDGMc5mThSANq5FpOAHblt42q/vY5Q0Rm4Tn09YfCYYoXd8bPpM9/gqrbZhOjYXwYcRV0uIeeHZKIirSCYUxRcLJwrADqi0gdYCcwABh0Rps5wBjv+Y82wGFVTReRMkCYqh71Pr4KeMTBrCbAZW1bzt6Pn6bankXEaASzIntQotNYrr20FSUi7KS3MUXJscKhqi4RGQMsxHM57hRVXSsio73bXwHm47kUdxOey3GHebtXAWZ5r7OPAKar6gKnspoA5XaT+dM8Dn/2LNWPfE9ZLcO7pfpRodMdXJ/c1K6SMsZPxHNBU2hISkrS1NRUf8cwF8qVxYHl08hZ+gKxJ7eRppX5ouKN1L36NtpeUtNu3DOmEInISl/vk7M7x03A0KN72Pn5y5Rd8yaVcvazXmuxMOHvJPUYxs3VY/wdzxjjZYXD+N3Jbd+R/skLVN+1gARcfE1zdlz8dy7vPoCbbfBBYwKOFQ7jH65T7P32XbKWvUzCsbXEahQLoroR3mYUV3ToQHu7pNaYgGWFwxQp1/5t7Pj8VSpteIdY90G2aDzvxd3JRV1v5dr6dv7CmGBghcM4z3WKvakfcOyb/1Lz8ApqKSwLa0lGo4dof3U/bixvc3obE0yscBjHZKWv59fPXqHK1lnEug+TrTHMqTiYCu2G0b5VC5ue1ZggZYXDFCo9cZC0r9/F/f00ah37kdoazrKI1hxuMpDkLjdyfcUy/o5ojLlAVjjMhXOdYs+quRz+dhq19y+hBtls1ap8GPcnqnUcxmWNL7E5MIwJIVY4TMGocnDjV+z+6k2q71pAFT1KuJZjUdkehLfoT3L7rvQqXcLfKY0xDrDCYfLP7ebAL8vYvXwGsb8uIDZnD1FaguUlL+Vkwxto2ak33SpF+zulMcZhVjjMublzyFi7mL3fvkfVXZ8S495PWQ1nVURzVtS7jYsvH0DnhHh/pzTGFCErHOYPNPsEu1Z/yqFVs6i2exFxeohyGsnKEq04Wu8uLmrflzY1E+yeC2OKKSscBoDjGdvYvnw2smkhtY+kUp1TVNCSfB+VzIl619CgfR/aV4vzd0xjTACwwlFMqSuLXT8tYd/3HxGzczEJru00BHZoHMvK90AaXMUll3anQ0wlf0c1xgQYKxzFRY6LPT9/x54fPqHEjq+pdewHqpNFrIbzU0QT1tfoRUyLa2jcrBU1Iu3XwhhzdvYXIlS5c8jYtIr0Hz4l4tevqHV0NVU4ThVgMwl8W74HclFH6ib3JDG+ir/TGmOCiBWOEHHycAa//riEzE3LKJ2xihon1hPHSeKAX6nKqnKd0VqXUb3lVdStcxF17cS2MaaArHAEoVPHj7BrYyqHtqTCzpXEHvqR6u5dNABcGsaWsNqsqtANd0Jr4ptdSb16F1PT7tw2xhQSKxyBTJXDGTvYufFbjm1fTeTetcRmbiQ+J53a4pnyd7+WY2upRmyKvZ4yddtRq1l7GlSqRAM/RzfGhC4rHAEgO+s4u7eu5eD2dWTt2Uj4gU1EH9tG1ewdlOc45b3t0qjCrlL12RxzDSWqN6dKg9bUqFWPpAib9MgYU3QcLRwi0g14AQgHJqvqk2dsF+/2HsBxYKiqrspP32By8vhR9u/czKH0rZzYt42cgzuIOLqTUifSqXgqnSruvdQQpYa3/W5iyChRgzUVryKncgOiayWScElrEipXJsGvX4kxxjhYOEQkHJgIdAXSgBUiMkdV1+Vq1h2o7/1oA7wMtMln3yKlbjcnj2dy/NhhTmYe5uSxo5w6cZjs40fJPnYI19EM9Nhewo7vJzLrAFGnDlI25xDl3IcpTybVgere58pRYa/EcCAijrQyTdhS4SIi4hpQLqER8Rc1pmqFSlT11xdqjDHn4eQeRzKwSVW3AIhICtALyP3HvxfwpqoqsFxEKohIPFA7H30LzaZHEynpPkEYOYSpm3ByCMNNOG7CyCFCcyhFFqVEKXWO58lR4ZCU40hYeY5FVGRP6frsLFkJd3Q8ERVrUjq2FhXjL6Jy9dpULVHSioMxJig5WTiqAztyLafh2as4X5vqZ1l/Zl8ARGQUMAqgZs2aBQp6qMxFiLpQCUclApUwNCwCJAzCIjyPI8tAiTJIyWjCosoSHhVNZKloIktHE1W2IuVi4ilfKY6Y8HBiCpTCGGOCg5OFI6/rPzWfbfLT17NSdRIwCSApKSnPNueTNG5mQboZY0yx5GThSIPT53sBEoBd+WxTIh99jTHG+EGYg8+9AqgvInVEpAQwAJhzRps5wC3i0RY4rKrp+exrjDHGDxzb41BVl4iMARbiuaR2iqquFZHR3u2vAPPxXIq7Cc/luMPO1deprMYYY/JPPBc0hYakpCRNTU31dwxjjAkaIrJSVZN86ePkoSpjjDEhyAqHMcYYn1jhMMYY4xMrHMYYY3wSUifHRWQvsL2A3SsD+woxTlGwzEUj2DIHW16wzEUlr8y1VDXWlycJqcJxIUQk1dcrC/zNMheNYMscbHnBMheVwspsh6qMMcb4xAqHMcYYn1jh+J9J/g5QAJa5aARb5mDLC5a5qBRKZjvHYYwxxie2x2GMMcYnVjiMMcb4JOQLh4h0E5GNIrJJRCbksV1E5N/e7T+KSGJ++wZaZhGpISKLRWS9iKwVkbsDPXOu7eEi8r2IfBQMmb3THM8UkQ3e7/elQZD5Hu/vxU8i8o6IRAVI5ktE5BsRyRKR8b70DbTMAf4ePOv32bs9/+9BVQ3ZDzxDsm8GLsIzOdQPQKMz2vQAPsYz62Bb4Nv89g3AzPFAovdxNPBzoGfOtX0cMB34KNB/N7zbpgIjvY9LABUCOTOe6Zi3AqW8yzOAoQGSOQ5oDfwDGO9L3wDMHMjvwTwz59qe7/dgqO9xJAObVHWLqp4CUoBeZ7TpBbypHsuBCiISn8++AZVZVdNVdRWAqh4F1uP5gxGwmQFEJAHoCUwugqwXnFlEygEdgf8CqOopVT0UyJm92yKAUiISAZSmaGbVPG9mVc1Q1RVAtq99Ay1zIL8Hz/F99vk9GOqFozqwI9dyGn/8IZ6tTX76OuFCMp8mIrWBlsC3hR/xDy408/PAfYDboXx5uZDMFwF7gde9u/aTRaSMk2HPk+e8bVR1J/BP4FcgHc9sm584mPWceYqg74UolNcNwPfguTyPD+/BUC8ckse6M68/Plub/PR1woVk9mwUKQu8D4xV1SOFmO1sCpxZRK4BMlR1ZeHHOqcL+T5HAInAy6raEjgGFMXx9wv5PlfE8x9oHaAaUEZEbi7kfHm5kPdRIL8Hz/0EgfkezLtjAd6DoV440oAauZYT+OPu+dna5KevEy4kMyISiecXdpqqfuBgznzlyUeb9sB1IrINz+71FSLytnNRz5snP23SgDRV/e0/yZl4ConTLiTzlcBWVd2rqtnAB0A7B7OeL4/TfS/EBb1uAL8Hz8b396DTJ238+YHnP8MteP7L+u2EUeMz2vTk9ycTv8tv3wDMLMCbwPPB8n0+o83lFN3J8QvKDHwFXOx9/BDwTCBnBtoAa/Gc2xA8J/fvDITMudo+xO9PNAfse/AcmQP2PXi2zGdsy9d7sMi+MH994LnK5Gc8Vxzc7103Ghid6wc90bt9DZB0rr6BnBnogGf39EdgtfejRyBnLsgvbSBkBloAqd7v9WygYhBkfhjYAPwEvAWUDJDMVfH8x3wEOOR9XO5sfQM5c4C/B8/6fc71HPl6D9qQI8YYY3wS6uc4jDHGFDIrHMYYY3xihcMYY4xPrHAYY4zxiRUOY4wxPrHCYUwevKPf3p5ruZqIzHTota4XkQfP0+afInKFE69vjK/sclxj8uAdZ+gjVW1SBK+1DLhOVfedo00t4DVVvcrpPMacj+1xGJO3J4G6IrJaRJ4Rkdoi8hOAiAwVkdkiMldEtorIGBEZ5x3wcLmIVPK2qysiC0RkpYh8JSKXnPkiItIAyFLVfSIS7X2+SO+2ciKyTUQiVXU7ECMiVYvwe2BMnqxwGJO3CcBmVW2hqn/OY3sTYBCe4az/ARxXz4CH3wC3eNtMwjOsRytgPPBSHs/THsg9DPcXeIYNARgAvK+esaXwtmt/gV+XMRcswt8BjAlSi71/6I+KyGFgrnf9GqCZd3TUdsB7IqcHLi2Zx/PE4xmi/TeT8QxvPRsYBtyaa1sGnpFtjfErKxzGFExWrsfuXMtuPO+rMOCQqrY4z/OcAMr/tqCqX3sPi3UCwlX1p1xto7ztjfErO1RlTN6O4pn6s0DUMwfDVhG5EU7PBd48j6brgXpnrHsTeAd4/Yz1DfAMUGiMX1nhMCYPqrof+FpEfhKRZwr4NDcBI0TkBzxDmuc17ekSoKXkOp4FTAMq4ikewOk5HurhGZHXGL+yy3GN8TMReQGYq6qfeZdvAHqp6uBcbXoDiar6dz/FNOY0O8dhjP89jmeiJUTkP0B3PHMr5BYBPFvEuYzJk+1xGGOM8Ymd4zDGGOMTKxzGGGN8YoXDGGOMT6xwGGOM8YkVDmOMMT75fxGpsOxzhiZMAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "swiftdiff['px'].plot.line(x=\"time (y)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swifter.in new file mode 100644 index 000000000..9c026369e --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swifter.in @@ -0,0 +1,4 @@ +1 +100 +1.01 0.0 0.0 +0.0 6.252003053624663 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/tp.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..e1506974ae338f098f33af16f09e91ed31946bbc GIT binary patch literal 128 wcmd;JU|?VbVi4ef;uJ6s!PkuGKlD}OgFQ?hDh*dph~H?tT#T1V(gB-(0O>IX>i_@% literal 0 HcmV?d00001 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore b/examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in new file mode 100644 index 000000000..81c636655 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in @@ -0,0 +1,5 @@ +0 +0.00029591220819207774 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in new file mode 100644 index 000000000..81c636655 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in @@ -0,0 +1,5 @@ +0 +0.00029591220819207774 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py new file mode 100755 index 000000000..321c79932 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +import numpy as np +import swiftest +import swiftest.io as swio +import astropy.constants as const +import sys +import xarray as xr + +# Both codes use the same tp input file +tpin = "tp.in" + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.dat" +swiftest_enc = "enc.swiftest.dat" + +sim = swiftest.Simulation() + +sim.param['T0'] = 0.0 +sim.param['DT'] = 1.0 +sim.param['TSTOP'] = 365.25e1 +sim.param['ISTEP_OUT'] = 11 +sim.param['ISTEP_DUMP'] = 1 +sim.param['CHK_QMIN_COORD'] = "HELIO" +sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" +sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_RMAX'] = 1000.0 +sim.param['CHK_EJECT'] = 1000.0 +sim.param['OUT_FORM'] = "XV" +sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['GR'] = 'NO' +sim.param['CHK_CLOSE'] = 'YES' + +sim.param['MU2KG'] = swiftest.MSun +sim.param['TU2S'] = swiftest.JD2S +sim.param['DU2M'] = swiftest.AU2M + +bodyid = { + "Sun": 0, + "Mercury": 1, + "Venus": 2, + "Earth": 3, + "Mars": 4, + "Jupiter": 5, + "Saturn": 6, + "Uranus": 7, + "Neptune": 8, +} + +for name, id in bodyid.items(): + sim.add(name, idval=id) + +ds = sim.ds +cb = ds.sel(id=0) +pl = ds.where(ds.id > 0, drop=True) +npl = pl.id.size + +ntp = 16 +dims = ['time', 'id', 'vec'] +tp = [] +t = np.array([0.0]) +clab, plab, tlab = swio.make_swiftest_labels(sim.param) + +# For each planet, we will initialize a pair of test particles. One on its way in, and one on its way out. We will also initialize two additional particles that don't encounter anything +tpnames = np.arange(101, 101 + ntp) +tpxv1 = np.empty((6)) +tpxv2 = np.empty((6)) + +p1 = [] +p2 = [] +p3 = [] +p4 = [] +p5 = [] +p6 = [] + +for i in pl.id: + pli = pl.sel(id=i) + rstart = 2 * np.double(pli['Radius']) # Start the test particles at a multiple of the planet radius away + vstart = 1.5 * np.sqrt(2 * np.double(pli['Mass']) / rstart) # Start the test particle velocities at a multiple of the escape speed + xvstart = np.array([rstart / np.sqrt(2.0), rstart / np.sqrt(2.0), 0.0, vstart, 0.0, 0.0]) + # The positions and velocities of each pair of test particles will be in reference to a planet + plvec = np.array([np.double(pli['px']), + np.double(pli['py']), + np.double(pli['pz']), + np.double(pli['vx']), + np.double(pli['vy']), + np.double(pli['vz'])]) + tpxv1 = plvec + xvstart + tpxv2 = plvec - xvstart + p1.append(tpxv1[0]) + p1.append(tpxv2[0]) + p2.append(tpxv1[1]) + p2.append(tpxv2[1]) + p3.append(tpxv1[2]) + p3.append(tpxv2[2]) + p4.append(tpxv1[3]) + p4.append(tpxv2[3]) + p5.append(tpxv1[4]) + p5.append(tpxv2[4]) + p6.append(tpxv1[5]) + p6.append(tpxv2[5]) + +tvec = np.vstack([p1, p2, p3, p4, p5, p6]) +tpframe = np.expand_dims(tvec.T, axis=0) +tpxr = xr.DataArray(tpframe, dims = dims, coords = {'time' : t, 'id' : tpnames, 'vec' : tlab}) + +tp = [tpxr] +tpda = xr.concat(tp,dim='time') +tpds = tpda.to_dataset(dim = 'vec') + +sim.ds = xr.combine_by_coords([sim.ds, tpds]) +swio.swiftest_xr2infile(sim.ds, sim.param) + +sim.param['PL_IN'] = swiftest_pl +sim.param['TP_IN'] = tpin +sim.param['CB_IN'] = swiftest_cb +sim.param['BIN_OUT'] = swiftest_bin +sim.param['ENC_OUT'] = swiftest_enc +sim.save(swiftest_input) + +sim.param['PL_IN'] = swifter_pl +sim.param['TP_IN'] = tpin +sim.param['BIN_OUT'] = swifter_bin +sim.param['ENC_OUT'] = swifter_enc +sim.save(swifter_input, codename="Swifter") diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in new file mode 100644 index 000000000..aa33eeaa4 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in @@ -0,0 +1,26 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 3652.5 +DT 1.0 +ISTEP_OUT 11 +ISTEP_DUMP 1 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swifter.in +TP_IN tp.in +BIN_OUT bin.swifter.dat +ENC_OUT enc.swifter.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 +RHILL_PRESENT YES diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in new file mode 100644 index 000000000..6504c9637 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in @@ -0,0 +1,35 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 3652.5 +DT 1.0 +ISTEP_OUT 11 +ISTEP_DUMP 1 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.in +CB_IN cb.swiftest.in +BIN_OUT bin.swiftest.dat +ENC_OUT enc.swiftest.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 86400 +DU2M 149597870700.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY NO +GR NO +YARKOVSKY NO +YORP NO +MTINY 0.0 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in new file mode 100644 index 000000000..bd980fc4b --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 +1.6306381826061645943e-05 +0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 +-0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 +2 7.243452483873646905e-10 +4.0453784346544178454e-05 +-0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 +0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 +3 8.9970113821660187435e-10 +4.25875607065040958e-05 +0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 +0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 +4 9.549535102761465607e-11 +2.265740805092889601e-05 +-1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 +-0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 +5 2.825345908631354893e-07 +0.00046732617030490929307 +4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 +0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 +6 8.459715183006415395e-08 +0.00038925687730393611812 +6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 +0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 +7 1.2920249163736673626e-08 +0.00016953449859497231466 +14.856082147529010129 13.007589275314199284 -0.14417795763685259391 +-0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 +8 1.5243589003230834323e-08 +0.000164587904124493665 +29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 +0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in new file mode 100644 index 000000000..701e9a14f --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 0.00029591220819207775568 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 4.9125474498983623693e-11 0.0014751243077781048702 +1.6306381826061645943e-05 +0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 +-0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 +2 7.243452483873646905e-10 0.006759104275397271956 +4.0453784346544178454e-05 +-0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 +0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 +3 8.9970113821660187435e-10 0.010044787321379672528 +4.25875607065040958e-05 +0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 +0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 +4 9.549535102761465607e-11 0.007246743835971885302 +2.265740805092889601e-05 +-1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 +-0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 +5 2.825345908631354893e-07 0.35527126534549128905 +0.00046732617030490929307 +4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 +0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 +6 8.459715183006415395e-08 0.4376527512949726007 +0.00038925687730393611812 +6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 +0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 +7 1.2920249163736673626e-08 0.4695362423191493196 +0.00016953449859497231466 +14.856082147529010129 13.007589275314199284 -0.14417795763685259391 +-0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 +8 1.5243589003230834323e-08 0.7812870996943599397 +0.000164587904124493665 +29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 +0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in new file mode 100644 index 000000000..bd980fc4b --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 +1.6306381826061645943e-05 +0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 +-0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 +2 7.243452483873646905e-10 +4.0453784346544178454e-05 +-0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 +0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 +3 8.9970113821660187435e-10 +4.25875607065040958e-05 +0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 +0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 +4 9.549535102761465607e-11 +2.265740805092889601e-05 +-1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 +-0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 +5 2.825345908631354893e-07 +0.00046732617030490929307 +4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 +0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 +6 8.459715183006415395e-08 +0.00038925687730393611812 +6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 +0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 +7 1.2920249163736673626e-08 +0.00016953449859497231466 +14.856082147529010129 13.007589275314199284 -0.14417795763685259391 +-0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 +8 1.5243589003230834323e-08 +0.000164587904124493665 +29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 +0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb new file mode 100644 index 000000000..d0d223ce7 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -0,0 +1,753 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import swiftest\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swifter.in'\n", + "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swiftest.in'\n", + "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestdat - swifterdat" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", + "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", + "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", + "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", + "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    +       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "...\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n",
    +       "       6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n",
    +       "       3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n",
    +       "       4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n",
    +       "       3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n",
    +       "       1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n",
    +       "       4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n",
    +       "       2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n",
    +       "       4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n",
    +       "       3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n",
    +       "       1.17040422e-11])\n",
    +       "Coordinates:\n",
    +       "    id        int64 2\n",
    +       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + ], + "text/plain": [ + "\n", + "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "...\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n", + " 6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n", + " 3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n", + " 4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n", + " 3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n", + " 1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n", + " 4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n", + " 2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n", + " 4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n", + " 3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n", + " 1.17040422e-11])\n", + "Coordinates:\n", + " id int64 2\n", + " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['rmag'].sel(id=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in new file mode 100644 index 000000000..c7cf002d6 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in @@ -0,0 +1,49 @@ +16 +101 +0.33208578766229190915 0.07439013071780828379 -0.02438290851908785084 +-0.008988542188201206762 0.028710618792657981169 0.0034094833969203438596 +102 +0.33203966624962866216 0.07434400930514498129 -0.02438290851908785084 +-0.014195641132219511543 0.028710618792657981169 0.0034094833969203438596 +103 +-0.7187543234391324809 -0.011798260816488121555 0.041316403191083782287 +0.0065615071841567274707 -0.020313576971905909774 -0.00029114855617710840843 +104 +-0.71886874402007694407 -0.011912681397432518804 0.041316403191083782287 +-0.006132960226534060408 -0.020313576971905909774 -0.00029114855617710840843 +105 +0.35683111163121072895 -0.9518327808922094624 4.4027442504036787155e-05 +0.022724479262608666269 0.0059737936889703449964 -3.3484113013969089573e-07 +106 +0.3567106558193317012 -0.95195323670408849015 4.4027442504036787155e-05 +0.008935598794060913702 0.0059737936889703449964 -3.3484113013969089573e-07 +107 +-1.5233391647104730371 0.6724145771476651712 0.051459143378398922164 +-0.0020480822268840624331 -0.011607719813367209372 -0.000117479966462153095864 +108 +-1.5234032495379807859 0.6723504923201574224 0.051459143378398922164 +-0.008207040423331847523 -0.011607719813367209372 -0.000117479966462153095864 +109 +4.050605826355517358 -2.9904269687677218492 -0.078187280837353656526 +0.041279424970441319642 0.006432188574295680597 -0.00012509257442073270106 +110 +4.049284028339322994 -2.9917487667839162135 -0.078187280837353656526 +-0.032485009432853539924 0.006432188574295680597 -0.00012509257442073270106 +111 +6.299479995832536261 -7.7058625321556393217 -0.11669919842191249504 +0.02612723553831041573 0.0035242303011843410798 -0.00022097170940726839814 +112 +6.2983790111222752728 -7.70696351686590031 -0.11669919842191249504 +-0.01809910222875676239 0.0035242303011843410798 -0.00022097170940726839814 +113 +14.856321905516212567 13.007829033301401722 -0.14417795763685259391 +0.010478935887110856981 0.0027821364817078499815 4.40781085949555924e-05 +114 +14.855842389541807691 13.007349517326996846 -0.14417795763685259391 +-0.015710591190212928187 0.0027821364817078499815 4.40781085949555924e-05 +115 +29.55768244045575699 -4.6291447957067299868 -0.58590957207831262377 +0.014905509815736753265 0.0031274056019462009859 -7.51415892482447254e-05 +116 +29.557216915563323312 -4.6296103205991601115 -0.58590957207831262377 +-0.0139657618108195089035 0.0031274056019462009859 -7.51415892482447254e-05 From d18ffb5fda8b22dbb4567876e23bc7f7e89ff99d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 15:24:14 -0400 Subject: [PATCH 046/194] Fixed encounter check and fleshing out recursive step subroutine --- src/modules/symba_classes.f90 | 8 +++ src/symba/symba_encounter_check.f90 | 93 +++++++++++++---------------- src/symba/symba_step.f90 | 28 ++++++--- src/symba/symba_util.f90 | 1 + 4 files changed, 71 insertions(+), 59 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 4edad0767..837394571 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -175,6 +175,14 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) + implicit none + real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr + real(DP), intent(in) :: rhill1, rhill2, dt + integer(I4B), intent(in) :: irec + logical, intent(out) :: lencounter, lvdotr + end subroutine symba_encounter_check_one + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) implicit none class(symba_pl), intent(inout) :: self !! SyMBA test particle object diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index e188e57ac..d76a07af5 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -2,6 +2,10 @@ use swiftest contains module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between massive bodies. + !! implicit none ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA test particle object @@ -11,7 +15,6 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc ! Result logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 integer(I4B) :: nenc_old integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr @@ -21,34 +24,11 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc allocate(lencounter(nplpl), loc_lvdotr(nplpl)) lencounter(:) = .false. - term2 = RHSCALE * (RSHELL**irec) - do k = 1, nplpl associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) xr(:) = pl%xh(:, j) - pl%xh(:, i) - r2 = dot_product(xr(:), xr(:)) - r2crit = ((pl%rhill(i) + pl%rhill(i)) * term2)**2 vr(:) = pl%vh(:, j) - pl%vh(:, i) - vdotr = dot_product(vr(:), xr(:)) - if (r2 < r2crit) then - lencounter(k) = .true. - loc_lvdotr(k) = (vdotr < 0.0_DP) - else - if (vdotr < 0.0_DP) then - v2 = dot_product(vr(:), vr(:)) - tmin = -vdotr / v2 - if (tmin < dt) then - r2min = r2 - vdotr * vdotr / v2 - else - r2min = r2 + 2 * vdotr * dt + v2 * dt * dt - end if - r2min = min(r2min, r2) - if (r2min <= r2crit) then - lencounter(k) = .true. - loc_lvdotr(k) = (vdotr < 0.0_DP) - end if - end if - end if + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(i), pl%rhill(j), dt, irec, lencounter(k), loc_lvdotr(k)) end associate end do @@ -71,6 +51,10 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc end function symba_encounter_check_pl module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between test particles and massive bodies. + !! implicit none ! Arguments class(symba_tp), intent(inout) :: self !! SyMBA test particle object @@ -89,34 +73,11 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc allocate(lencounter(npl, ntp), loc_lvdotr(npl, ntp)) lencounter(:,:) = .false. - term2 = RHSCALE * (RSHELL**irec) - do j = 1, ntp do i = 1, npl xr(:) = tp%xh(:, j) - pl%xh(:, i) - r2 = dot_product(xr(:), xr(:)) - r2crit = (pl%rhill(i) * term2)**2 vr(:) = tp%vh(:, j) - pl%vh(:, i) - vdotr = dot_product(vr(:), xr(:)) - if (r2 < r2crit) then - lencounter(i,j) = .true. - loc_lvdotr(i,j) = (vdotr < 0.0_DP) - else - if (vdotr < 0.0_DP) then - v2 = dot_product(vr(:), vr(:)) - tmin = -vdotr / v2 - if (tmin < dt) then - r2min = r2 - vdotr * vdotr / v2 - else - r2min = r2 + 2 * vdotr * dt + v2 * dt * dt - end if - r2min = min(r2min, r2) - if (r2min <= r2crit) then - lencounter(i,j) = .true. - loc_lvdotr(i,j) = (vdotr < 0.0_DP) - end if - end if - end if + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(i), 0.0_DP, dt, irec, lencounter(i,j), loc_lvdotr(i,j)) end do end do @@ -128,11 +89,8 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc pltpenc_list%status(nenc_old+1:nenc) = ACTIVE pltpenc_list%level(nenc_old+1:nenc) = irec pltpenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) - !********************************************************************************************************* - ! This needs to be tested pltpenc_list%index1(nenc_old+1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) pltpenc_list%index2(nenc_old+1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) - !********************************************************************************************************* select type(pl) class is (symba_pl) pl%lencounter(pltpenc_list%index1(nenc_old+1:nenc)) = .true. @@ -143,4 +101,35 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) + !! author: David A. Minton + !! + !! Check for an encounter. + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_chk.f90 + !! Adapted from Hal Levison's Swift routine symba5_chk.f + implicit none + ! Arguments + real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr + real(DP), intent(in) :: rhill1, rhill2, dt + integer(I4B), intent(in) :: irec + logical, intent(out) :: lencounter, lvdotr + ! Internals + integer(I4B) :: iflag + real(DP) :: r2, v2, rcrit, r2crit, vdotr + + lencounter = .false. + rcrit = (rhill1 + rhill2)*RHSCALE*(RSHELL**(irec)) + r2crit = rcrit**2 + r2 = xr**2 + yr**2 + zr**2 + v2 = vxr**2 + vyr**2 + vzr**2 + vdotr = xr * vxr + yr * vyr + zr * vzr + iflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) + if (iflag /= 0) lencounter = .true. + lvdotr = (vdotr < 0.0_DP) + + return + end subroutine symba_encounter_check_one + + end submodule s_symba_encounter_check \ No newline at end of file diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 3f042fbd6..87cdab444 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -52,7 +52,6 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth !! Half step size - integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) @@ -76,8 +75,8 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%drift(system, param, dt, pl%status(:) == ACTIVE) call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - irec = 0 - call system%recursive_step(param, t, dt, irec) + + call system%recursive_step(param, t, dt, 0) call pl%set_beg_end(xend = pl%xh) call pl%accel(system, param, t + dt) @@ -113,10 +112,12 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, icflg, index_i, index_j, index_pl, index_tp - real(DP) :: dtl, dth,sgn + integer(I4B) :: i, j, irecp, icflg, nloops + real(DP) :: dtl, dth, sgn + real(DP), dimension(NDIM) :: xr, vr + logical :: lencounter - associate(plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + associate(pl => self%pl, tp => self%tp, plplenc_list => self%plplenc_list, nplplenc => self%plplenc_list%nenc, pltpenc_list => self%pltpenc_list, npltpenc => self%pltpenc_list%nenc) dtl = param%dt / (NTENC**ireci) dth = 0.5_DP * dtl IF (dtl / param%dt < VSMALL) THEN @@ -127,8 +128,21 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) END IF irecp = ireci + 1 if (ireci == 0) then - icflg = 0 + nloops = 1 + else + nloops = NTENC end if + do j = 1, nloops + icflg = 0 + do i = 1, nplplenc + associate(index_i => plplenc_list%index1(i), index_j => plplenc_list%index2(i)) + xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dtl, irecp, lencounter, plplenc_list%lvdotr(i)) + end associate + end do + + end do end associate end subroutine symba_step_recur_system diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 81b351e65..c356d686b 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -59,6 +59,7 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) allocate(enc_temp, source=self) call self%setup(2 * nrequested) call self%copy(enc_temp) + self%nenc = nrequested deallocate(enc_temp) return end subroutine symba_util_resize_pltpenc From 43f6b4cd1e81cc1a45535ed1ce34296095dac61e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 16:00:00 -0400 Subject: [PATCH 047/194] Added encounter checks for the plpl and pltp encounter lists --- src/modules/symba_classes.f90 | 20 ++++++ src/symba/symba_encounter_check.f90 | 96 +++++++++++++++++++++++++++++ src/symba/symba_step.f90 | 14 +---- 3 files changed, 119 insertions(+), 11 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 837394571..877f5b585 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -121,6 +121,7 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains + procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small @@ -136,6 +137,7 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains + procedure, public :: encounter_check => symba_encounter_check_plplenc !! Checks if massive bodies are going through close encounters with each other procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc @@ -192,6 +194,24 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_pl + module function symba_encounter_check_plplenc(self, system, dt, irec) result(lany_encounter) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + end function symba_encounter_check_plplenc + + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle object diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index d76a07af5..91feaafd1 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -50,6 +50,102 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl + module function symba_encounter_check_plplenc(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between massive bodies in the plplenc list. + !! + !! Adapted from portions of David E. Kaufmann's Swifter routine: symba_step_recur.f90 + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: xr, vr + logical :: lencounter + real(DP) :: rlim2, rji2 + + lany_encounter = .false. + associate(plplenc_list => self, nplplenc => self%nenc) + select type(pl => system%pl) + class is (symba_pl) + do i = 1, nplplenc + associate(index_i => plplenc_list%index1(i), index_j => plplenc_list%index2(i)) + xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dt, irec, lencounter, plplenc_list%lvdotr(i)) + if (lencounter) then + rlim2 = (pl%radius(index_i) + pl%radius(index_j))**2 + rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore + if (rji2 > rlim2) then + lany_encounter = .true. + pl%levelg(index_i) = irec + pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + pl%levelg(index_j) = irec + pl%levelm(index_j) = MAX(irec, pl%levelm(index_j)) + plplenc_list%level(i) = irec + end if + end if + end associate + end do + end select + end associate + return + end function symba_encounter_check_plplenc + + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) + !! author: David A. Minton + !! + !! Check for an encounter between test particles and massive bodies in the pltpenc list. + !! + !! Adapted from portions of David E. Kaufmann's Swifter routine: symba_step_recur.f90 + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + logical :: lany_encounter !! Returns true if there is at least one close encounter + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: xr, vr + logical :: lencounter + real(DP) :: rlim2, rji2 + + lany_encounter = .false. + associate(pltpenc_list => self, npltpenc => self%nenc) + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + do i = 1, npltpenc + associate(index_i => pltpenc_list%index1(i), index_j => pltpenc_list%index2(i)) + xr(:) = tp%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = tp%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), 0.0_DP, dt, irec, lencounter, pltpenc_list%lvdotr(i)) + if (lencounter) then + rlim2 = (pl%radius(index_i))**2 + rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore + if (rji2 > rlim2) then + lany_encounter = .true. + pl%levelg(index_i) = irec + pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + tp%levelg(index_j) = irec + tp%levelm(index_j) = MAX(irec, tp%levelm(index_j)) + pltpenc_list%level(i) = irec + end if + end if + end associate + end do + end select + end select + end associate + end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 87cdab444..cc7090065 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -112,12 +112,12 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, icflg, nloops + integer(I4B) :: i, j, irecp, nloops real(DP) :: dtl, dth, sgn real(DP), dimension(NDIM) :: xr, vr logical :: lencounter - associate(pl => self%pl, tp => self%tp, plplenc_list => self%plplenc_list, nplplenc => self%plplenc_list%nenc, pltpenc_list => self%pltpenc_list, npltpenc => self%pltpenc_list%nenc) + associate(system => self, pl => self%pl, tp => self%tp, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) dtl = param%dt / (NTENC**ireci) dth = 0.5_DP * dtl IF (dtl / param%dt < VSMALL) THEN @@ -133,15 +133,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) nloops = NTENC end if do j = 1, nloops - icflg = 0 - do i = 1, nplplenc - associate(index_i => plplenc_list%index1(i), index_j => plplenc_list%index2(i)) - xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) - vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dtl, irecp, lencounter, plplenc_list%lvdotr(i)) - end associate - end do - + lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) end do end associate From cceaf460bcb700188d5a2f47ef33c5fb0bad3cc4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 17:24:28 -0400 Subject: [PATCH 048/194] Simplified call to recursive step and fleshed out recursive step algorithm --- src/modules/symba_classes.f90 | 50 +++++++++++++++-------- src/symba/symba_kick.f90 | 35 ++++++++++++++++ src/symba/symba_step.f90 | 75 ++++++++++++++++++++++++----------- 3 files changed, 120 insertions(+), 40 deletions(-) create mode 100644 src/symba/symba_kick.f90 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 877f5b585..345b1b31c 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -122,9 +122,10 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other - procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another - procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small + procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion + procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** @@ -138,8 +139,9 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains procedure, public :: encounter_check => symba_encounter_check_plplenc !! Checks if massive bodies are going through close encounters with each other - procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another + procedure, public :: kick => symba_kick_plplenc !! Kick barycentric velocities of massive bodies within SyMBA recursion + procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** @@ -205,22 +207,40 @@ end function symba_encounter_check_plplenc module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) implicit none - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_pltpenc module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp + module subroutine symba_kick_plplenc(self, system, dt, irec, sgn) + implicit none + class(symba_plplenc), intent(in) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + end subroutine symba_kick_plplenc + + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + implicit none + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + 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_io_dump_particle_info(self, param, msg) use swiftest_classes, only : swiftest_parameters implicit none @@ -325,12 +345,10 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) + module recursive subroutine symba_step_recur_system(self, param, ireci) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level end subroutine symba_step_recur_system diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 new file mode 100644 index 000000000..6d438a950 --- /dev/null +++ b/src/symba/symba_kick.f90 @@ -0,0 +1,35 @@ +submodule(symba_classes) s_symba_kick + use swiftest +contains + + module subroutine symba_kick_plplenc(self, system, dt, irec, sgn) + !! author: David A. Minton + !! + !! !! Kick barycentric velocities of massive bodies within SyMBA recursion. + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_kick.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick.f + implicit none + class(symba_plplenc), intent(in) :: self !! SyMBA pl-pl encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + end subroutine symba_kick_plplenc + + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + !! author: David A. Minton + !! + !! !! Kick barycentric velocities of active test particles within SyMBA recursion. + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_kick.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick.f + implicit none + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + end subroutine symba_kick_pltpenc + +end submodule s_symba_kick \ No newline at end of file diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index cc7090065..b56db66d5 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -76,7 +76,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%drift(system, param, dt, pl%status(:) == ACTIVE) call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - call system%recursive_step(param, t, dt, 0) + call system%recursive_step(param, 0) call pl%set_beg_end(xend = pl%xh) call pl%accel(system, param, t + dt) @@ -96,7 +96,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) return end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) + module recursive subroutine symba_step_recur_system(self, param, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -108,33 +108,60 @@ module recursive subroutine symba_step_recur_system(self, param, t, dt, ireci) ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize integer(I4B), value, intent(in) :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, nloops - real(DP) :: dtl, dth, sgn + integer(I4B) :: i, j, irecp, nloops, sgn + real(DP) :: dtl, dth real(DP), dimension(NDIM) :: xr, vr logical :: lencounter - associate(system => self, pl => self%pl, tp => self%tp, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) - dtl = param%dt / (NTENC**ireci) - dth = 0.5_DP * dtl - IF (dtl / param%dt < VSMALL) THEN - write(*, *) "SWIFTEST Warning:" - write(*, *) " In symba_step_recur_system, local time step is too small" - write(*, *) " Roundoff error will be important!" - call util_exit(FAILURE) - END IF - irecp = ireci + 1 - if (ireci == 0) then - nloops = 1 - else - nloops = NTENC - end if - do j = 1, nloops - lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) - end do + associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + select type(pl => self%pl) + class is (symba_pl) + select type(tp => self%tp) + class is (symba_tp) + dtl = param%dt / (NTENC**ireci) + dth = 0.5_DP * dtl + IF (dtl / param%dt < VSMALL) THEN + write(*, *) "SWIFTEST Warning:" + write(*, *) " In symba_step_recur_system, local time step is too small" + write(*, *) " Roundoff error will be important!" + call util_exit(FAILURE) + END IF + irecp = ireci + 1 + if (ireci == 0) then + nloops = 1 + else + nloops = NTENC + end if + do j = 1, nloops + lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) + sgn = 1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + if (ireci /= 0) then + sgn = -1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + end if + + call pl%drift(system, param, dtl, pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci) + call tp%drift(system, param, dtl, tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci) + + if (lencounter) call system%recursive_step(param, irecp) + + sgn = 1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + if (ireci /= 0) then + sgn = -1 + call plplenc_list%kick(system, dth, irecp, sgn) + call pltpenc_list%kick(system, dth, irecp, sgn) + end if + + end do + end select + end select end associate end subroutine symba_step_recur_system From 9fd453f624018f4755aaf4d9b5d9dfd43cf3432d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 24 Jul 2021 23:40:56 -0400 Subject: [PATCH 049/194] Consolidated the plplenc and pltpenc encounter checks into one polymorphic subroutine --- src/modules/symba_classes.f90 | 1 - src/symba/symba_encounter_check.f90 | 107 +++++++++++----------------- 2 files changed, 40 insertions(+), 68 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 345b1b31c..42b8903d9 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -138,7 +138,6 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: encounter_check => symba_encounter_check_plplenc !! Checks if massive bodies are going through close encounters with each other procedure, public :: kick => symba_kick_plplenc !! Kick barycentric velocities of massive bodies within SyMBA recursion procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 91feaafd1..87f227058 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -50,57 +50,11 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl - module function symba_encounter_check_plplenc(self, system, dt, irec) result(lany_encounter) - !! author: David A. Minton - !! - !! Check for an encounter between massive bodies in the plplenc list. - !! - !! Adapted from portions of David E. Kaufmann's Swifter routine: symba_step_recur.f90 - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - logical :: lany_encounter !! Returns true if there is at least one close encounter - ! Internals - integer(I4B) :: i - real(DP), dimension(NDIM) :: xr, vr - logical :: lencounter - real(DP) :: rlim2, rji2 - - lany_encounter = .false. - associate(plplenc_list => self, nplplenc => self%nenc) - select type(pl => system%pl) - class is (symba_pl) - do i = 1, nplplenc - associate(index_i => plplenc_list%index1(i), index_j => plplenc_list%index2(i)) - xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) - vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dt, irec, lencounter, plplenc_list%lvdotr(i)) - if (lencounter) then - rlim2 = (pl%radius(index_i) + pl%radius(index_j))**2 - rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore - if (rji2 > rlim2) then - lany_encounter = .true. - pl%levelg(index_i) = irec - pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) - pl%levelg(index_j) = irec - pl%levelm(index_j) = MAX(irec, pl%levelm(index_j)) - plplenc_list%level(i) = irec - end if - end if - end associate - end do - end select - end associate - return - end function symba_encounter_check_plplenc - module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! !! Check for an encounter between test particles and massive bodies in the pltpenc list. + !! Note: This method works for the polymorphic symba_pltpenc and symba_plplenc types. !! !! Adapted from portions of David E. Kaufmann's Swifter routine: symba_step_recur.f90 implicit none @@ -113,37 +67,56 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan ! Internals integer(I4B) :: i real(DP), dimension(NDIM) :: xr, vr - logical :: lencounter + logical :: lencounter, isplpl real(DP) :: rlim2, rji2 lany_encounter = .false. - associate(pltpenc_list => self, npltpenc => self%nenc) - select type(pl => system%pl) - class is (symba_pl) - select type(tp => system%tp) - class is (symba_tp) - do i = 1, npltpenc - associate(index_i => pltpenc_list%index1(i), index_j => pltpenc_list%index2(i)) + select type(self) + class is (symba_plplenc) + isplpl = .true. + class is (symba_pltpenc) + isplpl = .false. + end select + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + do i = 1, self%nenc + associate(index_i => self%index1(i), index_j => self%index2(i)) + if (isplpl) then + xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dt, irec, lencounter, self%lvdotr(i)) + else xr(:) = tp%xh(:,index_j) - pl%xh(:,index_i) vr(:) = tp%vb(:,index_j) - pl%vb(:,index_i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), 0.0_DP, dt, irec, lencounter, pltpenc_list%lvdotr(i)) - if (lencounter) then + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), 0.0_DP, dt, irec, lencounter, self%lvdotr(i)) + end if + if (lencounter) then + if (isplpl) then + rlim2 = (pl%radius(index_i) + pl%radius(index_j))**2 + else rlim2 = (pl%radius(index_i))**2 - rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore - if (rji2 > rlim2) then - lany_encounter = .true. - pl%levelg(index_i) = irec - pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + end if + rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore + if (rji2 > rlim2) then + lany_encounter = .true. + pl%levelg(index_i) = irec + pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + if (isplpl) then + pl%levelg(index_j) = irec + pl%levelm(index_j) = MAX(irec, pl%levelm(index_j)) + else tp%levelg(index_j) = irec tp%levelm(index_j) = MAX(irec, tp%levelm(index_j)) - pltpenc_list%level(i) = irec end if - end if - end associate + self%level(i) = irec + end if + end if + end associate end do - end select end select - end associate + end select end function symba_encounter_check_pltpenc module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) From 2dacd1b76e630272449f692130478fb02de2cc87 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 25 Jul 2021 11:23:29 -0400 Subject: [PATCH 050/194] Converted symba_kick to OOF --- src/modules/symba_classes.f90 | 19 ------ src/symba/symba_kick.f90 | 115 ++++++++++++++++++++++++++++------ 2 files changed, 95 insertions(+), 39 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 42b8903d9..2a9602205 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -138,7 +138,6 @@ module symba_classes real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: kick => symba_kick_plplenc !! Kick barycentric velocities of massive bodies within SyMBA recursion procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc @@ -195,15 +194,6 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_pl - module function symba_encounter_check_plplenc(self, system, dt, irec) result(lany_encounter) - implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - logical :: lany_encounter !! Returns true if there is at least one close encounter - end function symba_encounter_check_plplenc - module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-pl encounter list object @@ -222,15 +212,6 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp - module subroutine symba_kick_plplenc(self, system, dt, irec, sgn) - implicit none - class(symba_plplenc), intent(in) :: self !! SyMBA pl-pl encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration - end subroutine symba_kick_plplenc - module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) implicit none class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 6d438a950..0586b2a5f 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -2,34 +2,109 @@ use swiftest contains - module subroutine symba_kick_plplenc(self, system, dt, irec, sgn) - !! author: David A. Minton - !! - !! !! Kick barycentric velocities of massive bodies within SyMBA recursion. - !! - !! Adapted from David E. Kaufmann's Swifter routine: symba_kick.f90 - !! Adapted from Hal Levison's Swift routine symba5_kick.f - implicit none - class(symba_plplenc), intent(in) :: self !! SyMBA pl-pl encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration - end subroutine symba_kick_plplenc - module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) !! author: David A. Minton !! - !! !! Kick barycentric velocities of active test particles within SyMBA recursion. + !! Kick barycentric velocities of massive bodies and ACTIVE test particles within SyMBA recursion. + !! Note: This method works for the polymorphic symba_pltpenc and symba_plplenc types !! !! Adapted from David E. Kaufmann's Swifter routine: symba_kick.f90 !! Adapted from Hal Levison's Swift routine symba5_kick.f implicit none - class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + ! Arguments + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + ! Internals + integer(I4B) :: i, irm1, irecl + real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj + real(DP), dimension(NDIM) :: dx + logical :: isplpl, lgoodlevel + + select type(self) + class is (symba_plplenc) + isplpl = .true. + class is (symba_pltpenc) + isplpl = .false. + end select + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + irm1 = irec - 1 + if (sgn < 0) then + irecl = irec - 1 + else + irecl = irec + end if + do i = 1, self%nenc + associate(index_i => self%index1(i), index_j => self%index2(i)) + if (isplpl) then + pl%ah(:,index_i) = 0.0_DP + pl%ah(:,index_j) = 0.0_DP + else + tp%ah(:,index_j) = 0.0_DP + end if + if (isplpl) then + lgoodlevel = (pl%levelg(index_i) >= irm1) .and. (pl%levelg(index_j) >= irm1) + else + lgoodlevel = (pl%levelg(index_i) >= irm1) .and. (tp%levelg(index_j) >= irm1) + end if + if ((self%status(i) == ACTIVE) .and. lgoodlevel) then + if (isplpl) then + ri = ((pl%rhill(index_i) + pl%rhill(index_j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + else + ri = ((pl%rhill(index_i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + rim1 = ri * (RSHELL**2) + dx(:) = tp%xh(:,index_j) - pl%xh(:,index_i) + end if + r2 = dot_product(dx(:), dx(:)) + if (r2 < rim1) then + fac = 0.0_DP + else if (r2 < ri) then + ris = sqrt(ri) + r = sqrt(r2) + rr = (ris - r) / (ris * (1.0_DP - RSHELL)) + fac = (r2**(-1.5_DP)) * (1.0_DP - 3 * (rr**2) + 2 * (rr**3)) + else + ir3 = 1.0_DP / (r2 * sqrt(r2)) + fac = ir3 + end if + faci = fac * pl%mass(index_i) + if (isplpl) then + facj = fac * pl%mass(index_j) + pl%ah(:,index_i) = pl%ah(:,index_i) + facj*dx(:) + pl%ah(:,index_j) = pl%ah(:,index_j) - faci*dx(:) + else + tp%ah(:,index_j) = tp%ah(:,index_j) - faci*dx(:) + end if + end if + end associate + end do + if (isplpl) then + do i = 1, self%nenc + associate(index_i => self%index1(i), index_j => self%index2(i)) + pl%vb(:,index_i) = pl%vb(:,index_i) + sgn * dt * pl%ah(:,index_i) + pl%vb(:,index_j) = pl%vb(:,index_j) + sgn * dt * pl%ah(:,index_j) + pl%ah(:,index_i) = 0.0_DP + pl%ah(:,index_j) = 0.0_DP + end associate + end do + else + where(tp%status(self%index2(1:self%nenc)) == ACTIVE) + tp%vb(1,self%index2(:)) = tp%vb(1,self%index2(:)) + sgn * dt * tp%ah(1,self%index2(:)) + tp%vb(2,self%index2(:)) = tp%vb(2,self%index2(:)) + sgn * dt * tp%ah(2,self%index2(:)) + tp%vb(3,self%index2(:)) = tp%vb(3,self%index2(:)) + sgn * dt * tp%ah(3,self%index2(:)) + end where + tp%ah(:,self%index2(1:self%nenc)) = 0.0_DP + end if + end select + end select + return end subroutine symba_kick_pltpenc end submodule s_symba_kick \ No newline at end of file From 6328d86d6e0720c08da6f7be11075af54b87d38c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sun, 25 Jul 2021 18:26:35 -0400 Subject: [PATCH 051/194] Fixed symba_interp drift mask --- .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 6 +++--- src/symba/symba_step.f90 | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 2c1c7d294..fbe6d8246 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index b56db66d5..d34956f4b 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -52,6 +52,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth !! Half step size + integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) @@ -72,11 +73,11 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%kick(dth) call tp%kick(dth) - - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - - call system%recursive_step(param, 0) + irec = -1 + call pl%drift(system, param, dt, pl%status(:) == ACTIVE .and. pl%levelg(:) == irec) + call tp%drift(system, param, dt, tp%status(:) == ACTIVE .and. tp%levelg(:) == irec) + irec = 0 + call system%recursive_step(param, irec) call pl%set_beg_end(xend = pl%xh) call pl%accel(system, param, t + dt) From bb3187ea87f068f585367c9fbcb914e72ca01787 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 10:46:29 -0400 Subject: [PATCH 052/194] Fixed bug that prevented the encounter list resize to save the correct number of encounters. Also corrected final barycentric velocity conversion in symba_step_interp_system. --- .../swiftest_vs_swifter.ipynb | 536 +++++++++++++++++- src/symba/symba_encounter_check.f90 | 1 + src/symba/symba_step.f90 | 4 +- src/symba/symba_util.f90 | 11 +- 4 files changed, 542 insertions(+), 10 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index fbe6d8246..6e3effc7c 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAvHElEQVR4nO3dd3hUZdrH8e9NAqQQeicEIh2kCCFRwAKIIgoISBdBQETFtSwq+9p1VSzr2kUsLCiCiqKoCK5YQLGQWOgoUkxogVBDSJu53z9mZEcMmIFMzszk/lxXLnLOeZ7JLyFn7jynPEdUFWOMMaa4yjkdwBhjTGixwmGMMcYvVjiMMcb4xQqHMcYYv1jhMMYY45dIpwOUpJo1a2rjxo2djmGMMSEjLS1tj6rW8qdPWBWOxo0bk5qa6nQMY4wJGSKy1d8+dqjKGGOMXwJaOESkt4hsEJGNIjKliO39RWSliPwoIqki0s1n2xYRWfX7tkDmNMYYU3wBO1QlIhHAs0AvIANYISILVHWtT7MlwAJVVRFpB7wJtPTZ3l1V9wQqozHGGP8F8hxHMrBRVTcBiMhcoD9wtHCoarZP+1igxOc/KSgoICMjg9zc3JJ+aUdFRUURHx9P+fLlnY5ijCljAlk4GgDpPssZQMqxjURkAPAQUBu42GeTAh+LiAIvqOr0kwmRkZFBXFwcjRs3RkRO5iWCjqqSlZVFRkYGiYmJTscxxpQxgTzHUdS79J9GFKo6X1VbApcC9/ts6qqqHYGLgOtE5Jwiv4jIBO/5kdTdu3f/aXtubi41atQIm6IBICLUqFEj7EZRxpjQEMjCkQE09FmOB7Yfr7GqLgWaiEhN7/J277+ZwHw8h76K6jddVZNUNalWraIvRQ6novG7cPyejDGhIZCFYwXQTEQSRaQCMAxY4NtARJqK9x1QRDoCFYAsEYkVkTjv+ljgAmB1ALMaY0xocRXCov+DAxml/qUDVjhUtRCYBCwG1gFvquoaEZkoIhO9zQYBq0XkRzxXYA1VzwNC6gBfishPwHfAh6q6KFBZT0WXLl2KXD9mzBjmzZtXymmMMWXG5w/BN8/C1uWl/qUDeue4qi4EFh6zbprP5w8DDxfRbxPQPpDZSsry5aX/n2aMKeM2fgLL/gVnjIJ2Q0r9y4fVlCNOqFSpEtnZ2agq119/PZ9++imJiYnYkxWNMQFxcDu8MwFqt4KLHsHlVnILXMRWLL23c5typITMnz+fDRs2sGrVKl588UUbiRhjSp6rEOaNg4JcGDwTKsTw0MJ1DHp+OYfzCksthhWOErJ06VKGDx9OREQE9evXp0ePHk5HMsaEm0/uht+WQ98noFZz3ljxGy99uZmUxOo24ghVdomsMSZgVr8NXz8Dna+CdkP4dlMWd7y7mrOb1eTOS1qXahQrHCXknHPOYe7cubhcLnbs2MFnn33mdCRjTLjIXAfvXQ8NU+DCB0nfm8M1s7+nYbUYnhnekciI0n0rt5PjJWTAgAF8+umntG3blubNm3Puuec6HckYEw5yD8DckVAhFgbP5FChMG7mCgpdbl4anUSVmNKfr84KxynKzvbM0ygiPPPMMw6nMcaEFbcb5l8D+7fC6PdxVarLjbNS+XX3YWZemcxptSo5EssOVRljTLD68nHY8CFc8AA06sJDC9exZH0m9/RtTbdmNR2LZYXDGGOC0cZP4NN/QtvBkHI1s7/dyktfbmZMl8aMOquxo9GscBhjTLDZtxXeHg+1W0PfJ1m2cQ93vbeG7i1qccfFrZxOZ4XDGGOCSl42zB0B6oahr7Jxv5trZ39Ps9qVeHpE6V9BVRTnExhjjPFwu+HdayBzLVw2g6yK8Vz5nxVUjIzg5TGdqVSKN/mdiBUOY4wJFksfhXULoNf95DY6jwmvppF5MI+XRifRoGq00+mOssIRYOnp6XTv3p1WrVrRpk0bnnzySacjGWOC0br34fMHof1w9Mxrue3tlaRt3ce/h3agQ8OqTqf7g+AY94SxyMhI/vWvf9GxY0cOHTpEp06d6NWrF61bl+4UAcaYILZrDbxzNTRIgkue4KlPf+W9H7dzy4Ut6NO2ntPp/sRGHAFWr149OnbsCEBcXBytWrVi27ZtDqcyxgSNw1kwZzhUjIOhr/Hemiz+/cnPDOoYz7XnNXE6XZHK1Ijj3vfXsHb7wRJ9zdb1K3N33zbFartlyxZ++OEHUlJSSjSDMSZEuQrgrdFwaCdc+RFp+ypyy7xvSU6szkMD2wbtxKk24igl2dnZDBo0iCeeeILKlSs7HccYEwwW/x9sWQb9niI9phUTZqVRv0oUL1zeiQqRwfv2XKZGHMUdGZS0goICBg0axMiRIxk4cKAjGYwxQSZtJnw3Hc6axMEWgxj73HIK3crLYzpTLbaC0+lOKHhLWphQVcaNG0erVq24+eabnY5jjAkGW7+GD/8OTXpQ0OMerpv9PZv3HOb5yzvSxKGJC/0R0MIhIr1FZIOIbBSRKUVs7y8iK0XkRxFJFZFuxe0bKr766iteffVVPv30Uzp06ECHDh1YuHCh07GMMU45kAFvjoKqCeigV7jjvXUs+2UPDw5oS5cmzk1c6I+AHaoSkQjgWaAXkAGsEJEFqrrWp9kSYIGqqoi0A94EWhazb0jo1q0bqup0DGNMMMjLhjnDPM8MH/Mhz3y9hzdS0/lbj6YM6dzQ6XTFFsgRRzKwUVU3qWo+MBfo79tAVbP1f++qsYAWt68xxoQUtwveucpzz8bg/zA/I5Z//fdnBp7RgJt6NXc6nV8CWTgaAOk+yxnedX8gIgNEZD3wITDWn77e/hO8h7lSd+/eXSLBjTGmxP33LtiwEHo/zHLpwK3zVtKlSQ2mDmoXtJfdHk8gC0dRP4k/HbNR1fmq2hK4FLjfn77e/tNVNUlVk2rVqnWyWY0xJnDS/gNfPwPJE/i58XCufi2NxJqxPB/kl90eTyATZwC+B+3ige3Ha6yqS4EmIlLT377GGBO0Nn3uuYKq6fns6nI3Y175jujyEcy4Mpkq0aX/vPCSEMjCsQJoJiKJIlIBGAYs8G0gIk3FO0YTkY5ABSCrOH2NMSbo7fkF3rwCajTjcN8XGTvrB/YfKeCVMZ2DarZbfwXsqipVLRSRScBiIAJ4RVXXiMhE7/ZpwCDgChEpAI4AQ70ny4vsG6isxhhT4nL2wutDoFx5CofO4bp3NrJ+5yFeGp3E6Q2qOJ3ulAT04JqqLlTV5qraRFUf8K6b5i0aqOrDqtpGVTuo6lmq+uWJ+oaqsWPHUrt2bU4//fSj6/bu3UuvXr1o1qwZvXr1Yt++fUe3PfTQQzRt2pQWLVqwePFiJyIbY05FYT68MQoObEOHzebOpdl8vmE39/c/ne4tajud7pSF3lmZEDRmzBgWLVr0h3VTp06lZ8+e/PLLL/Ts2ZOpU6cCsHbtWubOncuaNWtYtGgR1157LS6Xy4nYxpiToQof3ARbv4T+z/L8pprM+e43rj2vCSNSEpxOVyKscJSCc845h+rVq/9h3Xvvvcfo0aMBGD16NO++++7R9cOGDaNixYokJibStGlTvvvuu9KObIw5WV89AT++BudO4T13Fx5ZtIH+Heoz+YIWTicrMWVqkkM+mgI7V5Xsa9ZtCxdN9bvbrl27qFfP84CWevXqkZmZCcC2bds488wzj7aLj4+353cYEyrWvQ+f3AOnD+KbhKu45ZUVpCRW55HL2lGuXGjdq3EiNuIIMkVNTxJqNwcZUyZlpMLbV0F8Zzac+RBXvZpGQo0Ypo9KomJkhNPpSlTZGnGcxMggUOrUqcOOHTuoV68eO3bsoHZtzwmz+Ph40tP/d9N8RkYG9evXdyqmMaY49m6C14dCXB129HmFK/6zipgKEcwcm0yVmNC8V+NEbMThkH79+jFz5kwAZs6cSf/+/Y+unzt3Lnl5eWzevJlffvmF5ORkJ6MaY04kZy/MHgzq4sDAuVw+ZxM5+S5mjk0O6Xs1TqRsjTgcMnz4cD7//HP27NlDfHw89957L1OmTGHIkCG8/PLLJCQk8NZbbwHQpk0bhgwZQuvWrYmMjOTZZ58lIiK8hrnGhI2CXM/zwvenkzdiPmPe30v6viO8OjaZlnXD90mfEk5TficlJWlqauof1q1bt45WrVo5lCiwwvl7Myboud0w70pY+y6uQTOYkNaQzzZk8tzIjvQ+vZ7T6YpNRNJUNcmfPnaoyhhjTsYnd8Pad9Fe9/OPDU1Ysj6T+/qfHlJF42RZ4TDGGH999yIsfwo6X8Xj2RfwZmoGf+vRlMvPbOR0slJRJgpHOB2O+104fk/GhIQNH8FHt0Lzi3it2jU8/dmvDE9uGHIPYzoVYV84oqKiyMrKCqs3WlUlKyuLqKgop6MYU7Zs+x7mjYV67Vnc6gHufH8957eqw/39Ty9T91uF/VVV8fHxZGRkEG5PB4yKiiI+Pt7pGMaUHfu2eGa7ja1JapdpXD/nZzomVOPp4WcQGRH2f4P/QdgXjvLly5OYmOh0DGNMKPv9Xg1XAb9e/AZXvrGVRjVieHl0EtEVyt7l8mFfOIwx5pTk53hGGvu2knnpHIbP30dsxUhmjk2makwFp9M5omyNr4wxxh+uQs+9GtvSOHDx8wxdHEFugYtZ45KpH6Z3hReHFQ5jjCmKKnxwA/y8iCMXPMzwZbXZeSCXGVd2pnmdOKfTOcoKhzHGFOXT++GH1yjodgujf2rLL5mHmDaqE50aVf/rvmHOCocxxhzr2xdg2b9wdRzNhN96sWLrXv49tAPnNq/ldLKgYIXDGGN8rX4HProNbdGHyYdH8dnPe3jg0rZc0s4eb/C7gBYOEektIhtEZKOITCli+0gRWen9WC4i7X22bRGRVSLyo4ikHtvXGGNK3OalMP9qNOFM7o+azPyfMrmtd8uweVZ4SQnY5bgiEgE8C/QCMoAVIrJAVdf6NNsMnKuq+0TkImA6kOKzvbuq7glURmOMOWrHSpgzAqo34bm69/PK0p1cfc5pXHNeE6eTBZ1AjjiSgY2quklV84G5QH/fBqq6XFX3eRe/AexWaGNM6du3BWZfBlFVmNPiCR5dmsnQpIZMuail08mCUiALRwMg3Wc5w7vueMYBH/ksK/CxiKSJyITjdRKRCSKSKiKp4TatiDGmFGTvhlcHQmEeizs+xz8+yaJP27o8OLBtmZp/yh+BvHO8qJ94kTMNikh3PIWjm8/qrqq6XURqA/8VkfWquvRPL6g6Hc8hLpKSksJnJkNjTODlHoDXBsLB7Xx79itcu/gwZzeryb+HdiCinBWN4wnkiCMDaOizHA9sP7aRiLQDXgL6q2rW7+tVdbv330xgPp5DX8YYUzLyc+D1YZC5llXdnmHUx0LbBlWYdnknKkaWvfmn/BHIwrECaCYiiSJSARgGLPBtICIJwDvAKFX92Wd9rIjE/f45cAGwOoBZjTFlSWE+vDUafvuaX7o+zuAlsTStXYmZVyYTW9Gm8PsrAfsJqWqhiEwCFgMRwCuqukZEJnq3TwPuAmoAz3mPJRZ6n31bB5jvXRcJvK6qiwKV1RhThrhd8O5E+OVjfus6lUu/qEN8tWheHZdMlZjyTqcLCRJODzhKSkrS1FS75cMYcxyq8MFNkDaDXcn/R6/vOlA1pgJvXn0WdauUzQejiUia9w/2YrMxmTGm7FhyH6TNYN8Z19InrSOVKpZj9viUMls0TpZNOWKMKRu+ehK+fJxDp4+i9+oeiAivjU+hYfUYp5OFHCscxpjwl/Yf+O9dHGnenz6/9Cffpcwen8JptSo5nSwkWeEwxoS31e/A+zeSl9iTfttGsT/XzayxKbSoW7afqXEq7ByHMSZ8/fIJvDOBggbJDM6aSMZBF6+OS6ZtfBWnk4U0KxzGmPC06Qt4YySuWi0ZlXMz6/e6mDGmM0mN7UFMp8oOVRljws9v38CcYbiqNmZ0wT9Iy3Qz7fKOdG1a0+lkYcEKhzEmvGxLg9cuwx1Xj/F6B9/uEp4b2YkeLes4nSxsWOEwxoSPnavg1YG4Y6pzdbm7WbYjgmdGdKRXaysaJcnOcRhjwkPmepjVH3f5GCZF3sun28vzzPAzuLBNXaeThR0bcRhjQl/WrzCrHyqR3Bh1P4u3V+TJYR24qG09p5OFJRtxGGNC276tMLMf6irklkoP8UFGNP8e2p5L2tV3OlnYssJhjAldB7d7Rhr5h7i98lTeTq/E40Pa07/DiR42ak6VFQ5jTGjKzvSMNA7v4e6qDzEnvQqPXdaeAWfEO50s7Nk5DmNM6Mne7SkaB7fxYLX7mfVbDR4e1I5BnaxolAYrHMaY0JK9G2b2RfdtYWq1e3lxax0eGtiWIUkN/7qvKRF2qMoYEzp8isaDVe/lpfQGPDKoHUM6W9EoTVY4jDGhwado3F/lHv6zLZ7HLmtvh6ccYIXDGBP8fIrGvXF3M2t7Q/49tINdPeUQKxzGmOCWvdtzye2+Ldxd6S5m72rE08PP4OJ2dnOfUwJ6clxEeovIBhHZKCJTitg+UkRWej+Wi0j74vY1xpQBvxeNvZu5M/ZOXs9szLMjrGg4LWCFQ0QigGeBi4DWwHARaX1Ms83AuaraDrgfmO5HX2NMOPMpGrfH3MEbexJ5/vJO9D7diobTAjniSAY2quomVc0H5gL9fRuo6nJV3edd/AaIL25fY0wY8yka/4i6g3lZTXhhVCeb5TZIBLJwNADSfZYzvOuOZxzwkb99RWSCiKSKSOru3btPIa4xJihkZx4tGlMq3s78/U14cXSSPU8jiASycEgR67TIhiLd8RSO2/ztq6rTVTVJVZNq1ap1UkGNMUHi4HaY0Qf33s1MLv9/vHewKa+M6cy5zW3fDiaBvKoqA/C9Kyce2H5sIxFpB7wEXKSqWf70NcaEkX1bYVY/3Nl7uK7cHXyZ04xXx3Wmsz0jPOgEcsSxAmgmIokiUgEYBizwbSAiCcA7wChV/dmfvsaYMJL1K8zog+vwPsa67+Cbwua8ftWZVjSCVMBGHKpaKCKTgMVABPCKqq4RkYne7dOAu4AawHMiAlDoPexUZN9AZTXGOMj75L7CwnxGFtzO5sgmvDE+heZ14pxOZo5DVIs8dRCSkpKSNDU11ekYxpji2rkKZl1KvgpDcqawO/o0Xr8qhUY1Yp1OVmaISJqqJvnTx+4cN8Y4Y9v38OoA8spF0S/7Ngqqnsa88SnUqxLtdDLzF6xwGGNK32/fwuzLyImszCX7b6Vi7dN4c1wyNStVdDqZKQZ7HocxpnRtXgavDuBQZHV67ZtC5fpNmXvVmVY0QogVDmNM6fn5Y5h9Gfsr1qXH3ltJaNyM18anUCWmvNPJjB+scBhjSseqeejc4eyKSqTHnlto16I5M67sTKWKdsQ81FjhMMYE3ncvom+PZ0t0W3ru+TvdO7Zm2qhORJWPcDqZOQlW6o0xgaMKSx+Dz/7JqtguDM6awJhzWjLlopZ4790yIahYIw4RGXfMcoSI3B2YSMaYsOB2w+L/g8/+ybKY8xmQdQ03X9SOf/RpZUUjxBX3UFVPEVkoIvVE5HQ8U6DbbZ3GmKK5CmHBJPjmORZE9ePK/Vcy9bIzuPrcJk4nMyWgWIeqVHWEiAwFVgE5wHBV/SqgyYwxoakgF94eB+s/YEaF4UzN7se0yztxvj1LI2wUq3CISDPgBuBtoBUwSkR+UNWcQIYzxoSYvEMwZzhsWcZjEeOYlX8hr423GW7DTXFPjr8PXKeqS8RzcPImPDPYtglYMmNMaDmcBbMHoTtWcjvX80m583jzqmRa1q3sdDJTwopbOJKB8SJyHZ4HKn2JZ6pzY4yBvZvhtUG49mdwXeHNbKjSjbfHJtOweozTyUwAFLdwvAQcAp72Lg8HzgKGBCKUMSaEbP8RZg8mLy+XkblTKGyQwrzRSdSwKUTCVnELRwtVbe+z/JmI/BSIQMaYELJxCfrmFRykEgMP38lprTry1LAziK5gN/aFs+JejvuDiJz5+4KIpAB2VZUxZdmPc9DXh7CNOvQ6eCfdzuzCtMs7WdEoA4o74kgBrhCR37zLCcA6EVkFqKq2C0g6Y0zwUYUvH4cl97G6QntGHLyev/XpxPizE+3GvjKiuIWjd0BTGGNCg9sFH90KK15iSeQ5/O3wBKYO70Tf9vWdTmZKUXFvANwa6CDGmCBXcATeHg/rP2CW9OPxwpHMGJ9McqLdo1HWBHR2XBHpLSIbRGSjiEwpYntLEflaRPJEZPIx27aIyCoR+VFE7EHixjgpZy/MuhRd/yEPua/ghYpXMu/arlY0yqiAzY4rIhHAs0AvIANYISILVHWtT7O9wN+AS4/zMt1VdU+gMhpjimHvJpg9GNferdxQcD1b6l7A/DGdqR0X5XQy45BAjjiSgY2quklV84G5QH/fBqqaqaorgIIA5jDGnKytX6Mv9iRnfybDc6eQ27w/b0w4y4pGGRfIwtEASPdZzvCuKy4FPhaRNBGZUKLJjDF/beVb6Kx+7CyIpk/O3XQ4+2JeGNWJWHtiX5kXyN+Aoq7LUz/6d1XV7SJSG/iviKxX1aV/+iKeojIBICEh4eSSGmP+RxW+eBg+f4hVEW0Ym3MDtww8i6Gdbf8yHoEccWQADX2W44Htxe2sqtu9/2YC8/Ec+iqq3XRVTVLVpFq1ap1CXGMMhXkw/2r4/CHel3MZ67qdp8b1tKJh/iCQI44VQDMRSQS24ZkUcURxOopILFBOVQ95P78AuC9gSY0xniun5o6E35bzuGso71cezltXJpNYM9bpZCbIBKxwqGqhiEwCFgMRwCuqukZEJnq3TxORukAqUBlwi8iNQGugJjDfexdqJPC6qi4KVFZjyrw9G9HXB+Pal8FN+ZPY07gv8y/vSNWYCk4nM0EooGe5VHUhsPCYddN8Pt+J5xDWsQ4C7YtYb4wpaVu+ROeOJLtAGZ37fzRP6snjl55O+YiA3uZlQphdHmFMWZY6A104mXTqcvmRv3NFn/MY183mnDInZoXDmLLIVQCL/gErXmQ5HbiFG3hgTDe6t6jtdDITAqxwGFPWHM5C3xqNbFnGi65LeKvqOF67IpnTalVyOpkJEVY4jClLdq3FPWcY7gPbuTV/IgdbDObtoe2JiyrvdDITQqxwGFNWrP8Q99tXsd9VgXG5d3B2jz7c2LMZ5crZ+QzjHyscxoQ7VVj2GHz6T9ZLE651TWbKyO70Pr2e08lMiLLCYUw4yzsE710Ha99jgbsrT8X+jRdGd6VF3Tink5kQZoXDmHC15xfcc0fAno08XDCctYljmDfCbuozp84KhzHhaN0HuOdfzaGCclyTP4W2Z/djxgUtiLSb+kwJsMJhTDhxu+CzB2HZY6yjCTfq35k8sicXtqnrdDITRqxwGBMucvaib49Hfl3CG67zeK369UwfdZZNUmhKnBUOY8LBjpW45l6O+8B27iwYT367Ubw5oC3RFSKcTmbCkBUOY0LdD6/h/uBmslyVuLbwLgb068+I5ASbb8oEjBUOY0JV/mH0w78jP83hW3cb/hk9mQfH9aB9w6pOJzNhzgqHMaFo9wZcb1yB7NnAk4UD+em0Cbw6tBPVY+1SWxN4VjiMCTUr38S14AYOFkZyY8EUul44mJe7nWZTh5hSY4XDmFBRcAT9aAry/X9Ic7fkgehbuHtsTzomVHM6mSljrHAYEwqyfqVw7igid6/hucJ+rGw2iVmDO1Ilxma1NaXPCocxwe6nN3C9fxM5hcLkwlvpctEInu/S2K6aMo6xwmFMsMo9iPvDv1Nu1Zt8727BI7GTuWvkhbSNr+J0MlPGBXTiGhHpLSIbRGSjiEwpYntLEflaRPJEZLI/fY0Ja9vSKHj+bHTVPP5dMIg32jzHKzcMsKJhgkLARhwiEgE8C/QCMoAVIrJAVdf6NNsL/A249CT6GhN+3G50+VPokvvZ7a7KFLmHy4YM5qb29Z1OZsxRgTxUlQxsVNVNACIyF+gPHH3zV9VMIFNELva3rzFh59BOCuZNoPzWL1joSmZevVt4aMTZNKga7XQyY/4gkIWjAZDus5wBpJR0XxGZAEwASEhI8D+lMcFgwyIK3rkGV142dxdeRYMeV/PSeU2JsHszTBAKZOEo6jdeS7qvqk4HpgMkJSUV9/WNCQ55h3B99A8ifnyVX9yNmBp7LzeP6EcHmzbEBLFAFo4MoKHPcjywvRT6GhMatn5N/rwJRB5K5/nCvqS3u5Hn+3cgtqJd7GiCWyB/Q1cAzUQkEdgGDANGlEJfY4JbYR7uTx9Alj/FLq3FvZH3M2LYEK5pWcfpZMYUS8AKh6oWisgkYDEQAbyiqmtEZKJ3+zQRqQukApUBt4jcCLRW1YNF9Q1UVmNKza415L05jopZ65hT2J3vW93Co5d2pppNTmhCiKiGz2mBpKQkTU1NdTqGMX/mduFe/iy65D72uWO4v9xELhhwJRe3q+d0MlPGiUiaqib508cOphoTaLt/JvftiUTtTGORqzOLEm/j9sFnUzsuyulkxpwUKxzGBIqrEPfyp3F/9iC5rvLcyyQ69ruafyc1tHmmTEizwmFMIOxay5F5E4ne/ROLXZ35b+NbufWyc6hbxUYZJvRZ4TCmJLkKKFz6OLL0EXLcMdwTcTNnDxjPv9rVt1GGCRtWOIwpKTtWkvPW1cTsXcsC11l813IKUy7tYldMmbBjhcOYU5V/mPwlDxH57XNkaxz3lb+NC4eN558tazudzJiAsMJhzCnQnxeT++6NROdsZ46rO5va38LtlyQTF2VP5jPhywqHMSfj0E5yFtxCzC8LSHc3YHqVhxkxeCjD7fnfpgywwmGMP9xuCle8jOvju4kozOdJHUpcz78ztVszIiMC+lw0Y4KGFQ5jimvnag7Nm0Tcnh/4xtWGjxvfxsRBF1DfnpdhyhgrHMb8lSP7yFl8P1E/ziBfY7m3wg10G3It97Wu63QyYxxhhcOY43G7KUibSeHH91Ax/wCvu3uxN2Uyt16QRHSFCKfTGeMYKxzGFCUjjYPv3EDlvav4wd2ChfEPM2ZgXxrXjHU6mTGOs8JhjK/s3Rz88E4qr5vDEa3K09E30fXSa7jHnpVhzFFWOIwBKMwjd/k0+OIRoguPMIO+lDvvNm45uw0VIu1qKWN8WeEwZZsqhavf5cjCO4g7ksEXrnasaDGZ0f17UyuuotPpjAlKVjhMmaXpK9j/7q1Uy/qebe6GzK/5AJcMHMXk+CpORzMmqFnhMGXP/t/Yu+B2qm9aQKFW4fHo6zij33VMaWUz2BpTHFY4TNlxZB8H/vsoMT9MJ8YNL0dcRuXzJ/O3lBZ217cxfrDCYcJfXjYHlz5D+a+fJs51mPfpxu7kWxl+fhdiK9ouYIy/ArrXiEhv4EkgAnhJVaces1282/sAOcAYVf3eu20LcAhwAYX+PkzdGArzyF7+Eix9lMqF+1ji7sj61jcwuE9vale2J/EZc7ICVjhEJAJ4FugFZAArRGSBqq71aXYR0Mz7kQI87/33d91VdU+gMpow5XaRk/o6BUseoEreDr5xtyK1yT/p33cgPavHOJ3OmJAXyBFHMrBRVTcBiMhcoD/gWzj6A7NUVYFvRKSqiNRT1R0BzGXCldvNkVXvcmTRfVQ/spmf3KexLOExLuo3jEm145xOZ0zYCGThaACk+yxn8MfRxPHaNAB2AAp8LCIKvKCq04v6IiIyAZgAkJCQUDLJTWhxu8j54S2OLHmYGjmb2Oauz9y6d9P90nFMqm+X1hpT0gJZOIq6rlH9aNNVVbeLSG3gvyKyXlWX/qmxp6BMB0hKSjr29U04cxVyKHUO+Z89So3craS745lX53ZSLhnHtY1qOJ3OmLAVyMKRATT0WY4Hthe3jar+/m+miMzHc+jrT4XDlEGuAg5++xqFXzxK9bxtrHMn8E79e+jSdwxXN7An8BkTaIEsHCuAZiKSCGwDhgEjjmmzAJjkPf+RAhxQ1R0iEguUU9VD3s8vAO4LYFYTCvJz2PfVDPj6aarl72C1O5H5CQ9wbt9RXFXHDkkZU1oCVjhUtVBEJgGL8VyO+4qqrhGRid7t04CFeC7F3Yjnctwrvd3rAPO9d/FGAq+r6qJAZTVB7vAedn7yFJV+mkE190F+dDfl3cSH6dH3csbVrOR0OmPKHPFc0BQekpKSNDU11ekYpoS49/zKto8eo86v86hAPp+RREbr8Zx/QX/qVbXLao0pCSKS5u99cnbbrAk6eVu+ZddHjxC/awm1NYJFkeeRn3wdvc87h+52p7cxjrO90ASHwjyyvp1L3vIXqH94DVU0hnkxg6l63iT6JLW1uaSMCSJWOIyj3PvSSf/kWaqtm0MN9342uuszp/b1NOl1FYObJ9hstcYEISscpvSpkr3hc3YveZqE3Z8Rr8qycklkthpNtwsGMbyanb8wJphZ4TClRrN3k/HFDCqsfI06eVsp0EosiB1IbNerOTelExUjI5yOaIwpBiscJrDcLvavXkzWspdJ2P05DSnkR23GsvgptL5wLAMS6jid0BjjJyscJiAKsrbw25IXqbrhDWq4duPWSiyO7Utk59Gc3eVsOtjVUcaELNt7TYnRnH2kL5+L66c3aXToBxIVvivXjmXNbqJdz2FcUtfmjzImHFjhMKem4Ag7VrxLduocGu39igQK2ax1+bD6FVTvOoaUMzrYpbTGhBkrHMZ/rgJ2r/qErG9m03DnEuqRwy6typK4fpTvMITkrj3pG13B6ZTGmACxwmGKRfNz2PH9Rxz44R3iMz+nlmZTUaP5Jrobha0vo+O5/bioil1Ga0xZYIXDHJf7yAG2fjOf3FXv0XjvcuqTS6zGkBp9FrlN+tDmnIH0rFPd6ZjGmFJmhcP8jyrZO9aT/u0CIn79hMbZ35NIIZlala8qnQ+t+tK268V0r2aPYTWmLLPCUca5c7NJ/34xB1d/RO1dy6jj2kkrYJPW54tqA6jY9lLan9WL82MqOh3VGBMkrHCUNa4Cdm34lsxVn1Dht6UkHv6JRhRyWCuyukJ7fmp4BbXPuJg2p7fjNLsayhhTBCscYU4L89m5/hsyV31CxYyvSTi8kjrkUgfYSEOWVRtI+RYX0jKlFynV7Cl6xpi/ZoUjzOQeyCRj9Zcc+vVronb+QKOcVdQjl3p4CsV3VS6ERmfT4IyeNGmUSNNyNvusMcY/VjhCmDs/l20bvmXP+uWU255GrQOrqe/eQVPApcKmcgmkVu0NjbvRsMP5NGnUmKY2Tbkx5hRZ4QgFquzfuZkdP6dxOP0nInevpXr2L9QvzKChuGkI7NLqbI1pxc+1BhFzWgqN2nSlWa0aNHM6uzEm7FjhCCKFeTns3rqBrPR15O36Gfb+SuyhzTTI+5Wq5FDV224btdgR1YTNtXpQvkF76rXpRqPGzahjh52MMaUgoIVDRHoDTwIRwEuqOvWY7eLd3gfIAcao6vfF6RuKcg8fYO+OrRzYtYUjWekU7ttGuUPbiM7eSo28DGq791BPlHre9ns1jh2RDVlZrRfu2m2IS2hPg+YdqV+zFg3skJMxxiEBKxwiEgE8C/QCMoAVIrJAVdf6NLsIaOb9SAGeB1KK2dcRbpeLvCOHyTuS7fk39zB52fvJPbiH/EO7cWXvxZ2TRbkj+4jM20eFggNUyt9DdXcWlTlMfaC+z+vt0zgyI+vxW6X2bKySSGTNpsQ1aEHtRq2pWas21a1AGGOCTCBHHMnARlXdBCAic4H+gO+bf39glqoq8I2IVBWRekDjYvQtMZvva095zUVQPG/Tiuj/Pi+HmwrkE6V5REkB0UD0CV7PrcJBiSVb4jgcUZm9UQ3ZEd0ZjatHRNUGRNdsSJU6jahetzHV4ipTLRDflDHGBEggC0cDIN1nOQPPqOKv2jQoZl8ARGQCMAEgISHhpILuqdwKcRf8/oqoCOD9EE85cUdGo+WjITIaykcj5WMoVzGGchViiIiKI6pyTWKq1iKuWm0qV61J1fLlj56TMMaYcBLIwlHUMRYtZpvi9PWsVJ0OTAdISkoqss1f6Xzj3JPpZowxZVIgC0cG0NBnOR7YXsw2FYrR1xhjjAMCORnRCqCZiCSKSAVgGLDgmDYLgCvE40zggKruKGZfY4wxDgjYiENVC0VkErAYzyW1r6jqGhGZ6N0+DViI51LcjXgux73yRH0DldUYY0zxieeCpvCQlJSkqampTscwxpiQISJpqprkTx+bN9sYY4xfrHAYY4zxixUOY4wxfrHCYYwxxi9hdXJcRHYDW0+ye01gTwnGKQ2WuXSEWuZQywuWubQUlbmRqtby50XCqnCcChFJ9ffKAqdZ5tIRaplDLS9Y5tJSUpntUJUxxhi/WOEwxhjjFysc/zPd6QAnwTKXjlDLHGp5wTKXlhLJbOc4jDHG+MVGHMYYY/xihcMYY4xfwr5wiEhvEdkgIhtFZEoR20VEnvJuXykiHYvbN9gyi0hDEflMRNaJyBoRuSHYM/tsjxCRH0Tkg1DI7H3M8TwRWe/9eZ8VAplv8v5erBaROSISFSSZW4rI1yKSJyKT/ekbbJmDfB887s/Zu734+6Cqhu0HninZfwVOw/NwqJ+A1se06QN8hOepg2cC3xa3bxBmrgd09H4eB/wc7Jl9tt8MvA58EOy/G95tM4Hx3s8rAFWDOTOexzFvBqK9y28CY4Ikc22gM/AAMNmfvkGYOZj3wSIz+2wv9j4Y7iOOZGCjqm5S1XxgLtD/mDb9gVnq8Q1QVUTqFbNvUGVW1R2q+j2Aqh4C1uF5wwjazAAiEg9cDLxUCllPObOIVAbOAV4GUNV8Vd0fzJm92yKBaBGJBGIonadq/mVmVc1U1RVAgb99gy1zMO+DJ/g5+70PhnvhaACk+yxn8Of/xOO1KU7fQDiVzEeJSGPgDODbko/4J6ea+QngVsAdoHxFOZXMpwG7gRneof1LIhIbyLB/kecv26jqNuAx4DdgB56nbX4cwKwnzFMKfU9FiXzdINwHT+QJ/NgHw71wSBHrjr3++HhtitM3EE4ls2ejSCXgbeBGVT1YgtmO56Qzi8glQKaqppV8rBM6lZ9zJNAReF5VzwAOA6Vx/P1Ufs7V8PwFmgjUB2JF5PISzleUU9mPgnkfPPELBOc+WHTHk9gHw71wZAANfZbj+fPw/HhtitM3EE4lMyJSHs8v7GxVfSeAOYuVpxhtugL9RGQLnuF1DxF5LXBR/zJPcdpkABmq+vtfkvPwFJJAO5XM5wObVXW3qhYA7wBdApj1r/IEuu+pOKWvG8T74PH4vw8G+qSNkx94/jLchOevrN9PGLU5ps3F/PFk4nfF7RuEmQWYBTwRKj/nY9qcR+mdHD+lzMAyoIX383uAR4M5M5ACrMFzbkPwnNy/Phgy+7S9hz+eaA7affAEmYN2Hzxe5mO2FWsfLLVvzKkPPFeZ/IznioPbvesmAhN9/qOf9W5fBSSdqG8wZwa64RmergR+9H70CebMJ/NLGwyZgQ5Aqvdn/S5QLQQy3wusB1YDrwIVgyRzXTx/MR8E9ns/r3y8vsGcOcj3weP+nH1eo1j7oE05Yowxxi/hfo7DGGNMCbPCYYwxxi9WOIwxxvjFCocxxhi/WOEwxhjjFyscxhTBO/vttT7L9UVkXoC+1qUictdftHlMRHoE4usb4y+7HNeYInjnGfpAVU8vha+1HOinqntO0KYR8KKqXhDoPMb8FRtxGFO0qUATEflRRB4VkcYishpARMaIyLsi8r6IbBaRSSJys3fCw29EpLq3XRMRWSQiaSKyTERaHvtFRKQ5kKeqe0Qkzvt65b3bKovIFhEpr6pbgRoiUrcUfwbGFMkKhzFFmwL8qqodVPWWIrafDozAM531A0COeiY8/Bq4wttmOp5pPToBk4HninidroDvNNyf45k2BGAY8LZ65pbC267rKX5fxpyySKcDGBOiPvO+0R8SkQPA+971q4B23tlRuwBviRyduLRiEa9TD88U7b97Cc/01u8CVwJX+WzLxDOzrTGOssJhzMnJ8/nc7bPsxrNflQP2q2qHv3idI0CV3xdU9SvvYbFzgQhVXe3TNsrb3hhH2aEqY4p2CM+jP0+Kep7BsFlEBsPRZ4G3L6LpOqDpMetmAXOAGcesb45ngkJjHGWFw5giqGoW8JWIrBaRR0/yZUYC40TkJzxTmhf12NOlwBniczwLmA1Uw1M8gKPPeGiKZ0ZeYxxll+Ma4zAReRJ4X1U/8S5fBvRX1VE+bQYAHVX1TodiGnOUneMwxnkP4nnQEiLyNHARnmcr+IoE/lXKuYwpko04jDHG+MXOcRhjjPGLFQ5jjDF+scJhjDHGL1Y4jDHG+MUKhzHGGL/8P1Op12cPf+MQAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdl0lEQVR4nO3dfZBddZ3n8fenbxLCo+Gh0SYNppXmIcAQQm+IYOEIZirBWbLKLpvoyIPsZlKCpeu6U5mlZker1pUqxy1kzJLiyQXHIaUoGK0MzK5AMQsCaQQDASNtANMQTYgaiEDS3fe7f5zTnZub25170n363nPzeVXdOvf8Hs75dif3fvuc3zm/o4jAzMysXm2NDsDMzIrFicPMzDJx4jAzs0ycOMzMLBMnDjMzy2RKowOYSMcdd1zMmjWr0WGYmRXGU0899XpEtGfp01KJY9asWfT29jY6DDOzwpD0StY+PlVlZmaZOHGYmVkmThxmZpZJS41x1DIwMEB/fz/vvPNOo0OZUNOnT6ezs5OpU6c2OhQzO8i0fOLo7+/nyCOPZNasWUhqdDgTIiLYvn07/f39dHV1NTocMzvItPypqnfeeYdjjz22ZZIGgCSOPfbYljuKMrNiyDVxSFooaaOkPkkratRL0k1p/XpJc9PyUyU9U/F6Q9LnxxHHOH6K5tSKP5OZFUNuiUNSCVgJLAJmA0slza5qtgjoTl/LgJsBImJjRMyJiDnAucBbwL15xWpmVjhv/x4e/O+wZf2k7zrPI455QF9EbIqI3cBqYHFVm8XAXZF4HJghqaOqzcXAryIi800qk+H888+vWX7VVVdxzz33THI0ZnbQePv38MjXYOvzk77rPBPHTGBzxXp/Wpa1zRLg7gmPboI89thjjQ7BzA5G5aFk2Tb51zjlucdaJ+GrHzc4ZhtJ04BLgb8edSfSMpLTXJx00knZoxynI444gp07dxIRfPazn+XBBx+kq6sLP1nRzHJVHkyWbaVJ33WeRxz9wIkV653AaxnbLAJ+FhG/HW0nEXFLRPRERE97e6Z5uibUvffey8aNG3n22We59dZbfSRiZvkaSRyTf8SRZ+JYB3RL6kqPHJYAa6rarAGuSK+umg/siIgtFfVLaeLTVJUeeeQRli5dSqlU4oQTTuCiiy5qdEhm1sqGBpJlK52qiohBSdcBDwAl4I6I2CBpeVq/ClgLXAL0kVw5dfVwf0mHAQuAv8wrxonmS2TNbNI0cIwj1/s4ImJtRJwSEe+PiK+kZavSpEF6NdW1af1ZEdFb0fetiDg2InbkGeNEufDCC1m9ejVDQ0Ns2bKFhx56qNEhmVkra+CpqpafcmSyfOxjH+PBBx/krLPO4pRTTuFDH/pQo0Mys1bmxFFcO3fuBJLTVN/85jcbHI2ZHTRadHDczMzy4sRhZmaZtOh9HGZmlpfhxFGa/GfyOHGYmRWRT1WZmVkmrXofh5mZ5cRjHK1r8+bNfPjDH+b000/njDPO4Bvf+EajQzKzVtCKU45YYsqUKXz9619n7ty5vPnmm5x77rksWLCA2bOrn2llZpaBxzhaV0dHB3PnzgXgyCOP5PTTT+fVV19tcFRmVngjiWPyr6o6qI44vvyjDTz/2hsTus3ZJxzF3/7rM+pq+/LLL/P0009z3nnnTWgMZnYQGhkc9xhHy9q5cyeXXXYZN954I0cddVSjwzGzovNcVZOj3iODiTYwMMBll13GJz/5ST7+8Y83JAYzazHlxg2O+4gjZxHBNddcw+mnn84XvvCFRodjZq3Cg+Ot69FHH+Xb3/42Dz74IHPmzGHOnDmsXbu20WGZWdE18AbAg+pUVSN88IMfJCIaHYaZtZryIKgN2ib/738fcZiZFVF5sCFHG+DEYWZWTK2aOCQtlLRRUp+kFTXqJemmtH69pLkVdTMk3SPpF5JekPSBPGM1MyuUoRZMHJJKwEpgETAbWCqpep6NRUB3+loG3FxR9w3g/og4DTgbeCGvWM3MCqc82JCb/yDfI455QF9EbIqI3cBqYHFVm8XAXZF4HJghqUPSUcCFwO0AEbE7Iv6QY6xmZsVSHmzIdCOQb+KYCWyuWO9Py+pp8z5gG/AtSU9Luk3S4bV2ImmZpF5Jvdu2bZu46M3MmlmLjnGoRln1damjtZkCzAVujohzgD8C+4yRAETELRHRExE97e3t44k3N5/+9Kc5/vjjOfPMM0fKfve737FgwQK6u7tZsGABv//970fqvvrVr3LyySdz6qmn8sADDzQiZDNrduWhlkwc/cCJFeudwGt1tukH+iPiibT8HpJEUkhXXXUV999//15lN9xwAxdffDEvvvgiF198MTfccAMAzz//PKtXr2bDhg3cf//9fOYzn2FoaKgRYZtZMysPtOQYxzqgW1KXpGnAEmBNVZs1wBXp1VXzgR0RsSUifgNslnRq2u5i4PkcY83VhRdeyDHHHLNX2Q9/+EOuvPJKAK688kruu+++kfIlS5ZwyCGH0NXVxcknn8yTTz452SGbWbNr4Kmq3PYaEYOSrgMeAErAHRGxQdLytH4VsBa4BOgD3gKurtjEZ4HvpElnU1XdgfmnFfCbZ8e9mb285yxYdEPmbr/97W/p6OgAkmd2bN26FYBXX32V+fPnj7Tr7Oz08zvMbF/lQSg1ZnA813QVEWtJkkNl2aqK9wFcO0rfZ4CePONrRrWmJ5FqDQWZ2UGtPNSwU1UH11xVB3BkkJd3v/vdbNmyhY6ODrZs2cLxxx8PJEcYmzfvudCsv7+fE044oVFhmlmzatGrqmwMl156KXfeeScAd955J4sXLx4pX716Nbt27eKll17ixRdfZN68eY0M1cyaUSuOcdgeS5cu5eGHH+b111+ns7OTL3/5y6xYsYLLL7+c22+/nZNOOonvfe97AJxxxhlcfvnlzJ49mylTprBy5UpKpcYcjppZExsacOJoZXfffXfN8p/85Cc1y6+//nquv/76PEMys6Jr0fs4zMwsLx7jMDOzTJw48tWKT+BrxZ/JzDJw4sjP9OnT2b59e0t90UYE27dvZ/r06Y0OxcwapYHTqrf84HhnZyf9/f202sy506dPp7Ozs9FhmFmj+HLc/EydOpWurq5Gh2FmNrEaOOVIy5+qMjNrSR7jMDOzTBo4V5UTh5lZEfmIw8zMMmnglCNOHGZmRVQegjYPjpuZWb0aeB+HE4eZWRF5jMPMzDJp1cQhaaGkjZL6JK2oUS9JN6X16yXNrah7WdKzkp6R1JtnnGZmhRIB0bhp1XPbq6QSsBJYAPQD6yStiYjnK5otArrT13nAzely2Icj4vW8YjQzK6TyYLJswSOOeUBfRGyKiN3AamBxVZvFwF2ReByYIakjx5jMzIpvOHGUWi9xzAQ2V6z3p2X1tgngnyU9JWnZaDuRtExSr6TeVpvI0MysphY+4lCNsuq5zcdqc0FEzCU5nXWtpAtr7SQibomInojoaW9vP/BozcyKooUTRz9wYsV6J/BavW0iYni5FbiX5NSXmZkNtW7iWAd0S+qSNA1YAqyparMGuCK9umo+sCMitkg6XNKRAJIOB/4MeC7HWM3MimPkiKPFHuQUEYOSrgMeAErAHRGxQdLytH4VsBa4BOgD3gKuTru/G7hX0nCM/xgR9+cVq5lZoYwkjsZMOZLrcU5ErCVJDpVlqyreB3BtjX6bgLPzjM3MrLBaeIzDzMzyUB5Klk4cZmZWlwaPcThxmJkVTXkgWfqIw8zM6uIxDjMzy2R4jKPkBzmZmVk9PMZhZmaZ+FSVmZllMuTBcTMzy8L3cZiZWSY+VWVmZpk4cZiZWSZOHGZmlokTh5mZZeL7OMzMLBMfcZiZWSbDicNTjpiZWV18xGFmZpn4BkAzM8tkZMqRFhwcl7RQ0kZJfZJW1KiXpJvS+vWS5lbVlyQ9LenHecZpZlYorXqqSlIJWAksAmYDSyXNrmq2COhOX8uAm6vqPwe8kFeMZmaFNJI4Wm9wfB7QFxGbImI3sBpYXNVmMXBXJB4HZkjqAJDUCXwUuC3HGM3MiqeFxzhmApsr1vvTsnrb3Aj8FVAeayeSlknqldS7bdu2cQVsZlYI5UFA0NaYYeo896oaZVFPG0l/DmyNiKf2t5OIuCUieiKip729/UDiNDMrlvJgw442IN/E0Q+cWLHeCbxWZ5sLgEslvUxyiusiSf+QX6hmZgVSHmjZxLEO6JbUJWkasARYU9VmDXBFenXVfGBHRGyJiL+OiM6ImJX2ezAi/iLHWM3MiqM81NDEkdueI2JQ0nXAA0AJuCMiNkhantavAtYClwB9wFvA1XnFY2bWMsqDUGrBxAEQEWtJkkNl2aqK9wFcu59tPAw8nEN4ZmbF1MJjHGZmlgcnDjMzy2TIicPMzLIoDzZsnipw4jAzK57yYMOmGwEnDjOz4vEYh5mZZdLg+zjqShySrqlaL0n623xCMjOzMRVkjONiSWsldUg6E3gcODLHuMzMbDQNnnKkrj1HxCck/XvgWZI7vJdGxKO5RmZmZrUVYYxDUjfJQ5W+D7wMfErSYTnGZWZmoykPQan5r6r6EfA3EfGXwIeAX5JMYmhmZpOtIGMc84CzJf0AuIfkuRpLcovKzMxG1+BTVfXu+TbgTeDv0/WlwAeAy/MIyszMxjBUgMFx4NSIOLti/SFJP88jIDMz248i3McBPJ0+aAkASecBvqrKzKwRCnKq6jySJ/X9Ol0/CXhB0rMkj9X4k1yiMzOzfRUkcSzMNQozM6tfERJHRLySdyBmZlanItwAeKAkLZS0UVKfpBU16iXpprR+vaS5afl0SU9K+rmkDZK+nGecZmaFUpD7ODKTVAJWAouA2cBSSbOrmi0CutPXMuDmtHwXcFF6JdccYGHl4LyZ2UGthY845gF9EbEpInYDq4HFVW0WA3dF4nFghqSOdH1n2mZq+oocYzUzK47yYCGmHDkQM4HNFev9aVldbdKp258BtgL/JyKeqLUTScsk9Urq3bZt20TFbmbWvApyH8eBUI2y6qOGUdtExFBEzAE6gXnpdO77No64JSJ6IqKnvb19PPGamRVDq45xkBw9nFix3gm8lrVNRPwBeBhfEmxmlmjwlCN5Jo51QLekLknTSCZFXFPVZg3JjYVKB793RMQWSe2SZgBIOhT4CPCLHGM1MyuGCIjGnqrKbc8RMSjpOuABoATcEREbJC1P61cBa4FLgD6SB0RdnXbvAO5Mr8xqA74bET/OK1Yzs8IoDyXLtsYNjueasiJiLUlyqCxbVfE+gGtr9FsPnJNnbGZmhVQeTJYtOsZhZmYTbSRxtOYYh5mZTbTyQLJ04jAzs7qMjHE4cZiZWT08xmFmZpkMJ44WnXLEzMwmmgfHzcwsE49xmJlZJkPDV1V5jMPMzOrhU1VmZpbJSOLw4LiZmdXDYxxmZpaJ7+MwM7NMPOWImZll4sFxMzPLxInDzMwyGR4cLzlxmJlZPXzEYWZmmThxmJlZJkMtflWVpIWSNkrqk7SiRr0k3ZTWr5c0Ny0/UdJDkl6QtEHS5/KM08ysMFr5BkBJJWAlsAiYDSyVNLuq2SKgO30tA25OyweB/xwRpwPzgWtr9DUzO/i0+KmqeUBfRGyKiN3AamBxVZvFwF2ReByYIakjIrZExM8AIuJN4AVgZo6xmpkVQ4snjpnA5or1fvb98t9vG0mzgHOAJ2rtRNIySb2Serdt2zbemM3MmluLJw7VKIssbSQdAXwf+HxEvFFrJxFxS0T0RERPe3v7AQdrZlYILZ44+oETK9Y7gdfqbSNpKknS+E5E/CDHOM3MiqPFJzlcB3RL6pI0DVgCrKlqswa4Ir26aj6wIyK2SBJwO/BCRPzPHGM0MyuWJjjiyG3PETEo6TrgAaAE3BERGyQtT+tXAWuBS4A+4C3g6rT7BcCngGclPZOW/deIWJtXvGZmhTCcOEqNe5BTrikr/aJfW1W2quJ9ANfW6Pf/qD3+YWZ2cGvl+zjMzCwHw0ccatzXtxOHmVmRDA0kRxtq3EkZJw4zsyIpDzb0NBU4cZiZFUt5CNoaNzAOThxmZsVSHmzoPRzgxGFmViw+VWVmZpmUB5w4zMwsg/KQE4eZmWXgMQ4zM8ukPNjQ6UbAicPMrFg8OG5mZpkMOXGYmVkWHuMwM7NMfKrKzMwyKQ96yhEzM8vA93GYmVkmHuMwM7NMWn3KEUkLJW2U1CdpRY16SboprV8vaW5F3R2Stkp6Ls8YzcwKpZUHxyWVgJXAImA2sFTS7Kpmi4Du9LUMuLmi7n8DC/OKz8yskFp8jGMe0BcRmyJiN7AaWFzVZjFwVyQeB2ZI6gCIiEeA3+UYn5lZ8ZQHodS6iWMmsLlivT8ty9pmTJKWSeqV1Ltt27YDCtTMrDBa+VQVUOtJ6nEAbcYUEbdERE9E9LS3t2fpamZWPEOtPTjeD5xYsd4JvHYAbczMbFiLj3GsA7oldUmaBiwB1lS1WQNckV5dNR/YERFbcozJzKzYWvk+jogYBK4DHgBeAL4bERskLZe0PG22FtgE9AG3Ap8Z7i/pbuCnwKmS+iVdk1esZmaF0QRTjuR6vBMRa0mSQ2XZqor3AVw7St+lecZmZlZILT44bmZmE63FxzjMzGyilQdad4zDzMxy4FNVZmZWtwgnDjMzyyDKybLkBzmZmVk9yoPJ0mMcZmZWl6GBZOlTVWZmVpeRIw4nDjMzq0d5KFk6cZiZWV18xGFmZpk4cZiZWSZNkjgau3czM6vbzrff5gjgpodf4iePPcrgUJmBoTLvOnQq31t+/qTF4cRhZlYQ63+9nfOB3eU23nXoVKaVxJS2No4+fHJvCHTiMDMriFe2vcH5wLUfOY1Dz57XsDg8xmFmVhAvb3sDgEMPOaShcThxmJkVxNbXX0/eTJne0DicOMzMCuCdgSEOe2NTsnLsyQ2NxYnDzKwA+rbu5H28ymDpUHjXiQ2NJdfEIWmhpI2S+iStqFEvSTel9eslza23r5nZwWTjb96kW/0MHnMytDX2b/7crqqSVAJWAguAfmCdpDUR8XxFs0VAd/o6D7gZOK/OvhNm5xu/I2KMBlJ1wTjqx9N3vNs2s6J69tUdLGt7jWnvvqjRoeR6Oe48oC8iNgFIWg0sBiq//BcDd0VEAI9LmiGpA5hVR98J0/b10zhMu/LYdFMrx96JpTp3BtX1qrttdRKbyG3vu57sL9K64frK9T1txm4HEFFHmzG2te9+quOoHUv1tkb2E7W3tVebUbZFjfirtwWinL5iZNlGOSrL20bel2kbaVdOy2uuRxsBVe3H6t+2dxzRVnP/sdcyKR+ixCBtlGljMEoM0cYgJYYYft+2p03sqRsuH6Ktok8b+/wR1gQO522+NH07HH9qo0PJNXHMBDZXrPeTHFXsr83MOvsCIGkZsAzgpJNOOqBA15/2uZFb+TXmoQdUf62pan3fQ5cYvW2Vffc99vpYse67r7Hj3G9slfX7iXN8P2fW32/aJvZ8Fe69n4ry2Du9VG5vT5u908yeNlGxn4rtxJ59jnxFx95fy3v1H2lTFUvsu889P0+goOpnqdxnea9YKuOo/Nn2iSWq0mKUK8rLKF2Slu+pL+9Vn+y3PFI/0q7AyiolyUolQlPSZYly2xSG2qbteWkq5ZH1qQy1TUvWNXWvdoOlwxgoHcbAlMMYKB2eLpPX7ilH8va0oxkqHTpmTMe9sQHWAce1duKolbKr/zeN1qaevklhxC3ALQA9PT0H9L91/tLrD6SbmY0m0sQV5fRxpxXv93qNVl5Pm+HyISiXkz/+yoPp+mAyBflwWXmoan24Xe02bWlZqbLN0ED62gWDu2Bod9VyJwzuhoFdyXLwnbTunT1zTI1l6uFw+HFweDsc/V44thuO64aZ58IxXfDME0niaD8t73+9/cozcfQDlUP/ncBrdbaZVkdfM2tWUjrG5gs3gSSR7N6ZvHbt3Pv9Ozvgj9vgj68ny52/hf5eeO4HjPy9fGw3HNWRTG54TFdDfxTIN3GsA7oldQGvAkuAT1S1WQNcl45hnAfsiIgtkrbV0dfMrBimTIMpx8Bhx9TfZ+Bt2N4HrzwGT90JLz2SnKYqTe68VLXkljgiYlDSdcADQAm4IyI2SFqe1q8C1gKXAH3AW8DVY/XNK1Yzs6Yz9VB4z1nJq+fT8OSt8K6ZjY4KAMV+B4OLo6enJ3p7exsdhplZYUh6KiJ6svTxCUgzM8vEicPMzDJx4jAzs0ycOMzMLBMnDjMzy8SJw8zMMnHiMDOzTJw4zMwsk5a6ATCdquSVA+x+HPD6BIYzGRzz5ChazEWLFxzzZKkV83sjoj3LRloqcYyHpN6sd082mmOeHEWLuWjxgmOeLBMVs09VmZlZJk4cZmaWiRPHHrc0OoAD4JgnR9FiLlq84Jgny4TE7DEOMzPLxEccZmaWiROHmZll0vKJQ9JCSRsl9UlaUaNekm5K69dLmltv32aLWdKJkh6S9IKkDZI+1+wxV9SXJD0t6cdFiFnSDEn3SPpF+vv+QAFi/k/p/4vnJN0taXqTxHyapJ9K2iXpi1n6NlvMTf4ZHPX3nNbX/xmMiJZ9kTx29lfA+4BpwM+B2VVtLgH+CRAwH3ii3r5NGHMHMDd9fyTwy2aPuaL+C8A/Aj9u9v8bad2dwH9I308DZjRzzMBM4CXg0HT9u8BVTRLz8cC/Ar4CfDFL3yaMuZk/gzVjrqiv+zPY6kcc84C+iNgUEbuB1cDiqjaLgbsi8TgwQ1JHnX2bKuaI2BIRPwOIiDeBF0i+MJo2ZgBJncBHgdsmIdZxxyzpKOBC4HaAiNgdEX9o5pjTuinAoZKmAIcBrzVDzBGxNSLWAQNZ+zZbzM38GRzj95z5M9jqiWMmsLlivZ99/xFHa1NP3zyMJ+YRkmYB5wBPTHyI+xhvzDcCfwWUc4qvlvHE/D5gG/Ct9ND+NkmH5xnsfuLZb5uIeBX4O+DXwBZgR0T8c46xjhnPJPQdjwnZbxN+BsdyIxk+g62eOFSjrPr649Ha1NM3D+OJOamUjgC+D3w+It6YwNhGc8AxS/pzYGtEPDXxYY1pPL/nKcBc4OaIOAf4IzAZ59/H83s+muQv0C7gBOBwSX8xwfHVMp7PUTN/BsfeQHN+Bmt3PIDPYKsnjn7gxIr1TvY9PB+tTT198zCemJE0leQ/7Hci4gc5xllXPHW0uQC4VNLLJIfXF0n6h/xC3W889bTpB/ojYvgvyXtIEknexhPzR4CXImJbRAwAPwDOzzHW/cWTd9/xGNd+m/gzOJrsn8G8B20a+SL5y3ATyV9ZwwNGZ1S1+Sh7DyY+WW/fJoxZwF3AjUX5PVe1+VMmb3B8XDED/wKcmr7/EvC1Zo4ZOA/YQDK2IZLB/c82Q8wVbb/E3gPNTfsZHCPmpv0MjhZzVV1dn8FJ+8Ea9SK5yuSXJFccXJ+WLQeWV/xDr0zrnwV6xurbzDEDHyQ5PF0PPJO+LmnmmA/kP20zxAzMAXrT3/V9wNEFiPnLwC+A54BvA4c0SczvIfmL+Q3gD+n7o0br28wxN/lncNTfc8U26voMesoRMzPLpNXHOMzMbII5cZiZWSZOHGZmlokTh5mZZeLEYWZmmThxmNWQzn77mYr1EyTdk9O+/o2k/7afNn8n6aI89m+WlS/HNashnWfoxxFx5iTs6zHg0oh4fYw27wVujYg/yzses/3xEYdZbTcA75f0jKSvSZol6TkASVdJuk/SjyS9JOk6SV9IJzx8XNIxabv3S7pf0lOS/kXSadU7kXQKsCsiXpd0ZLq9qWndUZJeljQ1Il4BjpX0nkn8HZjV5MRhVtsK4FcRMSci/kuN+jOBT5BMZ/0V4K1IJjz8KXBF2uYWkmk9zgW+CPyvGtu5AKichvthkmlDAJYA349kbinSdheM8+cyG7cpjQ7ArKAeSr/o35S0A/hRWv4s8Cfp7KjnA9+TRiYuPaTGdjpIpmgfdhvJ9Nb3AVcD/7GibivJzLZmDeXEYXZgdlW8L1esl0k+V23AHyJizn628zbwruGViHg0PS32IaAUEc9VtJ2etjdrKJ+qMqvtTZJHfx6QSJ7B8JKkfwcjzwI/u0bTF4CTq8ruAu4GvlVVfgrJBIVmDeXEYVZDRGwHHpX0nKSvHeBmPglcI+nnJFOa13rs6SPAOao4nwV8BziaJHkAI894OJlkRl6zhvLluGYNJukbwI8i4v+m6/8WWBwRn6po8zFgbkT8TYPCNBvhMQ6zxvsfJA9aQtLfA4tInq1QaQrw9UmOy6wmH3GYmVkmHuMwM7NMnDjMzCwTJw4zM8vEicPMzDJx4jAzs0z+P7PZ7aKX7Z56AAAAAElFTkSuQmCC\n", "text/plain": [ "
    " ] @@ -106,6 +106,536 @@ "swiftdiff['px'].plot.line(x=\"time (y)\")" ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'px' (time (y): 199, id: 2)>\n",
    +       "array([[ 0.00000000e+00,  0.00000000e+00],\n",
    +       "       [ 0.00000000e+00, -7.12220460e-09],\n",
    +       "       [ 0.00000000e+00, -2.84900827e-08],\n",
    +       "       [ 0.00000000e+00, -6.41074152e-08],\n",
    +       "       [ 0.00000000e+00, -1.13980512e-07],\n",
    +       "       [ 0.00000000e+00, -1.78118202e-07],\n",
    +       "       [ 0.00000000e+00, -2.56531852e-07],\n",
    +       "       [ 0.00000000e+00, -3.49235353e-07],\n",
    +       "       [ 0.00000000e+00, -4.56245140e-07],\n",
    +       "       [ 0.00000000e+00, -5.77580189e-07],\n",
    +       "       [ 0.00000000e+00, -7.13262030e-07],\n",
    +       "       [ 0.00000000e+00, -8.63314745e-07],\n",
    +       "       [ 0.00000000e+00, -1.02776499e-06],\n",
    +       "       [ 0.00000000e+00, -1.20664199e-06],\n",
    +       "       [ 0.00000000e+00, -1.39997756e-06],\n",
    +       "       [ 0.00000000e+00, -1.60780612e-06],\n",
    +       "       [ 0.00000000e+00, -1.83016468e-06],\n",
    +       "       [ 0.00000000e+00, -2.06709291e-06],\n",
    +       "       [ 0.00000000e+00, -2.31863308e-06],\n",
    +       "       [ 0.00000000e+00, -2.58483014e-06],\n",
    +       "...\n",
    +       "       [-4.44089210e-16, -5.00980628e-04],\n",
    +       "       [-1.22124533e-15, -5.18253726e-04],\n",
    +       "       [-3.33066907e-15, -5.36896942e-04],\n",
    +       "       [-4.44089210e-15, -5.57134011e-04],\n",
    +       "       [-5.44009282e-15, -5.79246689e-04],\n",
    +       "       [-5.44009282e-15, -6.03596238e-04],\n",
    +       "       [-5.32907052e-15, -6.30655877e-04],\n",
    +       "       [-5.21804822e-15, -6.61061384e-04],\n",
    +       "       [-5.10702591e-15, -6.95693612e-04],\n",
    +       "       [-4.99600361e-15, -7.35820563e-04],\n",
    +       "       [-4.99600361e-15, -7.83359285e-04],\n",
    +       "       [ 1.33226763e-15, -8.41403959e-04],\n",
    +       "       [ 4.77395901e-15, -9.15431516e-04],\n",
    +       "       [-2.22044605e-16, -1.01661465e-03],\n",
    +       "       [ 3.77475828e-15, -1.17430457e-03],\n",
    +       "       [ 1.29488925e-06, -1.53697214e-03],\n",
    +       "       [ 3.16460020e-03,  1.93749443e-03],\n",
    +       "       [ 3.17685641e-03,  3.61711129e-02],\n",
    +       "       [ 3.18905387e-03,  7.04843014e-02],\n",
    +       "       [ 3.20119234e-03,             nan]])\n",
    +       "Coordinates:\n",
    +       "  * id        (id) int64 2 100\n",
    +       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
    " + ], + "text/plain": [ + "\n", + "array([[ 0.00000000e+00, 0.00000000e+00],\n", + " [ 0.00000000e+00, -7.12220460e-09],\n", + " [ 0.00000000e+00, -2.84900827e-08],\n", + " [ 0.00000000e+00, -6.41074152e-08],\n", + " [ 0.00000000e+00, -1.13980512e-07],\n", + " [ 0.00000000e+00, -1.78118202e-07],\n", + " [ 0.00000000e+00, -2.56531852e-07],\n", + " [ 0.00000000e+00, -3.49235353e-07],\n", + " [ 0.00000000e+00, -4.56245140e-07],\n", + " [ 0.00000000e+00, -5.77580189e-07],\n", + " [ 0.00000000e+00, -7.13262030e-07],\n", + " [ 0.00000000e+00, -8.63314745e-07],\n", + " [ 0.00000000e+00, -1.02776499e-06],\n", + " [ 0.00000000e+00, -1.20664199e-06],\n", + " [ 0.00000000e+00, -1.39997756e-06],\n", + " [ 0.00000000e+00, -1.60780612e-06],\n", + " [ 0.00000000e+00, -1.83016468e-06],\n", + " [ 0.00000000e+00, -2.06709291e-06],\n", + " [ 0.00000000e+00, -2.31863308e-06],\n", + " [ 0.00000000e+00, -2.58483014e-06],\n", + "...\n", + " [-4.44089210e-16, -5.00980628e-04],\n", + " [-1.22124533e-15, -5.18253726e-04],\n", + " [-3.33066907e-15, -5.36896942e-04],\n", + " [-4.44089210e-15, -5.57134011e-04],\n", + " [-5.44009282e-15, -5.79246689e-04],\n", + " [-5.44009282e-15, -6.03596238e-04],\n", + " [-5.32907052e-15, -6.30655877e-04],\n", + " [-5.21804822e-15, -6.61061384e-04],\n", + " [-5.10702591e-15, -6.95693612e-04],\n", + " [-4.99600361e-15, -7.35820563e-04],\n", + " [-4.99600361e-15, -7.83359285e-04],\n", + " [ 1.33226763e-15, -8.41403959e-04],\n", + " [ 4.77395901e-15, -9.15431516e-04],\n", + " [-2.22044605e-16, -1.01661465e-03],\n", + " [ 3.77475828e-15, -1.17430457e-03],\n", + " [ 1.29488925e-06, -1.53697214e-03],\n", + " [ 3.16460020e-03, 1.93749443e-03],\n", + " [ 3.17685641e-03, 3.61711129e-02],\n", + " [ 3.18905387e-03, 7.04843014e-02],\n", + " [ 3.20119234e-03, nan]])\n", + "Coordinates:\n", + " * id (id) int64 2 100\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['px']" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 87f227058..17383f9c0 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -71,6 +71,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan real(DP) :: rlim2, rji2 lany_encounter = .false. + if (self%nenc == 0) return select type(self) class is (symba_plplenc) isplpl = .true. diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index d34956f4b..0ef7f8df8 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -86,9 +86,9 @@ module subroutine symba_step_interp_system(self, param, t, dt) call pl%kick(dth) call tp%kick(dth) - call pl%vh2vb(cb) + call pl%vb2vh(cb) call pl%lindrift(cb, dth, lbeg=.false.) - call tp%vh2vb(vbcb = -cb%ptend) + call tp%vb2vh(vbcb = -cb%ptend) call tp%lindrift(cb, dth, lbeg=.false.) end select end select diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c356d686b..031ae4ae5 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -55,12 +55,13 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B) :: nold nold = size(self%status) - if (nrequested <= nold) return - allocate(enc_temp, source=self) - call self%setup(2 * nrequested) - call self%copy(enc_temp) + if (nrequested > nold) then + allocate(enc_temp, source=self) + call self%setup(2 * nrequested) + call self%copy(enc_temp) + deallocate(enc_temp) + end if self%nenc = nrequested - deallocate(enc_temp) return end subroutine symba_util_resize_pltpenc From b55887d738a8c54dfabc5f95fc373ab48efb94f0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 10:57:35 -0400 Subject: [PATCH 053/194] Removed commented out old cruft --- src/kick/kick.f90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index efad4702a..56e74dfcd 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -56,9 +56,6 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) acc(:) = 0.0_DP do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) - !rji2 = dot_product(dx(:), dx(:)) - !irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - !fac = GMpl(j) * irij3 r2 = dot_product(dx(:), dx(:)) fac = GMpl(j) / (r2 * sqrt(r2)) acc(:) = acc(:) - fac * dx(:) From e7e392a3aa68fea2fd7e34fd28549b40715bd00c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 11:03:49 -0400 Subject: [PATCH 054/194] Corrected comments --- src/helio/helio_getacch.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 index 098549eff..968d2c0c0 100644 --- a/src/helio/helio_getacch.f90 +++ b/src/helio/helio_getacch.f90 @@ -11,7 +11,7 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) implicit none ! Arguments class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step @@ -45,8 +45,8 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) !! Adapted from Hal Levison's Swift routine helio_getacch_tp.f implicit none ! Arguments - class(helio_tp), intent(inout) :: self !! WHM test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object + class(helio_tp), intent(inout) :: self !! Helio test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step From a79de9343e77e290f54db12edc2148bbe2a3fab3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 11:34:20 -0400 Subject: [PATCH 055/194] Added code to subrtract accelerations of encountering pairs to symba accel --- src/kick/kick.f90 | 6 +-- src/modules/symba_classes.f90 | 18 +++++++ src/symba/symba_getacch.f90 | 90 +++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 src/symba/symba_getacch.f90 diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 56e74dfcd..58ebfd1aa 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -49,18 +49,16 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) ! Internals integer(I4B) :: i, j real(DP) :: rji2, irij3, fac, r2 - real(DP), dimension(NDIM) :: dx, acc + real(DP), dimension(NDIM) :: dx associate(tp => self, ntp => self%nbody) do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) - acc(:) = 0.0_DP do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) r2 = dot_product(dx(:), dx(:)) fac = GMpl(j) / (r2 * sqrt(r2)) - acc(:) = acc(:) - fac * dx(:) + tp%ah(:, i) = tp%ah(:, i) - fac * dx(:) end do - tp%ah(:, i) = tp%ah(:, i) + acc(:) end do end associate return diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 2a9602205..93e9184e2 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -212,6 +212,24 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp + module subroutine symba_getacch_pl(self, system, param, t, lbeg) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + end subroutine symba_getacch_pl + + module subroutine symba_getacch_tp(self, system, param, t, lbeg) + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + end subroutine symba_getacch_tp + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) implicit none class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object diff --git a/src/symba/symba_getacch.f90 b/src/symba/symba_getacch.f90 new file mode 100644 index 000000000..b2410d99a --- /dev/null +++ b/src/symba/symba_getacch.f90 @@ -0,0 +1,90 @@ +submodule (symba_classes) s_symba_getacch + use swiftest +contains + module subroutine symba_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_getacch.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: rji2, rlim2, faci, facj + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + call helio_getacch_pl(pl, system, param, t, lbeg) + ! Remove accelerations from encountering pairs + do k = 1, nplplenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i) + pl%radius(j))**2 + if (rji2 > rlim2) then + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) + end if + end associate + end do + end associate + end select + + return + end subroutine symba_getacch_pl + + module subroutine symba_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine symba5_getacch.f + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: rji2, fac, rlim2 + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) + call helio_getacch_tp(tp, system, param, t, lbeg) + ! Remove accelerations from encountering pairs + do k = 1, npltpenc + associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) + if (tp%status(j) == ACTIVE) THEN + dx(:) = tp%xh(:,j) - pl%xh(:,i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i))**2 + if (rji2 > rlim2) then + fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) + end if + end IF + end associate + end DO + end associate + end select + return + end subroutine symba_getacch_tp + +end submodule s_symba_getacch From a6ca94045e15a940e19591be6f5db31a0b37bc62 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 14:23:32 -0400 Subject: [PATCH 056/194] Refactored codebase to place getacc subroutines inside of kick. Next I will include accel method calls inside of kicks to simplify the algorithms and fix an issue specific to SyMBA in which don't want to reset accelerations to 0 before calling the helio getacch methods --- src/gr/gr.f90 | 6 +- src/helio/helio_getacch.f90 | 69 ------------------ src/helio/helio_kick.f90 | 77 ++++++++++++++++++-- src/kick/kick.f90 | 12 +-- src/modules/helio_classes.f90 | 24 +++--- src/modules/rmvs_classes.f90 | 6 +- src/modules/swiftest_classes.f90 | 36 ++++----- src/modules/symba_classes.f90 | 10 ++- src/modules/whm_classes.f90 | 24 +++--- src/rmvs/{rmvs_getacch.f90 => rmvs_kick.f90} | 14 ++-- src/symba/symba_getacch.f90 | 28 +++---- src/tides/tides_getacch_pl.f90 | 8 +- src/user/user_getacch.f90 | 10 +-- src/whm/whm_gr.f90 | 12 +-- src/whm/{whm_getacch.f90 => whm_kick.f90} | 42 +++++------ 15 files changed, 188 insertions(+), 190 deletions(-) delete mode 100644 src/helio/helio_getacch.f90 rename src/rmvs/{rmvs_getacch.f90 => rmvs_kick.f90} (91%) rename src/whm/{whm_getacch.f90 => whm_kick.f90} (82%) diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index 7d794bf2b..cf13d90d2 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -1,7 +1,7 @@ submodule(swiftest_classes) s_gr use swiftest contains - module pure subroutine gr_getaccb_ns_body(self, system, param) + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) !! author: David A. Minton !! !! Add relativistic correction acceleration for non-symplectic integrators. @@ -11,7 +11,7 @@ module pure subroutine gr_getaccb_ns_body(self, system, param) !! Quinn, T.R., Tremaine, S., Duncan, M., 1991. A three million year integration of the earth’s orbit. !! AJ 101, 2287–2305. https://doi.org/10.1086/115850 !! - !! Adapted from David A. Minton's Swifter routine routine gr_getaccb_ns.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_kick_getaccb_ns.f90 implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -41,7 +41,7 @@ module pure subroutine gr_getaccb_ns_body(self, system, param) return - end subroutine gr_getaccb_ns_body + end subroutine gr_kick_getaccb_ns_body module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton diff --git a/src/helio/helio_getacch.f90 b/src/helio/helio_getacch.f90 deleted file mode 100644 index 968d2c0c0..000000000 --- a/src/helio/helio_getacch.f90 +++ /dev/null @@ -1,69 +0,0 @@ -submodule (helio_classes) s_helio_getacch - use swiftest -contains - module subroutine helio_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch.f90 - !! Adapted from Hal Levison's Swift routine helio_getacch.f - implicit none - ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - - associate(cb => system%cb, pl => self, npl => self%nbody) - pl%ah(:,:) = 0.0_DP - call pl%accel_int() - if (param%loblatecb) then - cb%aoblbeg = cb%aobl - call pl%accel_obl(system) - cb%aoblend = cb%aobl - if (param%ltides) then - cb%atidebeg = cb%atide - call pl%accel_tides(system) - cb%atideend = cb%atide - end if - end if - if (param%lextra_force) call pl%accel_user(system, param, t) - !if (param%lgr) call pl%gr_accel(param) - end associate - - return - end subroutine helio_getacch_pl - - module subroutine helio_getacch_tp(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of test particles - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_getacch_tp.f90 - !! Adapted from Hal Levison's Swift routine helio_getacch_tp.f - implicit none - ! Arguments - class(helio_tp), intent(inout) :: self !! Helio test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - - associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) - tp%ah(:,:) = 0.0_DP - if (present(lbeg)) system%lbeg = lbeg - if (system%lbeg) then - call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) - else - call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) - end if - if (param%loblatecb) call tp%accel_obl(system) - if (param%lextra_force) call tp%accel_user(system, param, t) - !if (param%lgr) call tp%gr_accel(param) - end associate - return - end subroutine helio_getacch_tp - -end submodule s_helio_getacch diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 9d5cea3a6..a4cd86d1d 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -1,13 +1,78 @@ submodule(helio_classes) s_helio_kick use swiftest contains - module subroutine helio_kickvb_pl(self, dt) +module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + + associate(cb => system%cb, pl => self, npl => self%nbody) + pl%ah(:,:) = 0.0_DP + call pl%accel_int() + if (param%loblatecb) then + cb%aoblbeg = cb%aobl + call pl%accel_obl(system) + cb%aoblend = cb%aobl + if (param%ltides) then + cb%atidebeg = cb%atide + call pl%accel_tides(system) + cb%atideend = cb%atide + end if + end if + if (param%lextra_force) call pl%accel_user(system, param, t) + !if (param%lgr) call pl%gr_accel(param) + end associate + + return + end subroutine helio_kick_getacch_pl + + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch_tp.f + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Helio test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + + associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) + tp%ah(:,:) = 0.0_DP + if (present(lbeg)) system%lbeg = lbeg + if (system%lbeg) then + call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) + else + call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) + end if + if (param%loblatecb) call tp%accel_obl(system) + if (param%lextra_force) call tp%accel_user(system, param, t) + !if (param%lgr) call tp%gr_accel(param) + end associate + return + end subroutine helio_kick_getacch_tp + + module subroutine helio_kick_vb_pl(self, dt) !! author: David A. Minton !! !! Kick barycentric velocities of bodies !! !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f - !! Adapted from David E. Kaufmann's Swifter routine helio_kickvb.f90 + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb.f90 implicit none ! Arguments class(helio_pl), intent(inout) :: self !! Swiftest generic body object @@ -24,15 +89,15 @@ module subroutine helio_kickvb_pl(self, dt) return - end subroutine helio_kickvb_pl + end subroutine helio_kick_vb_pl - module subroutine helio_kickvb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, dt) !! author: David A. Minton !! !! Kick barycentric velocities of bodies !! !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh_tp.f - !! Adapted from David E. Kaufmann's Swifter routine helio_kickvb_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb_tp.f90 implicit none ! Arguments class(helio_tp), intent(inout) :: self !! Swiftest generic body object @@ -49,5 +114,5 @@ module subroutine helio_kickvb_tp(self, dt) return - end subroutine helio_kickvb_tp + end subroutine helio_kick_vb_tp end submodule s_helio_kick \ No newline at end of file diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 58ebfd1aa..3d57f2d1c 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -1,13 +1,13 @@ submodule(swiftest_classes) s_kick use swiftest contains - module pure subroutine kick_getacch_int_pl(self) + module pure subroutine kick_kick_getacch_int_pl(self) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations of massive bodies !! !! Adapted from Hal Levison's Swift routine getacch_ah3.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah3.f90 and helio_kick_getacch_int.f90 implicit none ! Arguments class(swiftest_pl), intent(inout) :: self @@ -31,15 +31,15 @@ module pure subroutine kick_getacch_int_pl(self) end associate return - end subroutine kick_getacch_int_pl + end subroutine kick_kick_getacch_int_pl - module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) + module pure subroutine kick_kick_getacch_int_tp(self, GMpl, xhp, npl) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies !! !! Adapted from Hal Levison's Swift routine getacch_ah3_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah3.f90 and helio_getacch_int_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah3.f90 and helio_kick_getacch_int_tp.f90 implicit none ! Arguments class(swiftest_tp), intent(inout) :: self !! Swiftest test particle @@ -62,7 +62,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) end do end associate return - end subroutine kick_getacch_int_tp + end subroutine kick_kick_getacch_int_tp module subroutine kick_vh_body(self, dt) !! author: David A. Minton diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 17366e88f..39d1e30e4 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -38,8 +38,8 @@ module helio_classes procedure, public :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) procedure, public :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates procedure, public :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: accel => helio_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_pl !! Kicks the barycentric velocities + procedure, public :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl @@ -54,8 +54,8 @@ module helio_classes procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: accel => helio_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kickvb_tp !! Kicks the barycentric velocities + procedure, public :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp @@ -132,7 +132,7 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp - module subroutine helio_getacch_pl(self, system, param, t, lbeg) + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object @@ -140,9 +140,9 @@ module subroutine helio_getacch_pl(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine helio_getacch_pl + end subroutine helio_kick_getacch_pl - module subroutine helio_getacch_tp(self, system, param, t, lbeg) + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object @@ -150,19 +150,19 @@ module subroutine helio_getacch_tp(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine helio_getacch_tp + end subroutine helio_kick_getacch_tp - module subroutine helio_kickvb_pl(self, dt) + module subroutine helio_kick_vb_pl(self, dt) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object real(DP), intent(in) :: dt !! Stepsize - end subroutine helio_kickvb_pl + end subroutine helio_kick_vb_pl - module subroutine helio_kickvb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, dt) implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object real(DP), intent(in) :: dt !! Stepsize - end subroutine helio_kickvb_tp + end subroutine helio_kick_vb_tp module subroutine helio_step_pl(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 8d0fb1f18..a459e7246 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -71,7 +71,7 @@ module rmvs_classes procedure, public :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered procedure, public :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure, public :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => rmvs_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + procedure, public :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles procedure, public :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) @@ -136,7 +136,7 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine rmvs_util_fill_tp - module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle data structure @@ -144,7 +144,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine rmvs_getacch_tp + end subroutine rmvs_kick_getacch_tp module subroutine rmvs_setup_pl(self,n) implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 5c6b83bdc..d09bd15bd 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -9,16 +9,16 @@ module swiftest_classes public :: discard_pl, discard_system, discard_tp public :: drift_all, drift_body, drift_one public :: eucl_dist_index_plpl - public :: gr_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel + public :: gr_kick_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_getacch_int_pl, kick_vh_body + public :: kick_kick_getacch_int_pl, kick_vh_body public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp - public :: tides_getacch_pl, tides_step_spin_system - public :: user_getacch_body + public :: tides_kick_getacch_pl, tides_step_spin_system + public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version @@ -183,7 +183,7 @@ module swiftest_classes procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays - procedure, public :: accel_user => user_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure @@ -218,10 +218,10 @@ module swiftest_classes ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_int => kick_kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) @@ -247,7 +247,7 @@ module swiftest_classes ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure, public :: accel_int => kick_kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass @@ -415,12 +415,12 @@ module subroutine eucl_dist_index_plpl(self) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object end subroutine - module pure subroutine gr_getaccb_ns_body(self, system, param) + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine gr_getaccb_ns_body + end subroutine gr_kick_getaccb_ns_body module pure subroutine gr_p4_pos_kick(param, x, v, dt) implicit none @@ -604,18 +604,18 @@ module subroutine io_write_frame_system(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_system - module pure subroutine kick_getacch_int_pl(self) + module pure subroutine kick_kick_getacch_int_pl(self) implicit none class(swiftest_pl), intent(inout) :: self - end subroutine kick_getacch_int_pl + end subroutine kick_kick_getacch_int_pl - module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) + module pure subroutine kick_kick_getacch_int_tp(self, GMpl, xhp, npl) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle real(DP), dimension(:), intent(in) :: GMpl !! Massive body masses real(DP), dimension(:,:), intent(in) :: xhp !! Massive body position vectors integer(I4B), intent(in) :: npl !! Number of active massive bodies - end subroutine kick_getacch_int_tp + end subroutine kick_kick_getacch_int_tp module subroutine kick_vh_body(self, dt) implicit none @@ -703,11 +703,11 @@ module subroutine setup_tp(self, n) integer, intent(in) :: n !! Number of bodies to allocate space for end subroutine setup_tp - module subroutine tides_getacch_pl(self, system) + module subroutine tides_kick_getacch_pl(self, system) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - end subroutine tides_getacch_pl + end subroutine tides_kick_getacch_pl module subroutine tides_step_spin_system(self, param, t, dt) implicit none @@ -717,14 +717,14 @@ module subroutine tides_step_spin_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine tides_step_spin_system - module subroutine user_getacch_body(self, system, param, t, lbeg) + module subroutine user_kick_getacch_body(self, system, param, t, lbeg) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine user_getacch_body + end subroutine user_kick_getacch_body module subroutine util_coord_b2h_pl(self, cb) implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 93e9184e2..85c65de34 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -91,6 +91,7 @@ module symba_classes private procedure, public :: discard => symba_discard_pl !! Process massive body discards procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle end type symba_pl @@ -106,6 +107,7 @@ module symba_classes private procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle end type symba_tp @@ -212,23 +214,23 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp - module subroutine symba_getacch_pl(self, system, param, t, lbeg) + module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine symba_getacch_pl + end subroutine symba_kick_getacch_pl - module subroutine symba_getacch_tp(self, system, param, t, lbeg) + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine symba_getacch_tp + end subroutine symba_kick_getacch_tp module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index ef2487aa6..f4f98dbf3 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -35,8 +35,8 @@ module whm_classes procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => whm_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: accel_gr => whm_gr_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. @@ -55,8 +55,8 @@ module whm_classes !! component list, such as whm_setup_tp and whm_util_spill_tp contains private - procedure, public :: accel => whm_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: accel_gr => whm_gr_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize @@ -115,7 +115,7 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end subroutine whm_util_fill_pl !> Get heliocentric accelration of massive bodies - module subroutine whm_getacch_pl(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure @@ -123,10 +123,10 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine whm_getacch_pl + end subroutine whm_kick_getacch_pl !> Get heliocentric accelration of the test particle - module subroutine whm_getacch_tp(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure @@ -134,21 +134,21 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - end subroutine whm_getacch_tp + end subroutine whm_kick_getacch_tp - module subroutine whm_gr_getacch_pl(self, param) + module subroutine whm_gr_kick_getacch_pl(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine whm_gr_getacch_pl + end subroutine whm_gr_kick_getacch_pl - module subroutine whm_gr_getacch_tp(self, param) + module subroutine whm_gr_kick_getacch_tp(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine whm_gr_getacch_tp + end subroutine whm_gr_kick_getacch_tp module pure subroutine whm_gr_p4_pl(self, param, dt) use swiftest_classes, only : swiftest_parameters diff --git a/src/rmvs/rmvs_getacch.f90 b/src/rmvs/rmvs_kick.f90 similarity index 91% rename from src/rmvs/rmvs_getacch.f90 rename to src/rmvs/rmvs_kick.f90 index 0ede99ab5..c68453d3d 100644 --- a/src/rmvs/rmvs_getacch.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -1,13 +1,13 @@ -submodule(rmvs_classes) s_rmvs_getacch +submodule(rmvs_classes) s_rmvs_kick use swiftest contains - module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute the oblateness acceleration in the inner encounter region with planets !! - !! Performs a similar task as David E. Kaufmann's Swifter routine rmvs_getacch_tp.f90, but + !! Performs a similar task as David E. Kaufmann's Swifter routine rmvs_kick_getacch_tp.f90, but !! uses object polymorphism, and so is not directly adapted. implicit none ! Arguments @@ -49,7 +49,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) param_planetocen%lextra_force = .false. param_planetocen%lgr = .false. ! Now compute the planetocentric values of acceleration - call whm_getacch_tp(tp, system_planetocen, param_planetocen, t) + call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t) ! Now compute any heliocentric values of acceleration if (tp%lfirst) then @@ -74,7 +74,7 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) end select end select else ! Not a close encounter, so just proceded with the standard WHM method - call whm_getacch_tp(tp, system, param, t, lbeg) + call whm_kick_getacch_tp(tp, system, param, t, lbeg) end if end select @@ -82,6 +82,6 @@ module subroutine rmvs_getacch_tp(self, system, param, t, lbeg) return - end subroutine rmvs_getacch_tp + end subroutine rmvs_kick_getacch_tp -end submodule s_rmvs_getacch \ No newline at end of file +end submodule s_rmvs_kick \ No newline at end of file diff --git a/src/symba/symba_getacch.f90 b/src/symba/symba_getacch.f90 index b2410d99a..d10e2267c 100644 --- a/src/symba/symba_getacch.f90 +++ b/src/symba/symba_getacch.f90 @@ -1,13 +1,13 @@ -submodule (symba_classes) s_symba_getacch +submodule (symba_classes) s_symba_kick_getacch use swiftest contains - module subroutine symba_getacch_pl(self, system, param, t, lbeg) + module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of massive bodies !! - !! Adapted from David E. Kaufmann's Swifter routine symba_getacch.f90 - !! Adapted from Hal Levison's Swift routine symba5_getacch.f + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f implicit none ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure @@ -17,13 +17,12 @@ module subroutine symba_getacch_pl(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: k - real(DP) :: rji2, rlim2, faci, facj + real(DP) :: irij3, rji2, rlim2, faci, facj real(DP), dimension(NDIM) :: dx select type(system) class is (symba_nbody_system) associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) - call helio_getacch_pl(pl, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, nplplenc associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) @@ -39,19 +38,20 @@ module subroutine symba_getacch_pl(self, system, param, t, lbeg) end if end associate end do + call helio_kick_getacch_pl(pl, system, param, t, lbeg) end associate end select return - end subroutine symba_getacch_pl + end subroutine symba_kick_getacch_pl - module subroutine symba_getacch_tp(self, system, param, t, lbeg) + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of test particles !! - !! Adapted from David E. Kaufmann's Swifter routine symba_getacch_tp.f90 - !! Adapted from Hal Levison's Swift routine symba5_getacch.f + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f implicit none ! Arguments class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure @@ -67,7 +67,6 @@ module subroutine symba_getacch_tp(self, system, param, t, lbeg) select type(system) class is (symba_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) - call helio_getacch_tp(tp, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) @@ -81,10 +80,11 @@ module subroutine symba_getacch_tp(self, system, param, t, lbeg) end if end IF end associate - end DO + end do + call helio_kick_getacch_tp(tp, system, param, t, lbeg) end associate end select return - end subroutine symba_getacch_tp + end subroutine symba_kick_getacch_tp -end submodule s_symba_getacch +end submodule s_symba_kick_getacch diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index ff9d554ef..ae503e082 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -1,7 +1,7 @@ -submodule(swiftest_classes) s_tides_getacch +submodule(swiftest_classes) s_tides_kick_getacch use swiftest contains - module subroutine tides_getacch_pl(self, system) + module subroutine tides_kick_getacch_pl(self, system) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! !! Calculated tidal torques from central body to any planet and from any planet to central body @@ -60,5 +60,5 @@ module subroutine tides_getacch_pl(self, system) return - end subroutine tides_getacch_pl -end submodule s_tides_getacch \ No newline at end of file + end subroutine tides_kick_getacch_pl +end submodule s_tides_kick_getacch \ No newline at end of file diff --git a/src/user/user_getacch.f90 b/src/user/user_getacch.f90 index 16a2f0916..ccad7ea7d 100644 --- a/src/user/user_getacch.f90 +++ b/src/user/user_getacch.f90 @@ -1,12 +1,12 @@ -submodule(swiftest_classes) s_user_getacch +submodule(swiftest_classes) s_user_kick_getacch use swiftest contains - module subroutine user_getacch_body(self, system, param, t, lbeg) + module subroutine user_kick_getacch_body(self, system, param, t, lbeg) !! author: David A. Minton !! !! Add user-supplied heliocentric accelerations to planets. !! - !! Adapted from David E. Kaufmann's Swifter routine whm_user_getacch.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_user_kick_getacch.f90 implicit none ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest massive body particle data structure @@ -16,6 +16,6 @@ module subroutine user_getacch_body(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the ste return - end subroutine user_getacch_body + end subroutine user_kick_getacch_body -end submodule s_user_getacch +end submodule s_user_kick_getacch diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index 62c7fb2b5..c6d0b1723 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -1,12 +1,12 @@ submodule(whm_classes) s_whm_gr use swiftest contains - module subroutine whm_gr_getacch_pl(self, param) !! author: David A. Minton + module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies !! Based on Saha & Tremaine (1994) Eq. 28 !! - !! Adapted from David A. Minton's Swifter routine routine gr_whm_getacch.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 implicit none ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure @@ -33,15 +33,15 @@ module subroutine whm_gr_getacch_pl(self, param) !! author: David A. Minton end do end associate return - end subroutine whm_gr_getacch_pl + end subroutine whm_gr_kick_getacch_pl - module subroutine whm_gr_getacch_tp(self, param) + module subroutine whm_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of test particles !! Based on Saha & Tremaine (1994) Eq. 28 !! - !! Adapted from David A. Minton's Swifter routine routine gr_whm_getacch.f90 + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 implicit none ! Arguments class(whm_tp), intent(inout) :: self !! WHM massive body particle data structure @@ -59,7 +59,7 @@ module subroutine whm_gr_getacch_tp(self, param) end do end associate return - end subroutine whm_gr_getacch_tp + end subroutine whm_gr_kick_getacch_tp module pure subroutine whm_gr_p4_pl(self, param, dt) !! author: David A. Minton diff --git a/src/whm/whm_getacch.f90 b/src/whm/whm_kick.f90 similarity index 82% rename from src/whm/whm_getacch.f90 rename to src/whm/whm_kick.f90 index e950d855c..af8805d47 100644 --- a/src/whm/whm_getacch.f90 +++ b/src/whm/whm_kick.f90 @@ -1,13 +1,13 @@ -submodule(whm_classes) s_whm_getacch +submodule(whm_classes) s_whm_kick use swiftest contains - module subroutine whm_getacch_pl(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of planets !! !! Adapted from Hal Levison's Swift routine getacch.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch.f90 implicit none ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure @@ -23,13 +23,13 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) if (npl == 0) return call pl%set_ir3() - ah0 = whm_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) + ah0 = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) do i = 1, npl pl%ah(:, i) = ah0(:) end do - call whm_getacch_ah1(cb, pl) - call whm_getacch_ah2(cb, pl) + call whm_kick_getacch_ah1(cb, pl) + call whm_kick_getacch_ah2(cb, pl) call pl%accel_int() if (param%loblatecb) then @@ -48,15 +48,15 @@ module subroutine whm_getacch_pl(self, system, param, t, lbeg) if (param%lextra_force) call pl%accel_user(system, param, t) end associate return - end subroutine whm_getacch_pl + end subroutine whm_kick_getacch_pl - module subroutine whm_getacch_tp(self, system, param, t, lbeg) + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! !! Compute heliocentric accelerations of test particles !! !! Adapted from Hal Levison's Swift routine getacch_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_tp.f90 implicit none ! Arguments class(whm_tp), intent(inout) :: self !! WHM test particle data structure @@ -73,13 +73,13 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) if (present(lbeg)) system%lbeg = lbeg if (system%lbeg) then - ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) do i = 1, ntp tp%ah(:, i) = ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else - ah0(:) = whm_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) do i = 1, ntp tp%ah(:, i) = ah0(:) end do @@ -91,9 +91,9 @@ module subroutine whm_getacch_tp(self, system, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) end associate return - end subroutine whm_getacch_tp + end subroutine whm_kick_getacch_tp - function whm_getacch_ah0(mu, xhp, n) result(ah0) + function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) !! author: David A. Minton !! !! Compute zeroth term heliocentric accelerations of planets @@ -118,15 +118,15 @@ function whm_getacch_ah0(mu, xhp, n) result(ah0) end do return - end function whm_getacch_ah0 + end function whm_kick_getacch_ah0 - pure subroutine whm_getacch_ah1(cb, pl) + pure subroutine whm_kick_getacch_ah1(cb, pl) !! author: David A. Minton !! !! Compute first term heliocentric accelerations of planets !! !! Adapted from Hal Levison's Swift routine getacch_ah1.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah1.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah1.f90 implicit none ! Arguments class(swiftest_cb), intent(in) :: cb !! WHM central body object @@ -145,15 +145,15 @@ pure subroutine whm_getacch_ah1(cb, pl) return - end subroutine whm_getacch_ah1 + end subroutine whm_kick_getacch_ah1 - pure subroutine whm_getacch_ah2(cb, pl) + pure subroutine whm_kick_getacch_ah2(cb, pl) !! author: David A. Minton !! !! Compute second term heliocentric accelerations of planets !! !! Adapted from Hal Levison's Swift routine getacch_ah2.f - !! Adapted from David E. Kaufmann's Swifter routine whm_getacch_ah2.f90 + !! Adapted from David E. Kaufmann's Swifter routine whm_kick_getacch_ah2.f90 implicit none ! Arguments class(swiftest_cb), intent(in) :: cb !! Swiftest central body object @@ -177,6 +177,6 @@ pure subroutine whm_getacch_ah2(cb, pl) end associate return - end subroutine whm_getacch_ah2 + end subroutine whm_kick_getacch_ah2 -end submodule s_whm_getacch +end submodule s_whm_kick From 178c1cc897547443d65101cc417b8cd8d08a017f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 14:26:06 -0400 Subject: [PATCH 057/194] Replaced kick_kick with just kick after refactoring --- src/kick/kick.f90 | 8 ++++---- src/modules/swiftest_classes.f90 | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 3d57f2d1c..f9cd81b35 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -1,7 +1,7 @@ submodule(swiftest_classes) s_kick use swiftest contains - module pure subroutine kick_kick_getacch_int_pl(self) + module pure subroutine kick_getacch_int_pl(self) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations of massive bodies @@ -31,9 +31,9 @@ module pure subroutine kick_kick_getacch_int_pl(self) end associate return - end subroutine kick_kick_getacch_int_pl + end subroutine kick_getacch_int_pl - module pure subroutine kick_kick_getacch_int_tp(self, GMpl, xhp, npl) + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies @@ -62,7 +62,7 @@ module pure subroutine kick_kick_getacch_int_tp(self, GMpl, xhp, npl) end do end associate return - end subroutine kick_kick_getacch_int_tp + end subroutine kick_getacch_int_tp module subroutine kick_vh_body(self, dt) !! author: David A. Minton diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d09bd15bd..4092a0a52 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -13,7 +13,7 @@ module swiftest_classes public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_kick_getacch_int_pl, kick_vh_body + public :: kick_getacch_int_pl, kick_vh_body public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp @@ -218,7 +218,7 @@ module swiftest_classes ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body @@ -247,7 +247,7 @@ module swiftest_classes ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: accel_int => kick_kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass @@ -604,18 +604,18 @@ module subroutine io_write_frame_system(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine io_write_frame_system - module pure subroutine kick_kick_getacch_int_pl(self) + module pure subroutine kick_getacch_int_pl(self) implicit none class(swiftest_pl), intent(inout) :: self - end subroutine kick_kick_getacch_int_pl + end subroutine kick_getacch_int_pl - module pure subroutine kick_kick_getacch_int_tp(self, GMpl, xhp, npl) + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle real(DP), dimension(:), intent(in) :: GMpl !! Massive body masses real(DP), dimension(:,:), intent(in) :: xhp !! Massive body position vectors integer(I4B), intent(in) :: npl !! Number of active massive bodies - end subroutine kick_kick_getacch_int_tp + end subroutine kick_getacch_int_tp module subroutine kick_vh_body(self, dt) implicit none From d85ee28f96bf09af373396acc55e51986bef55bc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 16:01:21 -0400 Subject: [PATCH 058/194] Restructured kick methods for entire code with new masked interface. WHM still works, but Helio does not. --- src/helio/helio_drift.f90 | 43 ++++++++++-------- src/helio/helio_kick.f90 | 33 ++++++++++---- src/helio/helio_step.f90 | 31 +++++-------- src/kick/kick.f90 | 26 ----------- src/modules/helio_classes.f90 | 48 +++++++++++++------- src/modules/swiftest_classes.f90 | 48 +++++++++++--------- src/modules/whm_classes.f90 | 58 +++++++++++++++++------- src/symba/symba_step.f90 | 37 ++++++--------- src/whm/whm_kick.f90 | 78 +++++++++++++++++++++++++++++++- src/whm/whm_step.f90 | 22 ++------- 10 files changed, 259 insertions(+), 165 deletions(-) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 0c146eea5..942206945 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -71,7 +71,7 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) return end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) !! author: David A. Minton !! !! Perform linear drift of massive bodies due to barycentric momentum of Sun @@ -80,21 +80,26 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) !! Adapted from Hal Levison's Swift routine helio_lindrift.f implicit none ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(helio_cb), intent(inout) :: cb !! Helio central bod - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(helio_cb), intent(inout) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals - real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + integer(I4B) :: i associate(pl => self, npl => self%nbody) - pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl)) - pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl)) - pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl)) + if (npl == 0) return + pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), mask) + pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), mask) + pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), mask) pt(:) = pt(:) / cb%Gmass - pl%xh(1,1:npl) = pl%xh(1,1:npl) + pt(1) * dt - pl%xh(2,1:npl) = pl%xh(2,1:npl) + pt(2) * dt - pl%xh(3,1:npl) = pl%xh(3,1:npl) + pt(3) * dt + do concurrent(i = 1:npl, mask(i)) + pl%xh(1,1:npl) = pl%xh(1,1:npl) + pt(1) * dt + pl%xh(2,1:npl) = pl%xh(2,1:npl) + pt(2) * dt + pl%xh(3,1:npl) = pl%xh(3,1:npl) + pt(3) * dt + end do if (lbeg) then cb%ptbeg = pt(:) @@ -106,7 +111,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) return end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) !! author: David A. Minton !! !! Perform linear drift of test particles due to barycentric momentum of Sun @@ -116,20 +121,22 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) !! Adapted from Hal Levison's Swift routine helio_lindrift_tp.f implicit none ! Arguments - class(helio_tp), intent(inout) :: self !! Helio test particleb object - class(helio_cb), intent(in) :: cb !! Helio central body - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_tp), intent(inout) :: self !! Helio test particleb object + class(helio_cb), intent(in) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body associate(tp => self, ntp => self%nbody) + if (ntp == 0) return if (lbeg) then pt(:) = cb%ptbeg else pt(:) = cb%ptend end if - where (tp%status(1:ntp) == ACTIVE) + where (mask(1:ntp)) tp%xh(1, 1:ntp) = tp%xh(1, 1:ntp) + pt(1) * dt tp%xh(2, 1:ntp) = tp%xh(2, 1:ntp) + pt(2) * dt tp%xh(3, 1:ntp) = tp%xh(3, 1:ntp) + pt(3) * dt diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index a4cd86d1d..1c2fff23e 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -66,7 +66,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) return end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, dt) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -75,14 +75,25 @@ module subroutine helio_kick_vb_pl(self, dt) !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb.f90 implicit none ! Arguments - class(helio_pl), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize + class(helio_pl), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i associate(pl => self, npl => self%nbody) if (npl ==0) return - do concurrent(i = 1:npl, pl%status(i) == ACTIVE) + call pl%accel(system, param, t) + if (lbeg) then + call pl%set_beg_end(xbeg = pl%xh) + else + call pl%set_beg_end(xend = pl%xh) + end if + do concurrent(i = 1:npl, mask(i)) pl%vb(:, i) = pl%vb(:, i) + pl%ah(:, i) * dt end do end associate @@ -91,7 +102,7 @@ module subroutine helio_kick_vb_pl(self, dt) end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -100,14 +111,20 @@ module subroutine helio_kick_vb_tp(self, dt) !! Adapted from David E. Kaufmann's Swifter routine helio_kick_vb_tp.f90 implicit none ! Arguments - class(helio_tp), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize + class(helio_tp), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i associate(tp => self, ntp => self%nbody) if (ntp ==0) return - do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) + call tp%accel(system, param, t, lbeg) + do concurrent(i = 1:ntp, mask(i)) tp%vb(:, i) = tp%vb(:, i) + tp%ah(:, i) * dt end do end associate diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 511ffacb6..d0c4dde83 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -37,8 +37,7 @@ module subroutine helio_step_pl(self, system, param, t, dt) real(DP), intent(in) :: t !! Current simulation time real(DP), intent(in) :: dt !! Stepsize ! Internals - integer(I4B) :: i - real(DP) :: dth, msys + real(DP) :: dth !! Half step size if (self%nbody == 0) return associate(pl => self) @@ -49,15 +48,11 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%vh2vb(cb) pl%lfirst = .false. end if - call pl%lindrift(cb, dth, lbeg=.true.) - call pl%accel(system, param, t) - call pl%kick(dth) - call pl%set_beg_end(xbeg = pl%xh) - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) - call pl%set_beg_end(xend = pl%xh) - call pl%accel(system, param, t + dt) - call pl%kick(dth) - call pl%lindrift(cb, dth, lbeg=.false.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE)) + call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) end select end associate @@ -80,9 +75,9 @@ module subroutine helio_step_tp(self, system, param, t, dt) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nboody system class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - real(DP), intent(in) :: dt !! Stepsiz + real(DP), intent(in) :: dt !! Stepsize ! Internals - real(DP) :: dth !! Half step size + real(DP) :: dth !! Half step size if (self%nbody == 0) return @@ -94,13 +89,11 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%vh2vb(vbcb = -cb%ptbeg) tp%lfirst = .false. end if - call tp%lindrift(cb, dth, lbeg=.true.) - call tp%accel(system, param, t, lbeg=.true.) - call tp%kick(dth) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - call tp%accel(system, param, t + dt, lbeg=.false.) - call tp%kick(dth) - call tp%lindrift(cb, dth, lbeg=.false.) + call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) end select end associate diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index f9cd81b35..c10d47dbc 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -64,30 +64,4 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) return end subroutine kick_getacch_int_tp - module subroutine kick_vh_body(self, dt) - !! author: David A. Minton - !! - !! Kick heliocentric velocities of bodies - !! - !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f and kickvh_tp.f - !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh.f90 and whm_kickvh_tp.f90 - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - real(DP), intent(in) :: dt !! Stepsize - ! Internals - integer(I4B) :: i - - associate(n => self%nbody, vh => self%vh, ah => self%ah, status => self%status) - if (n == 0) return - do i = 1, n - if (status(i) == ACTIVE) vh(:, i) = vh(:, i) + ah(:, i) * dt - end do - end associate - - return - end subroutine kick_vh_body - - - end submodule s_kick diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 39d1e30e4..c3dc0be62 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -116,20 +116,22 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) implicit none - class(helio_pl), intent(inout) :: self !! Helio massive body object - class(helio_cb), intent(inout) :: cb !! Helio central body object - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(helio_cb), intent(inout) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) implicit none - class(helio_tp), intent(inout) :: self !! Helio test particle object - class(helio_cb), intent(in) :: cb !! Helio nbody system object - real(DP), intent(in) :: dt !! Stepsize - logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step + class(helio_tp), intent(inout) :: self !! Helio test particle object + class(helio_cb), intent(in) :: cb !! Helio central body + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) @@ -143,7 +145,7 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) end subroutine helio_kick_getacch_pl module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) - use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object @@ -152,16 +154,28 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, dt) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none - class(helio_pl), intent(inout) :: self !! Helio massive body object - real(DP), intent(in) :: dt !! Stepsize + class(helio_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, dt) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none - class(helio_tp), intent(inout) :: self !! Helio test particle object - real(DP), intent(in) :: dt !! Stepsize + class(helio_tp), intent(inout) :: self !! Helio test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_tp module subroutine helio_step_pl(self, system, param, t, dt) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 4092a0a52..7c160b780 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -13,7 +13,7 @@ module swiftest_classes public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_getacch_int_pl, kick_vh_body + public :: kick_getacch_int_pl public :: obl_acc_body, obl_acc_pl, obl_acc_tp public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp @@ -167,6 +167,7 @@ module swiftest_classes contains private procedure(abstract_discard_body), public, deferred :: discard + procedure(abstract_kick_body), public, deferred :: kick procedure(abstract_set_mu), public, deferred :: set_mu procedure(abstract_step_body), public, deferred :: step procedure(abstract_accel), public, deferred :: accel @@ -177,7 +178,6 @@ module swiftest_classes procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: kick => kick_vh_body !! Kicks the heliocentric velocities procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements @@ -216,19 +216,19 @@ module swiftest_classes private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass + procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body + procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** @@ -319,6 +319,18 @@ subroutine abstract_initialize(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine abstract_initialize + subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) + import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system objec + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine abstract_kick_body + subroutine abstract_read_frame(self, iu, param, form, ierr) import DP, I4B, swiftest_base, swiftest_parameters class(swiftest_base), intent(inout) :: self !! Swiftest base object @@ -617,12 +629,6 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) integer(I4B), intent(in) :: npl !! Number of active massive bodies end subroutine kick_getacch_int_tp - module subroutine kick_vh_body(self, dt) - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - real(DP), intent(in) :: dt !! Stepsize - end subroutine kick_vh_body - module subroutine obl_acc_body(self, system) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index f4f98dbf3..e30bd874f 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -30,19 +30,20 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_pl and whm_util_spill_pl contains - procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates - procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates - procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates + procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates + procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates + procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates + procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. procedure, public :: set_ir3 => whm_setup_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) - procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize - procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize + procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -55,11 +56,12 @@ module whm_classes !! component list, such as whm_setup_tp and whm_util_spill_tp contains private - procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations - procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize + procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles + procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations + procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp !******************************************************************************************************************************** @@ -136,6 +138,30 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine whm_kick_getacch_tp + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine whm_kick_vh_pl + + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(whm_tp), intent(inout) :: self !! WHM test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + end subroutine whm_kick_vh_tp + module subroutine whm_gr_kick_getacch_pl(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 0ef7f8df8..896af6ab4 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -62,34 +62,27 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) + irec = -1 call pl%vh2vb(cb) - call pl%lindrift(cb, dth, lbeg=.true.) - call tp%vh2vb(vbcb = -cb%ptbeg) - call tp%lindrift(cb, dth, lbeg=.true.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == irec)) - call pl%set_beg_end(xbeg = pl%xh) - call pl%accel(system, param, t) - call tp%accel(system, param, t, lbeg=.true.) + call tp%vh2vb(vbcb = -cb%ptbeg) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == irec)) - call pl%kick(dth) - call tp%kick(dth) - irec = -1 - call pl%drift(system, param, dt, pl%status(:) == ACTIVE .and. pl%levelg(:) == irec) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE .and. tp%levelg(:) == irec) irec = 0 call system%recursive_step(param, irec) - call pl%set_beg_end(xend = pl%xh) - call pl%accel(system, param, t + dt) - call tp%accel(system, param, t + dt, lbeg=.false.) - - call pl%kick(dth) - call tp%kick(dth) - + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) - call pl%lindrift(cb, dth, lbeg=.false.) + call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%vb2vh(vbcb = -cb%ptend) - call tp%lindrift(cb, dth, lbeg=.false.) + call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end select end select end select @@ -146,8 +139,8 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) call pltpenc_list%kick(system, dth, irecp, sgn) end if - call pl%drift(system, param, dtl, pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci) - call tp%drift(system, param, dtl, tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci) + call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) + call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) if (lencounter) call system%recursive_step(param, irecp) diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index af8805d47..5a0e19fd5 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -23,7 +23,7 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) if (npl == 0) return call pl%set_ir3() - ah0 = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) + ah0(:) = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) do i = 1, npl pl%ah(:, i) = ah0(:) end do @@ -179,4 +179,80 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) return end subroutine whm_kick_getacch_ah2 + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + !! author: David A. Minton + !! + !! Kick heliocentric velocities of massive bodies + !! + !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + ! Internals + integer(I4B) :: i + + associate(pl => self, npl => self%nbody, cb => system%cb) + if (npl == 0) return + if (pl%lfirst) then + call pl%h2j(cb) + call pl%accel(system, param, t) + pl%lfirst = .false. + end if + if (lbeg) then + call pl%set_beg_end(xbeg = pl%xh) + else + call pl%set_beg_end(xend = pl%xh) + call pl%accel(system, param, t) + end if + do concurrent(i = 1:npl, mask(i)) + pl%vh(:, i) = pl%vh(:, i) + pl%ah(:, i) * dt + end do + end associate + + return + end subroutine whm_kick_vh_pl + + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + !! author: David A. Minton + !! + !! Kick heliocentric velocities of test particles + !! + !! Adapted from Martin Duncan and Hal Levison's Swift routine kickvh_tp.f + !! Adapted from David E. Kaufmann's Swifter routine whm_kickvh_tp.f90 + implicit none + ! Arguments + class(whm_tp), intent(inout) :: self !! WHM massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + real(DP), intent(in) :: dt !! Stepsize + logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick + logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. + ! Internals + integer(I4B) :: i + + associate(tp => self, ntp => self%nbody) + if (ntp == 0) return + if (tp%lfirst) then + call tp%accel(system, param, t, lbeg=.true.) + tp%lfirst = .false. + end if + if (.not.lbeg) call tp%accel(system, param, t, lbeg) + do concurrent(i = 1:ntp, mask(i)) + tp%vh(:, i) = tp%vh(:, i) + tp%ah(:, i) * dt + end do + end associate + + return + end subroutine whm_kick_vh_tp + + + end submodule s_whm_kick diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 64415f15d..ae8722ad9 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -47,20 +47,13 @@ module subroutine whm_step_pl(self, system, param, t, dt) associate(pl => self, cb => system%cb) dth = 0.5_DP * dt - if (pl%lfirst) then - call pl%h2j(cb) - call pl%accel(system, param, t) - pl%lfirst = .false. - end if - call pl%set_beg_end(xbeg = pl%xh) - call pl%kick(dth) + call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%drift(system, param, dt, pl%status(:) == ACTIVE) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) - call pl%accel(system, param, t + dt) - call pl%kick(dth) + call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%set_beg_end(xend = pl%xh) end associate return @@ -89,16 +82,11 @@ module subroutine whm_step_tp(self, system, param, t, dt) class is (whm_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl) dth = 0.5_DP * dt - if (tp%lfirst) then - call tp%accel(system, param, t, lbeg=.true.) - tp%lfirst = .false. - end if - call tp%kick(dth) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE)) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%accel(system, param, t + dt, lbeg=.false.) - call tp%kick(dth) + call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end associate end select return From 028bc69994cf4c7601ea9edf2b6e657ff12f6bd4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 16:13:49 -0400 Subject: [PATCH 059/194] Fixed bug in helio_drift_linear_pl due to bad index in loop --- .../helio_swifter_comparison/swiftest_vs_swifter.ipynb | 8 ++++---- src/helio/helio_drift.f90 | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 7f0b1d4b9..9adcfb4d0 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": [ "
    " ] @@ -127,7 +127,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": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAElCAYAAAD3KtVsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABZSElEQVR4nO3dd3yV9dn48c+VvScJWYRAWGEGCEMFBK0UV3HXUf05qtVqHzusXc/T9Txt7XbXum1tta3VinuhsmSEGSCMEFbI3js54/r9cZ9gxACHcFaS7/v1Oq8z7nXdEc91vltUFcMwDMM4mSB/B2AYhmEMDCZhGIZhGG4xCcMwDMNwi0kYhmEYhltMwjAMwzDcYhKGYRiG4RaTMIwhSUR+KiLPu15ni0iriAT34zyPicj/eD5Cwwg8JmEYA5KIHBCRLxzz2Y0isupUz6Wqh1Q1RlUd/Tj2dlX9X3f2FZFnReT/TvUantLfv49h9DAJwzAGAREJGQzXMAKbSRjGoCUiGSLybxGpEZH9IvJfx9kvR0S05wvRddwyEakXkRIRufUE1zhaahCRhSJSJiLfEZFqEakQkZtc224DrgPudVV/vXayGEUkUkSeE5EGESkWkXtFpKzX9gMi8j0R2Qa0iUiIiHxfRPaJSIuI7BSRS1375gGPAWe4rt/o+jxeRP7iuv5BEflvEQlybbtRRFaLyB9FpB74aX//WxiDg/nFYAxKri+914BXgWuALOB9Edmtqu+c5PAXgB1ABjABeE9ESlX1AzcunQbEA5nAecBLIvIfVX1cRM4EylT1v92M8SdADjAaiAbe7ON61wAXArWqaheRfcB8oBK4EnheRMaoarGI3A58VVXn9Tr+IVe8o4Fk4F2gAnjKtX0O8CKQCoS6cf/GIGZKGMZA9h8Raex5AI/22jYLSFHVn6tqt6qWAk8AV5/ohCIyApgHfE9VO1V1C/AkcL2bMdmAn6uqTVXfBFqB8cfZ92QxXgX8UlUbVLUMeLCPczyoqodVtQNAVf+lquWq6lTVfwB7gdnHuddg4MvAD1S1RVUPAL8/5l7LVfUhVbX3XMMYukwJwxjILlHV93veiMiNwFddb0cCGT1VLy7BwMqTnDMDqFfVll6fHQQK3IypTlXtvd63AzHH2fdkMWYAh3tt6/26z89E5Abg21glE1zXHnac6w8DwrDur8dBrNLRia5pDFEmYRiD1WFgv6qOPcXjyoEkEYntlTSygSMeiOnYqaFPFmMFVjXVTtf7ESc6p4iMxCqhnAt8oqoOEdkCyHGuX4tVIhrZ6xrH3quZzto4ylRJGYPVeqDZ1SgcKSLBIjJZRGad6CBVPQysAX4lIhEiMhW4BfibB2KqwmorcDfGfwI/EJFEEckE7jrJ+aOxvuBrAFwN7pOPuX6WiIQBuLoR/xP4hYjEuhLOt4HnT+82jcHKJAxjUHJ9GV4M5AP7sX5NP4nVwHsy12BV6ZQDrwA/UdX3PBDWU8BEV5vLf9yI8edAmWvb+8BLQNfxTq6qO7HaID7BSg5TgNW9dlmO1ZhfKSK1rs++AbQBpcAq4O/A06d7o8bgJGYBJcMYGETkDuBqVT3b37EYQ5MpYRhGgBKRdBE5S0SCRGQ88B2sEo9h+IVp9DaMwBUG/BkYBTRijYd49EQHGIY3mSopwzAMwy2mSsowDMNwi0kYhuHS1wy4g8Wx82UZRn+YhGEMKa4vzTbXBHxHROQP0o91MDwQwxhfXtMwPMEkDGMomqaqMVgjoq8FjjsbrWEYnzIJwxiyVHUX1rxNk4/dJiKzReQT1yC7ChF5uGeEtGu7isjtIrLXNf34IyIivbbf7JqSvEFE3nGNokZEVrh22eoq5XxZRIaJyOuua9WLyMqeKcb7iOtMEdkgIk2u5zN7bftIRP7XNSV5i4i8KyKfm0dKRK4UkY3HfPYdEfnPqf0FjaHGJAxjyBKRiVhTgW/uY7MD+BbWBH1nYJVGvn7MPhdhzTg7DWtm2S+6znsJ8EPgMiAFKym9AKCqC1zHTnOt8vcPrPEVZa59h7uO/Vz3RRFJAt7AmrU2GfgD8IaIJPfa7VrgJqzpyMOAe/q4t2XAKNcaGT2+Avy1j30N4yiTMIyhaJOINGCtRfEk8MyxO6jqRlVd65rW+wDWeIhjR1jfp6qNqnoI+BBrig+ArwG/UtVi18y1vwTye0oZfbAB6cBI17ToK7Xv/u4XAntV9a+uuF4AdmFNL9LjGVXd45qK/J+9Yup9b13AP7CSBCIyCWsqlNePE59hACZhGEPTDFVNVNVcVf1vVXUeu4OIjHNVE1WKSDPWl/6x1TuVvV73nsZ8JPBAr3U66rFmjM2kb78FSoB3RaRURL5/nP0y+OxU5PD56ciPF9OxngOudVWjXQ/805VIDOO4TMIwjL79CevX+1hVjcOqJpITH3LUYeBrqprQ6xGpqmv62tm1eNF3VHU0Vmnh2yJybh+7lmMlo976NfW6qq4FurGq5K7FVEcZbjAJwzD6Fgs0A60iMgG44xSOfQxrWvJJcHTd7Ct7bf/MNOcicpGIjHH92m/Gaj9x9HHeN4FxInKtWOt3fxmYSP+rkv4CPAzYVXVVP89hDCEmYRhG3+7B+uXdgrUo0T/cPVBVXwF+Dbzoqs7aDpzfa5efAs+5qqyuAsZiTV/eijU1+aOq+lEf563Damj/DlAH3AtcpKq1x+7rpr9i9RAzpQvDLWYuKcMYokQkEqjGatPZ6+94jMBnShiGMXTdAWwwycJwl5lXxjCGIBE5gNWIf4l/IzEGElMlZRiGYbjFVEkZhmEYbhnUVVLDhg3TnJwcf4dhGIYxYGzcuLFWVVP62uazhCEiT2N1CaxW1b4me/sucF2vuPKAFFWtd9W3tmD1TberaoE718zJyaGwsNAT4RuGYQwJInLsbAJH+bJK6llgyfE2qupvVTVfVfOBHwAfq2p9r10Wuba7lSwMwzAMz/JZwlDVFVhz6rjjGlyzexqGYRiBIeAavUUkCqsk8u9eHyvWxGwbReS2kxx/m4gUikhhTU2NN0M1DMMYUgKx0ftiYPUx1VFnqWq5iKQC74nILleJ5XNU9XHgcYCCgoLP9Rm22WyUlZXR2dnpjdg9IiIigqysLEJDQ/0dimEYxlGBmDCu5pjqKFUtdz1Xi8grwGygz4RxMmVlZcTGxpKTk0OvBdIChqpSV1dHWVkZo0aN8nc4hmEYRwVUlZSIxGMtUvNqr8+iRSS25zWwGGsyt37p7OwkOTk5IJMFgIiQnJwc0CUgwzCGJl92q30BWAgME5Ey4CdAKICqPuba7VLgXVVt63XocOAV1xd8CPB3VX37NGM5ncO9LtDjMwxjaPJZwlDVa9zY51ms7re9PyvFWjPZMAzDOI5uu5OXNpYRJHDZjCzCQjxfgRRQVVIDxZlnntnn5zfeeCMvvfSSj6MxDGOoczqVr/21kB++UsT3Xy7iluc20Gnraw2u0xOIjd4Bb82aPlfaNAzD8IuXNpbx4e4afnzRRCLDgllVUktwkOertk3C6IeYmBhaW1tRVb7xjW+wfPlyRo0ahZn51zAMX3M6lT99vI+pWfHcdJbV+/PqWSO80hZqqqROwyuvvMLu3bspKiriiSeeMCUPwzB8bsXeGvbXtnHLvFFHk4S3Os6YhHEaVqxYwTXXXENwcDAZGRmcc845/g7JMIwh5s2iCmLDQ1gyOc3r1zIJ4zSZLrCGYfiL3eHk/eJqzslLJTwk2OvXMwnjNCxYsIAXX3wRh8NBRUUFH374ob9DMgxjCCk82EB9WzdfnOT90gWYRu/Tcumll7J8+XKmTJnCuHHjOPvss/0dkmEYQ8jKvTUEBwkLxvW53pHHmYTRD62trYBVHfXwww/7ORrDMIaqdaX1TMmMJybcN1/lpkrKMAxjAOrodrC1rJE5o5N8dk2TMAzDMAagzYcasDmUuaOSfXZNkzAMwzAGoLX76wkSKMhJ9Nk1TcIwDMMYgLYcbmR8WhyxEb5baM0kDMMwjAGouKKZielxPr2mSRiGYRgDTE1LFzUtXUzMMAlj0Lv55ptJTU1l8uTJ/g7FMIwBqLiiGYC89FifXtckDD+48cYbefvt01o00DCMIawnYZgqqSFgwYIFJCX5ru+0YRiDS3FFMxnxESREhfn0ukN6pPfPXtvBzvJmj55zYkYcP7l4kkfPaRiG0VtxRQt5Pi5dgClhGIZhDCidNgclNa1+SRg+K2GIyNPARUC1qn6utVdEFgKvAvtdH72sqj93bVsCPAAEA0+q6n2eiMmUBAzDGGhKqltxOHXQlzCeBZacZJ+VqprvevQki2DgEeB8YCJwjYhM9GqkhmEYAWpnT4O3j7vUgg8ThqquAOr7cehsoERVS1W1G3gRWOrR4Hzsmmuu4YwzzmD37t1kZWXx1FNP+TskwzAGiJ3lzUSFBTMyKcrn1w60Ru8zRGQrUA7co6o7gEzgcK99yoA5xzuBiNwG3AaQnZ3txVD774UXXvB3CIZhDFDFFc2MT4slKMj3q30GUqP3JmCkqk4DHgL+4/q8r7+KHu8kqvq4qhaoakFKim8WFTEMw/AFVaW4otkv7RcQQAlDVZtVtdX1+k0gVESGYZUoRvTaNQurBGIYhjGklDd10txp9/mAvR4BkzBEJE1ExPV6NlZsdcAGYKyIjBKRMOBqYJn/IjUMw/CPnnFj/iph+LJb7QvAQmCYiJQBPwFCAVT1MeAK4A4RsQMdwNWqqoBdRO4C3sHqVvu0q23DMAxjSCmuaEYEJqT5dg6pHj5LGKp6zUm2Pwz0uUC2q4rqTW/EZRiGMVAUVzSTkxxNtI/W8D5WwFRJGYZhGCe2s6LZ5zPU9mYSho8dPnyYRYsWkZeXx6RJk3jggQf8HZJhGANAa5edg3Xt5KX5p/0CAm8cxqAXEhLC73//e2bMmEFLSwszZ87kvPPOY+JEM3jdMIzj213p3wZvMCUMn0tPT2fGjBkAxMbGkpeXx5EjR/wclWEYgW5nRQvgnylBegztEsZb34fKIs+eM20KnO/e3IgHDhxg8+bNzJlz3IHrhmEYgNWlNj4ylPT4CL/FYEoYftLa2srll1/O/fffT1yc/34xGIYxMBS7Grxdw9X8YmiXMNwsCXiazWbj8ssv57rrruOyyy7zSwyGYQwcDqeyu7KFa2b7d348U8LwMVXllltuIS8vj29/+9v+DscwjAHgYF0bHTaHX7vUgkkYPrd69Wr++te/snz5cvLz88nPz+fNN82YRMMwjq9nDQx/9pCCoV4l5Qfz5s3DmvHEMAzDPcUVzYQECWOHx/g1DlPCMAzDCHDFFS2MSY0hPCTYr3GYhGEYhhHgdpb7bw2M3kzCMAzDCGANbd1UNnf6vcEbTMIwDMMIaMUB0uANJmEYhmEEtEDpIQUmYRiGYQS0nRXNpMaGMywm3N+hmITha52dncyePZtp06YxadIkfvKTn/g7JMMwAlhxRUtAlC7AjMPwufDwcJYvX05MTAw2m4158+Zx/vnnM3fuXH+HZhhGgOm2OympbmHh+BR/hwKYEobPiQgxMdbgG5vNhs1m8+tkYoZhBK6S6lZsDjUljEDw6/W/Zlf9Lo+ec0LSBL43+3sn3MfhcDBz5kxKSkq48847zfTmhnESr245wvNrD5IaF8H3l0xgRFKUv0PyiR3lTQBM8uMaGL35rIQhIk+LSLWIbD/O9utEZJvrsUZEpvXadkBEikRki4gU+ipmbwkODmbLli2UlZWxfv16tm/v809iGAbwjw2HuPvFLdS3dbNidw2X/WkNVc2d/g7LJ3aUNxMVFkxOcrS/QwF8W8J4FngY+Mtxtu8HzlbVBhE5H3gc6P3Te5Gq1noyoJOVBLwtISGBhQsX8vbbbzN58mS/xmIYgaiiqYOfv7aTs8Yk8+xNsymtaeOSR1bzo1e28+T/K/B3eF63s7yZCWmxBAcFRrW1z0oYqroCqD/B9jWq2uB6uxbI8klgPlZTU0NjYyMAHR0dvP/++0yYMMG/QRlGgHrwgxJsTuVXl04lNDiI8WmxfOPcMbxfXMXa0jp/h+dVTqeys6KZSRnx/g7lqEBt9L4FeKvXewXeFZGNInLbiQ4UkdtEpFBECmtqarwaZH9UVFSwaNEipk6dyqxZszjvvPO46KKL/B2WYQSc2tYu/r2pjMtnZJKd/Gmbxc1njWJYTDiPryj1Y3Ted6i+ndYue8C0X0AANnqLyCKshDGv18dnqWq5iKQC74nILleJ5XNU9XGs6iwKCgoCbh7xqVOnsnnzZn+HYRgB7z+bj9Btd3LLvFGf+TwiNJhr52Tz0PK9HKxrY2SA1O97Ws8Ib1PCOA4RmQo8CSxV1aPlTVUtdz1XA68As/0ToWEYvvLqlnKmZMYzJvXzk+5dNyebYBFeWH/YD5H5xo7yJoIDYA2M3gImYYhINvAycL2q7un1ebSIxPa8BhYDpluRYQxi+2paKTrSxNL8jD63D4+LYN7YYby2tXzQLki2o7yZsakxRIT6dw2M3nzZrfYF4BNgvIiUicgtInK7iNzu2uXHQDLw6DHdZ4cDq0RkK7AeeENV3/ZV3IZh+N7rWysQgYum9p0wAC6emsGRxg42HWr0XWA+tKO8mYkB1H4BPmzDUNVrTrL9q8BX+/i8FJj2+SMMwxislu+qIn9EAmnxEcfdZ/Gk4YS9EsRrW8uZOTLRh9F5X3VLJzUtXQHVfgEBVCVlGIYBUNfaxbYjTSwcl3rC/WIjQjl7XArv7qgcdNVSO8utBu+JATIlSA+TMAzDCCgr9tagilsT7n0hL5Xypk6KK1p8EJnvFJVZU4IEWpWUSRh+4nA4mD59uhmDYRjH+Hh3DcnRYUzJPHl1zKIJVilk+a4qb4flU1vLGslNiSY+MtTfoXzGSROGiGS7+QisVBjgHnjgAfLy8vwdhmEEFKdTWbG3lgXjUghyYzqM1NgIpmXF88Guah9E5xuqypbDTUwbkeDvUD7HnUbv57BGWp/ov55izRV1vHmijF7Kysp44403+NGPfsQf/vAHf4djGAFjd1UL9W3dzBszzO1jzpkwnPs/2ENta1dArEp3usqbOqlt7SJ/ICYMVV107Gcikqaqld4JyXcqf/lLuoo9O715eN4E0n74wxPu881vfpPf/OY3tLQMrnpXwzhd61zzQ80ZneT2MefmpfLH9/fw4a5qriwY4a3QfGbr4UYApmUl+DWOvvS3DeMGj0YxhLz++uukpqYyc+ZMf4diGAFn3f56MhMiyUp0f72LSRlxpMaG89GewJs7rj+2Hm4kLDiICemfH+Hub/0dh7FURNqB91R1tycD8qWTlQS8YfXq1Sxbtow333yTzs5Ompub+cpXvsLzzz/v81gMI5CoKuv313P2KS5HKiKcPS6Fd3ZUYnc4CQke2H15thxuJC8jjvCQwBnh3aO/f9nLgBLgUhF50oPxDHq/+tWvKCsr48CBA7z44oucc845JlkYBtZypHVt3cwZ5X51VI+F41Np7rSz2VWdM1A5nErRkSamB2D7BfSzhKGqVcDbrodhGMZpW7ffWi5nzqjkUz523thhBAcJH+2uZlbOqSecQLG3uoX2bgfTRgTWCO8e/SphiMgjIvKs6/Vij0Y0hCxcuJDXX3/d32EYRkBYt7+e4XHhjEw+9fW64yNDmZmdyEe7B3Y7xsaD1hpy00cE5lQn/a2S6gZ6Vi85x0OxGIYxRKkq60rrmDMqGZH+LUd69vgUdpQ3U90ycNf73rC/npTY/iVNX+hvwmgH4kUkFMj2YDyGYQxBB+raqW7pOqXutMfqmUrk4wFcythwoIFZOYn9Tpre1t+EUQ/sAx4BVnsuHMMwhqKj4y/60X7RY2K6q3vtAE0YRxo7ONLYEdBtMKeUMEQkQUSeAS53ffQXoMDjURmGMaSs319PcnQYuSn9X25VRFg4PoWVe2uwO5wejM43Cg9Yjf6DJmGoaiNwH/AzYB0wFmuVPMMwjH7bcLCeWTlJp10VM5C7167fX09seAh5ATaleW/9qZK6BRitqhtV9RlVfc3TQRmGMXRUNnVyuL6DWf0Yf3Gss8Z82r12oNlwoJ4ZIxMJdmPSRX/pzziMBuB2ERkPbAW2qOpmz4Y1uOXk5BAbG0twcDAhISEUFhae/CDDGKTWu6piZnugKqane+2Hu2r47hcnnPb5fKWhrZs9Va0szc/0dygndMoJQ1V/JSIfAHuAfGABYBLGKfrwww8ZNsz9GTkNY7DasL+e6LBg8jw0d9LCCSn85u3dVDd3khp3/CVeA8knrkb/uafRS8wXTrlKSkR+DiwFzgOOqOoDHo/KMIwho6cqxlNzQPUs7TqQJiNcubeW2PCQgJyhtrf+lDB+LCLDgenA5SKSq6q3nuw4EXkauAioVtXJfWwX4AHgAqxxHjeq6ibXtiWubcHAk6p636nG3ZeV/9xD7eFWT5zqqGEjYph/1bgT7iMiLF68GBHha1/7GrfddptHYzCMgaKp3cbuqhYunJLusXPmpccyPC6cj3fXcNUAme58VUkNc3OTA37ixP7OVvs14M+qeipzST0LPMzxF1k6H6vX1VhgDvAnYI6IBGON9zgPKAM2iMgyVd3Zz9j9bvXq1WRkZFBdXc15553HhAkTWLBggb/DMgyfKzxYjyoUeLArac/stW9tHxiz1x6sa+NwfQe3zh/t71BOqr8J42ngDhGJBv6mqltOdoCqrhCRnBPsshT4i6oqsNY15iMdyAFKVLUUQERedO172gnjZCUBb8nIyAAgNTWVSy+9lPXr15uEYQxJGw40EBosTM9O8Oh5F41P5Z+FZWw61MhsD/S+8qYVe2sBq4dXoOtv6v0vrGQTAjzooVgygcO93pe5Pjve530SkdtEpFBECmtqAq8Os62t7ehKe21tbbz77rtMnvy5GjrDGBI2HKhnSmY8EaGeXfvhrLHDCBkg3WtX7a0hIz6C0cP6P2jRV/qbMPYBEcCrquqpn8Z9dT4+3lrieryTqOrjqlqgqgUpKae2EIsvVFVVMW/ePKZNm8bs2bO58MILWbJkib/DMgyf67Q52FbW6JHxF8eKiwhlxsjAn722y+5gdUkdC8alBOz8Ub31t0pqB9av/ltE5LeqOssDsZQBvVuosoByIOw4nw9Io0ePZuvWrf4OwzD8bsvhRmwO9cj4i74sHB/43WvXldbT2mXnvInD/R2KW/pbwhiH1WPpceAmD8WyDLhBLHOBJlWtADYAY0VklIiEAVe79jUMYwDbsL8eESgY6Z2EsWh84Hevfb+4iojQoAHRfgH9TxgTsAbr3QO41SdURF4APgHGi0iZiNwiIreLyO2uXd7EWmOjBHgC+DqAqtqBu4B3gGLgn6q6o59xG4YRINYfqGf88Fjio0K9cv4JabGkxUUEbDuGqvL+zirmj03xeBuOt/S3SioB+B5wL9bcUielqtecZLsCdx5n25tYCcUwjEHA5nCy8WADV8zM8to1RIRFE1J4bWsFnTZHwH0p76xoprypk29+wT+9NfujvyWMn2M1eO8GBt48woZh+NW2skbaux2cmdv/9S/cccGUdFq77AHZ+P3OjipEYNGEVH+H4ja3EoaIBItIhYh8FUBVy1T1fdfr73szQMMwBp/VJXWInN6CSe44Y3QyydFhvLYtsPrJqCqvbS1n7qhkUmLD/R2O29xKGKrqALYDud4NxzCMoWDNvlompseRGB3m1euEBAdx/pQ0lhdX095t9+q1TsX2I83sr23jS/kZ/g7llJxKlVQUcK9rUNwy1+NVbwU2mDU2NnLFFVcwYcIE8vLy+OSTT/wdkmH4TKfNwaaDjV6vjupx8dQMOmwO3i8OnMbvZVuPEBosnD85zd+hnJJTafQ+w/U8w/WAEwygM47v7rvvZsmSJbz00kt0d3fT3t7u75AMw2c2Hmyg2+HkzFzfdCWdlZPE8Lhwlm0p50vT/P+L3ulUXttawdnjUkiI8m4Jy9NOJWGM8loUQ0hzczMrVqzg2WefBSAsLIywsIH1j8YwTseafbUEB4lXRnj3JShIuGR6Jk+u3E91Syepsf4dxLdmXx2VzZ388MI8v8bRH24nDFU96M1A/OHDZx+n+mCpR8+ZOnI0i248/tCU0tJSUlJSuOmmm9i6dSszZ87kgQceIDo68OeRMQxPWLOvjmlZ8cSE97dX/6n7csEI/vxxKf/eeIQ7Fvq3Kfbv6w+SGBXKFycNjNHdvQX2vL+DkN1uZ9OmTdxxxx1s3ryZ6Oho7rvPI8t7GEbAa2q3sfVwo89HNo9OiWH2qCT+seEQ1pAv/6hu6eTdHVVcMTOL8JDAGhfiDt+l+AB0opKAt2RlZZGVlcWcOXMAuOKKK0zCMIaMlSU1ONWa58nXrp41gm//cytrS+s5w0cN7sd6aWMZdqdy9exsv1z/dPVnidaLvRHIUJGWlsaIESPYvXs3AB988AETJ070c1SGP7V22flwVzUbDtTjdA7ufiQf7a4hPjKU/BGJPr/2+ZPTiY0I4fl1/qldtzmc/G3tIeaOTiI3JcYvMZyu/pQwfgG85ulAhpKHHnqI6667ju7ubkaPHs0zzzzj75AMP1m+q4pv/WMrTR02ACZnxvHotTPJTo7yc2Se53QqH+2uYcG4FIKDfD+Vd2RYMNfMzubJlaUcrm9nRJJv/8ZvbKvgSGMHP/vSJJ9e15P604YR+JO2B7j8/HwKCwvZtm0b//nPf0hM9P2vLcP/PtlXx21/2UhWYiR/++ocfnflNA7Xd/Dlxz+hoqnD3+F53M6KZmpbu1g4zn/r1Nx0Vg5BIjy9er9Pr6uqPPbxPsamxnDOAJoK5Fj9SRiDu8xsGD7Q3Gnjv17cTM6waF64bS5njRnGFTOzeOHWubR02rn7hS04Bln1VM+ssQv8mDDS4yP50rQM/rHhME3tNp9d9+M9NeyqbOFrZ+cS5IfSlaeYXlKG4Qe/f2c3da1d/PGqfOIiPp3ee2JGHD/70iTWH6jnGR//Cva2D3fXMCUz3u9zJ926YDTt3Q6eWOnZLvXH43Qqv3t3N5kJkQExcPB0mIRhGD52uL6dv607xLVzspmSFf+57ZfNyGTR+BQeeH8vta1dfojQ86qbO9l0qCEgVpbLS4/joqnpPLVqPzUt3v/7vratnO1Hmrnni+MICxnYX7n9ib7K41EYxhDyp4/3ESTCnYvG9LldRPjRhRPpsDn4w3t7fBydd7yzswpVWBIgcyd9Z/F4uh1OHl6+16vX6bI7+N27u8lLj2PptEyvXssXTjlhqOp53gjEMIaC2tYuXios44qCLNLjI4+735jUGK6dk80/NxzmcP3An2vsne2VjE6JZmxqYHQnHTUsmi/PGsHf1h1id2WL167z6If7OFzfwQ8vmDCg2y56DOzykWEMMK9uKafb4eSmM3NOuu8dC3MJEuHRj/Z5PzAvamjr5pPSOpZMSkMkcL4071k8ntiIEH74SpFXxr/srWrh0Y9KWJqfwfyx/mvo9ySTMHxs9+7d5OfnH33ExcVx//33+zssw0f+vbGMqVnxjB0ee9J90+MjuWpWFi9tPMyRxoHbzfb94iocTuX8yen+DuUzkqLD+O8LJ7LxYAN/8/BgPpvDyXdf2kZ0eAj/c9HgGZjbr4QhIt/u9Xq858IZ/MaPH8+WLVvYsmULGzduJCoqiksvvdTfYRk+UFzRzM6KZi6f4f461ncstNo5HhvApYw3iirITIhkcmacv0P5nMtmZDJ/7DD+741iiiuaPXbeX7+1iy2HG/nFJVMYFjNwVtQ7mVNKGCKSICLPAFeKyNdFZB7g9hKtIrJERHaLSImIfO44EfmuiGxxPbaLiENEklzbDohIkWtb4anEHag++OADcnNzGTlypL9DMXzg5U1lhAYLF59C18rMhEgun5HFPwoPU93c6cXovKOmpYuVe2v5Un5GQFVH9RAR/vjlfOIjQ/n63zbR3Hn6YzNe3XKEJ1ft54YzRnLh1MAqVZ2uU5oaRFUbgZtE5EKgElgMvOzOsSISDDwCnAeUARtEZJmq7ux1/t8Cv3XtfzHwLVWt73WaRapaeyoxn0jja/voLm/z1OkACMuIJuFi96ZPfvHFF7nmmms8en0jMNkdTl7ZXM6i8akkneKypLefncs/Cw/z1Kr9/OCCgbWGwrKt5TicymXTA7eH0LCYcB6+dgbXPrGWW58r5LmbZxMR2r+ZZFftreWef21lzqgkfjQA17s4mf62YZyN1b12LlYCcMdsoERVS1W1G3gRWHqC/a8BXuhnfAGvu7ubZcuWceWVV/o7FMMHVu6tpba1i8tnul8d1SNnWDQXTc3g+bUHaWzv9kJ03vPK5jKmZLrXZuNPs0cl8furprH+QD23/XUjbV2nvv73uzsqufm5DeSmxPD4DQUDcvryk+nv9OYJwPeAe4Fb3DwmEzjc630ZMKevHUUkClgC3NXrYwXeFREF/qyqjx/n2NuA2wCys088hbC7JQFveOutt5gxYwbDh/t/IJPhfS9tKiMxKpRF4/s3j9DXF+WybGs5z645wDe/MM7D0XnHnqoWth9p5scDpNF3aX4mXTYnP3iliKv+/AmPXDuDnGEnX9jM4VQe/bCEP76/hylZCTx74yziI0NPetxA1N8Sxs+BV1V1N+B085i+KjCP15ftYmD1MdVRZ6nqDOB84E4RWdDXgar6uKoWqGpBSkrgdmV74YUXTHXUENHUbuO9nVUszc/s90jfCWlxfCFvOM+sPkBrP379+sML6w8RGix8KX/gTIdx1awRPPn/CjhU386SB1bwyIclx/17qyprS+u47NHV/P69PVw8LYO/f3UOiadY5TiQ9KuEoaplWCUEVNXdRu8yYESv91lA+XH2vZpjqqNUtdz1XC0ir2BVca04hbADRnt7O++99x5//vOf/R2K4QOvF5XTbXeeUu+ovty5KJdLH63i7+sOctsC/y4zejLt3XZe2ljG+ZPTB1wvoUXjU3nvW2fz3/8p4rfv7Oaxj/dx7oRUpmcnkhIbTke3gz1VLSzfVc3e6lbS4iK4/8v5LA3Qhn1P6lfCEJFHgGhVvVFEFqvqu24ctgEYKyKjgCNYSeHaPs4dj9VG8pVen0UDQara4nq9GKuUMyBFRUVRV1fn7zAMH3l50xHGDY857W6l07MTOWtMMk+s3M8NZ+T0u2HWF5ZtKael0871ZwzMHoBp8RE8+f9msflQA8+vPcTyXVX8Z8unv2/DgoOYNiKeX146hUunZxIZFrj/LTypv20Y3Xw6p9Q5wEkThqraReQu4B0gGHhaVXeIyO2u7Y+5dr0UeFdVe3dfGg684sreIcDfVfXtfsZuGD6zv7aNjQcb+P75Ezzy6/POhWO49sl1/GtjGdfPDcwvY1Xlr2sPMiEtloKRA3utl+nZiUzPTkRVqWntoq61m4jQYDISIgK7UburBcI939GgvwmjHYgXkVDA7cVpVfVN4M1jPnvsmPfPAs8e81kpMK2fsRqG37y8qYwggUs91K30jNxkpmcn8OeP93H1rBGEBgfeZA2f7KtjR3kzv7x0yqCpohERUmMjSI2N8Hcox6cKJR/AmgehpQK+vg6CPPvvo79nqwf2YY2rWO25cAxj8HA6lZc3HWHe2BSGx3nmi0ZEuHPhGMoaOli25XhNgP716Ef7SIkN57IZgTv2YlCxd8Hm5+HRM+Bvl0PtHsi/FpyeXyCqvyO9L3d99BegwONRGcYgsHZ/HUcaO7jcw1+c5+alMiEtlkc/KvHKpHmnY1tZI6tKavnqvFEB3cYyKHS3w9o/wQP58OqdEBQMlzwGd2+Ded+CEM93Njjlkd4ich+QA9QCU3FzpLdhDDUvbzpCbHgIX5zk2TUgRISvLxrDf72wmdeLKgJqFbcHPyghLiKE6wK0fWVQ6GyGwqdgzcPQXgsj58HShyH3HPByFWB/2jBuAfar6jvARg/HYxiDQnu3nbeKKrhoaoZXfmlfOCWdRz8s4Tdv72LxxOEB8Wu+8EA97xdXcc/iccSE97d51Diu9npY92dY9xh0NkLuubDgHhh5ps9C6E8bRgNwu4jcLyI3ich0Twc12P3xj39k0qRJTJ48mWuuuYbOzoE3qZxxYm9vr6St29GvqUDcERwk/M9FEylr6OCZ1Qe8co1Toar88s1iUmPDuXneKH+HM7h0NMAHP4f7p8DH90HOPLj1Q7j+ZZ8mC+jfinu/Am4FfgrsB/occW307ciRIzz44IMUFhayfft2HA4HL774or/DMjzspY1lZCdFMSvHe91KzxozjC/kpfLIhyV+X/v7zaJKNh1q5FvnjSMqzJQuPKKrBT7+Ddw/DVb+AcYuhjvWwNV/g8wZfgnplBOGiPwca9LA84AjqvqAx6Ma5Ox2Ox0dHdjtdtrb28nICJw6aOP0Ha5vZ82+Oq6cmeX1bqU/uCCPTpuDX7xR7NXrnEhzp42fvbaDvPQ4rvRSiWpIsXXAmofggWnw4S+sEsUdq+HKZ2D4JL+Gdso/BVT1xyLyY6xkc7mI5KrqrZ4PzfveeustKisrPXrOtLQ0zj///ONuz8zM5J577iE7O5vIyEgWL17M4sWLPRqD4V//2liGCF6rjuotNyWGry8aw4Mf7OVL0zJYNKF/kxuejt+/s5ua1i4ev6GAkAAcFzJg2Lth03Ow4nfQWmm1UZzzI8ic6e/Ijurvf92ngTwgGXjUc+EMfg0NDbz66qvs37+f8vJy2traeP755/0dluEhDqfyUuFh5o9NISMh0ifXvHNRLmNTY/jhK0UeWQDoVKwuqeUvaw9yw9yR5I9I8Om1Bw2H3RpH8dBMePMeSBoNN75ptVEEULKA/o/0/i+s6UFCgAcYoO0YJyoJeMv777/PqFGj6JlJ97LLLmPNmjV85StfOcmRxkCwZl8t5U2dPl3oKDwkmN9cMZUrHvuEH/y7iIevne6TEdZ1rV186x9bGD0smu+dP8Hr1xt0nE7Y8TJ89CuoK4GM6XDx/T7pHttf/S1h7AMisKY4H5DJwl+ys7NZu3Yt7e3tqCoffPABeXmDb2WuoepfhWXER4Zy3kTfrnMyPTuR735xPG8UVfDsmgNev57d4eSb/9hCY7uNh66ZYRq6T4Uq7HoT/jwf/n0LBIfD1X+3ej6NOTdgkwX0v4SxA2sxpFtE5LeqOsuDMQ1qc+bM4YorrmDGjBmEhIQwffp0brvtNn+HZXhATUsXb22v4Lo5I/0yLuK2+aMpPNDAL98sZtzwWM4aM8wr11FVfrJsByv31vLry6cwMeP0ZuEdUvavsLrIlm2ApFy4/CmYdJnH53zylv4mjFys8RiPu56NU/Czn/2Mn/3sZ/4Ow/CwF9YfwuZQv03pHRQk/P6qaVz12Cd87a8befG2uUzOjPf4dR74YC9/W3eI28/O5cuz3J57dGgr2wjLfw6lH0FcJnzpIZh2LQQPrJJZf9PaYVVdBpQA/uvPZxgBwuZw8vzagywYl0JuSozf4oiPDOW5m2cTHxnKV55ax5bDjR47t6ry+3d3c//7e7liZhb3fnG8x849aFUXw4vXwZPnQGURfPFX8I1NMOOGAZcsoP8JY4mIZAGPAX/0YDyGMSC9tb2S6pYubjzT/3MopcVH8Pdb5xAbEcK1T6xl+a6qkx90Ep02B9/+51YeWl7CVQVZ/ObyqQQFBW5du981HIBXbrdmkN2/Ahb9CO7eCmd8HUIDeIr0k+hvwkgAvgfcC/h3iGk/qAbWDJ/HCvT4jM97bs0BRiZHsXCc78dB9GVkcjT/vv1McpKjufnZQn71VjGdNke/zrX9SBOXPLKaVzYf4Z7F4/i1SRbH11IJb3wHHiqAHa/Amd+wEsXZ93plQSNf62+Z6OfABFXdLSL9+1foJxEREdTV1ZGcnByQi7uoKnV1dUREDNxfIUPN+v31bDzYwE8unhhQX6SpcRG8/PUz+dlrO/nzx6W8VVTJD86fwOJJaQS7EWdFUwcPLy/hxQ2HSY4O45kbZ/llYOCA0F4Pqx+wJgd02mDG/4MF34W4dH9H5lHizq9ZEQkGyoD/UdUnvR6VhxQUFGhhYeFnPrPZbJSVlQX0hH8RERFkZWURGhrq71AMN9zw9Hp2HGli1ffOCdi1nVftreUny7azr6aN7KQoLpmeycLxKUxIiz3aJdbpVI40dlB4sJ43iyr5cFc1InD1rGzuWTye+Cjz7/Fz2uvhk0esRNHdClOvgoXftwbfDVAislFV+1znyK0Shqo6RGQ7Vu+oAS00NJRRo8xsmoZnbCtrZMWeGu5dMj5gkwXAvLHDeOebC3hnRxXPfXKAh5fv5cEP9gJWQ3locBBNHd3YHNYPyJTYcG6ZN4qvzB3JiKQof4YemI5NFJMutaqdUgf3mKpTqZKKAu4VkfOAnrUhVVWXej4swxgYHlpuLRh0/QBYMCgkOIgLp6Zz4dR0Gtq6Wbe/jr1VrdS0dmFzKAlRoWQmRDIjO5HxabFuVVsNOUM0UfQ4lYRxhut5husBcEqtsyKyBGsqkWDgSVW975jtC4FXsaZNB3hZVX/uzrGG4WsbD9bz3s4qvn3eOGIjBlZ1TWJ0GEsmp7Nksr8jGSBaq63lUNc/4UoUl8CCe2H4RH9H5lOnkjBOqx7H1Q7yCNa06GXABhFZpqo7j9l1pape1M9jDcMnVJVfvGEtGPTV+aaKc9Cq329NNb75eXB0w8SlcPb3hlyi6HHShCEiPUM5+yxN9NreqKrNJzjVbKBEVUtdx72Ita6GO1/6p3OsYXjc29utBYPuu2yKmUdpMKrYBqvvt7rGBoXAtKvhzLth2Bh/R+ZX7vxLfw4rWZyoQlOBZ4G/nGCfTKz5p3qUAXP62O8MEdmK1U5yj6ruOIVjDcPr2rvt/N8bxYwbHsMVZsGgwcPphNLl8MmjsO8DCIuFM+6CuV8fdN1j++ukCUNVF3noWn0lnGNLLZuAkaraKiIXAP8Bxrp5rHURkduA28CaGdYwPO2P7+3hSGMH/7r9DLNg0GDQ1QJbXoD1f7amGY9OhXN/DAW3QGSCv6MLKL4sS5cBI3q9z+LT3lYA9K7SUtU3ReRRERnmzrG9jnsca1JECgoKzJBpw6O2H2niqVX7uWZ2NrNykvwdjnE6aktg/eOw5e/Q3WItVnTZE1Y7RUi4v6MLSL5MGBuAsSIyCjgCXA1c23sHEUkDqlRVRWQ21tQldUDjyY41DG/r6HbwzX9sITkmnO8vMQsGDUjd7VC8DDb9FQ6ugqBQmHwZzP4aZAXW6naByGcJQ1XtInIX8A5W19inVXWHiNzu2v4YcAVwh4jYgQ7garWGovd5rK9iNwyAn7++k5LqVv56y2wz6nkgUYXyTVaS2P5v6GqGxFFwzv/A9Osh1reLXQ1kbk0NMlD1NTWIYfTHq1uOcPeLW7j97Fy+b5YjHRhqdsP2l61lUGv3QEikVd0043rIPnPALFrka6c9NYhh9NfO8maeWrWfNftqqWvtJjE6lIKRSVwyPZNzJqQOiNHEmw418N2XtjErJ5HvLB7n73CME6nbZ3WF3fEKVG0HBEaeBXPvgMmXQ4TnF5QaSkzCMLzC5nDyqzd38cya/cSEhbBwQioZCRFUN3exqqSWN4oqyE2J5r8vmsii8YE7A+qhunZu+0shaXER/Pn6AkJNr6jA4rDBoU9gzzuw522rlxPAiDmw5NdWicJ0ifUYkzAMj2vvtvPV5wpZs6+O6+eO/NxMp3aHk7d3VPL7d/dw0zMbOG/icH5xyWRS4wJrSvfD9e1c88Ra7E7l6RsLSIoO83dIhtMJNbvgwCo4sAJKP7baJILDIGe+1Xg9fgkkmC713mDaMAyP6rQ5XMmilt9cMe2EA9u67U6eXr2fP763h4jQYH6+dBJfmpYREOuUlNa0cv1T62ntsvO3r87xytrYhhu626ylTY9sskoSB1dDe521LSEbRi+EcUtg1NkQ7r+lcQcT04Zh+MzPXtvJqpJafnfliZMFQFhIELefnct5E4fz3X9t5e4Xt/BmUQX/d8kUUmL91w9+/f56bvtrIUEiPH+LSRY+oQrNR6zG6Zo9VpIo32SVJtRp7ROfbSWHnHlWu0Ri4M8Q7GtOddJqa6XD1sHwaM/3/jIlDMNjXt9Wzl1/39yvnkQOp/LUqlJ+9+4eosOC+cEFeVw5M8unpQ2nU3lq1X5+884uRiRG8cxNsxiZHO2Zk6tCZ6M162lHI3Q2WVUpna7Xtk5rcjuHzfXseo2CBFmPoGDX62DrdXAYhEZBaOSnj5Ce1xG9tkW7nnvt6+tSnMNu3WtzOTSVWcmh6TA0HYH6fVC715oFtkdUMmTMgMwZ1nNGPsSm+TZmP3Oqk5buFho6G2jsaqShs4GGroaj7+s762nsaqSxs5GGrgaauppotbXiVCcpkSksv2p5v65rShiG1x2qa+cH/y5iRnZCv3oSBQcJty3I5ZwJqXzv30Xc+9I2/lV4mP+7ZArj07y/FvLh+nZ++EoRK/fWsnjicH5zxVQSok6hzULVSgb1+6yeOvX7oOGgtcZzS7n1bD/JKo/B4VYSCA799FnEqrdXh/VL2+mwXjud4Og6+TmP53PJxJVQwqJ6JRfXIyTclagEkE+frRu3YrB1gr0D7F1g6wBbu7V2REcDdNRbSfFYQaEQnwmJOZB/HaSMg2HjYdg4iEn1fVLzEac6aexqpKa9hpqOGmraa6hurz76uqbDetS212JXe5/nCA8OJzEikcTwRBIjEsmMzSQ+LJ648DjiwuJIivDOLASmhGGctm67kyseW8OB2jbevHs+WYmnt0Kb06n8a+NhfvXWLlo67Vw6PZO7zx3rlZXfWjptPLFyP499vI+QIOGHF+Rx3ZzsE5dsutuheidUbrNmNa3cZlWjdLd8uk9QiFXHHpth/TKOS4fYdIgZbs1PFB5vdfGMiIeIOAiJ6N8XpNPp+sJ2fUnbO61nWyfY2lzP7a5Hx6fP3W2u9x2u/To+3d7de3/XZ6iVFPuawi0kwkoqIZHWc08CikyEyCSISrKeIxOtv0NcFsRnQXTKoBwLYXfaqW6vpry1nPK2cuu51+vKtkpsTtvnjosPjyclMsV6RFnPyZHJJIQnWMnBlSASwhOICvXeKognKmGYhGGctl+8sdP60v3KDJZM9lwXxvq2bh5eXsLz6w7idCoXT8vgK3OzmZGdeNpVVeWNHbyw/hDPrjlAS6edi6dl8MMLJpAeH/n5nZvK4NBaq9H10ForWfTUq0fEQ9pUa8W15DGQlAvJo6369uBBXoDv+e4YpCWBE+l2dHO45TAHmw9yqPkQB5oPcKjl0NGE4FDHZ/YfFjmMjOgMMmIySI9OZ3j08M8khpSoFMKDA2P+KpMwDK9ZvquKm58t5Pq5I/nfS7yzfFtVcyd/+mgfL20so7XLTm5KNIsnpXHuhFSmZMUTHnLytbRVlX01bazZV8vb2yv5pLQOVVgyKY2vL8plalbCpzu31cK+D6HkfatXTpNrZv2wGMiaZT3Sp1qJIiF7SH5hDgWqSlV7Ffsa97G/ab+VFJoPHU0M2qu0lRSRRHZsNlmxWaRHp5MRYyWHjOgM0mPSAyYZuMMkDMMrKps6Of+BFaTFR/LK188kIvTkX9yno63LzrKt5by2tZx1++txOJXQYGFCWhyjhkWTnhBBYlQYIa7R400dNurauimtaWVvVSt1bd0A5CRHccn0TC6bnkV2cpRVrVO2AUres5JE+RZArWqUUQtg5JmQPRdSJw3+UsMQpKrUddZR0lhCSUMJJY0l7Gvcx77GfbTYPq1mjA2NZWTcSLLjshkZN/LoIzsum7iwOD/egWeZhGF4nMOpXPvEWoqONPHaN+aRm+LbPvBN7TY+Ka1ly+Emio40cri+g8qmTrodzqP7BAkkRIWRkxzFmNQYpo1IYN6YYWQnRSFOh1V6KF4Gxa9Da6XVsJs1G8acaz3S863eSMagYXPaKG0sZVf9LnbV76K4vpiSxhKauj5tlE8ITyA3IZcxCWMYkzCG3IRcRsePJikiKSDGCHmb6SVleNyDH+xl3f56fn/lNJ8nC4D4qFCWTE7/TJuJ06l02h3YHNaPoNjwEIJ6z1XldFpTWq/+F+x6wxoAFhIJY78AeUut58hEX9+K4SWd9k72NOw5mhiK64rZ27CXbqdV0owMiWRs4ljOG3ne0cQwJmEMyRHJQyIx9IdJGMYpW7W3lgeX7+XyGVlcHkBLlAYFSd/ra9fuha0vwLZ/Wu0RYTHWALCJX4IxX4AwD421MPzG4XRQ2lRKUW0R22q2sa12G6WNpUcbn+PC4shLyuPavGuZkDSBvKQ8RsaNJNiUIE+JSRjGKalq7uTuFzczNjWG/71kkr/DOb7OZij6p7X05pFCq7op9xz4wk9h/AXWeANjwKrtqGVbzTaKaosoqilie9122mxtgJUcpgybwqIRi5iYNJG85DzSo9NNqcEDTMIw3GZzOPnG3zfTYXPw6HUz+v41728V26DwKdj2L2t8QeokWPx/MOXKITdSeLBwqpN9jfvYVLWJjdUb2Vq9lfI2a4XmEAlhXNI4Lhp9EdNSpjFl2BRGxo0ccsnB2dlJ5/btdGzZQvuWLThb2xj57DMev04A/h9vBCJV5cevbmf9gXoeuDqfManeH33tNlsH7PiPlSjKNlgDySZfAbNuttZpNgYUm9PGzrqdbKraxKaqTWyu2Xy0UTo1MpX81HyuzbuWqSlTyUvKIyIksGY59gVHUxPtmzbRvqGQ9sJCOnfuBLs1Kjx0ZDZR02egTifi4YGRJmEYbnl8RSkvrD/MnYtyWZqf6e9wLC2VsP5xKHzamoIieSx88VeQf41pvB5AOu2dbK3ZysaqjWyq2sS22m102DsAGBk3knOzz2VG6gxmDJ9BVoxv5xcLFPbaWtoLN9JeaCWIrt27QRUJDSVi2lSSb7qJyOn5RE6bRkhystfiMAnDOKllW8u57+1dXDg1ne+cN97f4UDldvjkESj6FzjtMOFCmH2bNWZiCH6ZDDR2p50ddTtYV7GOdRXr2FK9hW5nN4IwPmk8l4297GiCGBY5zN/h+oWtvNxKDq4SRPf+/QBIZCRR0/OJ/cZdRBUUEDl1KkERvithmYRhnNDb2yv41j+2MGtkEr+/ctpnu6n6kiqUfACfPASlH1mT4hXcZC29mTTaPzEZbnGqk70Ne1lfuZ51FesorCo82kA9PnE8V0+4mjnpc5ieOp3YsACq6vQRVcV28OCnCWLDBmzlVhtNUGwsUTNnknDF5UQVFBAxcSISGnqSM3qPSRjGcb29vYK7/r6ZaVnxPH3TLK+P5O6Tw26VJFbfb62NEJsO5/7ESham2ilglbWU8UnFJ6yvWM/6yvXUd9YDVhXTBaMuYE76HGalzfLarKqBTJ1OuvaW0F644WgVk6OmFoDgpCSiCgpIuvFGomYVED5uHBIcOF1/fZowRGQJ8AAQDDypqvcds/064Huut63AHaq61bXtANACOAD78UYiGp7x3JoD/PS1HUwfkcCzN88mJtzHvy3s3bDtRVj5e2g4YPV2uuQxmHw5hJilUgNNt6ObTdWbWFm2kpVHVrK/yapCSY1M5ayMs5idPps5aXNIjxl662ur3U5n8S7aN7gSxMaNOJusRvyQtDSi555BVEEBUbMKCBs1KqDbaHz2LSAiwcAjwHlAGbBBRJap6s5eu+0HzlbVBhE5H3gcmNNr+yJVrfVVzENRt93Jr94q5pnVBzhv4nAevHo6kWE+/IVj74LNz8OqP1qD7DKmWw3Z48837RMBprKtkpVHVrKqbBVrK9bSbm8nLCiMgrQCrhp3FWdmnsmouMD+AvQGZ3c3nUVFR9sfOjZtwtneDlg9mGK/cC5RBbOImlVAaGbmgPr7+PJn42ygRFVLAUTkRWApcDRhqOqaXvuvBQJnGPEQUNbQzp1/38zWw43cfNYofnRhHsG+arOwdcDG52D1A9aCQ1mz4KI/WiOxB9D/UIOZzWlja/VWVh6xShF7G/YCkB6dzsW5FzM/cz6z0mZ5da2GQORsb7fGP7jaIDq2bkW7relHwseOJf6SpVYD9cwCQoen+jna0+PLhJEJHO71vozPlh6OdQvwVq/3CrwrIgr8WVUf7+sgEbkNuA0gOzv7tAIeKpxO5e/rD/Hrt3YB8KfrZnD+FB9VHXS3Wd1iVz8IbdWQfSZc8iiMXmgSRQCoaa9h1ZFVrDqyik/KP6HF1kKIhDBj+Ay+M/M7zM+az+j40QPqV/LpcjQ3075pEx2FhbRt2EDnDtcYiKAgIvLySLzmGqJmFRA5cyYhiYOrnc2XCaOvf1F9TpUrIouwEsa8Xh+fparlIpIKvCciu1R1xedOaCWSx8Garfb0wx7cth9p4mev7WDDgQbOzE3mvsumWlN+e1tXC2x4EtY8ZE0COGoBnP0M5Mw7+bGG1zicDopqi6xSRNlKiuuLAastYnHOYuZlzmNu+lxiwnw/4aS/2OvqPjsGYtcuq9deaCiRU6aQfPPNVoKYPp3gmMH9d/FlwigDRvR6nwWUH7uTiEwFngTOV9W6ns9Vtdz1XC0ir2BVcX0uYRju2V/bxh/e28NrW8tJiArlt1dM5YqZPhgU1dkE6x6HtY9Yg+1yz4Wz77XWmzD8oqGzgdXlq1lZtpLV5atp6moiSILIT8nn7hl3Mz9zPuMSxw2ZUoStosJKEK5G6u7SUgAkIoLI/HyG3XmnVcU0bSpBkX2s0DiI+TJhbADGisgo4AhwNXBt7x1EJBt4GbheVff0+jwaCFLVFtfrxcDPfRb5IKGqrNtfz1Or9vN+cRURIcHctWgMty4YTXykl/t2t9fDusdg7WPQ1WTNFrvgXsgyU3f4mlOdFNcVs+LIClaVraKotghFSYpI4uyss5mfOZ8zMs4gPjze36F63dExEBs3Hm2ktpWVARAUE0PkzBnEX3qJlSAmTULChnYPPZ8lDFW1i8hdwDtY3WqfVtUdInK7a/tjwI+BZOBR16+Znu6zw4FXXJ+FAH9X1bd9FftAV9nUyatbjvDK5iPsqmwhMSqUOxeO4YYzR5Ia6+VRom211qjs9U9AdwvkXQwLvgvp07x7XeMzmrqa+KTiE1aWrWTVkVXUd9YjCFOGTeGO/DtYkLmAvOQ8gsSzcw8FGnU46NqzxypBbNxI+8ZeYyASEoiaVUDS9V8hsqCAiAkTAmoMRCAwK+4NUgdq21i+q5r3i6uOrl+dPyKBqwpGcOn0TO93lW2pgjUPWg3atg6YdCksuAeGB/CU6IOIqrKnYc/RtoitNVtxqIO4sDjOyjyL+ZnzOSvzrEE/cM7Z3U3n9u2uBFFIx6bNOFusZVdD0tOJmjmTqIKZRM2cSVhurscn6xuIzIp7Q0BdaxeFBxtYv7+eD3dXU1pjTb2QmxLNN84Zy6XTMxk1zAcLBTWXWz2eNj4Djm5r1tgF90BKAMxBNci12dpYW772aLfX6vZqAPKS8rhlyi3Mz5zPlGFTBvWiQY7WNquL68ZCOgo30rFtG9rVBUDY6NHELVlC1KwCombOJDQzQCbRHEBMwhiAVJXD9R2sP1BP4YF6NhyoZ58rQYSFBDFnVBI3zB3JOROG+6bHE0DjIWuw3ebnwemAaVfD/O9Acq5vrj8EqSqlTaWsOrKKlWUr2Vi9EbvTTkxoDGdknMH8zPnMy5xHSlSKv0P1GntNDe1bttDhqmLqLC4Gh+PTLq5Xf5nIAitBhCQN7tKUL5iEMQA4nEpxRbMrOTSw4UA91S3Wr6a4iBBm5SRxxcwRzMpJZEpWPOEhPvwFWbcPVv7BmsYDgelfgXnfhMQc38UwhLTb2llfuf5okuhZSGhs4lhumHgD8zPnMy11GqFB/pugzlvUbrfaHzZvpmPLVjo2bz7aQC1hYUROnUrybbcSNbOAyPx8gmPM0rueZhJGALI7nGw53Mja0jrWH2hg08EGWrusxVEy4iM4IzeZgpwkZuckMTY1xj8zyFbvgpW/g+3/huAwmPVVOPO/IN4U8z3pM6WIIyvZVLUJm9NGZEgkc9Pn8tWpX2V+5nzSogffaoL2hgY6tm6lY/MWOrZsoaOoCHVNsRGSkkLk9OkkXnstkfn5REyeRNAQ78HkCyZhBIjG9m7e21nFR3tqWLmnhuZOK0GMHx7L0vwMZo9KoiAnicwEP/f7rtgGK34Lxa9ZU4yfcZf1iB3u37gGkTZbG+sq1h0dYV3RVgHAmIQxXJd3HWdlnsWM1BmEBQ+eL0i12+kqKaFj27ajCaJnDQiCg4nIyyPhssuInJ5PVH4+IRkZQ2ZcSCAxCcOPbA4n7++s4pXNR/hwdzU2h5IaG84XJ6WxaEIqZ+YmkxAVAF8KqnBwjTXP0953IDzOasie+3WIMvXCp0tVKWksOZogNlVvwu60ExUSxdz0udw69VbmZcwbNDO99ox96CjaTuf2Ijq2FdFZXIx2dgIQnJhI5PTpxF96KVHT84mYPHnIDZALVCZh+EFTh40X1x/i2TUHqGjqJCU2nBvOyGFpfgZTMuMD55eT0wG7XrcSxZGNEJUMi/4bZt8KkQn+jm5Aq+uoY33letZWrGVN+Roq2yoBqy3i+onXMz9zPvkp+YQGD+y2CFXFXlVFR1ERnT0JYvsOnM3NgDV6OmLiRBK/fBURk6cQOXUKodnZgfP/gPEZJmH4UJfdwV/WHOThD0to6rBxZm4y/3fJZBaOT/XdrLDusHXAlr9ZA+7qSyFxFFz4e5h2LYQNrZlIPaXd1s6m6k2sLV/L2oq17G7YDUBsWCxz0uZw+9TbOSvzrAHdFqGq2I4cobO4mK7iYjqLd9GxvejowDhCQogYN464888ncspkIqZMITw3FwkxX0MDhfkv5SNrSmr5/stFHKpv5+xxKXz3i+OZnBlgUy+01kDhU7D+cWtCwMyZcOVz1ujsQdx33xvsTjs763aytsJKEFuqt2Bz2ggNCmVG6gzunnE3c9PnkpeUNyDHRWh3N1379tFZvIvOXcV07Symc/fuo4PiCAoibPQoYs480yo5TJlMeF4eQeHh/g3cOC0mYXhZe7edX75ZzPNrDzF6WDR/vWU288cGWL/4skIrSex4xRpsN/aLcNbdMPJMM8W4m+xOO8V1xWys2khhVSGbqjbRYrO+PPOS8vhK3leYmz6X6cOnExkycOrjVRVHbS1dJSV07d3rShC76CopAZsNAImMJGL8eOIuupCICXlETMwjfOxYgiK8PO2M4XMmYXjRwbo2vvbXjeyuauGr80ZxzxfH+2dd7L7Yu2D7y1aiKN8EYTEw80aYdSukjPN3dAGv29HNjrodFFYWsrFqI5urN9Nut7p85sTlsDhnMXMz5jI7bfaAmX7D3tBAd0kJnXv30l1SQteevXSVlOBobDy6T3ByMhF5ecTMO4uIvDzCJ+QRNjLbzLk0RJiE4SUr9tRw1983ERQk/OXmACpV1JbAludh01+hvRaGjYMLfgdTvwwRcf6OLmA1dTVRVFvE1pqtbKraxNaarXQ5rMGTYxLGcHHuxRSkFTAzdWZAj6w+WmLYv5/u/Qfo2meVHLpKSj5ta8CaqTV87FhizzuP8LFjCR87hvAxYwhJCdx7M7zPJAwvWLa1nG//YwtjUmN44oYCRiT5uaG4qxV2vmpN23FoDUiwNb347FvNynZ9cDgdlDSWsLVmK9tqtrGtdhv7m6wxAUESxPjE8Vw57koKhhcwY/gMEiMCb1U1Z3s73QcO0H3gwNHk0PPe2dp6dD+JjCR8zBhi5s3/NDGMHUvI8OGmp5LxOSZheNjzaw/yP69uZ1ZOEk/+vwLiIvzULdLphMNrYesLVtVTdyskj4Ev/BSmXQOxA7c3jiepKmUtZeys30lxXTFFtUVsr91+tHopMTyRaSnTuHj0xUxNmcrkYZOJDg2MKSccTU10l5VhO1yGreww3YfL6D54kO79+7FXVX26owih6emEjRpF/NKlhI0aRVhODuGjcghJTzcztBpuMwnDQ1SVRz/ax2/f2c05E1J59LoZvm+vUIXyzdZ0HdtfhpZyazT2pMusOZ6y5w7p0oTdaedA0wGK64utR10xu+t3H22cDpEQxieNZ+mYpUxNmcq0YdPIivXBKoTHod3d2Coq6HYlBFtZmfX68GG6y8qOjmXoEZyYSGj2CKLnziVsVA5hOaOs5DAy2zRAGx5hEoYHqCq/emsXj68oZWl+Br+7chqhwT761eZ0QsVm2PWGlSQa9kNQKIw9Dyb/r1X1FD641xk+llOdlLeWU9pUSkljCfsa91HSWEJpYymdDms0cURwBOMSx3HB6AvIS8ojLzmPMQljfDbdhjqd2GtqsVdWYKuoxFZZgb2iEltFBbbKSuwVFdhra60fAS4SGkpoZiahI0YQnz+N0KwRhI7IImzECEKzsgb9etKG/5mEcZrsDic/fKWIfxaWccMZI/npxZO8PxlgdzuUfgR73oI970BrFUgQjDrbmlI87yKIDLx6dU9rt7VzuOUwh1oOcaj5EKVNpexr3EdpUykd9o6j+6VGppKbkMsV465gYvJE8pLyyInPISTI8//8VRVnWxv26hrsNTXYa13PNTXYq6o/TQxVVWC3f+ZYiYggNC2N0Ix0wufPt15nZRE2IovQESMISU011UeGX5mEcRo6bQ7+64XNvLuziv86dyzf+sJY71RfOB1QuQ1KP4b9K+DgarB3QlgsjDkXxl9glSgG2bxOdqedmvYaKtsrqWitOJocylrKONRyiNqO2s/sPyxyGLkJuVw29jJyE3IZkzCG0fGjT3ttaisJtONobMDR0ICjvh57ba0rEdR+mhBcn/XMidSbhIYSMnw4oWlpRM6YQVxaGiHpaYSmpROankZIWhrBCQmmodkIaCZh9FN1Syd3/m0TGw408NOLJ3LjWaM8d3Jbp5Ugygqt5HBgJXQ2WdtSJsCM/wfjz4eRZ0FIAExOeIpUlebuZuo666jrqKO+s95KDG2VVnJoq6CyrZLajlqc6vzMsalRqYyIHcH8zPlkx2UzInYE2bHWc0zYyatker78nS3NOJqbrQTQ0IC9oQFHfUOv9/U4GhqPvtfu7j7PFxQXR0hKijXd9rRp1uthwwhJdT27tgXFxZlkYAx4JmH0w7rSOr7xwmaaO208fO10Lpqa0f+T2bugZjdU74Qjm6BsA1QWgdMaRUtCNuR9yapuGjU/oHo3qSqdjk5aulto7mqmxdZCS3cLTV1NtHRbr5u7m2nsajyaGHqe7Wr/3PnCg8NJi04jLSqNuelzSYtOIz06/ehnmbGZRDiDcbS1oe3tONracDa04TxYjaN5H/UtzTibW3A0N7sSQov13NSMo6UFZ7P1jMNx3HsKio8nJCHBakDOyCBi0kRCEhMJTkwiODGR4MQE6/2wFEJShpmpLowhxacJQ0SWAA8AwcCTqnrfMdvFtf0CoB24UVU3uXOsL1Q3d/LH9/fwwvrDjEyO4rmbZ5OX7sZgN1VorYbGg9BwwJrQr7rYShJ1+0BdX2Ch0ZAxHc64E7IKILMA4k5vSmunOulydNHt6KbL0WU97NZzu72dDnuH9WzroMP+6aNnW4e94zPbej5vs7XR0t2CrSex9brXUAeE2SDMDnEaQbLEMCwojhFBMSSRSzyTiSeSWGcYMY4QomxBRNmE0E4H2t6Os70NZ1sFzrZ9rtftONvaONDefnQ6ihOR8HCC4+IIiosjODaW4OQkwkaNIjgulqDYONe2WIJj4whOSnQlhESC4+OR0IE9O6xheJPPEoaIBAOPAOcBZcAGEVmmqjt77XY+MNb1mAP8CZjj5rFeUdvaxeZDjby1vYLXt1Vgdzi5dd5IvnV2BlHaCjUV1sC4riZoq4XWKhwtVdjaqrC1VmNrqcTeXIbN0YENwSauR1wGtsQcbKPnYI/PwhaXQXf0MGzqoNPeQbetke6S1+i2dWKzddHd3YHN1oXN3oXd1oXN5nq2d2G3d+OwdWOzd1uv7d047DYc9m7UYSfYASEOCHG6no99HP1cXc9CpAaT6AwhXIMIcwYT5gwizCmEOoMIc0CoHcJskYTYwgmxOQnqthPUbYduG9KrZw+0uR5Vx/kLgwLtYWEERUURFB396XN0NCGpqb3eH7Pd9Xw0OcTFERQba37190FVrT80R5+O9sD69D299vnszp/Zp+d8x3527Hl7/zM43nl7n+YzBxy7Tx/n7H3MZ87z2RMcfX+Cax27j6Kf2f+45z1ePL2POc69f/7a+rm/c1/3cML/fq7noBAhc5znO774soQxGyhR1VIAEXkRWAr0/tJfCvxFrb/6WhFJEJF0IMeNYz3m/v/5Nc5j/qtmAbcL1l9sXRGPrTvRGWJcj9zj79LBMd+h5a7H8YQRShihxJ7owscnWGUzN4eG2FyPlv5dzfNsQKMNGhuBRv/GYhgBLlSD+Mb/3evx8/oyYWQCh3u9L8MqRZxsn0w3jwVARG4DbgPIzs7uV6CRtiDUo+2T8pmnfh7d5zt3N7l1gGmTHbg88m/rNE/mKwEe3qk4pVs5hZ1DxDuDhn2ZMPq6XXVzH3eOtT5UfRx4HKCgoKDPfU7ma/d9tz+HGYZhDGq+TBhlwIhe77P4fB3M8fYJc+NYwzAMw4t8OWx0AzBWREaJSBhwNbDsmH2WATeIZS7QpKoVbh5rGIZheJHPShiqaheRu4B3sJpen1bVHSJyu2v7Y8CbWF1qS7C61d50omN9FbthGIYB8rmubINIQUGBFhYW+jsMwzCMAUNENqpqQV/bzExmhmEYhltMwjAMwzDcYhKGYRiG4RaTMAzDMAy3DOpGbxGpAQ728/BhQO1J9xpczD0PfkPtfsHc86kaqaopfW0Y1AnjdIhI4fF6CgxW5p4Hv6F2v2Du2ZNMlZRhGIbhFpMwDMMwDLeYhHF8j/s7AD8w9zz4DbX7BXPPHmPaMAzDMAy3mBKGYRiG4RaTMAzDMAy3DOmEISJLRGS3iJSIyPf72C4i8qBr+zYRmeGPOD3JjXu+znWv20RkjYhM80ecnnSye+613ywRcYjIFb6MzxvcuWcRWSgiW0Rkh4h87OsYPc2Nf9vxIvKaiGx13fNN/ojTU0TkaRGpFpHtx9nu+e8vVR2SD6xp0vcBo7EWaNoKTDxmnwuAt7BW/JsLrPN33D645zOBRNfr84fCPffabznWFPtX+DtuH/x3TgB2Atmu96n+jtsH9/xD4Neu1ylAPRDm79hP454XADOA7cfZ7vHvr6FcwpgNlKhqqap2Ay8CS4/ZZynwF7WsBRJEJN3XgXrQSe9ZVdeoaoPr7Vqs1Q0HMnf+OwN8A/g3UO3L4LzEnXu+FnhZVQ8BqOpAv2937lmBWBERIAYrYdh9G6bnqOoKrHs4Ho9/fw3lhJEJHO71vsz12anuM5Cc6v3cgvULZSA76T2LSCZwKfCYD+PyJnf+O48DEkXkIxHZKCI3+Cw673Dnnh8G8rCWdy4C7lZVp2/C8wuPf3/5ck3vQCN9fHZsH2N39hlI3L4fEVmElTDmeTUi73Pnnu8HvqeqDuvH54Dnzj2HADOBc4FI4BMRWauqe7wdnJe4c89fBLYA5wC5wHsislJVm70cm794/PtrKCeMMmBEr/dZWL88TnWfgcSt+xGRqcCTwPmqWuej2LzFnXsuAF50JYthwAUiYlfV//gkQs9z9992raq2AW0isgKYBgzUhOHOPd8E3KdWBX+JiOwHJgDrfROiz3n8+2soV0ltAMaKyCgRCQOuBpYds88y4AZXb4O5QJOqVvg6UA866T2LSDbwMnD9AP612dtJ71lVR6lqjqrmAC8BXx/AyQLc+7f9KjBfREJEJAqYAxT7OE5PcueeD2GVqBCR4cB4oNSnUfqWx7+/hmwJQ1XtInIX8A5WD4unVXWHiNzu2v4YVo+ZC4ASoB3rF8qA5eY9/xhIBh51/eK26wCe6dPNex5U3LlnVS0WkbeBbYATeFJV++yeORC4+d/5f4FnRaQIq7rme6o6YKc9F5EXgIXAMBEpA34ChIL3vr/M1CCGYRiGW4ZylZRhGIZxCkzCMAzDMNxiEoZhGIbhFpMwDMMwDLeYhGEYhmG4xSQMw3CDiCSIyNd7vc8QkZe8dK1LROTHJ9nndyJyjjeubxjHY7rVGoYbRCQHeF1VJ/vgWmuAL51ojICIjASeUNXF3o7HMHqYEoZhuOc+INe1fsRvRSSnZx0CEblRRP7jWmthv4jcJSLfFpHNIrJWRJJc++WKyNuuyf5WisiEYy8iIuOALlWtFZFY1/lCXdviROSAiISq6kEgWUTSfPg3MIY4kzAMwz3fB/apar6qfreP7ZOxpgyfDfwCaFfV6cAnQM9MsI8D31DVmcA9wKN9nOcsYBOAqrYAHwEXurZdDfxbVW2u95tc+xuGTwzZqUEMw8M+dH3Bt4hIE/Ca6/MiYKqIxGAtTvWvXjPihvdxnnSgptf7J4F7gf9gTe1wa69t1UCGp27AME7GJAzD8IyuXq+dvd47sf4/CwIaVTX/JOfpAOJ73qjqalf119lA8DHzPUW49jcMnzBVUobhnhYgtr8Hu9Zc2C8iV8LR9Zb7Wi+9GBhzzGd/AV4Anjnm83HAgJ0w0Bh4TMIwDDe41gVZLSLbReS3/TzNdcAtIrIV2EHfS8WuAKbLZ1dy+huQiJU0AHA1hI8BCvsZi2GcMtOt1jACjIg8ALymqu+73l8BLFXV63vtcykwQ1X/x09hGkOQacMwjMDzS6wFjRCRh4DzsdY16C0E+L2P4zKGOFPCMAzDMNxi2jAMwzAMt5iEYRiGYbjFJAzDMAzDLSZhGIZhGG4xCcMwDMNwy/8HApQhuetmrmIAAAAASUVORK5CYII=\n", "text/plain": [ "
    " ] @@ -179,7 +179,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 942206945..b1fb311ce 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -96,9 +96,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), mask) pt(:) = pt(:) / cb%Gmass do concurrent(i = 1:npl, mask(i)) - pl%xh(1,1:npl) = pl%xh(1,1:npl) + pt(1) * dt - pl%xh(2,1:npl) = pl%xh(2,1:npl) + pt(2) * dt - pl%xh(3,1:npl) = pl%xh(3,1:npl) + pt(3) * dt + pl%xh(:,i) = pl%xh(:,i) + pt(:) * dt end do if (lbeg) then From ebc2796824968a350c5a685ce49ee8a332641f91 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 16:36:00 -0400 Subject: [PATCH 060/194] Fixed bug in which acceleration was not initialized to 0 on on half of a WHM pl step --- src/helio/helio_kick.f90 | 4 ++-- src/symba/symba_kick.f90 | 14 +++++++------- src/whm/whm_kick.f90 | 26 ++++++++++++++++---------- src/whm/whm_step.f90 | 1 - 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 1c2fff23e..b1949ac2f 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -17,7 +17,6 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step associate(cb => system%cb, pl => self, npl => self%nbody) - pl%ah(:,:) = 0.0_DP call pl%accel_int() if (param%loblatecb) then cb%aoblbeg = cb%aobl @@ -52,7 +51,6 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) - tp%ah(:,:) = 0.0_DP if (present(lbeg)) system%lbeg = lbeg if (system%lbeg) then call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) @@ -87,6 +85,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) associate(pl => self, npl => self%nbody) if (npl ==0) return + pl%ah(:,:) = 0.0_DP call pl%accel(system, param, t) if (lbeg) then call pl%set_beg_end(xbeg = pl%xh) @@ -123,6 +122,7 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) associate(tp => self, ntp => self%nbody) if (ntp ==0) return + tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg) do concurrent(i = 1:ntp, mask(i)) tp%vb(:, i) = tp%vb(:, i) + tp%ah(:, i) * dt diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 0586b2a5f..85d3bb8f3 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -12,16 +12,16 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) !! Adapted from Hal Levison's Swift routine symba5_kick.f implicit none ! Arguments - class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration ! Internals - integer(I4B) :: i, irm1, irecl - real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj + integer(I4B) :: i, irm1, irecl + real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj real(DP), dimension(NDIM) :: dx - logical :: isplpl, lgoodlevel + logical :: isplpl, lgoodlevel select type(self) class is (symba_plplenc) diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 5a0e19fd5..c5a60452a 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -25,7 +25,7 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) ah0(:) = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) do i = 1, npl - pl%ah(:, i) = ah0(:) + pl%ah(:, i) = pl%ah(:, i) + ah0(:) end do call whm_kick_getacch_ah1(cb, pl) @@ -75,13 +75,13 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) if (system%lbeg) then ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) do i = 1, ntp - tp%ah(:, i) = ah0(:) + tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) do i = 1, ntp - tp%ah(:, i) = ah0(:) + tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) end if @@ -200,16 +200,18 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) associate(pl => self, npl => self%nbody, cb => system%cb) if (npl == 0) return - if (pl%lfirst) then - call pl%h2j(cb) - call pl%accel(system, param, t) - pl%lfirst = .false. - end if if (lbeg) then + if (pl%lfirst) then + call pl%h2j(cb) + pl%ah(:,:) = 0.0_DP + call pl%accel(system, param, t) + pl%lfirst = .false. + end if call pl%set_beg_end(xbeg = pl%xh) else - call pl%set_beg_end(xend = pl%xh) + pl%ah(:,:) = 0.0_DP call pl%accel(system, param, t) + call pl%set_beg_end(xend = pl%xh) end if do concurrent(i = 1:npl, mask(i)) pl%vh(:, i) = pl%vh(:, i) + pl%ah(:, i) * dt @@ -241,10 +243,14 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) associate(tp => self, ntp => self%nbody) if (ntp == 0) return if (tp%lfirst) then + tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg=.true.) tp%lfirst = .false. end if - if (.not.lbeg) call tp%accel(system, param, t, lbeg) + if (.not.lbeg) then + tp%ah(:,:) = 0.0_DP + call tp%accel(system, param, t, lbeg) + end if do concurrent(i = 1:ntp, mask(i)) tp%vh(:, i) = tp%vh(:, i) + tp%ah(:, i) * dt end do diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ae8722ad9..ebcb94e27 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -54,7 +54,6 @@ module subroutine whm_step_pl(self, system, param, t, dt) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call pl%set_beg_end(xend = pl%xh) end associate return end subroutine whm_step_pl From 5e598b259c3a29f60dfbd6f6cfdfa259c4d920c3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 16:37:26 -0400 Subject: [PATCH 061/194] Updated examples after testing --- .../helio_swifter_comparison/swiftest_vs_swifter.ipynb | 8 ++++---- .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 4 ++-- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 9adcfb4d0..7f0b1d4b9 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": [ "
    " ] @@ -127,7 +127,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": [ "
    " ] @@ -179,7 +179,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] 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 98b32fc30..d9be0df4d 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, diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb index d0d223ce7..cd1a5aab8 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -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": [ "
    " ] @@ -622,7 +622,7 @@ " 1.17040422e-11])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", From bfb987123cd51f8656f0dca6e265837c50f62330 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 16:40:12 -0400 Subject: [PATCH 062/194] Moved symba_getacch subroutines to the symba_kick submodule --- src/symba/symba_getacch.f90 | 90 ------------------------------------- src/symba/symba_kick.f90 | 86 +++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 90 deletions(-) delete mode 100644 src/symba/symba_getacch.f90 diff --git a/src/symba/symba_getacch.f90 b/src/symba/symba_getacch.f90 deleted file mode 100644 index d10e2267c..000000000 --- a/src/symba/symba_getacch.f90 +++ /dev/null @@ -1,90 +0,0 @@ -submodule (symba_classes) s_symba_kick_getacch - use swiftest -contains - module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 - !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f - implicit none - ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: k - real(DP) :: irij3, rji2, rlim2, faci, facj - real(DP), dimension(NDIM) :: dx - - select type(system) - class is (symba_nbody_system) - associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) - ! Remove accelerations from encountering pairs - do k = 1, nplplenc - associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - rlim2 = (pl%radius(i) + pl%radius(j))**2 - if (rji2 > rlim2) then - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - faci = pl%Gmass(i) * irij3 - facj = pl%Gmass(j) * irij3 - pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) - pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) - end if - end associate - end do - call helio_kick_getacch_pl(pl, system, param, t, lbeg) - end associate - end select - - return - end subroutine symba_kick_getacch_pl - - module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of test particles - !! - !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch_tp.f90 - !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f - implicit none - ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: k - real(DP) :: rji2, fac, rlim2 - real(DP), dimension(NDIM) :: dx - - select type(system) - class is (symba_nbody_system) - associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) - ! Remove accelerations from encountering pairs - do k = 1, npltpenc - associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) - if (tp%status(j) == ACTIVE) THEN - dx(:) = tp%xh(:,j) - pl%xh(:,i) - rji2 = dot_product(dx(:), dx(:)) - rlim2 = (pl%radius(i))**2 - if (rji2 > rlim2) then - fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) - tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - end if - end IF - end associate - end do - call helio_kick_getacch_tp(tp, system, param, t, lbeg) - end associate - end select - return - end subroutine symba_kick_getacch_tp - -end submodule s_symba_kick_getacch diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 85d3bb8f3..39721a098 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -2,6 +2,92 @@ use swiftest contains +module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: irij3, rji2, rlim2, faci, facj + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + ! Remove accelerations from encountering pairs + do k = 1, nplplenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i) + pl%radius(j))**2 + if (rji2 > rlim2) then + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) + end if + end associate + end do + call helio_kick_getacch_pl(pl, system, param, t, lbeg) + end associate + end select + + return + end subroutine symba_kick_getacch_pl + + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of test particles + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch_tp.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: rji2, fac, rlim2 + real(DP), dimension(NDIM) :: dx + + select type(system) + class is (symba_nbody_system) + associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) + ! Remove accelerations from encountering pairs + do k = 1, npltpenc + associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) + if (tp%status(j) == ACTIVE) THEN + dx(:) = tp%xh(:,j) - pl%xh(:,i) + rji2 = dot_product(dx(:), dx(:)) + rlim2 = (pl%radius(i))**2 + if (rji2 > rlim2) then + fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) + end if + end IF + end associate + end do + call helio_kick_getacch_tp(tp, system, param, t, lbeg) + end associate + end select + return + end subroutine symba_kick_getacch_tp + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) !! author: David A. Minton !! From 29d5d6a565aac631d206e8b5dc69ece942a8605d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 17:18:03 -0400 Subject: [PATCH 063/194] Refactored to simply loop indices --- .../swiftest_vs_swifter.ipynb | 262 +++++++++--------- src/symba/symba_kick.f90 | 46 +-- 2 files changed, 154 insertions(+), 154 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 6e3effc7c..f1f15c4cb 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdl0lEQVR4nO3dfZBddZ3n8fenbxLCo+Gh0SYNppXmIcAQQm+IYOEIZirBWbLKLpvoyIPsZlKCpeu6U5mlZker1pUqxy1kzJLiyQXHIaUoGK0MzK5AMQsCaQQDASNtANMQTYgaiEDS3fe7f5zTnZub25170n363nPzeVXdOvf8Hs75dif3fvuc3zm/o4jAzMysXm2NDsDMzIrFicPMzDJx4jAzs0ycOMzMLBMnDjMzy2RKowOYSMcdd1zMmjWr0WGYmRXGU0899XpEtGfp01KJY9asWfT29jY6DDOzwpD0StY+PlVlZmaZOHGYmVkmThxmZpZJS41x1DIwMEB/fz/vvPNOo0OZUNOnT6ezs5OpU6c2OhQzO8i0fOLo7+/nyCOPZNasWUhqdDgTIiLYvn07/f39dHV1NTocMzvItPypqnfeeYdjjz22ZZIGgCSOPfbYljuKMrNiyDVxSFooaaOkPkkratRL0k1p/XpJc9PyUyU9U/F6Q9LnxxHHOH6K5tSKP5OZFUNuiUNSCVgJLAJmA0slza5qtgjoTl/LgJsBImJjRMyJiDnAucBbwL15xWpmVjhv/x4e/O+wZf2k7zrPI455QF9EbIqI3cBqYHFVm8XAXZF4HJghqaOqzcXAryIi800qk+H888+vWX7VVVdxzz33THI0ZnbQePv38MjXYOvzk77rPBPHTGBzxXp/Wpa1zRLg7gmPboI89thjjQ7BzA5G5aFk2Tb51zjlucdaJ+GrHzc4ZhtJ04BLgb8edSfSMpLTXJx00knZoxynI444gp07dxIRfPazn+XBBx+kq6sLP1nRzHJVHkyWbaVJ33WeRxz9wIkV653AaxnbLAJ+FhG/HW0nEXFLRPRERE97e6Z5uibUvffey8aNG3n22We59dZbfSRiZvkaSRyTf8SRZ+JYB3RL6kqPHJYAa6rarAGuSK+umg/siIgtFfVLaeLTVJUeeeQRli5dSqlU4oQTTuCiiy5qdEhm1sqGBpJlK52qiohBSdcBDwAl4I6I2CBpeVq/ClgLXAL0kVw5dfVwf0mHAQuAv8wrxonmS2TNbNI0cIwj1/s4ImJtRJwSEe+PiK+kZavSpEF6NdW1af1ZEdFb0fetiDg2InbkGeNEufDCC1m9ejVDQ0Ns2bKFhx56qNEhmVkra+CpqpafcmSyfOxjH+PBBx/krLPO4pRTTuFDH/pQo0Mys1bmxFFcO3fuBJLTVN/85jcbHI2ZHTRadHDczMzy4sRhZmaZtOh9HGZmlpfhxFGa/GfyOHGYmRWRT1WZmVkmrXofh5mZ5cRjHK1r8+bNfPjDH+b000/njDPO4Bvf+EajQzKzVtCKU45YYsqUKXz9619n7ty5vPnmm5x77rksWLCA2bOrn2llZpaBxzhaV0dHB3PnzgXgyCOP5PTTT+fVV19tcFRmVngjiWPyr6o6qI44vvyjDTz/2hsTus3ZJxzF3/7rM+pq+/LLL/P0009z3nnnTWgMZnYQGhkc9xhHy9q5cyeXXXYZN954I0cddVSjwzGzovNcVZOj3iODiTYwMMBll13GJz/5ST7+8Y83JAYzazHlxg2O+4gjZxHBNddcw+mnn84XvvCFRodjZq3Cg+Ot69FHH+Xb3/42Dz74IHPmzGHOnDmsXbu20WGZWdE18AbAg+pUVSN88IMfJCIaHYaZtZryIKgN2ib/738fcZiZFVF5sCFHG+DEYWZWTK2aOCQtlLRRUp+kFTXqJemmtH69pLkVdTMk3SPpF5JekPSBPGM1MyuUoRZMHJJKwEpgETAbWCqpep6NRUB3+loG3FxR9w3g/og4DTgbeCGvWM3MCqc82JCb/yDfI455QF9EbIqI3cBqYHFVm8XAXZF4HJghqUPSUcCFwO0AEbE7Iv6QY6xmZsVSHmzIdCOQb+KYCWyuWO9Py+pp8z5gG/AtSU9Luk3S4bV2ImmZpF5Jvdu2bZu46M3MmlmLjnGoRln1damjtZkCzAVujohzgD8C+4yRAETELRHRExE97e3t44k3N5/+9Kc5/vjjOfPMM0fKfve737FgwQK6u7tZsGABv//970fqvvrVr3LyySdz6qmn8sADDzQiZDNrduWhlkwc/cCJFeudwGt1tukH+iPiibT8HpJEUkhXXXUV999//15lN9xwAxdffDEvvvgiF198MTfccAMAzz//PKtXr2bDhg3cf//9fOYzn2FoaKgRYZtZMysPtOQYxzqgW1KXpGnAEmBNVZs1wBXp1VXzgR0RsSUifgNslnRq2u5i4PkcY83VhRdeyDHHHLNX2Q9/+EOuvPJKAK688kruu+++kfIlS5ZwyCGH0NXVxcknn8yTTz452SGbWbNr4Kmq3PYaEYOSrgMeAErAHRGxQdLytH4VsBa4BOgD3gKurtjEZ4HvpElnU1XdgfmnFfCbZ8e9mb285yxYdEPmbr/97W/p6OgAkmd2bN26FYBXX32V+fPnj7Tr7Oz08zvMbF/lQSg1ZnA813QVEWtJkkNl2aqK9wFcO0rfZ4CePONrRrWmJ5FqDQWZ2UGtPNSwU1UH11xVB3BkkJd3v/vdbNmyhY6ODrZs2cLxxx8PJEcYmzfvudCsv7+fE044oVFhmlmzatGrqmwMl156KXfeeScAd955J4sXLx4pX716Nbt27eKll17ixRdfZN68eY0M1cyaUSuOcdgeS5cu5eGHH+b111+ns7OTL3/5y6xYsYLLL7+c22+/nZNOOonvfe97AJxxxhlcfvnlzJ49mylTprBy5UpKpcYcjppZExsacOJoZXfffXfN8p/85Cc1y6+//nquv/76PEMys6Jr0fs4zMwsLx7jMDOzTJw48tWKT+BrxZ/JzDJw4sjP9OnT2b59e0t90UYE27dvZ/r06Y0OxcwapYHTqrf84HhnZyf9/f202sy506dPp7Ozs9FhmFmj+HLc/EydOpWurq5Gh2FmNrEaOOVIy5+qMjNrSR7jMDOzTBo4V5UTh5lZEfmIw8zMMmnglCNOHGZmRVQegjYPjpuZWb0aeB+HE4eZWRF5jMPMzDJp1cQhaaGkjZL6JK2oUS9JN6X16yXNrah7WdKzkp6R1JtnnGZmhRIB0bhp1XPbq6QSsBJYAPQD6yStiYjnK5otArrT13nAzely2Icj4vW8YjQzK6TyYLJswSOOeUBfRGyKiN3AamBxVZvFwF2ReByYIakjx5jMzIpvOHGUWi9xzAQ2V6z3p2X1tgngnyU9JWnZaDuRtExSr6TeVpvI0MysphY+4lCNsuq5zcdqc0FEzCU5nXWtpAtr7SQibomInojoaW9vP/BozcyKooUTRz9wYsV6J/BavW0iYni5FbiX5NSXmZkNtW7iWAd0S+qSNA1YAqyparMGuCK9umo+sCMitkg6XNKRAJIOB/4MeC7HWM3MimPkiKPFHuQUEYOSrgMeAErAHRGxQdLytH4VsBa4BOgD3gKuTru/G7hX0nCM/xgR9+cVq5lZoYwkjsZMOZLrcU5ErCVJDpVlqyreB3BtjX6bgLPzjM3MrLBaeIzDzMzyUB5Klk4cZmZWlwaPcThxmJkVTXkgWfqIw8zM6uIxDjMzy2R4jKPkBzmZmVk9PMZhZmaZ+FSVmZllMuTBcTMzy8L3cZiZWSY+VWVmZpk4cZiZWSZOHGZmlokTh5mZZeL7OMzMLBMfcZiZWSbDicNTjpiZWV18xGFmZpn4BkAzM8tkZMqRFhwcl7RQ0kZJfZJW1KiXpJvS+vWS5lbVlyQ9LenHecZpZlYorXqqSlIJWAksAmYDSyXNrmq2COhOX8uAm6vqPwe8kFeMZmaFNJI4Wm9wfB7QFxGbImI3sBpYXNVmMXBXJB4HZkjqAJDUCXwUuC3HGM3MiqeFxzhmApsr1vvTsnrb3Aj8FVAeayeSlknqldS7bdu2cQVsZlYI5UFA0NaYYeo896oaZVFPG0l/DmyNiKf2t5OIuCUieiKip729/UDiNDMrlvJgw442IN/E0Q+cWLHeCbxWZ5sLgEslvUxyiusiSf+QX6hmZgVSHmjZxLEO6JbUJWkasARYU9VmDXBFenXVfGBHRGyJiL+OiM6ImJX2ezAi/iLHWM3MiqM81NDEkdueI2JQ0nXAA0AJuCMiNkhantavAtYClwB9wFvA1XnFY2bWMsqDUGrBxAEQEWtJkkNl2aqK9wFcu59tPAw8nEN4ZmbF1MJjHGZmlgcnDjMzy2TIicPMzLIoDzZsnipw4jAzK57yYMOmGwEnDjOz4vEYh5mZZdLg+zjqShySrqlaL0n623xCMjOzMRVkjONiSWsldUg6E3gcODLHuMzMbDQNnnKkrj1HxCck/XvgWZI7vJdGxKO5RmZmZrUVYYxDUjfJQ5W+D7wMfErSYTnGZWZmoykPQan5r6r6EfA3EfGXwIeAX5JMYmhmZpOtIGMc84CzJf0AuIfkuRpLcovKzMxG1+BTVfXu+TbgTeDv0/WlwAeAy/MIyszMxjBUgMFx4NSIOLti/SFJP88jIDMz248i3McBPJ0+aAkASecBvqrKzKwRCnKq6jySJ/X9Ol0/CXhB0rMkj9X4k1yiMzOzfRUkcSzMNQozM6tfERJHRLySdyBmZlanItwAeKAkLZS0UVKfpBU16iXpprR+vaS5afl0SU9K+rmkDZK+nGecZmaFUpD7ODKTVAJWAouA2cBSSbOrmi0CutPXMuDmtHwXcFF6JdccYGHl4LyZ2UGthY845gF9EbEpInYDq4HFVW0WA3dF4nFghqSOdH1n2mZq+oocYzUzK47yYCGmHDkQM4HNFev9aVldbdKp258BtgL/JyKeqLUTScsk9Urq3bZt20TFbmbWvApyH8eBUI2y6qOGUdtExFBEzAE6gXnpdO77No64JSJ6IqKnvb19PPGamRVDq45xkBw9nFix3gm8lrVNRPwBeBhfEmxmlmjwlCN5Jo51QLekLknTSCZFXFPVZg3JjYVKB793RMQWSe2SZgBIOhT4CPCLHGM1MyuGCIjGnqrKbc8RMSjpOuABoATcEREbJC1P61cBa4FLgD6SB0RdnXbvAO5Mr8xqA74bET/OK1Yzs8IoDyXLtsYNjueasiJiLUlyqCxbVfE+gGtr9FsPnJNnbGZmhVQeTJYtOsZhZmYTbSRxtOYYh5mZTbTyQLJ04jAzs7qMjHE4cZiZWT08xmFmZpkMJ44WnXLEzMwmmgfHzcwsE49xmJlZJkPDV1V5jMPMzOrhU1VmZpbJSOLw4LiZmdXDYxxmZpaJ7+MwM7NMPOWImZll4sFxMzPLxInDzMwyGR4cLzlxmJlZPXzEYWZmmThxmJlZJkMtflWVpIWSNkrqk7SiRr0k3ZTWr5c0Ny0/UdJDkl6QtEHS5/KM08ysMFr5BkBJJWAlsAiYDSyVNLuq2SKgO30tA25OyweB/xwRpwPzgWtr9DUzO/i0+KmqeUBfRGyKiN3AamBxVZvFwF2ReByYIakjIrZExM8AIuJN4AVgZo6xmpkVQ4snjpnA5or1fvb98t9vG0mzgHOAJ2rtRNIySb2Serdt2zbemM3MmluLJw7VKIssbSQdAXwf+HxEvFFrJxFxS0T0RERPe3v7AQdrZlYILZ44+oETK9Y7gdfqbSNpKknS+E5E/CDHOM3MiqPFJzlcB3RL6pI0DVgCrKlqswa4Ir26aj6wIyK2SBJwO/BCRPzPHGM0MyuWJjjiyG3PETEo6TrgAaAE3BERGyQtT+tXAWuBS4A+4C3g6rT7BcCngGclPZOW/deIWJtXvGZmhTCcOEqNe5BTrikr/aJfW1W2quJ9ANfW6Pf/qD3+YWZ2cGvl+zjMzCwHw0ccatzXtxOHmVmRDA0kRxtq3EkZJw4zsyIpDzb0NBU4cZiZFUt5CNoaNzAOThxmZsVSHmzoPRzgxGFmViw+VWVmZpmUB5w4zMwsg/KQE4eZmWXgMQ4zM8ukPNjQ6UbAicPMrFg8OG5mZpkMOXGYmVkWHuMwM7NMfKrKzMwyKQ96yhEzM8vA93GYmVkmHuMwM7NMWn3KEUkLJW2U1CdpRY16SboprV8vaW5F3R2Stkp6Ls8YzcwKpZUHxyWVgJXAImA2sFTS7Kpmi4Du9LUMuLmi7n8DC/OKz8yskFp8jGMe0BcRmyJiN7AaWFzVZjFwVyQeB2ZI6gCIiEeA3+UYn5lZ8ZQHodS6iWMmsLlivT8ty9pmTJKWSeqV1Ltt27YDCtTMrDBa+VQVUOtJ6nEAbcYUEbdERE9E9LS3t2fpamZWPEOtPTjeD5xYsd4JvHYAbczMbFiLj3GsA7oldUmaBiwB1lS1WQNckV5dNR/YERFbcozJzKzYWvk+jogYBK4DHgBeAL4bERskLZe0PG22FtgE9AG3Ap8Z7i/pbuCnwKmS+iVdk1esZmaF0QRTjuR6vBMRa0mSQ2XZqor3AVw7St+lecZmZlZILT44bmZmE63FxzjMzGyilQdad4zDzMxy4FNVZmZWtwgnDjMzyyDKybLkBzmZmVk9yoPJ0mMcZmZWl6GBZOlTVWZmVpeRIw4nDjMzq0d5KFk6cZiZWV18xGFmZpk4cZiZWSZNkjgau3czM6vbzrff5gjgpodf4iePPcrgUJmBoTLvOnQq31t+/qTF4cRhZlYQ63+9nfOB3eU23nXoVKaVxJS2No4+fHJvCHTiMDMriFe2vcH5wLUfOY1Dz57XsDg8xmFmVhAvb3sDgEMPOaShcThxmJkVxNbXX0/eTJne0DicOMzMCuCdgSEOe2NTsnLsyQ2NxYnDzKwA+rbu5H28ymDpUHjXiQ2NJdfEIWmhpI2S+iStqFEvSTel9eslza23r5nZwWTjb96kW/0MHnMytDX2b/7crqqSVAJWAguAfmCdpDUR8XxFs0VAd/o6D7gZOK/OvhNm5xu/I2KMBlJ1wTjqx9N3vNs2s6J69tUdLGt7jWnvvqjRoeR6Oe48oC8iNgFIWg0sBiq//BcDd0VEAI9LmiGpA5hVR98J0/b10zhMu/LYdFMrx96JpTp3BtX1qrttdRKbyG3vu57sL9K64frK9T1txm4HEFFHmzG2te9+quOoHUv1tkb2E7W3tVebUbZFjfirtwWinL5iZNlGOSrL20bel2kbaVdOy2uuRxsBVe3H6t+2dxzRVnP/sdcyKR+ixCBtlGljMEoM0cYgJYYYft+2p03sqRsuH6Ktok8b+/wR1gQO522+NH07HH9qo0PJNXHMBDZXrPeTHFXsr83MOvsCIGkZsAzgpJNOOqBA15/2uZFb+TXmoQdUf62pan3fQ5cYvW2Vffc99vpYse67r7Hj3G9slfX7iXN8P2fW32/aJvZ8Fe69n4ry2Du9VG5vT5u908yeNlGxn4rtxJ59jnxFx95fy3v1H2lTFUvsu889P0+goOpnqdxnea9YKuOo/Nn2iSWq0mKUK8rLKF2Slu+pL+9Vn+y3PFI/0q7AyiolyUolQlPSZYly2xSG2qbteWkq5ZH1qQy1TUvWNXWvdoOlwxgoHcbAlMMYKB2eLpPX7ilH8va0oxkqHTpmTMe9sQHWAce1duKolbKr/zeN1qaevklhxC3ALQA9PT0H9L91/tLrD6SbmY0m0sQV5fRxpxXv93qNVl5Pm+HyISiXkz/+yoPp+mAyBflwWXmoan24Xe02bWlZqbLN0ED62gWDu2Bod9VyJwzuhoFdyXLwnbTunT1zTI1l6uFw+HFweDsc/V44thuO64aZ58IxXfDME0niaD8t73+9/cozcfQDlUP/ncBrdbaZVkdfM2tWUjrG5gs3gSSR7N6ZvHbt3Pv9Ozvgj9vgj68ny52/hf5eeO4HjPy9fGw3HNWRTG54TFdDfxTIN3GsA7oldQGvAkuAT1S1WQNcl45hnAfsiIgtkrbV0dfMrBimTIMpx8Bhx9TfZ+Bt2N4HrzwGT90JLz2SnKYqTe68VLXkljgiYlDSdcADQAm4IyI2SFqe1q8C1gKXAH3AW8DVY/XNK1Yzs6Yz9VB4z1nJq+fT8OSt8K6ZjY4KAMV+B4OLo6enJ3p7exsdhplZYUh6KiJ6svTxCUgzM8vEicPMzDJx4jAzs0ycOMzMLBMnDjMzy8SJw8zMMnHiMDOzTJw4zMwsk5a6ATCdquSVA+x+HPD6BIYzGRzz5ChazEWLFxzzZKkV83sjoj3LRloqcYyHpN6sd082mmOeHEWLuWjxgmOeLBMVs09VmZlZJk4cZmaWiRPHHrc0OoAD4JgnR9FiLlq84Jgny4TE7DEOMzPLxEccZmaWiROHmZll0vKJQ9JCSRsl9UlaUaNekm5K69dLmltv32aLWdKJkh6S9IKkDZI+1+wxV9SXJD0t6cdFiFnSDEn3SPpF+vv+QAFi/k/p/4vnJN0taXqTxHyapJ9K2iXpi1n6NlvMTf4ZHPX3nNbX/xmMiJZ9kTx29lfA+4BpwM+B2VVtLgH+CRAwH3ii3r5NGHMHMDd9fyTwy2aPuaL+C8A/Aj9u9v8bad2dwH9I308DZjRzzMBM4CXg0HT9u8BVTRLz8cC/Ar4CfDFL3yaMuZk/gzVjrqiv+zPY6kcc84C+iNgUEbuB1cDiqjaLgbsi8TgwQ1JHnX2bKuaI2BIRPwOIiDeBF0i+MJo2ZgBJncBHgdsmIdZxxyzpKOBC4HaAiNgdEX9o5pjTuinAoZKmAIcBrzVDzBGxNSLWAQNZ+zZbzM38GRzj95z5M9jqiWMmsLlivZ99/xFHa1NP3zyMJ+YRkmYB5wBPTHyI+xhvzDcCfwWUc4qvlvHE/D5gG/Ct9ND+NkmH5xnsfuLZb5uIeBX4O+DXwBZgR0T8c46xjhnPJPQdjwnZbxN+BsdyIxk+g62eOFSjrPr649Ha1NM3D+OJOamUjgC+D3w+It6YwNhGc8AxS/pzYGtEPDXxYY1pPL/nKcBc4OaIOAf4IzAZ59/H83s+muQv0C7gBOBwSX8xwfHVMp7PUTN/BsfeQHN+Bmt3PIDPYKsnjn7gxIr1TvY9PB+tTT198zCemJE0leQ/7Hci4gc5xllXPHW0uQC4VNLLJIfXF0n6h/xC3W889bTpB/ojYvgvyXtIEknexhPzR4CXImJbRAwAPwDOzzHW/cWTd9/xGNd+m/gzOJrsn8G8B20a+SL5y3ATyV9ZwwNGZ1S1+Sh7DyY+WW/fJoxZwF3AjUX5PVe1+VMmb3B8XDED/wKcmr7/EvC1Zo4ZOA/YQDK2IZLB/c82Q8wVbb/E3gPNTfsZHCPmpv0MjhZzVV1dn8FJ+8Ea9SK5yuSXJFccXJ+WLQeWV/xDr0zrnwV6xurbzDEDHyQ5PF0PPJO+LmnmmA/kP20zxAzMAXrT3/V9wNEFiPnLwC+A54BvA4c0SczvIfmL+Q3gD+n7o0br28wxN/lncNTfc8U26voMesoRMzPLpNXHOMzMbII5cZiZWSZOHGZmlokTh5mZZeLEYWZmmThxmNWQzn77mYr1EyTdk9O+/o2k/7afNn8n6aI89m+WlS/HNashnWfoxxFx5iTs6zHg0oh4fYw27wVujYg/yzses/3xEYdZbTcA75f0jKSvSZol6TkASVdJuk/SjyS9JOk6SV9IJzx8XNIxabv3S7pf0lOS/kXSadU7kXQKsCsiXpd0ZLq9qWndUZJeljQ1Il4BjpX0nkn8HZjV5MRhVtsK4FcRMSci/kuN+jOBT5BMZ/0V4K1IJjz8KXBF2uYWkmk9zgW+CPyvGtu5AKichvthkmlDAJYA349kbinSdheM8+cyG7cpjQ7ArKAeSr/o35S0A/hRWv4s8Cfp7KjnA9+TRiYuPaTGdjpIpmgfdhvJ9Nb3AVcD/7GibivJzLZmDeXEYXZgdlW8L1esl0k+V23AHyJizn628zbwruGViHg0PS32IaAUEc9VtJ2etjdrKJ+qMqvtTZJHfx6QSJ7B8JKkfwcjzwI/u0bTF4CTq8ruAu4GvlVVfgrJBIVmDeXEYVZDRGwHHpX0nKSvHeBmPglcI+nnJFOa13rs6SPAOao4nwV8BziaJHkAI894OJlkRl6zhvLluGYNJukbwI8i4v+m6/8WWBwRn6po8zFgbkT8TYPCNBvhMQ6zxvsfJA9aQtLfA4tInq1QaQrw9UmOy6wmH3GYmVkmHuMwM7NMnDjMzCwTJw4zM8vEicPMzDJx4jAzs0z+P7PZ7aKX7Z56AAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -465,91 +465,91 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'px' (time (y): 199, id: 2)>\n",
    -       "array([[ 0.00000000e+00,  0.00000000e+00],\n",
    -       "       [ 0.00000000e+00, -7.12220460e-09],\n",
    -       "       [ 0.00000000e+00, -2.84900827e-08],\n",
    -       "       [ 0.00000000e+00, -6.41074152e-08],\n",
    -       "       [ 0.00000000e+00, -1.13980512e-07],\n",
    -       "       [ 0.00000000e+00, -1.78118202e-07],\n",
    -       "       [ 0.00000000e+00, -2.56531852e-07],\n",
    -       "       [ 0.00000000e+00, -3.49235353e-07],\n",
    -       "       [ 0.00000000e+00, -4.56245140e-07],\n",
    -       "       [ 0.00000000e+00, -5.77580189e-07],\n",
    -       "       [ 0.00000000e+00, -7.13262030e-07],\n",
    -       "       [ 0.00000000e+00, -8.63314745e-07],\n",
    -       "       [ 0.00000000e+00, -1.02776499e-06],\n",
    -       "       [ 0.00000000e+00, -1.20664199e-06],\n",
    -       "       [ 0.00000000e+00, -1.39997756e-06],\n",
    -       "       [ 0.00000000e+00, -1.60780612e-06],\n",
    -       "       [ 0.00000000e+00, -1.83016468e-06],\n",
    -       "       [ 0.00000000e+00, -2.06709291e-06],\n",
    -       "       [ 0.00000000e+00, -2.31863308e-06],\n",
    -       "       [ 0.00000000e+00, -2.58483014e-06],\n",
    +       "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    +       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
            "...\n",
    -       "       [-4.44089210e-16, -5.00980628e-04],\n",
    -       "       [-1.22124533e-15, -5.18253726e-04],\n",
    -       "       [-3.33066907e-15, -5.36896942e-04],\n",
    -       "       [-4.44089210e-15, -5.57134011e-04],\n",
    -       "       [-5.44009282e-15, -5.79246689e-04],\n",
    -       "       [-5.44009282e-15, -6.03596238e-04],\n",
    -       "       [-5.32907052e-15, -6.30655877e-04],\n",
    -       "       [-5.21804822e-15, -6.61061384e-04],\n",
    -       "       [-5.10702591e-15, -6.95693612e-04],\n",
    -       "       [-4.99600361e-15, -7.35820563e-04],\n",
    -       "       [-4.99600361e-15, -7.83359285e-04],\n",
    -       "       [ 1.33226763e-15, -8.41403959e-04],\n",
    -       "       [ 4.77395901e-15, -9.15431516e-04],\n",
    -       "       [-2.22044605e-16, -1.01661465e-03],\n",
    -       "       [ 3.77475828e-15, -1.17430457e-03],\n",
    -       "       [ 1.29488925e-06, -1.53697214e-03],\n",
    -       "       [ 3.16460020e-03,  1.93749443e-03],\n",
    -       "       [ 3.17685641e-03,  3.61711129e-02],\n",
    -       "       [ 3.18905387e-03,  7.04843014e-02],\n",
    -       "       [ 3.20119234e-03,             nan]])\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    +       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    +       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    +       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    +       "        3.88578059e-15,  4.10782519e-15,  1.02750769e-03,  1.03179676e-03,\n",
    +       "        1.03606675e-03,  1.04031758e-03,  1.04454916e-03,  1.04876143e-03,\n",
    +       "        1.05295429e-03,  1.05712769e-03,  1.06128153e-03,  1.06541574e-03,\n",
    +       "        1.06953025e-03,  1.07362498e-03,  1.07769985e-03])\n",
            "Coordinates:\n",
    -       "  * id        (id) int64 2 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ - "\n", - "array([[ 0.00000000e+00, 0.00000000e+00],\n", - " [ 0.00000000e+00, -7.12220460e-09],\n", - " [ 0.00000000e+00, -2.84900827e-08],\n", - " [ 0.00000000e+00, -6.41074152e-08],\n", - " [ 0.00000000e+00, -1.13980512e-07],\n", - " [ 0.00000000e+00, -1.78118202e-07],\n", - " [ 0.00000000e+00, -2.56531852e-07],\n", - " [ 0.00000000e+00, -3.49235353e-07],\n", - " [ 0.00000000e+00, -4.56245140e-07],\n", - " [ 0.00000000e+00, -5.77580189e-07],\n", - " [ 0.00000000e+00, -7.13262030e-07],\n", - " [ 0.00000000e+00, -8.63314745e-07],\n", - " [ 0.00000000e+00, -1.02776499e-06],\n", - " [ 0.00000000e+00, -1.20664199e-06],\n", - " [ 0.00000000e+00, -1.39997756e-06],\n", - " [ 0.00000000e+00, -1.60780612e-06],\n", - " [ 0.00000000e+00, -1.83016468e-06],\n", - " [ 0.00000000e+00, -2.06709291e-06],\n", - " [ 0.00000000e+00, -2.31863308e-06],\n", - " [ 0.00000000e+00, -2.58483014e-06],\n", + "\n", + "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", "...\n", - " [-4.44089210e-16, -5.00980628e-04],\n", - " [-1.22124533e-15, -5.18253726e-04],\n", - " [-3.33066907e-15, -5.36896942e-04],\n", - " [-4.44089210e-15, -5.57134011e-04],\n", - " [-5.44009282e-15, -5.79246689e-04],\n", - " [-5.44009282e-15, -6.03596238e-04],\n", - " [-5.32907052e-15, -6.30655877e-04],\n", - " [-5.21804822e-15, -6.61061384e-04],\n", - " [-5.10702591e-15, -6.95693612e-04],\n", - " [-4.99600361e-15, -7.35820563e-04],\n", - " [-4.99600361e-15, -7.83359285e-04],\n", - " [ 1.33226763e-15, -8.41403959e-04],\n", - " [ 4.77395901e-15, -9.15431516e-04],\n", - " [-2.22044605e-16, -1.01661465e-03],\n", - " [ 3.77475828e-15, -1.17430457e-03],\n", - " [ 1.29488925e-06, -1.53697214e-03],\n", - " [ 3.16460020e-03, 1.93749443e-03],\n", - " [ 3.17685641e-03, 3.61711129e-02],\n", - " [ 3.18905387e-03, 7.04843014e-02],\n", - " [ 3.20119234e-03, nan]])\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", + " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", + " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", + " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", + " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", + " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", + " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", + " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", + " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", + " 3.88578059e-15, 4.10782519e-15, 1.02750769e-03, 1.03179676e-03,\n", + " 1.03606675e-03, 1.04031758e-03, 1.04454916e-03, 1.04876143e-03,\n", + " 1.05295429e-03, 1.05712769e-03, 1.06128153e-03, 1.06541574e-03,\n", + " 1.06953025e-03, 1.07362498e-03, 1.07769985e-03])\n", "Coordinates:\n", - " * id (id) int64 2 100\n", + " id int64 2\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['px']" + "swiftdiff['px'].sel(id=2)" ] }, { diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 39721a098..611ca99be 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -104,7 +104,7 @@ 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 ! Internals - integer(I4B) :: i, irm1, irecl + integer(I4B) :: k, irm1, irecl real(DP) :: r, rr, ri, ris, rim1, r2, ir3, fac, faci, facj real(DP), dimension(NDIM) :: dx logical :: isplpl, lgoodlevel @@ -125,28 +125,28 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) else irecl = irec end if - do i = 1, self%nenc - associate(index_i => self%index1(i), index_j => self%index2(i)) + do k = 1, self%nenc + associate(i => self%index1(k), j => self%index2(k)) if (isplpl) then - pl%ah(:,index_i) = 0.0_DP - pl%ah(:,index_j) = 0.0_DP + pl%ah(:,i) = 0.0_DP + pl%ah(:,j) = 0.0_DP else - tp%ah(:,index_j) = 0.0_DP + tp%ah(:,j) = 0.0_DP end if if (isplpl) then - lgoodlevel = (pl%levelg(index_i) >= irm1) .and. (pl%levelg(index_j) >= irm1) + lgoodlevel = (pl%levelg(i) >= irm1) .and. (pl%levelg(j) >= irm1) else - lgoodlevel = (pl%levelg(index_i) >= irm1) .and. (tp%levelg(index_j) >= irm1) + lgoodlevel = (pl%levelg(i) >= irm1) .and. (tp%levelg(j) >= irm1) end if if ((self%status(i) == ACTIVE) .and. lgoodlevel) then if (isplpl) then - ri = ((pl%rhill(index_i) + pl%rhill(index_j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + ri = ((pl%rhill(i) + pl%rhill(j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) - dx(:) = pl%xh(:,index_j) - pl%xh(:,index_i) + dx(:) = pl%xh(:,j) - pl%xh(:,i) else - ri = ((pl%rhill(index_i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + ri = ((pl%rhill(i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) - dx(:) = tp%xh(:,index_j) - pl%xh(:,index_i) + dx(:) = tp%xh(:,j) - pl%xh(:,i) end if r2 = dot_product(dx(:), dx(:)) if (r2 < rim1) then @@ -160,24 +160,24 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) ir3 = 1.0_DP / (r2 * sqrt(r2)) fac = ir3 end if - faci = fac * pl%mass(index_i) + faci = fac * pl%mass(i) if (isplpl) then - facj = fac * pl%mass(index_j) - pl%ah(:,index_i) = pl%ah(:,index_i) + facj*dx(:) - pl%ah(:,index_j) = pl%ah(:,index_j) - faci*dx(:) + facj = fac * pl%mass(j) + pl%ah(:,i) = pl%ah(:,i) + facj*dx(:) + pl%ah(:,j) = pl%ah(:,j) - faci*dx(:) else - tp%ah(:,index_j) = tp%ah(:,index_j) - faci*dx(:) + tp%ah(:,j) = tp%ah(:,j) - faci*dx(:) end if end if end associate end do if (isplpl) then - do i = 1, self%nenc - associate(index_i => self%index1(i), index_j => self%index2(i)) - pl%vb(:,index_i) = pl%vb(:,index_i) + sgn * dt * pl%ah(:,index_i) - pl%vb(:,index_j) = pl%vb(:,index_j) + sgn * dt * pl%ah(:,index_j) - pl%ah(:,index_i) = 0.0_DP - pl%ah(:,index_j) = 0.0_DP + do k = 1, self%nenc + associate(i => self%index1(k), j => self%index2(k)) + pl%vb(:,i) = pl%vb(:,i) + sgn * dt * pl%ah(:,i) + pl%vb(:,j) = pl%vb(:,j) + sgn * dt * pl%ah(:,j) + pl%ah(:,i) = 0.0_DP + pl%ah(:,j) = 0.0_DP end associate end do else From 029ebc8b6cdea9548fb95c6aeed0aecaaca24cea Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 17:43:11 -0400 Subject: [PATCH 064/194] Made lbeg flag required instead of optional so I can correctly set beginning/ending states of pl variables --- src/helio/helio_kick.f90 | 26 ++++++++++++++++---------- src/modules/helio_classes.f90 | 4 ++-- src/modules/rmvs_classes.f90 | 2 +- src/modules/swiftest_classes.f90 | 4 ++-- src/modules/symba_classes.f90 | 4 ++-- src/modules/whm_classes.f90 | 4 ++-- src/rmvs/rmvs_kick.f90 | 8 ++++---- src/symba/symba_kick.f90 | 4 ++-- src/user/user_getacch.f90 | 2 +- src/whm/whm_kick.f90 | 23 +++++++++++++---------- 10 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index b1949ac2f..fa601b7f7 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -14,21 +14,27 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step associate(cb => system%cb, pl => self, npl => self%nbody) call pl%accel_int() if (param%loblatecb) then - cb%aoblbeg = cb%aobl call pl%accel_obl(system) - cb%aoblend = cb%aobl + if (lbeg) then + cb%aoblbeg = cb%aobl + else + cb%aoblend = cb%aobl + end if if (param%ltides) then - cb%atidebeg = cb%atide call pl%accel_tides(system) - cb%atideend = cb%atide + if (lbeg) then + cb%atidebeg = cb%atide + else + cb%atideend = cb%atide + end if end if end if - if (param%lextra_force) call pl%accel_user(system, param, t) + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) !if (param%lgr) call pl%gr_accel(param) end associate @@ -48,17 +54,17 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) - if (present(lbeg)) system%lbeg = lbeg + system%lbeg = lbeg if (system%lbeg) then call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) end if if (param%loblatecb) call tp%accel_obl(system) - if (param%lextra_force) call tp%accel_user(system, param, t) + if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) !if (param%lgr) call tp%gr_accel(param) end associate return @@ -86,7 +92,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) associate(pl => self, npl => self%nbody) if (npl ==0) return pl%ah(:,:) = 0.0_DP - call pl%accel(system, param, t) + call pl%accel(system, param, t, lbeg) if (lbeg) then call pl%set_beg_end(xbeg = pl%xh) else diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index c3dc0be62..2f8a52808 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -141,7 +141,7 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine helio_kick_getacch_pl module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) @@ -151,7 +151,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine helio_kick_getacch_tp module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index a459e7246..8b0ad2c2f 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -143,7 +143,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structuree class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine rmvs_kick_getacch_tp module subroutine rmvs_setup_pl(self,n) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7c160b780..417138122 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -310,7 +310,7 @@ subroutine abstract_accel(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine abstract_accel subroutine abstract_initialize(self, param) @@ -729,7 +729,7 @@ module subroutine user_kick_getacch_body(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine user_kick_getacch_body module subroutine util_coord_b2h_pl(self, cb) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 85c65de34..72fb06ae7 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -220,7 +220,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine symba_kick_getacch_pl module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) @@ -229,7 +229,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine symba_kick_getacch_tp module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index e30bd874f..46a4e3743 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -124,7 +124,7 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine whm_kick_getacch_pl !> Get heliocentric accelration of the test particle @@ -135,7 +135,7 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine whm_kick_getacch_tp module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index c68453d3d..6cba4caef 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -15,7 +15,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structuree class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals type(swiftest_parameters) :: param_planetocen real(DP), dimension(:, :), allocatable :: xh_original @@ -34,7 +34,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) class is (rmvs_cb) associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) - if (present(lbeg)) system_planetocen%lbeg = lbeg + system_planetocen%lbeg = lbeg if (system_planetocen%lbeg) then allocate(xhp, source=pl%xbeg) @@ -49,7 +49,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) param_planetocen%lextra_force = .false. param_planetocen%lgr = .false. ! Now compute the planetocentric values of acceleration - call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t) + call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t, lbeg) ! Now compute any heliocentric values of acceleration if (tp%lfirst) then @@ -66,7 +66,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) GMcb_original = cb%Gmass cb%Gmass = tp%cb_heliocentric%Gmass if (param%loblatecb) call tp%accel_obl(system_planetocen) - if (param%lextra_force) call tp%accel_user(system_planetocen, param, t) + if (param%lextra_force) call tp%accel_user(system_planetocen, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) tp%xh(:,:) = xh_original(:,:) cb%Gmass = GMcb_original diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 611ca99be..4da46f5a6 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -15,7 +15,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current simulation time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: k real(DP) :: irij3, rji2, rlim2, faci, facj @@ -59,7 +59,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: k real(DP) :: rji2, fac, rlim2 diff --git a/src/user/user_getacch.f90 b/src/user/user_getacch.f90 index ccad7ea7d..2775de3dd 100644 --- a/src/user/user_getacch.f90 +++ b/src/user/user_getacch.f90 @@ -13,7 +13,7 @@ module subroutine user_kick_getacch_body(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody_system_object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters user parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the ste + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the ste return end subroutine user_kick_getacch_body diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index c5a60452a..4a8b68330 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -14,7 +14,7 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: i real(DP), dimension(NDIM) :: ah0 @@ -33,9 +33,12 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) call pl%accel_int() if (param%loblatecb) then - cb%aoblbeg = cb%aobl call pl%accel_obl(system) - cb%aoblend = cb%aobl + if (lbeg) then + cb%aoblbeg = cb%aobl + else + cb%aoblend = cb%aobl + end if if (param%ltides) then cb%atidebeg = cb%aobl call pl%accel_tides(system) @@ -45,7 +48,7 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) if (param%lgr) call pl%accel_gr(param) - if (param%lextra_force) call pl%accel_user(system, param, t) + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) end associate return end subroutine whm_kick_getacch_pl @@ -63,16 +66,16 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest central body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time - logical, optional, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: i real(DP), dimension(NDIM) :: ah0 associate(tp => self, ntp => self%nbody, pl => system%pl, cb => system%cb, npl => system%pl%nbody) if (ntp == 0 .or. npl == 0) return - if (present(lbeg)) system%lbeg = lbeg + system%lbeg = lbeg - if (system%lbeg) then + if (lbeg) then ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) do i = 1, ntp tp%ah(:, i) = tp%ah(:, i) + ah0(:) @@ -87,7 +90,7 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) end if if (param%loblatecb) call tp%accel_obl(system) - if (param%lextra_force) call tp%accel_user(system, param, t) + if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) end associate return @@ -204,13 +207,13 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) if (pl%lfirst) then call pl%h2j(cb) pl%ah(:,:) = 0.0_DP - call pl%accel(system, param, t) + call pl%accel(system, param, t, lbeg) pl%lfirst = .false. end if call pl%set_beg_end(xbeg = pl%xh) else pl%ah(:,:) = 0.0_DP - call pl%accel(system, param, t) + call pl%accel(system, param, t, lbeg) call pl%set_beg_end(xend = pl%xh) end if do concurrent(i = 1:npl, mask(i)) From bff4f3ece67b8ad0ad6331acd732ff7c06294a1a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:36:02 -0400 Subject: [PATCH 065/194] Added index level code. --- .../swiftest_vs_swifter.ipynb | 252 +++++++++--------- src/symba/symba_step.f90 | 8 +- 2 files changed, 133 insertions(+), 127 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index f1f15c4cb..f6cfff954 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n",
    +       "       4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n",
    +       "       1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n",
    +       "       4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n",
    +       "       7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n",
    +       "       1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n",
    +       "       1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n",
    +       "       2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n",
    +       "       3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n",
    +       "       3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n",
    +       "       4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n",
    +       "       5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n",
    +       "       6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n",
    +       "       8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n",
    +       "       9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n",
    +       "       1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n",
    +       "       1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n",
    +       "       1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n",
    +       "       1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n",
    +       "       1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n",
            "...\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    -       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    -       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    -       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    -       "        3.88578059e-15,  4.10782519e-15,  1.02750769e-03,  1.03179676e-03,\n",
    -       "        1.03606675e-03,  1.04031758e-03,  1.04454916e-03,  1.04876143e-03,\n",
    -       "        1.05295429e-03,  1.05712769e-03,  1.06128153e-03,  1.06541574e-03,\n",
    -       "        1.06953025e-03,  1.07362498e-03,  1.07769985e-03])\n",
    +       "       4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n",
    +       "       4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n",
    +       "       4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n",
    +       "       5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n",
    +       "       5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n",
    +       "       5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n",
    +       "       6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n",
    +       "       6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n",
    +       "       7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n",
    +       "       7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n",
    +       "       8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n",
    +       "       8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n",
    +       "       9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n",
    +       "       9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n",
    +       "       1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n",
    +       "       1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n",
    +       "       1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n",
    +       "       1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n",
    +       "       1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n",
    +       "       1.53913603e-02, 1.58186428e-02,            nan])\n",
            "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n", + " 4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n", + " 1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n", + " 4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n", + " 7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n", + " 1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n", + " 1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n", + " 2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n", + " 3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n", + " 3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n", + " 4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n", + " 5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n", + " 6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n", + " 8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n", + " 9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n", + " 1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n", + " 1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n", + " 1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n", + " 1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n", + " 1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", - " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", - " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", - " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", - " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", - " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", - " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", - " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", - " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", - " 3.88578059e-15, 4.10782519e-15, 1.02750769e-03, 1.03179676e-03,\n", - " 1.03606675e-03, 1.04031758e-03, 1.04454916e-03, 1.04876143e-03,\n", - " 1.05295429e-03, 1.05712769e-03, 1.06128153e-03, 1.06541574e-03,\n", - " 1.06953025e-03, 1.07362498e-03, 1.07769985e-03])\n", + " 4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n", + " 4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n", + " 4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n", + " 5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n", + " 5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n", + " 5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n", + " 6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n", + " 6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n", + " 7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n", + " 7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n", + " 8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n", + " 8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n", + " 9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n", + " 9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n", + " 1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n", + " 1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n", + " 1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n", + " 1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n", + " 1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n", + " 1.53913603e-02, 1.58186428e-02, nan])\n", "Coordinates:\n", - " id int64 2\n", + " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, @@ -633,7 +633,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=2)" + "swiftdiff['px'].sel(id=100)" ] }, { diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 896af6ab4..1581d82c7 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -152,7 +152,13 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) call plplenc_list%kick(system, dth, irecp, sgn) call pltpenc_list%kick(system, dth, irecp, sgn) end if - + associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & + plind2 => plplenc_list%index2(1:plplenc_list%nenc), & + plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & + tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) + where(pl%levelg([plind1,plind2,plind3]) == irecp) pl%levelg(:) = ireci + where(tp%levelg(tpind) == irecp) tp%levelg(:) = ireci + end associate end do end select end select From 3e7462d65657cefc8f1578ae52c9e4f3934105ad Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:41:44 -0400 Subject: [PATCH 066/194] Added encounter list level change code --- .../swiftest_vs_swifter.ipynb | 254 +++++++++--------- src/symba/symba_step.f90 | 2 + 2 files changed, 129 insertions(+), 127 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index f6cfff954..5ecd1db22 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEGCAYAAABCa2PoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAApEUlEQVR4nO3deXxU9b3/8dcnYRMFWQQFAhIBkcUNI+ByQaUoqAUVa0EtuNxSqvS2tbbFcrt4e21p1V5rpVBUWrAKVdxifxS0ikVRlCiyiyyCBMIumxgg5PP74wx0jCGZJHPmTJL38/GYR+bM+X5n3idm/PA9y/eYuyMiIlJVGVEHEBGRmkEFRUREkkIFRUREkkIFRUREkkIFRUREkqJO1AFS4aSTTvL27dtHHUNEpFp57733trt7i0Tb14qC0r59e/Ly8qKOISJSrZjZ+oq01y4vERFJChUUERFJChUUERFJilpxDKU0hw4dIj8/n8LCwqijJFWDBg3Iysqibt26UUcRkVqm1haU/Px8GjVqRPv27TGzqOMkhbuzY8cO8vPzyc7OjjqOiNQytXaXV2FhIc2bN68xxQTAzGjevHmNG3WJSPVQawsKUKOKyRE1cZtEpHqo1QVFRKRGen8qfDAt5R+rghKSCy+8sNTXb7nlFmbMmJHiNCJSq7z5ECx/IeUfq4ISkrfeeivqCCJSG326DnaugdMuTflH19qzvMJ2wgknsG/fPtyd73znO7z22mtkZ2ejO2SKSKjWzAl+dkh9QdEIJWTPP/88K1euZMmSJTz66KMauYhIuNbOgcZt4KTTU/7RKighmzt3LsOGDSMzM5PWrVtz2WWXRR1JRGqq4sOw9l/B7q4IzvhUQUkBncorIimxaSEU7opkdxeooISuT58+TJ8+ncOHD1NQUMCcOXOijiQiNdWKXMioAx2i2RMSakExswFmttLMVpvZmFLWm5k9HFu/2Mx6xK2bbGZbzWzpMd77bjNzMzspzG2oqmuvvZZOnTpx5pln8u1vf5u+fftGHUlEaiJ3WPYCnHYJNGwWSYTQzvIys0xgPNAfyAcWmFmuuy+PazYQ6BR79AImxH4C/AV4BJhaynu3jb3vJ2Hlr6p9+/YBwe6uRx55JOI0IlLjFXwAu9ZDnx9GFiHMEUpPYLW7r3X3g8B0YHCJNoOBqR6YDzQxs1YA7j4X2HmM9/4/4EeAzsEVEQFY9nywu+uMqyKLEGZBaQNsiFvOj71W0TZfYGaDgI3uvqicdiPNLM/M8rZt25Z4ahGR6qa4GJY+H+nuLgi3oJR2alPJEUUibf7d2KwhMBb4WXkf7u6T3D3H3XNatGhRXnMRkepr3Ruw+xM4e1ikMcIsKPlA27jlLGBTJdrE6wBkA4vMbF2s/ftmdkqV04qIVFcL/wr1T4x0dxeEW1AWAJ3MLNvM6gFDgdwSbXKB4bGzvXoDu9294Fhv6O5L3L2lu7d39/YEBamHu28OaRtERNJb4e7gdOEzr4e6x0UaJbSC4u5FwGhgNrACeNrdl5nZKDMbFWs2E1gLrAYeBe440t/MpgFvA53NLN/Mbg8rq4hItbXkGSgqhHNvijpJuJNDuvtMgqIR/9rEuOcO3HmMvuXuDIyNUqqtDRs2MHz4cDZv3kxGRgYjR47ku9/9btSxRKS6cId3/gStz4XWPcpvHzLNNhyhOnXq8OCDD9KjRw/27t3LeeedR//+/enatWvU0USkOljzGmz/CK79UyRzd5WkqVci1KpVK3r0CP5V0ahRI7p06cLGjRsjTiUi1cY7f4LjW0K3a6NOAmiEAsC9Ly1j+aY9SX3Prq0b8/Ovdku4/bp161i4cCG9evUqv7GIyI41sGo29B0DdepHnQbQCCUt7Nu3jyFDhvDQQw/RuHHjqOOISHXw7iTIqAs5t0Wd5CiNUKBCI4lkO3ToEEOGDOGmm27iuuuuiyyHiFQjhXtg4ZPQ/TpodHLUaY7SCCVC7s7tt99Oly5duOuuu6KOIyLVxcIn4OBe6PWtqJN8gQpKhObNm8cTTzzBa6+9xjnnnMM555zDzJkzy+8oIrXXoUKY9zC0/w9oc17Uab5Au7widPHFFxNciiMikqCFT8C+zXDdpKiTfIlGKCIi1UXRQXjzIWjbC7L7RJ3mS1RQRESqi0VPwZ586POjtLiQsSQVFBGR6uDwIXjjd8E0Kx37RZ2mVCooIiLVweKnY7f4Tc/RCaigiIikv6ID8Po4aHU2dB4YdZpj0lleIiLpbsHjwR0ZB/0+bUcnoBFKpG677TZatmxJ9+7dj762c+dO+vfvT6dOnejfvz+ffvrp0XW//vWv6dixI507d2b27NlRRBaRVCvcDXPvh+y+0OGyqNOUSQUlQrfccguzZs36wmvjxo2jX79+rFq1in79+jFu3DgAli9fzvTp01m2bBmzZs3ijjvu4PDhw1HEFpFUeusP8PlO+Movok5SLhWUCPXp04dmzZp94bUXX3yRESNGADBixAheeOGFo68PHTqU+vXrk52dTceOHXn33XdTHVlEUmnvFnh7fDA9fZvob6BVHh1DAfjHGNi8JLnvecqZMHBchbtt2bKFVq1aAcH9UrZu3QrAxo0b6d2799F2WVlZuneKSE33+q/h8EG47KdRJ0lIqCMUMxtgZivNbLWZjSllvZnZw7H1i82sR9y6yWa21cyWluhzv5l9GGv/vJk1CXMb0kVpU7RYGh+cE5Eq2rwE3p8CObdD8w5Rp0lIaCMUM8sExgP9gXxggZnluvvyuGYDgU6xRy9gQuwnwF+AR4CpJd76FeAedy8ys98A9wA/rlLYSowkwnLyySdTUFBAq1atKCgooGXLlkAwItmwYcPRdvn5+bRu3TqqmCISJneYdQ80aAKX3hN1moSFOULpCax297XufhCYDgwu0WYwMNUD84EmZtYKwN3nAjtLvqm7v+zuRbHF+UBWaFsQgUGDBjFlyhQApkyZwuDBg4++Pn36dA4cOMDHH3/MqlWr6NmzZ5RRRSQsK3Jh3Rtw2Vg4rmnUaRIW5jGUNsCGuOV8/j36KKtNG6Agwc+4DfhbaSvMbCQwEqBdu3YJvl1qDRs2jNdff53t27eTlZXFvffey5gxY7jhhht4/PHHadeuHc888wwA3bp144YbbqBr167UqVOH8ePHk5mZGfEWiEjSHfocXv5vaNkNetwSdZoKCbOglLaDv+SBgETalP7mZmOBIuDJ0ta7+yRgEkBOTk5azhE/bdq0Ul9/9dVXS3197NixjB07NsxIIhK1tx6BXZ/A8FzIrF7nTYWZNh9oG7ecBWyqRJsvMbMRwNVAP9cNRUSkptj5MbzxAHQZBKf1jTpNhYV5DGUB0MnMss2sHjAUyC3RJhcYHjvbqzew293L3N1lZgMIDsIPcvf9YQQXEUk5d5j5Q8ioAwPS50ShigitoMQOnI8GZgMrgKfdfZmZjTKzUbFmM4G1wGrgUeCOI/3NbBrwNtDZzPLN7PbYqkeARsArZvaBmU2sQsbKdk1bNXGbRGqFFbmw+hW4dCyc2CbqNJUS6g46d59JUDTiX5sY99yBO4/Rd9gxXu+YjGwNGjRgx44dNG/evMZcz+Hu7NixgwYNGkQdRUQq4sDe4ALrU86EniOjTlNp1euITxJlZWWRn5/Ptm3boo6SVA0aNCArq0adSS1S8835FewtgK8/Ue0OxMervsmrqG7dumRnZ0cdQ0Rquw3vwvwJkHMbZOVEnaZKNDmkiEhUDhXCi3fCiVnQ/96o01RZrR2hiIhE7vVfw/aP4ObnoH6jqNNUmUYoIiJR2PgevPUwnPsN6Ngv6jRJoYIiIpJqRQfghTvhhFPgivuiTpM02uUlIpJqc++HbSvgxmegwYlRp0kajVBERFJp0wfwxu/g7GFw+uVRp0kqFRQRkVQ5uB+e+yac0BKu+FXUaZJOu7xERFLllZ8GZ3V94wVo2CzqNEmnEYqISCqsnAULHoMLRkOHS6NOEwoVFBGRsO3bGlzAeHJ36PezqNOERgVFRCRM7kExObgPhjwGdepHnSg0OoYiIhKmBY/Bqpdh4P3QskvUaUKlEYqISFg2Lw3uD9+xP/T8ZtRpQqeCIiIShgN74ZkR0KAJXDMBash9l8qiXV4iIsnmDi99F3auhREvwQktok6UEhqhiIgkW95kWPpscDvf9hdHnSZlQi0oZjbAzFaa2WozG1PKejOzh2PrF5tZj7h1k81sq5ktLdGnmZm9YmarYj+bhrkNIiIVUrAIZt0DHb8CF98VdZqUCq2gmFkmMB4YCHQFhplZ1xLNBgKdYo+RwIS4dX8BBpTy1mOAV929E/BqbFlEJHqFu+HpEdCwOVw7CTJq106gMLe2J7Da3de6+0FgOjC4RJvBwFQPzAeamFkrAHefC+ws5X0HA1Niz6cA14QRXkSkQoqL4YU7YNcncP1kOL551IlSLsyC0gbYELecH3utom1KOtndCwBiP1uW1sjMRppZnpnlbdu2rULBRUQq7M3fwYd/D27le+oFUaeJRJgFpbRz5LwSbSrF3Se5e46757RoUTvOsBCRiKx6BV77X+h+fTBXVy0VZkHJB9rGLWcBmyrRpqQtR3aLxX5urWJOEZHK27EGnr09mKdr0B9qxfUmxxJmQVkAdDKzbDOrBwwFcku0yQWGx8726g3sPrI7qwy5wIjY8xHAi8kMLSKSsAP74G83g2XA0L9CvYZRJ4pUaAXF3YuA0cBsYAXwtLsvM7NRZjYq1mwmsBZYDTwK3HGkv5lNA94GOptZvpndHls1DuhvZquA/rFlEZHUcofc0bDtw+AgfNP2USeKXKhXyrv7TIKiEf/axLjnDtx5jL7DjvH6DqBfEmOKiFTcGw/AsufhK7+ADpdFnSYt1K6TpEVEkmHZC8FB+LO+Dhd9L+o0aUMFRUSkIjYthOdHQVZP+OrDtfogfEkqKCIiidqzCaYNg+NPgqFPQt0GUSdKK5ptWEQkEQf3B8XkwF64bTacUOo11bWaCoqISHmKi+H5bwUTPw6bBqd0jzpRWlJBEREpz8tjYUUuXH4fdB4YdZq0pWMoIiJleesRmP9H6PVtuKDUqxwkRgVFRORYlj4bjE66DoYrfqUzusqhgiIiUpp1bwanB7e7oFbe26Qy9BsSESlp6wqYfiM0zYahT+n04ASpoIiIxNuzCf56PdRpADfPgIbNok5UbegsLxGRIz7/FJ78GhTuglv/AU3aRZ2oWlFBEREBOPgZPHkDbP8IbvwbtDor6kTVjgqKiEjRAZh+E2zMg69N0ezBlaSCIiK12+Gi4I6La+fA4D9C10FRJ6q2dFBeRGqv4mJ46b9gxUswYByce1PUiao1FRQRqZ3cYfY98MGTcMlPoPe3o05U7amgiEjt9Po4eGci9L4T+v4o6jQ1QqgFxcwGmNlKM1ttZmNKWW9m9nBs/WIz61FeXzM7x8zmm9kHZpZnZj3D3AYRqYHeeBD+NQ7OvRmuuE9TqiRJaAXFzDKB8cBAoCswzMy6lmg2EOgUe4wEJiTQ97fAve5+DvCz2LKISGLefAhe/R848wbdcTHJwhyh9ARWu/tadz8ITAcGl2gzGJjqgflAEzNrVU5fBxrHnp8IbApxG0SkJpn3MPzz59D9erhmAmRkRp2oRgnztOE2wIa45XygVwJt2pTT93vAbDN7gKAgXljah5vZSIJRD+3a6WpXkVrv7fHwyk+h23Vw7Z8gU1dNJFuYI5TSxpGeYJuy+n4b+L67twW+Dzxe2oe7+yR3z3H3nBYtWiQYWURqpPkTYPZPgmnor3tUxSQkYRaUfKBt3HIWX949daw2ZfUdATwXe/4Mwe4xEZHSvTMJZo2BLl+FIY+rmIQozIKyAOhkZtlmVg8YCuSWaJMLDI+d7dUb2O3uBeX03QT0jT2/DFgV4jaISHU2fwL844fQ+SoYMhky60adqEYLrVS7e5GZjQZmA5nAZHdfZmajYusnAjOBK4HVwH7g1rL6xt76m8DvzawOUEjsOImIyBfMfQBe+yWccTVc/2eoUy/qRDWeuZc8rFFKI7Pb3f3xuOVM4L/d/d4wwyVLTk6O5+XlRR1DRFLBHV77X3jjATjza3DNRO3mqiQze8/dcxJtn+gur35mNtPMWplZd2A+0KhSCUVEwuIOs8cGxaTHcJ3NlWIJ/abd/UYz+zqwhGDX1DB3nxdqMhGRiiguhpk/gLzJ0PNbwWSPug98SiX02zazTsB3gWeBdcA3zKxhiLlERBJ3uAhevCMoJhd9Dwb+RsUkAomOBV8C7nT3V83MCK7/WAB0Cy2ZiEgiDhXCc/8ZTEF/yU+CiR41nUokEi3hPYGzzew5YAbBRYZDQ0slIpKIwj3w5PVBMbni13DJj1VMIpToCOUxYC/wh9jyMOAC4IYwQomIlGvfVvjrENi6PLj6/Sz97yhqiRaUzu5+dtzyHDNbFEYgEZFyfboOnrgW9hTAsOnQqX/UiYTEd3ktjF3JDoCZ9QJ0lpeIpN7mpfD45bB/J4zIVTFJI4mOUHoRTJHySWy5HbDCzJYA7u5nhZJORCTe+rfgqaFQ73i4bRa07BJ1IomTaEEZEGoKEZHyLH0Wnh8FTU6FbzwHTXRbinST6IWN68MOIiJSKneY9xD88xfQ7kIY+iQ0bBZ1KimF5iQQkfR1uCiYLThvMnQfAoP/CHUbRJ1KjkEFRUTS04F9MOM2WDU7uPq938919XuaU0ERkfSzdws89TXYvASu/j/IuS3qRJIAFRQRSS8Fi2DajfD5p8E1JqdfEXUiSZDGjyKSPpa/CJMHAA63/UPFpJrRCEVEoucOc++HOfdB1vnw9Seh0clRp5IKCnWEYmYDzGylma02szGlrDczezi2frGZ9Uikr5l9J7ZumZn9NsxtEJGQHfo8OPg+5z44ayiM+LuKSTUV2ggldpvg8UB/IB9YYGa57r48rtlAoFPs0QuYAPQqq6+ZXQoMBs5y9wNm1jKsbRCRkO3ZBNNvhE0fwFd+EZzNpdmCq60wd3n1BFa7+1oAM5tOUAjiC8pgYKoHN7afb2ZNzKwV0L6Mvt8Gxrn7AQB33xriNohIWDa+Fxx8P7gPhj4FZ1wZdSKpojB3ebUBNsQt58deS6RNWX1PB/7DzN4xs3+Z2flJTS0i4Vv0N/jzlVCnHtz+sopJDRHmCKW0casn2KasvnWApkBv4HzgaTM7LTbK+fcbm40ERgK0a6c5f0TSQtFBmP0TWPAonHoR3DAVjj8p6lSSJGGOUPKBtnHLWcCmBNuU1TcfeM4D7wLFwJf+It19krvnuHtOixYtqrQhIpIEewpgytVBMblgNAx/UcWkhgmzoCwAOplZtpnVI7hlcG6JNrkE0+Jb7H4ru929oJy+LwCXAZjZ6UA9YHuI2yEiVbVuHvypT3Avk+snwxX3QWbdqFNJkoW2y8vdi8xsNDAbyAQmu/syMxsVWz8RmAlcCawG9gO3ltU39taTgclmthQ4CIwoubtLRNKEO8yfAC//NzRtH9wQS/cwqbGsNvy/OCcnx/Py8qKOIVK7HPwMcv8Lls6AzlfBtROgwYlRp5IKMLP33D0n0fa6Ul5Ekm/bR/DMCNj2IfT7GVz0fc0UXAuooIhIcn0wDf7fXVD3OLhpBnTsF3UiSREVFBFJjoOfwf+7GxY9BadeDEMeg8atok4lKaSCIiJVt2UZPHMLbF8FfX8cPDIyo04lKaaCIiKV5w7vT4F//Dg44D78RTitb9SpJCIqKCJSOYV74O/fg6XPwmmXwnWT4ATN1VqbqaCISMVteBeeGwm71sNlP4WL79JZXKKCIiIVcLgouBHW3PuhcRu4ZSacekHUqSRNqKCISGJ2rAlGJRvz4OxhMPA3ulBRvkAFRUTK5g7vT4VZ90BmHbj+z9D9uqhTSRpSQRGRY/tsB7z0X/Dh3yG7D1wzEU4seVsjkYAKioiU7qOXIXc0fP4pXP6/0PtOHXiXMqmgiMgXfb4ruAnWB09Ciy5w87NwyplRp5JqQAVFRP5t1SvBDMH7tsB//CC44r1O/ahTSTWhgiIisVHJWPjgr9DiDBj6JLTpEXUqqWZUUERqu1X/hNzvwL7NwQWKl4zRqEQqRQVFpLb6/NPgTooLj4xK/gptzos6lVRjKigitY07LHs+mNBx/w64+PvQdwzUbRB1MqnmQj0H0MwGmNlKM1ttZmNKWW9m9nBs/WIz61GBvnebmZvZSWFug0iNsmsDTBsKM26Fxq1h5Bz4yi9UTCQpQhuhmFkmMB7oD+QDC8ws192XxzUbCHSKPXoBE4Be5fU1s7axdZ+ElV+kRik+DO9Ogld/CThc8Svo+a3gyneRJAnzr6knsNrd1wKY2XRgMBBfUAYDU93dgflm1sTMWgHty+n7f8CPgBdDzC9SMxQsDq5237QQOvaHqx6EpqdGnUpqoDALShtgQ9xyPsEopLw2bcrqa2aDgI3uvsjMjvnhZjYSGAnQrl27ym2BSHV2YB/86zfw9nho2AyGPA7dh0AZ3xuRqgizoJT2V+sJtin1dTNrCIwFLi/vw919EjAJICcnp+TnitRcRw66zx4LezfBuTdD/18GRUUkRGEWlHygbdxyFrApwTb1jvF6ByAbODI6yQLeN7Oe7r45qelFqqNtH8HMu+HjfwXTpdwwBdr2jDqV1BJhFpQFQCczywY2AkOBG0u0yQVGx46R9AJ2u3uBmW0rra+7LwOO3mPUzNYBOe6+PcTtEEl/B/bB3N/C23+Eug3hygcg5zbIyIw6mdQioRUUdy8ys9HAbCATmOzuy8xsVGz9RGAmcCWwGtgP3FpW37CyilRb7rD8BZj1k2D31jk3B6cBn9Ai6mRSC1lwglXNlpOT43l5eVHHEEmugsXBrMDr3gh2b135ILQred6LSOWZ2XvunpNoe52ELlLd7NsKr/0S3n8Cjmuq3VuSNlRQRKqLQ4Uw/4/wxu+g6HPofQf0/WFQVETSgAqKSLpzh+Uvwis/hV2fQOcrg9OAT+oYdTKRL1BBEUln+Xnw8k/hk7egZTcY/iKcdknUqURKpYIiko62r4JX/wdW5MLxLeDqh6DHcB0nkbSmgiKSTvZuhtfHwftToe5xcMk9cMGdUL9R1MlEyqWCIpIOCnfDvN8HFyYWF8H5/wl9fqjrSaRaUUERidKhz2HB4/DGA8EdFM/8Glw6FpplR51MpMJUUESicKgQ3p8CbzwI+7ZAh8uCK9xbnR11MpFKU0ERSaWiA7DwCZj7YDBVyqkXw/V/hvYXRZ1MpMpUUERS4fAh+OApmHs/7N4AbXvBtRMhu4/uTyI1hgqKSJiKDsLi6TD3Adi1HtqcB199CDr0UyGRGkcFRSQMhz4PTv2d9zDsyQ+OjQz8LZx+hQqJ1FgqKCLJVLgH8h4Pbrv72TZo2zsYkXT8igqJ1HgqKCLJsH8nvPMneGdCcE3JaZdCn7vh1ItUSKTWUEERqYpP18M7E4PdWwf3QeeroM8PgmMlIrWMCopIZWx8H976QzALsBl0uw4u/h6c3C3qZCKRUUERSVRxMax6OSgk69+E+o2DebZ6jYIT20SdTiRyGWG+uZkNMLOVZrbazMaUst7M7OHY+sVm1qO8vmZ2v5l9GGv/vJk1CXMbRDi4H977C/yxF0z7Ony6Di6/D76/DC7/pYqJSExoIxQzywTGA/2BfGCBmeW6+/K4ZgOBTrFHL2AC0Kucvq8A97h7kZn9BrgH+HFY2yG12KfrYMFjwa12C3fBKWfBdY9Bt2sgs27E4UTST5i7vHoCq919LYCZTQcGA/EFZTAw1d0dmG9mTcysFdD+WH3d/eW4/vOB60PcBqlt3GHt6/DuJFj5D7AM6PJV6PUtaHeBztgSKUOYBaUNsCFuOZ9gFFJemzYJ9gW4DfhbaR9uZiOBkQDt2rWrSG6pjQ7shUXT4d1HYftKaHgS/McPIOc27dISSVCYBaW0f8p5gm3K7WtmY4Ei4MnSPtzdJwGTAHJyckp+rkhg08Lg+MiSGcFpv63PhWsmQrdroW6DqNOJVCthFpR8oG3cchawKcE29crqa2YjgKuBfrHdZSKJK9wDS2cEhaRgEdQ5DroPgfNugawc7dYSqaQwC8oCoJOZZQMbgaHAjSXa5AKjY8dIegG73b3AzLYdq6+ZDSA4CN/X3feHmF9qEnfY9H5sNPIsHPoMTu4OVz4Q3NTquCZRJxSp9kIrKLGzsEYDs4FMYLK7LzOzUbH1E4GZwJXAamA/cGtZfWNv/QhQH3jFgn9Jznf3UWFth1RzezfD4qdh0TTYuhzqNoyNRm6FNj00GhFJIqsNe4xycnI8Ly8v6hiSKocKYeXM4P4ja14FL4as8+HsYXDm9dDgxKgTilQLZvaeu+ck2l5XykvN4A75C4KRyNJngwkaG7eBi78fFJKTOkWdUKTGU0GR6ssdtiwLDrAvfRZ2fRIcYO86KCgi2X0gIzPqlCK1hgqKVD871gQFZMmM4JoRy4QOl8IlP4EzroIGjaNOKFIrqaBI9bBzLax4CZY+BwUfAAanXhhcwd71Gji+ecQBRUQFRdKTe3BW1oqXgseWpcHrrc8NJmbsdq2uYBdJMyookj6Ki4Mr11fkBkVk5xrAoF1vuOLX0OVqaKJpdETSlQqKROvAXlgzB1bNhlWvwL4tkFEnOKB+4ejgDoiNTo46pYgkQAVFUm/HmuBGVR/NgnXzoPgQ1D8ROvaD068IHsc1jTqliFSQCoqEr3APrHsT1s6BNa/BjtXB6yd1ht6j4PQB0LaX7jEiUs2poEjyHS6Cje/FCsic4IJDPxxcI9L+Ijj/m3D65dDstKiTikgSqaBI1R0ugs2LYf28YBfW+nlwYA9g0PocuOi7wXUibXtBnfpRpxWRkKigSMUVHQzOxlr/Jqx/Cz55Bw7uDdY16xCc0tvhUsjuCw2bRZtVRFJGBUXKt3dLsNsq/13Iz4ON70PR58G6FmfAWTcEFxmeehE0bhVtVhGJjAqKfNHB/cH8WPkLYo882P1JsC6jLrQ6O7gR1akXBo/jT4o0roikDxWU2uzzXbB5SXD8o2BR8Nj+UTDdO0DjLGh7fnAmVtb5cMpZui2uiByTCkptUHQwOFV32wrY+mHwc/MS+HTdv9s0ahWMProMglZnQZvzoHHryCKLSPWjglKTFO4OLhrcuTYoIFtXBI+da6C4KGhjGcHpuqecBed+A1qdExSQE1pGGl1Eqj8VlOqk+HBwS9vd+bB7A+z8OCgWR4rI/u1xjQ2aZUOLLsEcWC26QMszoHkn7bYSkVCEWlDMbADwe4L7wj/m7uNKrLfY+isJ7il/i7u/X1ZfM2sG/A1oD6wDbnD3T8PcjpQ4sC+Yx+qzbbBva/B8b0FQPHZtCH7u3fTvkcYRjdsEI44zroLmHYLnzToExaTucdFsi4jUSqEVFDPLBMYD/YF8YIGZ5br78rhmA4FOsUcvYALQq5y+Y4BX3X2cmY2JLf84rO1ISHExFBXCoc/h0P64n/uDA9+Fu4LdUUeeH/m5fyd8tjUoIIf2f/l9M+oExzFObAunXgAnZsUebYNC0rQ91GuYwg0VETm2MEcoPYHV7r4WwMymA4OB+IIyGJjq7g7MN7MmZtaKYPRxrL6DgUti/acArxNSQZkz6W5O3zKLDA6TQTEZFJPp/36e4Yep64eoz4GE3/MzO57PMo7nM2vEvoxG7M7IZle9c9ndoBm7MpqwO7MpuzKasjujCbszmuCWCQeBbbHHUbuBRcndYBGpcbq2bszPv9otJZ8VZkFpA2yIW84nGIWU16ZNOX1PdvcCAHcvMLNSjyab2UhgJEC7dpW7h8beus1ZXzc7KB+WQTGZR58fjj0/ZPU4YPU5aA04YPVjz+tTaA04aPX5LOME9tvx7MtoxH5rGBQIEZEaKMyCYqW85gm2SaRvmdx9EjAJICcnp0J9jxh06z2V6SYiUitlhPje+UDbuOUsYFOCbcrquyW2W4zYz61JzCwiIpUUZkFZAHQys2wzqwcMBXJLtMkFhlugN7A7tjurrL65wIjY8xHAiyFug4iIJCi0XV7uXmRmo4HZBKf+Tnb3ZWY2KrZ+IjCT4JTh1QSnDd9aVt/YW48Dnjaz24FPgK+FtQ0iIpI4C06wqtlycnI8Ly8v6hgiItWKmb3n7jmJtg9zl5eIiNQiKigiIpIUKigiIpIUKigiIpIUteKgvJltA9ZXsvtJwPZyW6UXZU4NZU4NZU6N0jKf6u4tEn2DWlFQqsLM8ipylkM6UObUUObUUObUSEZm7fISEZGkUEEREZGkUEEp36SoA1SCMqeGMqeGMqdGlTPrGIqIiCSFRigiIpIUKigiIpIUtbqgmNkAM1tpZqtj96cvud7M7OHY+sVm1iPRvumW2czamtkcM1thZsvM7LvpnDdufaaZLTSzv6cib1Uzx25jPcPMPoz9ri+oBpm/H/ubWGpm08ysQZpkPsPM3jazA2Z2d0X6plvmqL5/Vckctz7x76C718oHwbT4a4DTgHoEN2jvWqLNlcA/CO4g2Rt4J9G+aZi5FdAj9rwR8FHYmauSN279XcBTwN/T/e8itm4K8J+x5/WAJumcmeB22x8Dx8WWnwZuSZPMLYHzgfuAuyvSNw0zp/z7V9XMcesT/g7W5hFKT2C1u69194PAdGBwiTaDgakemA80seAukYn0TavM7l7g7u8DuPteYAXB/0zSMi+AmWUBVwGPhZwzKZnNrDHQB3gcwN0PuvuudM4cW1cHOM7M6gAN+fKdVSPJ7O5b3X0BcKiifdMtc0Tfvyplhop/B2tzQWkDbIhbzufL/4GP1SaRvmGoSuajzKw9cC7wTvIjVixLOW0eAn4EFIeUrzRVyXwasA34c2wXwWNmdnyYYcvJU24bd98IPEBws7oCgrumvhxi1jLzpKBvVSTlc1P4/YOqZ36ICnwHa3NBsVJeK3kO9bHaJNI3DFXJHKw0OwF4Fvieu+9JYrbSVDqvmV0NbHX395Ifq0xV+R3XAXoAE9z9XOAzIBX796vye25K8C/WbKA1cLyZ3ZzkfKWpynconb9/Zb9Bar9/UIXMlfkO1uaCkg+0jVvO4stD/WO1SaRvGKqSGTOrS/DH/KS7PxdiznKzJNDmImCQma0jGKZfZmZ/DS9quXkSaZMP5Lv7kX95ziAoMGGrSuavAB+7+zZ3PwQ8B1wYYtby8oTdtyqq9LkRfP+gapkr/h0M+6BQuj4I/jW5luBfZkcOVnUr0eYqvngg891E+6ZhZgOmAg9Vh99xiTaXkLqD8lXKDLwBdI49/wVwfzpnBnoBywiOnRjBSQXfSYfMcW1/wRcPcKft96+MzCn//lU1c4l1CX0HU7Zh6fggOPPlI4KzIMbGXhsFjIr7IxgfW78EyCmrbzpnBi4mGOouBj6IPa5M17wl3iOhP+Z0yAycA+TFfs8vAE2rQeZ7gQ+BpcATQP00yXwKwb+w9wC7Ys8bH6tvOmeO6vtX1d9z3Hsk9B3U1CsiIpIUtfkYioiIJJEKioiIJIUKioiIJIUKioiIJIUKioiIJIUKikgFxWYUviNuubWZzQjps64xs5+V0+YBM7ssjM8XqQidNixSQbG5mP7u7t1T8FlvAYPcfXsZbU4FHnX3y8POI1IWjVBEKm4c0MHMPjCz+82svZktBTCzW8zsBTN7ycw+NrPRZnZXbLLI+WbWLNaug5nNMrP3zOwNMzuj5IeY2enAAXffbmaNYu9XN7ausZmtM7O67r4eaG5mp6TwdyDyJSooIhU3Bljj7ue4+w9LWd8duJFg6vD7gP0eTBb5NjA81mYSwRQn5wF3A38s5X0uAuKnPH+dYAoVgKHAsx7Mv0Ws3UVV3C6RKqkTdQCRGmhOrADsNbPdwEux15cAZ8VmnL0QeMbs6GSw9Ut5n1YE0+Ef8RjBVOIvALcC34xbt5VgtmCRyKigiCTfgbjnxXHLxQTfuQxgl7ufU877fA6ceGTB3efFdq/1BTLdfWlc2wax9iKR0S4vkYrbS3Ab10rx4D4YH5vZ1+Do/d7PLqXpCqBjidemAtOAP5d4/XSCyR1FIqOCIlJB7r4DmGdmS83s/kq+zU3A7Wa2iGD6+NJuYTsXONfi9osBTwJNCYoKcPQ+Gx0JZjkWiYxOGxZJY2b2e+Ald/9nbPl6YLC7fyOuzbVAD3f/aUQxRQAdQxFJd78iuAkWZvYHYCDB/S3i1QEeTHEukS/RCEVERJJCx1BERCQpVFBERCQpVFBERCQpVFBERCQpVFBERCQp/j8W9+CPxM7YUgAAAABJRU5ErkJggg==\n", "text/plain": [ "
    " ] @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n",
    -       "       4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n",
    -       "       1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n",
    -       "       4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n",
    -       "       7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n",
    -       "       1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n",
    -       "       1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n",
    -       "       2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n",
    -       "       3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n",
    -       "       3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n",
    -       "       4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n",
    -       "       5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n",
    -       "       6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n",
    -       "       8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n",
    -       "       9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n",
    -       "       1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n",
    -       "       1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n",
    -       "       1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n",
    -       "       1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n",
    -       "       1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n",
    +       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
            "...\n",
    -       "       4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n",
    -       "       4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n",
    -       "       4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n",
    -       "       5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n",
    -       "       5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n",
    -       "       5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n",
    -       "       6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n",
    -       "       6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n",
    -       "       7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n",
    -       "       7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n",
    -       "       8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n",
    -       "       8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n",
    -       "       9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n",
    -       "       9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n",
    -       "       1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n",
    -       "       1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n",
    -       "       1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n",
    -       "       1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n",
    -       "       1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n",
    -       "       1.53913603e-02, 1.58186428e-02,            nan])\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    +       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    +       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    +       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    +       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    +       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    +       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    +       "        3.88578059e-15,  4.10782519e-15,  5.55111512e-15,  7.54951657e-15,\n",
    +       "        8.21565038e-15,  9.43689571e-15,  1.12132525e-14,  1.18793864e-14,\n",
    +       "        1.23234756e-14,  1.39888101e-14,  1.75415238e-14,  3.00870440e-14,\n",
    +       "        4.03010958e-14,  4.11892742e-14,  7.31636973e-14])\n",
            "Coordinates:\n",
    -       "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([0.00000000e+00, 2.74036222e-07, 1.15852614e-06, 2.65236928e-06,\n", - " 4.75447829e-06, 7.46377922e-06, 1.07792117e-05, 1.46997292e-05,\n", - " 1.92242994e-05, 2.43519045e-05, 3.00815415e-05, 3.64122226e-05,\n", - " 4.33429755e-05, 5.08728442e-05, 5.90008888e-05, 6.77261864e-05,\n", - " 7.70478318e-05, 8.69649372e-05, 9.74766335e-05, 1.08582071e-04,\n", - " 1.20280418e-04, 1.32570865e-04, 1.45452623e-04, 1.58924922e-04,\n", - " 1.72987017e-04, 1.87638184e-04, 2.02877723e-04, 2.18704958e-04,\n", - " 2.35119239e-04, 2.52119940e-04, 2.69706461e-04, 2.87878232e-04,\n", - " 3.06634709e-04, 3.25975376e-04, 3.45899748e-04, 3.66407370e-04,\n", - " 3.87497820e-04, 4.09170706e-04, 4.31425670e-04, 4.54262388e-04,\n", - " 4.77680572e-04, 5.01679968e-04, 5.26260360e-04, 5.51421570e-04,\n", - " 5.77163459e-04, 6.03485927e-04, 6.30388915e-04, 6.57872406e-04,\n", - " 6.85936427e-04, 7.14581045e-04, 7.43806377e-04, 7.73612583e-04,\n", - " 8.03999870e-04, 8.34968493e-04, 8.66518758e-04, 8.98651020e-04,\n", - " 9.31365684e-04, 9.64663210e-04, 9.98544111e-04, 1.03300895e-03,\n", - " 1.06805836e-03, 1.10369301e-03, 1.13991364e-03, 1.17672105e-03,\n", - " 1.21411610e-03, 1.25209971e-03, 1.29067287e-03, 1.32983661e-03,\n", - " 1.36959205e-03, 1.40994038e-03, 1.45088283e-03, 1.49242073e-03,\n", - " 1.53455547e-03, 1.57728851e-03, 1.62062137e-03, 1.66455567e-03,\n", - " 1.70909310e-03, 1.75423542e-03, 1.79998446e-03, 1.84634216e-03,\n", + "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", "...\n", - " 4.30823098e-03, 4.38328010e-03, 4.45913106e-03, 4.53579222e-03,\n", - " 4.61327223e-03, 4.69158001e-03, 4.77072480e-03, 4.85071614e-03,\n", - " 4.93156391e-03, 5.01327831e-03, 5.09586993e-03, 5.17934970e-03,\n", - " 5.26372898e-03, 5.34901950e-03, 5.43523346e-03, 5.52238349e-03,\n", - " 5.61048270e-03, 5.69954471e-03, 5.78958366e-03, 5.88061426e-03,\n", - " 5.97265178e-03, 6.06571214e-03, 6.15981192e-03, 6.25496836e-03,\n", - " 6.35119948e-03, 6.44852405e-03, 6.54696168e-03, 6.64653286e-03,\n", - " 6.74725905e-03, 6.84916266e-03, 6.95226722e-03, 7.05659737e-03,\n", - " 7.16217900e-03, 7.26903930e-03, 7.37720688e-03, 7.48671187e-03,\n", - " 7.59758603e-03, 7.70986288e-03, 7.82357787e-03, 7.93876850e-03,\n", - " 8.05547452e-03, 8.17373814e-03, 8.29360420e-03, 8.41512048e-03,\n", - " 8.53833795e-03, 8.66331107e-03, 8.79009816e-03, 8.91876181e-03,\n", - " 9.04936932e-03, 9.18199325e-03, 9.31671202e-03, 9.45361060e-03,\n", - " 9.59278135e-03, 9.73432493e-03, 9.87835148e-03, 1.00249819e-02,\n", - " 1.01743494e-02, 1.03266016e-02, 1.04819024e-02, 1.06404352e-02,\n", - " 1.08024063e-02, 1.09680487e-02, 1.11376282e-02, 1.13114500e-02,\n", - " 1.14898675e-02, 1.16732947e-02, 1.28771928e-02, 1.30765110e-02,\n", - " 1.32826154e-02, 1.34963967e-02, 1.37189875e-02, 1.39518693e-02,\n", - " 1.41970511e-02, 1.44573900e-02, 1.47372237e-02, 1.50438063e-02,\n", - " 1.53913603e-02, 1.58186428e-02, nan])\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", + " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", + " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", + " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", + " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", + " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", + " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", + " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", + " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", + " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", + " 3.88578059e-15, 4.10782519e-15, 5.55111512e-15, 7.54951657e-15,\n", + " 8.21565038e-15, 9.43689571e-15, 1.12132525e-14, 1.18793864e-14,\n", + " 1.23234756e-14, 1.39888101e-14, 1.75415238e-14, 3.00870440e-14,\n", + " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", "Coordinates:\n", - " id int64 100\n", + " id int64 2\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, @@ -633,7 +633,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=100)" + "swiftdiff['px'].sel(id=2)" ] }, { diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 1581d82c7..2eecdacc3 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -159,6 +159,8 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) where(pl%levelg([plind1,plind2,plind3]) == irecp) pl%levelg(:) = ireci where(tp%levelg(tpind) == irecp) tp%levelg(:) = ireci end associate + where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci + where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci end do end select end select From ef3915c85c2539b0152b5a7b40ad2a75f1549b25 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 19:48:01 -0400 Subject: [PATCH 067/194] Added mask to pltp/pl encounter check. --- .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 14 +++++++------- src/symba/symba_encounter_check.f90 | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 5ecd1db22..2023b522a 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -509,7 +509,7 @@ " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", "Coordinates:\n", " id int64 2\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", @@ -627,7 +627,7 @@ " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 17383f9c0..796df5d4a 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -82,7 +82,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - do i = 1, self%nenc + do concurrent(i = 1:self%nenc, self%status(i) == ACTIVE .and. self%level(i) == irec - 1) associate(index_i => self%index1(i), index_j => self%index2(i)) if (isplpl) then xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) From a816f9acaf622856c0aff3f1b83c74fb43080906 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 23:25:34 -0400 Subject: [PATCH 068/194] Changed incorrect pl%mass to pl%Gmass --- src/symba/symba_kick.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 4da46f5a6..e58e575b8 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -160,9 +160,9 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) ir3 = 1.0_DP / (r2 * sqrt(r2)) fac = ir3 end if - faci = fac * pl%mass(i) + faci = fac * pl%Gmass(i) if (isplpl) then - facj = fac * pl%mass(j) + facj = fac * pl%Gmass(j) pl%ah(:,i) = pl%ah(:,i) + facj*dx(:) pl%ah(:,j) = pl%ah(:,j) - faci*dx(:) else From 25b141400e5bf5cf45f03cd74921961a17fcba68 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 26 Jul 2021 23:26:58 -0400 Subject: [PATCH 069/194] Updated example notebook --- .../swiftest_vs_swifter.ipynb | 252 +++++++++--------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 2023b522a..c40b98435 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -466,90 +466,90 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    +       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
            "...\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        0.00000000e+00,  3.33066907e-16,  4.44089210e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16,  1.11022302e-16,  3.33066907e-16, -1.11022302e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n",
    -       "       -7.77156117e-16, -4.44089210e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "       -1.11022302e-16,  0.00000000e+00,  3.33066907e-16,  1.11022302e-16,\n",
    -       "        1.11022302e-16, -2.22044605e-16,  0.00000000e+00, -5.55111512e-16,\n",
    -       "       -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n",
    -       "       -3.33066907e-16,  2.22044605e-16,  0.00000000e+00,  0.00000000e+00,\n",
    -       "        2.22044605e-16,  1.11022302e-16,  2.22044605e-16, -1.11022302e-16,\n",
    -       "        3.33066907e-16,  6.66133815e-16,  8.88178420e-16,  1.22124533e-15,\n",
    -       "        3.88578059e-15,  4.10782519e-15,  5.55111512e-15,  7.54951657e-15,\n",
    -       "        8.21565038e-15,  9.43689571e-15,  1.12132525e-14,  1.18793864e-14,\n",
    -       "        1.23234756e-14,  1.39888101e-14,  1.75415238e-14,  3.00870440e-14,\n",
    -       "        4.03010958e-14,  4.11892742e-14,  7.31636973e-14])\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    +       "       2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n",
    +       "       6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n",
    +       "       1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n",
    +       "       3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n",
            "Coordinates:\n",
            "    id        int64 2\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 1.11022302e-16,\n", - " 1.11022302e-16, 1.11022302e-16, 3.33066907e-16, -1.11022302e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -2.22044605e-16, -5.55111512e-16,\n", - " -3.33066907e-16, -4.44089210e-16, -5.55111512e-16, -4.44089210e-16,\n", - " -7.77156117e-16, -4.44089210e-16, 0.00000000e+00, 0.00000000e+00,\n", - " -1.11022302e-16, 0.00000000e+00, 3.33066907e-16, 1.11022302e-16,\n", - " 1.11022302e-16, -2.22044605e-16, 0.00000000e+00, -5.55111512e-16,\n", - " -3.33066907e-16, -1.11022302e-16, -4.44089210e-16, -4.44089210e-16,\n", - " -3.33066907e-16, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00,\n", - " 2.22044605e-16, 1.11022302e-16, 2.22044605e-16, -1.11022302e-16,\n", - " 3.33066907e-16, 6.66133815e-16, 8.88178420e-16, 1.22124533e-15,\n", - " 3.88578059e-15, 4.10782519e-15, 5.55111512e-15, 7.54951657e-15,\n", - " 8.21565038e-15, 9.43689571e-15, 1.12132525e-14, 1.18793864e-14,\n", - " 1.23234756e-14, 1.39888101e-14, 1.75415238e-14, 3.00870440e-14,\n", - " 4.03010958e-14, 4.11892742e-14, 7.31636973e-14])\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", + " 2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n", + " 6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n", + " 1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n", + " 3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n", "Coordinates:\n", " id int64 2\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } From be6e542b74ad49380127c36ac337abae70395a81 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 07:54:34 -0400 Subject: [PATCH 070/194] Improved io error handling and added rhill to the list binary output files and reinabled it in the swiftest parameter input --- .../1pl_1tp_encounter/init_cond.py | 4 +- .../1pl_1tp_encounter/param.swiftest.in | 1 + .../1pl_1tp_encounter/pl.swifter.in | 2 +- .../1pl_1tp_encounter/pl.swiftest.in | Bin 160 -> 176 bytes .../swiftest_vs_swifter.ipynb | 262 +++++++++--------- python/swiftest/swiftest/io.py | 17 +- python/swiftest/swiftest/simulation_class.py | 1 + src/io/io.f90 | 114 ++++---- src/setup/setup.f90 | 4 +- 9 files changed, 207 insertions(+), 198 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index b292ed42f..5ef0d4df7 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -55,7 +55,7 @@ p_tp = np.array([atp, 0.0, 0.0], dtype=np.double) v_tp = np.array([0.0, vtp, 0.0], dtype=np.double) -Rhill = apl * 0.0100447248332378922085 +Rhill = np.double(apl * 0.0100447248332378922085) #Make Swifter files plfile = open(swifter_pl, 'w') @@ -126,6 +126,7 @@ plfile.write_record(v_pl[1]) plfile.write_record(v_pl[2]) plfile.write_record(mass) +plfile.write_record(Rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(swiftest_tp, 'w') @@ -171,6 +172,7 @@ print(f'MU2KG {MU2KG}') print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') +print(f'RHILL_PRESENT yes') diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in index 36937896f..f2a1422d1 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -27,3 +27,4 @@ GR no MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 +RHILL_PRESENT yes diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in index 95513c9fd..17d461561 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swifter.in @@ -2,7 +2,7 @@ 1 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 -2 0.00012002693582795244940133 0.010044724833237891545 +2 0.00012002693582795244940133 0.010044724833237892 4.25875607065041e-05 1.0 0.0 0.0 0.0 6.283185307179586 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/pl.swiftest.in index 6f4bc1337f56833a126ada00c5685c950d805447..c94c6ae61581655ba2acb43d632ec99b4c8d1cc3 100644 GIT binary patch delta 35 lcmZ3$xPfuP6q(ga>{UZ1wb*koFff3ykokl{#t=3z9{{*62kQU; delta 19 acmdnMxPWoO6dob-35ARyZ1x-s3=9A{sswKU diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index c40b98435..8d8d319fa 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -465,91 +465,91 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'px' (time (y): 199)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    +       "array([ 0.00000000e+00,  9.11215959e-05,  1.80587788e-04,  2.68393108e-04,\n",
    +       "        3.54531638e-04,  4.38997006e-04,  5.21782391e-04,  6.02880514e-04,\n",
    +       "        6.82283643e-04,  7.59983586e-04,  8.35971688e-04,  9.10238833e-04,\n",
    +       "        9.82775435e-04,  1.05357144e-03,  1.12261631e-03,  1.18989903e-03,\n",
    +       "        1.25540811e-03,  1.31913155e-03,  1.38105688e-03,  1.44117110e-03,\n",
    +       "        1.49946072e-03,  1.55591171e-03,  1.61050954e-03,  1.66323914e-03,\n",
    +       "        1.71408489e-03,  1.76303062e-03,  1.81005960e-03,  1.85515453e-03,\n",
    +       "        1.89829752e-03,  1.93947008e-03,  1.97865314e-03,  2.01582697e-03,\n",
    +       "        2.05097122e-03,  2.08406489e-03,  2.11508630e-03,  2.14401311e-03,\n",
    +       "        2.17082226e-03,  2.19548996e-03,  2.21799170e-03,  2.23830220e-03,\n",
    +       "        2.25639539e-03,  2.27224441e-03,  2.28582155e-03,  2.29709827e-03,\n",
    +       "        2.30604512e-03,  2.31263176e-03,  2.31682691e-03,  2.31859829e-03,\n",
    +       "        2.31791266e-03,  2.31473571e-03,  2.30903208e-03,  2.30076526e-03,\n",
    +       "        2.28989763e-03,  2.27639036e-03,  2.26020337e-03,  2.24129530e-03,\n",
    +       "        2.21962347e-03,  2.19514380e-03,  2.16781076e-03,  2.13757734e-03,\n",
    +       "        2.10439497e-03,  2.06821345e-03,  2.02898089e-03,  1.98664364e-03,\n",
    +       "        1.94114621e-03,  1.89243121e-03,  1.84043924e-03,  1.78510882e-03,\n",
    +       "        1.72637627e-03,  1.66417567e-03,  1.59843868e-03,  1.52909449e-03,\n",
    +       "        1.45606969e-03,  1.37928810e-03,  1.29867071e-03,  1.21413550e-03,\n",
    +       "        1.12559730e-03,  1.03296763e-03,  9.36154537e-04,  8.35062432e-04,\n",
            "...\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n",
    -       "       2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n",
    -       "       6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n",
    -       "       1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n",
    -       "       3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n",
    +       "       -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n",
    +       "       -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n",
    +       "       -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n",
    +       "       -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n",
    +       "       -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n",
    +       "       -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n",
    +       "       -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n",
    +       "       -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n",
    +       "       -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n",
    +       "       -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n",
    +       "       -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n",
    +       "       -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n",
    +       "       -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n",
    +       "       -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n",
    +       "       -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n",
    +       "       -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n",
    +       "       -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n",
    +       "        9.12143589e-03,  2.33356115e-02,  3.93212119e-02,  5.77079105e-02,\n",
    +       "        7.94629069e-02,  1.06185107e-01,  1.40789920e-01,  1.89418143e-01,\n",
    +       "        2.68513569e-01,  4.52523697e-01,             nan])\n",
            "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + "\n", + "array([ 0.00000000e+00, 9.11215959e-05, 1.80587788e-04, 2.68393108e-04,\n", + " 3.54531638e-04, 4.38997006e-04, 5.21782391e-04, 6.02880514e-04,\n", + " 6.82283643e-04, 7.59983586e-04, 8.35971688e-04, 9.10238833e-04,\n", + " 9.82775435e-04, 1.05357144e-03, 1.12261631e-03, 1.18989903e-03,\n", + " 1.25540811e-03, 1.31913155e-03, 1.38105688e-03, 1.44117110e-03,\n", + " 1.49946072e-03, 1.55591171e-03, 1.61050954e-03, 1.66323914e-03,\n", + " 1.71408489e-03, 1.76303062e-03, 1.81005960e-03, 1.85515453e-03,\n", + " 1.89829752e-03, 1.93947008e-03, 1.97865314e-03, 2.01582697e-03,\n", + " 2.05097122e-03, 2.08406489e-03, 2.11508630e-03, 2.14401311e-03,\n", + " 2.17082226e-03, 2.19548996e-03, 2.21799170e-03, 2.23830220e-03,\n", + " 2.25639539e-03, 2.27224441e-03, 2.28582155e-03, 2.29709827e-03,\n", + " 2.30604512e-03, 2.31263176e-03, 2.31682691e-03, 2.31859829e-03,\n", + " 2.31791266e-03, 2.31473571e-03, 2.30903208e-03, 2.30076526e-03,\n", + " 2.28989763e-03, 2.27639036e-03, 2.26020337e-03, 2.24129530e-03,\n", + " 2.21962347e-03, 2.19514380e-03, 2.16781076e-03, 2.13757734e-03,\n", + " 2.10439497e-03, 2.06821345e-03, 2.02898089e-03, 1.98664364e-03,\n", + " 1.94114621e-03, 1.89243121e-03, 1.84043924e-03, 1.78510882e-03,\n", + " 1.72637627e-03, 1.66417567e-03, 1.59843868e-03, 1.52909449e-03,\n", + " 1.45606969e-03, 1.37928810e-03, 1.29867071e-03, 1.21413550e-03,\n", + " 1.12559730e-03, 1.03296763e-03, 9.36154537e-04, 8.35062432e-04,\n", "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 3.33066907e-16, 4.44089210e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-16, 2.22044605e-16, 2.22044605e-16, 2.22044605e-16,\n", - " 2.22044605e-15, 2.44249065e-15, 3.77475828e-15, 5.55111512e-15,\n", - " 6.10622664e-15, 7.21644966e-15, 9.43689571e-15, 1.01030295e-14,\n", - " 1.04360964e-14, 1.19904087e-14, 1.50990331e-14, 2.76445533e-14,\n", - " 3.79696274e-14, 3.89688282e-14, 7.06101844e-14])\n", + " -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n", + " -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n", + " -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n", + " -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n", + " -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n", + " -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n", + " -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n", + " -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n", + " -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n", + " -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n", + " -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n", + " -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n", + " -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n", + " -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n", + " -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n", + " -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n", + " -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n", + " 9.12143589e-03, 2.33356115e-02, 3.93212119e-02, 5.77079105e-02,\n", + " 7.94629069e-02, 1.06185107e-01, 1.40789920e-01, 1.89418143e-01,\n", + " 2.68513569e-01, 4.52523697e-01, nan])\n", "Coordinates:\n", - " id int64 2\n", + " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 8, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['px'].sel(id=2)" + "swiftdiff['vx'].sel(id=100)" ] }, { diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index ceab9a74f..aeaf742bb 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -71,6 +71,7 @@ def read_swiftest_param(param_file_name, param): param['EXTRA_FORCE'] = param['EXTRA_FORCE'].upper() param['BIG_DISCARD'] = param['BIG_DISCARD'].upper() param['CHK_CLOSE'] = param['CHK_CLOSE'].upper() + param['RHILL_PRESENT'] = param['RHILL_PRESENT'].upper() param['FRAGMENTATION'] = param['FRAGMENTATION'].upper() param['ROTATION'] = param['ROTATION'].upper() param['TIDES'] = param['TIDES'].upper() @@ -401,6 +402,8 @@ def make_swiftest_labels(param): plab = tlab.copy() plab.append('Mass') plab.append('Radius') + if param['RHILL_PRESENT'] == 'YES': + plab.append('Rhill') clab = ['Mass', 'Radius', 'J_2', 'J_4'] if param['ROTATION'] == 'YES': clab.append('Ip_x') @@ -491,6 +494,8 @@ def swiftest_stream(f, param): p6 = f.read_reals(np.float64) Mpl = f.read_reals(np.float64) Rpl = f.read_reals(np.float64) + if param['RHILL_PRESENT'] == 'YES': + Rhill = f.read_reals(np.float64) if param['ROTATION'] == 'YES': Ipplx = f.read_reals(np.float64) Ipply = f.read_reals(np.float64) @@ -523,6 +528,9 @@ def swiftest_stream(f, param): tvec = np.empty((6, 0)) tpid = np.empty(0) cvec = np.array([Mcb, Rcb, J2cb, J4cb]) + if param['RHILL_PRESENT'] == 'YES': + if npl > 0: + pvec = np.vstack([pvec, Rhill]) if param['ROTATION'] == 'YES': cvec = np.vstack([cvec, Ipcbx, Ipcby, Ipcbz, rotcbx, rotcby, rotcbz]) if npl > 0: @@ -1021,9 +1029,13 @@ def swifter2swiftest(swifter_param, plname="", tpname="", cbname="", conversion_ for n in range(1, npl): # Loop over planets line = plold.readline() i_list = [i for i in line.split(" ") if i.strip()] - name = int(i_list[0]) + idnum = int(i_list[0]) GMpl = real2float(i_list[1]) - print(name, GMpl, file=plnew) + if swifter_param['RHILL_PRESENT'] == 'YES': + Rhill = real2float(i_list[2]) + print(idnum, GMpl, Rhill, file=plnew) + else: + print(idnum, GMpl, file=plnew) if swifter_param['CHK_CLOSE'] == 'YES': line = plold.readline() i_list = [i for i in line.split(" ") if i.strip()] @@ -1237,7 +1249,6 @@ def swiftest2swifter_param(swiftest_param, J2=0.0, J4=0.0): tmp = swifter_param.pop(key, None) swifter_param['J2'] = J2 swifter_param['J4'] = J4 - swifter_param['RHILL_PRESENT'] = "YES" swifter_param['CHK_CLOSE'] = "YES" if swifter_param['OUT_STAT'] == "REPLACE": swifter_param['OUT_STAT'] = "UNKNOWN" diff --git a/python/swiftest/swiftest/simulation_class.py b/python/swiftest/swiftest/simulation_class.py index e20ef05f7..670b72a60 100644 --- a/python/swiftest/swiftest/simulation_class.py +++ b/python/swiftest/swiftest/simulation_class.py @@ -39,6 +39,7 @@ def __init__(self, codename="Swiftest", param_file=""): 'EXTRA_FORCE': "NO", 'BIG_DISCARD': "NO", 'CHK_CLOSE': "YES", + 'RHILL_PRESENT': "YES", 'FRAGMENTATION': "NO", 'ROTATION': "NO", 'TIDES': "NO", diff --git a/src/io/io.f90 b/src/io/io.f90 index cf4772a8f..82c87dfc7 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -612,41 +612,33 @@ module subroutine io_read_body_in(self, param) do i = 1, nbody select type(self) class is (swiftest_pl) - read(iu, *, iostat = ierr) self%id(i), val - self%Gmass(i) = real(val, kind=DP) - self%mass(i) = real(val / param%GU, kind=DP) - - if (param%lclose) then - if (param%lrhill_present) then - read(iu, *, iostat = ierr) self%radius(i), self%rhill(i) - else - read(iu, *, iostat = ierr) self%radius(i) - end if - if (ierr /= 0 ) exit + if (param%lrhill_present) then + read(iu, *, iostat=ierr, err=100) self%id(i), val, self%rhill(i) else - self%radius(i) = 0.0_DP + read(iu, *, iostat=ierr, err=100) self%id(i), val end if + self%Gmass(i) = real(val, kind=DP) + self%mass(i) = real(val / param%GU, kind=DP) + if (param%lclose) read(iu, *, iostat=ierr, err=100) self%radius(i) if (param%lrotation) then - read(iu, iostat = ierr) self%Ip(:, i) - read(iu, iostat = ierr) self%rot(:, i) + read(iu, iostat=ierr, err=100) self%Ip(:, i) + read(iu, iostat=ierr, err=100) self%rot(:, i) end if if (param%ltides) then - read(iu, iostat = ierr) self%k2(i) - read(iu, iostat = ierr) self%Q(i) + read(iu, iostat=ierr, err=100) self%k2(i) + read(iu, iostat=ierr, err=100) self%Q(i) end if class is (swiftest_tp) - read(iu, *, iostat = ierr) self%id(i) + read(iu, *, iostat=ierr, err=100) self%id(i) end select - if (ierr /= 0 ) exit - read(iu, *, iostat = ierr) self%xh(1, i), self%xh(2, i), self%xh(3, i) - read(iu, *, iostat = ierr) self%vh(1, i), self%vh(2, i), self%vh(3, i) - if (ierr /= 0 ) exit + read(iu, *, iostat=ierr, err=100) self%xh(1, i), self%xh(2, i), self%xh(3, i) + read(iu, *, iostat=ierr, err=100) self%vh(1, i), self%vh(2, i), self%vh(3, i) self%status(i) = ACTIVE end do end if case (REAL4_TYPE, REAL8_TYPE) !, SWIFTER_REAL4_TYPE, SWIFTER_REAL8_TYPE) - open(unit = iu, file = infile, status = 'old', form = 'UNFORMATTED', iostat = ierr) - read(iu, iostat = ierr) nbody + open(unit=iu, file=infile, status='old', form='UNFORMATTED', iostat=ierr) + read(iu, iostat=ierr, err=100) nbody call self%setup(nbody) if (nbody > 0) then call self%read_frame(iu, param, XV, ierr) @@ -658,7 +650,7 @@ module subroutine io_read_body_in(self, param) end select close(iu) - if (ierr /= 0 ) then + 100 if (ierr /= 0 ) then write(*,*) 'Error reading in initial conditions from ',trim(adjustl(infile)) call util_exit(FAILURE) end if @@ -817,45 +809,46 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) integer(I4B), intent(out) :: ierr !! Error code associate(n => self%nbody) - read(iu, iostat = ierr) self%id(1:n) - !read(iu, iostat = ierr) self%name(1:n) + read(iu, iostat=ierr, err=100) self%id(1:n) + !read(iu, iostat=ierr, err=100) self%name(1:n) select case (form) case (EL) - read(iu, iostat = ierr) self%a(1:n) - read(iu, iostat = ierr) self%e(1:n) - read(iu, iostat = ierr) self%inc(1:n) - read(iu, iostat = ierr) self%capom(:) - read(iu, iostat = ierr) self%omega(:) - read(iu, iostat = ierr) self%capm(:) + read(iu, iostat=ierr, err=100) self%a(1:n) + read(iu, iostat=ierr, err=100) self%e(1:n) + read(iu, iostat=ierr, err=100) self%inc(1:n) + read(iu, iostat=ierr, err=100) self%capom(:) + read(iu, iostat=ierr, err=100) self%omega(:) + read(iu, iostat=ierr, err=100) self%capm(:) case (XV) - read(iu, iostat = ierr) self%xh(1, 1:n) - read(iu, iostat = ierr) self%xh(2, 1:n) - read(iu, iostat = ierr) self%xh(3, 1:n) - read(iu, iostat = ierr) self%vh(1, 1:n) - read(iu, iostat = ierr) self%vh(2, 1:n) - read(iu, iostat = ierr) self%vh(3, 1:n) + read(iu, iostat=ierr, err=100) self%xh(1, 1:n) + read(iu, iostat=ierr, err=100) self%xh(2, 1:n) + read(iu, iostat=ierr, err=100) self%xh(3, 1:n) + read(iu, iostat=ierr, err=100) self%vh(1, 1:n) + read(iu, iostat=ierr, err=100) self%vh(2, 1:n) + read(iu, iostat=ierr, err=100) self%vh(3, 1:n) end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - read(iu, iostat = ierr) pl%Gmass(1:n) + read(iu, iostat=ierr, err=100) pl%Gmass(1:n) pl%mass(1:n) = pl%Gmass / param%GU - read(iu, iostat = ierr) pl%radius(1:n) + if (param%lrhill_present) read(iu, iostat=ierr, err=100) pl%rhill(1:n) + read(iu, iostat=ierr, err=100) pl%radius(1:n) if (param%lrotation) then - read(iu, iostat = ierr) pl%rot(1, 1:n) - read(iu, iostat = ierr) pl%rot(2, 1:n) - read(iu, iostat = ierr) pl%rot(3, 1:n) - read(iu, iostat = ierr) pl%Ip(1, 1:n) - read(iu, iostat = ierr) pl%Ip(2, 1:n) - read(iu, iostat = ierr) pl%Ip(3, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(1, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(2, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(3, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(1, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(2, 1:n) + read(iu, iostat=ierr, err=100) pl%Ip(3, 1:n) end if if (param%ltides) then - read(iu, iostat = ierr) pl%k2(1:n) - read(iu, iostat = ierr) pl%Q(1:n) + read(iu, iostat=ierr, err=100) pl%k2(1:n) + read(iu, iostat=ierr, err=100) pl%Q(1:n) end if end select end associate - if (ierr /=0) then + 100 if (ierr /=0) then write(*,*) 'Error reading Swiftest body data' call util_exit(FAILURE) end if @@ -878,22 +871,22 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) character(*), intent(in) :: form !! Input format code ("XV" or "EL") integer(I4B), intent(out) :: ierr !! Error cod - read(iu, iostat = ierr) self%id - !read(iu, iostat = ierr) self%name - read(iu, iostat = ierr) self%Gmass + read(iu, iostat=ierr, err=100) self%id + !read(iu, iostat=ierr, err=100) self%name + read(iu, iostat=ierr, err=100) self%Gmass self%mass = self%Gmass / param%GU - read(iu, iostat = ierr) self%radius - read(iu, iostat = ierr) self%j2rp2 - read(iu, iostat = ierr) self%j4rp4 + read(iu, iostat=ierr, err=100) self%radius + read(iu, iostat=ierr, err=100) self%j2rp2 + read(iu, iostat=ierr, err=100) self%j4rp4 if (param%lrotation) then - read(iu, iostat = ierr) self%Ip(:) - read(iu, iostat = ierr) self%rot(:) + read(iu, iostat=ierr, err=100) self%Ip(:) + read(iu, iostat=ierr, err=100) self%rot(:) end if if (param%ltides) then - read(iu, iostat = ierr) self%k2 - read(iu, iostat = ierr) self%Q + read(iu, iostat=ierr, err=100) self%k2 + read(iu, iostat=ierr, err=100) self%Q end if - if (ierr /=0) then + 100 if (ierr /=0) then write(*,*) 'Error reading central body data' call util_exit(FAILURE) end if @@ -1160,6 +1153,7 @@ module subroutine io_write_frame_body(self, iu, param) select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body write(iu) pl%Gmass(1:n) + write(iu) pl%rhill(1:n) write(iu) pl%radius(1:n) if (param%lrotation) then write(iu) pl%rot(1, 1:n) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index e85f9754a..ceed089fe 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -82,12 +82,12 @@ module subroutine setup_initialize_system(self, param) call self%cb%initialize(param) call self%pl%initialize(param) - if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) call self%tp%initialize(param) call self%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) call self%pl%eucl_index() + if (.not.param%lrhill_present) call self%pl%set_rhill(self%cb) return end subroutine setup_initialize_system @@ -177,7 +177,7 @@ module subroutine setup_pl(self,n) self%Gmass(:) = 0.0_DP self%rhill(:) = 0.0_DP self%radius(:) = 0.0_DP - self%density(:) = 0.0_DP + self%density(:) = 1.0_DP self%rot(:,:) = 0.0_DP self%Ip(:,:) = 0.0_DP self%k2(:) = 0.0_DP From 7fe286e3caf0c1a97af9f59da940c4800282a6bb Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 07:56:33 -0400 Subject: [PATCH 071/194] Fixed bug in the interpolation step where the second test particle kick had the wrong lbeg flag --- src/symba/symba_step.f90 | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 2eecdacc3..594088a9d 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -52,7 +52,6 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize ! Internals real(DP) :: dth !! Half step size - integer(I4B) :: irec !! Recursion level dth = 0.5_DP * dt associate(system => self) @@ -62,25 +61,23 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) - irec = -1 call pl%vh2vb(cb) call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == irec)) + call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == -1)) call tp%vh2vb(vbcb = -cb%ptbeg) call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == irec)) + call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == -1)) - irec = 0 - call system%recursive_step(param, irec) + call system%recursive_step(param, 0) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end select From ad48621215f08fec0a1bb749c9fa847a5fbf17c6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 08:11:02 -0400 Subject: [PATCH 072/194] Fixed bug that was not passing the correct massive body position to the test particle kick in SyMBA --- .../swiftest_vs_swifter.ipynb | 183 ++++++------------ src/symba/symba_kick.f90 | 6 +- 2 files changed, 59 insertions(+), 130 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 8d8d319fa..3016031e3 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -91,7 +91,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -466,90 +466,40 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    -       "array([ 0.00000000e+00,  9.11215959e-05,  1.80587788e-04,  2.68393108e-04,\n",
    -       "        3.54531638e-04,  4.38997006e-04,  5.21782391e-04,  6.02880514e-04,\n",
    -       "        6.82283643e-04,  7.59983586e-04,  8.35971688e-04,  9.10238833e-04,\n",
    -       "        9.82775435e-04,  1.05357144e-03,  1.12261631e-03,  1.18989903e-03,\n",
    -       "        1.25540811e-03,  1.31913155e-03,  1.38105688e-03,  1.44117110e-03,\n",
    -       "        1.49946072e-03,  1.55591171e-03,  1.61050954e-03,  1.66323914e-03,\n",
    -       "        1.71408489e-03,  1.76303062e-03,  1.81005960e-03,  1.85515453e-03,\n",
    -       "        1.89829752e-03,  1.93947008e-03,  1.97865314e-03,  2.01582697e-03,\n",
    -       "        2.05097122e-03,  2.08406489e-03,  2.11508630e-03,  2.14401311e-03,\n",
    -       "        2.17082226e-03,  2.19548996e-03,  2.21799170e-03,  2.23830220e-03,\n",
    -       "        2.25639539e-03,  2.27224441e-03,  2.28582155e-03,  2.29709827e-03,\n",
    -       "        2.30604512e-03,  2.31263176e-03,  2.31682691e-03,  2.31859829e-03,\n",
    -       "        2.31791266e-03,  2.31473571e-03,  2.30903208e-03,  2.30076526e-03,\n",
    -       "        2.28989763e-03,  2.27639036e-03,  2.26020337e-03,  2.24129530e-03,\n",
    -       "        2.21962347e-03,  2.19514380e-03,  2.16781076e-03,  2.13757734e-03,\n",
    -       "        2.10439497e-03,  2.06821345e-03,  2.02898089e-03,  1.98664364e-03,\n",
    -       "        1.94114621e-03,  1.89243121e-03,  1.84043924e-03,  1.78510882e-03,\n",
    -       "        1.72637627e-03,  1.66417567e-03,  1.59843868e-03,  1.52909449e-03,\n",
    -       "        1.45606969e-03,  1.37928810e-03,  1.29867071e-03,  1.21413550e-03,\n",
    -       "        1.12559730e-03,  1.03296763e-03,  9.36154537e-04,  8.35062432e-04,\n",
    -       "...\n",
    -       "       -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n",
    -       "       -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n",
    -       "       -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n",
    -       "       -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n",
    -       "       -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n",
    -       "       -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n",
    -       "       -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n",
    -       "       -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n",
    -       "       -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n",
    -       "       -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n",
    -       "       -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n",
    -       "       -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n",
    -       "       -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n",
    -       "       -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n",
    -       "       -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n",
    -       "       -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n",
    -       "       -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n",
    -       "        9.12143589e-03,  2.33356115e-02,  3.93212119e-02,  5.77079105e-02,\n",
    -       "        7.94629069e-02,  1.06185107e-01,  1.40789920e-01,  1.89418143e-01,\n",
    -       "        2.68513569e-01,  4.52523697e-01,             nan])\n",
    +       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0., nan])\n",
            "Coordinates:\n",
            "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ "\n", - "array([ 0.00000000e+00, 9.11215959e-05, 1.80587788e-04, 2.68393108e-04,\n", - " 3.54531638e-04, 4.38997006e-04, 5.21782391e-04, 6.02880514e-04,\n", - " 6.82283643e-04, 7.59983586e-04, 8.35971688e-04, 9.10238833e-04,\n", - " 9.82775435e-04, 1.05357144e-03, 1.12261631e-03, 1.18989903e-03,\n", - " 1.25540811e-03, 1.31913155e-03, 1.38105688e-03, 1.44117110e-03,\n", - " 1.49946072e-03, 1.55591171e-03, 1.61050954e-03, 1.66323914e-03,\n", - " 1.71408489e-03, 1.76303062e-03, 1.81005960e-03, 1.85515453e-03,\n", - " 1.89829752e-03, 1.93947008e-03, 1.97865314e-03, 2.01582697e-03,\n", - " 2.05097122e-03, 2.08406489e-03, 2.11508630e-03, 2.14401311e-03,\n", - " 2.17082226e-03, 2.19548996e-03, 2.21799170e-03, 2.23830220e-03,\n", - " 2.25639539e-03, 2.27224441e-03, 2.28582155e-03, 2.29709827e-03,\n", - " 2.30604512e-03, 2.31263176e-03, 2.31682691e-03, 2.31859829e-03,\n", - " 2.31791266e-03, 2.31473571e-03, 2.30903208e-03, 2.30076526e-03,\n", - " 2.28989763e-03, 2.27639036e-03, 2.26020337e-03, 2.24129530e-03,\n", - " 2.21962347e-03, 2.19514380e-03, 2.16781076e-03, 2.13757734e-03,\n", - " 2.10439497e-03, 2.06821345e-03, 2.02898089e-03, 1.98664364e-03,\n", - " 1.94114621e-03, 1.89243121e-03, 1.84043924e-03, 1.78510882e-03,\n", - " 1.72637627e-03, 1.66417567e-03, 1.59843868e-03, 1.52909449e-03,\n", - " 1.45606969e-03, 1.37928810e-03, 1.29867071e-03, 1.21413550e-03,\n", - " 1.12559730e-03, 1.03296763e-03, 9.36154537e-04, 8.35062432e-04,\n", - "...\n", - " -9.06384094e-03, -9.53563225e-03, -1.00261447e-02, -1.05363692e-02,\n", - " -1.10673737e-02, -1.16203109e-02, -1.21964269e-02, -1.27970711e-02,\n", - " -1.34237069e-02, -1.40779249e-02, -1.47614562e-02, -1.54761895e-02,\n", - " -1.62241890e-02, -1.70077157e-02, -1.78292519e-02, -1.86915293e-02,\n", - " -1.95975617e-02, -2.05506824e-02, -2.15545893e-02, -2.26133960e-02,\n", - " -2.37316936e-02, -2.49146262e-02, -2.61679707e-02, -2.74982392e-02,\n", - " -2.89128076e-02, -3.04200778e-02, -3.20296460e-02, -3.37525358e-02,\n", - " -3.56014802e-02, -3.75912752e-02, -3.97392261e-02, -4.20657183e-02,\n", - " -4.45949554e-02, -4.73559255e-02, -5.03836843e-02, -5.37210879e-02,\n", - " -5.74211718e-02, -6.15504863e-02, -6.61938790e-02, -7.14615345e-02,\n", - " -7.74996577e-02, -8.45072757e-02, -9.27638119e-02, -1.02676738e-01,\n", - " -1.14869366e-01, -1.30356355e-01, -1.50934546e-01, -1.80194489e-01,\n", - " -2.26803842e-01, -3.20277515e-01, -7.05708575e-01, -3.15189002e-01,\n", - " -2.27999562e-01, -1.85226841e-01, -1.58047007e-01, -1.38277275e-01,\n", - " -1.22598954e-01, -1.09372275e-01, -9.76751694e-02, -8.69372893e-02,\n", - " -7.67770793e-02, -6.69202219e-02, -5.71545915e-02, -4.73028792e-02,\n", - " -3.72040291e-02, -2.66985612e-02, -1.56153022e-02, -3.75648143e-03,\n", - " 9.12143589e-03, 2.33356115e-02, 3.93212119e-02, 5.77079105e-02,\n", - " 7.94629069e-02, 1.06185107e-01, 1.40789920e-01, 1.89418143e-01,\n", - " 2.68513569e-01, 4.52523697e-01, nan])\n", + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., nan])\n", "Coordinates:\n", " id int64 100\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, - "execution_count": 13, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index e58e575b8..ca96eca38 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -72,7 +72,11 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) if (tp%status(j) == ACTIVE) THEN - dx(:) = tp%xh(:,j) - pl%xh(:,i) + if (lbeg) then + dx(:) = tp%xh(:,j) - pl%xbeg(:,i) + else + dx(:) = tp%xh(:,j) - pl%xend(:,i) + end if rji2 = dot_product(dx(:), dx(:)) rlim2 = (pl%radius(i))**2 if (rji2 > rlim2) then From c42ae1ab88952933cb1700e27518ead0a0f13080 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 08:13:40 -0400 Subject: [PATCH 073/194] Removed radius overlap check from acceleration subtraction code until I make this more generalizeable --- src/symba/symba_kick.f90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index ca96eca38..140eb0072 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -29,14 +29,14 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) dx(:) = pl%xh(:, j) - pl%xh(:, i) rji2 = dot_product(dx(:), dx(:)) - rlim2 = (pl%radius(i) + pl%radius(j))**2 - if (rji2 > rlim2) then + !rlim2 = (pl%radius(i) + pl%radius(j))**2 + !if (rji2 > rlim2) then irij3 = 1.0_DP / (rji2 * sqrt(rji2)) faci = pl%Gmass(i) * irij3 facj = pl%Gmass(j) * irij3 pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) - end if + !end if end associate end do call helio_kick_getacch_pl(pl, system, param, t, lbeg) @@ -78,11 +78,11 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) dx(:) = tp%xh(:,j) - pl%xend(:,i) end if rji2 = dot_product(dx(:), dx(:)) - rlim2 = (pl%radius(i))**2 - if (rji2 > rlim2) then + !rlim2 = (pl%radius(i))**2 + !if (rji2 > rlim2) then fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - end if + !end if end IF end associate end do From c650865bad95580444772119da42df16a28e10b9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 10:39:12 -0400 Subject: [PATCH 074/194] Added recursion level to collision check method call --- src/modules/symba_classes.f90 | 38 +++++++++++++++++++++++++++------ src/symba/symba_collision.f90 | 40 +++++++++++++++++++++++++++++++++++ src/symba/symba_discard.f90 | 2 ++ src/symba/symba_step.f90 | 35 +++++++++++++++--------------- 4 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 src/symba/symba_collision.f90 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 72fb06ae7..86ccb38a2 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -107,7 +107,7 @@ module symba_classes private procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle end type symba_tp @@ -123,6 +123,7 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains + procedure, public :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays @@ -135,11 +136,12 @@ module symba_classes !******************************************************************************************************************************* !> SyMBA class for tracking pl-pl close encounters in a step type, public, extends(symba_pltpenc) :: symba_plplenc - real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter - real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter + real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter + real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter + real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter + real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains + procedure, public :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc @@ -163,6 +165,27 @@ module symba_classes end type symba_nbody_system interface + + module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_pltpenc + + module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_plplenc + module subroutine symba_discard_pl(self, system, param) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none @@ -345,11 +368,12 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, ireci) + module recursive subroutine symba_step_recur_system(self, param, t, ireci) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B), value, intent(in) :: ireci !! input recursion level + real(DP), value :: t + integer(I4B), value :: ireci !! input recursion level end subroutine symba_step_recur_system module subroutine symba_step_reset_system(self) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 new file mode 100644 index 000000000..70a4a39c6 --- /dev/null +++ b/src/symba/symba_collision.f90 @@ -0,0 +1,40 @@ +submodule (symba_classes) s_symba_collision + use swiftest +contains + module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) + !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton + !! + !! Check for merger between massive bodies in SyMBA. If the user has turned on the FRAGMENTATION feature, it will call the + !! symba_regime subroutine to determine what kind of collision will occur. + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_plplenc + + + module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) + !! author: David A. Minton + !! + !! Check for merger between massive bodies and test particles in SyMBA + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_merge_tp.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + integer(I4B), intent(in) :: irec !! Current recursion level + end subroutine symba_collision_check_pltpenc + +end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 8bafdb2b5..a71ee747a 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -19,6 +19,8 @@ module subroutine symba_discard_tp(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + call discard_tp(self, system, param) + return end subroutine symba_discard_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 594088a9d..4e7082c4b 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -71,7 +71,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == -1)) - call system%recursive_step(param, 0) + call system%recursive_step(param, t, 0) call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) call pl%vb2vh(cb) @@ -87,7 +87,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) return end subroutine symba_step_interp_system - module recursive subroutine symba_step_recur_system(self, param, ireci) + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -99,9 +99,10 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B), value, intent(in) :: ireci !! input recursion level + real(DP), value :: t + integer(I4B), value :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, nloops, sgn + integer(I4B) :: i, j, irecp, nloops real(DP) :: dtl, dth real(DP), dimension(NDIM) :: xr, vr logical :: lencounter @@ -127,27 +128,27 @@ module recursive subroutine symba_step_recur_system(self, param, ireci) end if do j = 1, nloops lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) - sgn = 1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, 1) + call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then - sgn = -1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, -1) + call pltpenc_list%kick(system, dth, irecp, -1) end if call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) - if (lencounter) call system%recursive_step(param, irecp) + if (lencounter) call system%recursive_step(param, t+dth,irecp) - sgn = 1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, 1) + call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then - sgn = -1 - call plplenc_list%kick(system, dth, irecp, sgn) - call pltpenc_list%kick(system, dth, irecp, sgn) + call plplenc_list%kick(system, dth, irecp, -1) + call pltpenc_list%kick(system, dth, irecp, -1) + end if + if (param%lclose) then + call plplenc_list%collision_check(system, param, t+dtl, dtl, ireci) + call pltpenc_list%collision_check(system, param, t+dtl, dtl, ireci) end if associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & plind2 => plplenc_list%index2(1:plplenc_list%nenc), & From 6e6c0f1d3481d72f93a5a2553e9559085c199322 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:11:30 -0400 Subject: [PATCH 075/194] Restructured orbel subroutines. Consolidated them into the single submodule file orbel.f90 and put the explicit interfaces back. Added an elemental function for checking collisions between encountering bodies. --- src/modules/swiftest_classes.f90 | 19 +- src/orbel/{orbel_el2xv.f90 => orbel.f90} | 347 ++++++++++++++++++++++- src/orbel/orbel_scget.f90 | 27 -- src/orbel/orbel_xv2aeq.f90 | 57 ---- src/orbel/orbel_xv2aqt.f90 | 100 ------- src/orbel/orbel_xv2el.f90 | 142 ---------- src/symba/symba_collision.f90 | 45 ++- 7 files changed, 398 insertions(+), 339 deletions(-) rename src/orbel/{orbel_el2xv.f90 => orbel.f90} (65%) delete mode 100644 src/orbel/orbel_scget.f90 delete mode 100644 src/orbel/orbel_xv2aeq.f90 delete mode 100644 src/orbel/orbel_xv2aqt.f90 delete mode 100644 src/orbel/orbel_xv2el.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 417138122..313893e5d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -661,16 +661,23 @@ end subroutine orbel_scget module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, e, q + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: e !! eccentricity + real(DP), intent(out) :: q !! periapsis end subroutine orbel_xv2aeq module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, q, capm, tperi + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: q !! periapsis + real(DP), intent(out) :: capm !! mean anomaly + real(DP), intent(out) :: tperi !! time of pericenter passage end subroutine orbel_xv2aqt module subroutine orbel_xv2el_vec(self, cb) diff --git a/src/orbel/orbel_el2xv.f90 b/src/orbel/orbel.f90 similarity index 65% rename from src/orbel/orbel_el2xv.f90 rename to src/orbel/orbel.f90 index 3f1a81fe9..850b643f1 100644 --- a/src/orbel/orbel_el2xv.f90 +++ b/src/orbel/orbel.f90 @@ -1,11 +1,15 @@ -submodule (swiftest_classes) s_orbel_el2xv +submodule (swiftest_classes) s_orbel use swiftest contains - module procedure orbel_el2xv_vec + module subroutine orbel_el2xv_vec(self, cb) !! author: David A. Minton !! !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body objec + ! Internals integer(I4B) :: i if (self%nbody == 0) return @@ -15,7 +19,7 @@ call orbel_el2xv(self%mu(i), self%a(i), self%e(i), self%inc(i), self%capom(i), & self%omega(i), self%capm(i), self%xh(:, i), self%vh(:, i)) end do - end procedure orbel_el2xv_vec + end subroutine orbel_el2xv_vec pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) !! author: David A. Minton @@ -118,6 +122,33 @@ pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) return end subroutine orbel_el2xv + module pure subroutine orbel_scget(angle, sx, cx) + !! author: David A. Minton + !! + !! Efficiently compute the sine and cosine of an input angle + !! Input angle must be in radians + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_scget.f90 + !! Adapted from Hal Levison's Swift routine orbel_scget.f + implicit none + ! Arguments + real(DP), intent(in) :: angle + real(DP), intent(out) :: sx, cx + ! Internals + integer(I4B) :: nper + real(DP) :: x + + nper = angle / TWOPI + x = angle - nper * TWOPI + if (x < 0.0_DP) x = x + TWOPI + sx = sin(x) + cx = sqrt(1.0_DP - sx**2) + if ((x > PIBY2) .and. (x < PI3BY2)) cx = -cx + + return + + end subroutine orbel_scget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -207,8 +238,6 @@ real(DP) pure function orbel_flon(e,icapn) ! set iflag nonzero if capn < 0., in which case solve for -capn ! and change the sign of the final answer for f. ! Begin with a reasonable guess based on solving the cubic for small F - - a = 6 * ( e - 1.d0) / e b = -6 * capn / e sq = SQRT(0.25_DP * b**2 + a**3 / 27._DP) @@ -657,5 +686,311 @@ real(DP) pure function orbel_fhybrid(e,n) return end function orbel_fhybrid + module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) + !! author: David A. Minton + !! + !! Compute semimajor axis, eccentricity, and pericentric distance from relative Cartesian position and velocity + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aeq.f90 + !! Adapted from Luke Dones' Swift routine orbel_xv2aeq.f + implicit none + !! Arguments + real(DP), intent(in) :: mu + real(DP), dimension(:), intent(in) :: x, v + real(DP), intent(out) :: a, e, q + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, energy, fac + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + e = 0.0_DP + q = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec(:) = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + if (h2 == 0.0_DP) return + energy = 0.5_DP * v2 - mu / r + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = PARABOLA + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) e = sqrt(fac) + q = a * (1.0_DP - e) + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + q = a + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + q = a * (1.0_DP - e) + end select + + return + + end subroutine orbel_xv2aeq + + module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) + !! author: David A. Minton + !! + !! Compute semimajor axis, pericentric distance, mean anomaly, and time to nearest pericenter passage from + !! relative Cartesian position and velocity + !! tperi > 0 means nearest pericenter passage is in the future + !! tperi < 0 means nearest pericenter passage is in the past + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aqt.f90 + implicit none + ! Arguments + real(DP), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:), intent(in) :: x !! Position vector + real(DP), dimension(:), intent(in) :: v !! Velocity vector + real(DP), intent(out) :: a !! semimajor axis + real(DP), intent(out) :: q !! periapsis + real(DP), intent(out) :: capm !! mean anomaly + real(DP), intent(out) :: tperi !! time of pericenter passage + ! Internals + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, rdotv, energy, fac, w, face, cape, e, tmpf, capf, mm + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + q = 0.0_DP + capm = 0.0_DP + tperi = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec(:) = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + if (h2 == 0.0_DP) return + rdotv = dot_product(x(:), v(:)) + energy = 0.5_DP * v2 - mu / r + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = PARABOLA + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) then + e = sqrt(fac) + cape = 0.0_DP + face = (a - r) / (a * e) + if (face < -1.0_DP) then + cape = PI + else if (face < 1.0_DP) then + cape = acos(face) + end if + if (rdotv < 0.0_DP) cape = TWOPI - cape + else + e = 0.0_DP + cape = 0.0_DP + end if + capm = cape - e * sin(cape) + q = a * (1.0_DP - e) + mm = sqrt(mu / a**3) + if (capm < PI) then + tperi = -1.0_DP * capm / mm + else + tperi = -1.0_DP * (capm - TWOPI) / mm + end if + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + w = 0.0_DP + fac = 2 * a / r - 1.0_DP + if (fac < -1.0_DP) then + w = PI + else if (fac < 1.0_DP) then + w = acos(fac) + end if + if (rdotv < 0.0_DP) w = TWOPI - w + tmpf = tan(0.5_DP * w) + capm = tmpf*(1.0_DP + tmpf * tmpf / 3.0_DP) + q = a + mm = sqrt(0.5_DP * mu / q**3) + tperi = -1.0_DP * capm / mm + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + tmpf = (a - r) / (a * e) + if (tmpf < 1.0_DP) tmpf = 1.0_DP + capf = log(tmpf + sqrt(tmpf * tmpf - 1.0_DP)) + if (rdotv < 0.0_DP) capf = -capf + capm = e * sinh(capf) - capf + q = a * (1.0_DP - e) + mm = sqrt(-mu / a**3) + tperi = -1.0_DP * capm / mm + end select + + return + + end subroutine orbel_xv2aqt + + + module subroutine orbel_xv2el_vec(self, cb) + !! author: David A. Minton + !! + !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + ! internals + integer(I4B) :: i + + if (self%nbody == 0) return + call self%set_mu(cb) + !do concurrent (i = 1:self%nbody) + do i = 1, self%nbody + call orbel_xv2el(self%mu(i), self%xh(:, i), self%vh(:, i), self%a(i), self%e(i), self%inc(i), & + self%capom(i), self%omega(i), self%capm(i)) + end do + end subroutine orbel_xv2el_vec + + pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) + !! author: David A. Minton + !! + !! Compute osculating orbital elements from relative Cartesian position and velocity + !! All angular measures are returned in radians + !! If inclination < TINY, longitude of the ascending node is arbitrarily set to 0 + !! + !! If eccentricity < sqrt(TINY), argument of pericenter is arbitrarily set to 0 + !! + !! References: Danby, J. M. A. 1988. Fundamentals of Celestial Mechanics, (Willmann-Bell, Inc.), 201 - 206. + !! Fitzpatrick, P. M. 1970. Principles of Celestial Mechanics, (Academic Press), 69 - 73. + !! Roy, A. E. 1982. Orbital Motion, (Adam Hilger, Ltd.), 75 - 95 + !! + !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2el.f90 + !! Adapted from Martin Duncan's Swift routine orbel_xv2el.f + implicit none + real(DP), intent(in) :: mu + real(DP), dimension(:), intent(in) :: x, v + real(DP), intent(out) :: a, e, inc, capom, omega, capm + integer(I4B) :: iorbit_type + real(DP) :: r, v2, h2, h, rdotv, energy, fac, u, w, cw, sw, face, cape, tmpf, capf + real(DP), dimension(NDIM) :: hvec + + a = 0.0_DP + e = 0.0_DP + inc = 0.0_DP + capom = 0.0_DP + omega = 0.0_DP + capm = 0.0_DP + r = sqrt(dot_product(x(:), x(:))) + v2 = dot_product(v(:), v(:)) + hvec = x(:) .cross. v(:) + h2 = dot_product(hvec(:), hvec(:)) + h = sqrt(h2) + if (h2 == 0.0_DP) return + rdotv = dot_product(x(:), v(:)) + energy = 0.5_DP * v2 - mu / r + fac = hvec(3) / h + if (fac < -1.0_DP) then + inc = PI + else if (fac < 1.0_DP) then + inc = acos(fac) + end if + fac = sqrt(hvec(1)**2 + hvec(2)**2) / h + if (fac**2 < VSMALL) then + u = atan2(x(2), x(1)) + if (hvec(3) < 0.0_DP) u = -u + else + capom = atan2(hvec(1), -hvec(2)) + u = atan2(x(3) / sin(inc), x(1) * cos(capom) + x(2) * sin(capom)) + end if + if (capom < 0.0_DP) capom = capom + TWOPI + if (u < 0.0_DP) u = u + TWOPI + if (abs(energy * r / mu) < sqrt(VSMALL)) then + iorbit_type = parabola + else + a = -0.5_DP * mu / energy + if (a < 0.0_DP) then + fac = -h2 / (mu * a) + if (fac > VSMALL) then + iorbit_type = HYPERBOLA + else + iorbit_type = PARABOLA + end if + else + iorbit_type = ELLIPSE + end if + end if + select case (iorbit_type) + case (ELLIPSE) + fac = 1.0_DP - h2 / (mu * a) + if (fac > VSMALL) then + e = sqrt(fac) + cape = 0.0_DP + face = (a - r) / (a * e) + if (face < -1.0_DP) then + cape = PI + else if (face < 1.0_DP) then + cape = acos(face) + end if + if (rdotv < 0.0_DP) cape = TWOPI - cape + fac = 1.0_DP - e * cos(cape) + cw = (cos(cape) - e) / fac + sw = sqrt(1.0_DP - e**2) * sin(cape) / fac + w = atan2(sw, cw) + if (w < 0.0_DP) w = w + TWOPI + else + cape = u + w = u + end if + capm = cape - e * sin(cape) + case (PARABOLA) + a = 0.5_DP * h2 / mu + e = 1.0_DP + w = 0.0_DP + fac = 2 * a / r - 1.0_DP + if (fac < -1.0_DP) then + w = PI + else if (fac < 1.0_DP) then + w = acos(fac) + end if + if (rdotv < 0.0_DP) w = TWOPI - w + tmpf = tan(0.5_DP * w) + capm = tmpf * (1.0_DP + tmpf * tmpf / 3.0_DP) + case (HYPERBOLA) + e = sqrt(1.0_DP + fac) + tmpf = max((a - r) / (a * e), 1.0_DP) + capf = log(tmpf + sqrt(tmpf**2 - 1.0_DP)) + if (rdotv < 0.0_DP) capf = -capf + fac = e * cosh(capf) - 1.0_DP + cw = (e - cosh(capf)) / fac + sw = sqrt(e * e - 1.0_DP) * sinh(capf) / fac + w = atan2(sw, cw) + if (w < 0.0_DP) w = w + TWOPI + capm = e * sinh(capf) - capf + end select + omega = u - w + if (omega < 0.0_DP) omega = omega + TWOPI + + return + end subroutine orbel_xv2el -end submodule s_orbel_el2xv +end submodule s_orbel diff --git a/src/orbel/orbel_scget.f90 b/src/orbel/orbel_scget.f90 deleted file mode 100644 index 0cdb67c72..000000000 --- a/src/orbel/orbel_scget.f90 +++ /dev/null @@ -1,27 +0,0 @@ -submodule (swiftest_classes) s_orbel_scget - use swiftest -contains - module procedure orbel_scget - !! author: David A. Minton - !! - !! Efficiently compute the sine and cosine of an input angle - !! Input angle must be in radians - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_scget.f90 - !! Adapted from Hal Levison's Swift routine orbel_scget.f - implicit none - integer(I4B) :: nper - real(DP) :: x - - ! executable code - nper = angle / TWOPI - x = angle - nper * TWOPI - if (x < 0.0_DP) x = x + TWOPI - sx = sin(x) - cx = sqrt(1.0_DP - sx**2) - if ((x > PIBY2) .and. (x < PI3BY2)) cx = -cx - - return - - end procedure orbel_scget -end submodule s_orbel_scget diff --git a/src/orbel/orbel_xv2aeq.f90 b/src/orbel/orbel_xv2aeq.f90 deleted file mode 100644 index 8338d6559..000000000 --- a/src/orbel/orbel_xv2aeq.f90 +++ /dev/null @@ -1,57 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2aeq - use swiftest -contains - module procedure orbel_xv2aeq - !! author: David A. Minton - !! - !! Compute semimajor axis, eccentricity, and pericentric distance from relative Cartesian position and velocity - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aeq.f90 - !! Adapted from Luke Dones' Swift routine orbel_xv2aeq.f - implicit none - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, energy, fac - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - e = 0.0_DP - q = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec(:) = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - if (h2 == 0.0_DP) return - energy = 0.5_DP * v2 - mu / r - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = PARABOLA - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) e = sqrt(fac) - q = a * (1.0_DP - e) - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - q = a - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - q = a * (1.0_DP - e) - end select - - return - - end procedure orbel_xv2aeq -end submodule s_orbel_xv2aeq diff --git a/src/orbel/orbel_xv2aqt.f90 b/src/orbel/orbel_xv2aqt.f90 deleted file mode 100644 index 3c8bf3f3e..000000000 --- a/src/orbel/orbel_xv2aqt.f90 +++ /dev/null @@ -1,100 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2aqt - use swiftest -contains - module procedure orbel_xv2aqt ! (mu, px, py, pz, vx, vy, vz, a, q, capm, tperi - !! author: David A. Minton - !! - !! Compute semimajor axis, pericentric distance, mean anomaly, and time to nearest pericenter passage from - !! relative Cartesian position and velocity - !! tperi > 0 means nearest pericenter passage is in the future - !! tperi < 0 means nearest pericenter passage is in the past - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2aqt.f90 - implicit none - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, rdotv, energy, fac, w, face, cape, e, tmpf, capf, mm - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - q = 0.0_DP - capm = 0.0_DP - tperi = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec(:) = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - if (h2 == 0.0_DP) return - rdotv = dot_product(x(:), v(:)) - energy = 0.5_DP * v2 - mu / r - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = PARABOLA - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) then - e = sqrt(fac) - cape = 0.0_DP - face = (a - r) / (a * e) - if (face < -1.0_DP) then - cape = PI - else if (face < 1.0_DP) then - cape = acos(face) - end if - if (rdotv < 0.0_DP) cape = TWOPI - cape - else - e = 0.0_DP - cape = 0.0_DP - end if - capm = cape - e * sin(cape) - q = a * (1.0_DP - e) - mm = sqrt(mu / a**3) - if (capm < PI) then - tperi = -1.0_DP * capm / mm - else - tperi = -1.0_DP * (capm - TWOPI) / mm - end if - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - w = 0.0_DP - fac = 2 * a / r - 1.0_DP - if (fac < -1.0_DP) then - w = PI - else if (fac < 1.0_DP) then - w = acos(fac) - end if - if (rdotv < 0.0_DP) w = TWOPI - w - tmpf = tan(0.5_DP * w) - capm = tmpf*(1.0_DP + tmpf * tmpf / 3.0_DP) - q = a - mm = sqrt(0.5_DP * mu / q**3) - tperi = -1.0_DP * capm / mm - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - tmpf = (a - r) / (a * e) - if (tmpf < 1.0_DP) tmpf = 1.0_DP - capf = log(tmpf + sqrt(tmpf * tmpf - 1.0_DP)) - if (rdotv < 0.0_DP) capf = -capf - capm = e * sinh(capf) - capf - q = a * (1.0_DP - e) - mm = sqrt(-mu / a**3) - tperi = -1.0_DP * capm / mm - end select - - return - - end procedure orbel_xv2aqt -end submodule s_orbel_xv2aqt diff --git a/src/orbel/orbel_xv2el.f90 b/src/orbel/orbel_xv2el.f90 deleted file mode 100644 index 434925c7d..000000000 --- a/src/orbel/orbel_xv2el.f90 +++ /dev/null @@ -1,142 +0,0 @@ -submodule (swiftest_classes) s_orbel_xv2el - use swiftest -contains - - module procedure orbel_xv2el_vec - !! author: David A. Minton - !! - !! A wrapper method that converts all of the cartesian position and velocity vectors of a Swiftest body object to orbital elements. - implicit none - integer(I4B) :: i - - if (self%nbody == 0) return - call self%set_mu(cb) - !do concurrent (i = 1:self%nbody) - do i = 1, self%nbody - call orbel_xv2el(self%mu(i), self%xh(:, i), self%vh(:, i), self%a(i), self%e(i), self%inc(i), & - self%capom(i), self%omega(i), self%capm(i)) - end do - end procedure orbel_xv2el_vec - - pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) - !! author: David A. Minton - !! - !! Compute osculating orbital elements from relative Cartesian position and velocity - !! All angular measures are returned in radians - !! If inclination < TINY, longitude of the ascending node is arbitrarily set to 0 - !! - !! If eccentricity < sqrt(TINY), argument of pericenter is arbitrarily set to 0 - !! - !! References: Danby, J. M. A. 1988. Fundamentals of Celestial Mechanics, (Willmann-Bell, Inc.), 201 - 206. - !! Fitzpatrick, P. M. 1970. Principles of Celestial Mechanics, (Academic Press), 69 - 73. - !! Roy, A. E. 1982. Orbital Motion, (Adam Hilger, Ltd.), 75 - 95 - !! - !! Adapted from David E. Kaufmann's Swifter routine: orbel_xv2el.f90 - !! Adapted from Martin Duncan's Swift routine orbel_xv2el.f - implicit none - real(DP), intent(in) :: mu - real(DP), dimension(:), intent(in) :: x, v - real(DP), intent(out) :: a, e, inc, capom, omega, capm - integer(I4B) :: iorbit_type - real(DP) :: r, v2, h2, h, rdotv, energy, fac, u, w, cw, sw, face, cape, tmpf, capf - real(DP), dimension(NDIM) :: hvec - - a = 0.0_DP - e = 0.0_DP - inc = 0.0_DP - capom = 0.0_DP - omega = 0.0_DP - capm = 0.0_DP - r = sqrt(dot_product(x(:), x(:))) - v2 = dot_product(v(:), v(:)) - hvec = x(:) .cross. v(:) - h2 = dot_product(hvec(:), hvec(:)) - h = sqrt(h2) - if (h2 == 0.0_DP) return - rdotv = dot_product(x(:), v(:)) - energy = 0.5_DP * v2 - mu / r - fac = hvec(3) / h - if (fac < -1.0_DP) then - inc = PI - else if (fac < 1.0_DP) then - inc = acos(fac) - end if - fac = sqrt(hvec(1)**2 + hvec(2)**2) / h - if (fac**2 < VSMALL) then - u = atan2(x(2), x(1)) - if (hvec(3) < 0.0_DP) u = -u - else - capom = atan2(hvec(1), -hvec(2)) - u = atan2(x(3) / sin(inc), x(1) * cos(capom) + x(2) * sin(capom)) - end if - if (capom < 0.0_DP) capom = capom + TWOPI - if (u < 0.0_DP) u = u + TWOPI - if (abs(energy * r / mu) < sqrt(VSMALL)) then - iorbit_type = parabola - else - a = -0.5_DP * mu / energy - if (a < 0.0_DP) then - fac = -h2 / (mu * a) - if (fac > VSMALL) then - iorbit_type = HYPERBOLA - else - iorbit_type = PARABOLA - end if - else - iorbit_type = ELLIPSE - end if - end if - select case (iorbit_type) - case (ELLIPSE) - fac = 1.0_DP - h2 / (mu * a) - if (fac > VSMALL) then - e = sqrt(fac) - cape = 0.0_DP - face = (a - r) / (a * e) - if (face < -1.0_DP) then - cape = PI - else if (face < 1.0_DP) then - cape = acos(face) - end if - if (rdotv < 0.0_DP) cape = TWOPI - cape - fac = 1.0_DP - e * cos(cape) - cw = (cos(cape) - e) / fac - sw = sqrt(1.0_DP - e**2) * sin(cape) / fac - w = atan2(sw, cw) - if (w < 0.0_DP) w = w + TWOPI - else - cape = u - w = u - end if - capm = cape - e * sin(cape) - case (PARABOLA) - a = 0.5_DP * h2 / mu - e = 1.0_DP - w = 0.0_DP - fac = 2 * a / r - 1.0_DP - if (fac < -1.0_DP) then - w = PI - else if (fac < 1.0_DP) then - w = acos(fac) - end if - if (rdotv < 0.0_DP) w = TWOPI - w - tmpf = tan(0.5_DP * w) - capm = tmpf * (1.0_DP + tmpf * tmpf / 3.0_DP) - case (HYPERBOLA) - e = sqrt(1.0_DP + fac) - tmpf = max((a - r) / (a * e), 1.0_DP) - capf = log(tmpf + sqrt(tmpf**2 - 1.0_DP)) - if (rdotv < 0.0_DP) capf = -capf - fac = e * cosh(capf) - 1.0_DP - cw = (e - cosh(capf)) / fac - sw = sqrt(e * e - 1.0_DP) * sinh(capf) / fac - w = atan2(sw, cw) - if (w < 0.0_DP) w = w + TWOPI - capm = e * sinh(capf) - capf - end select - omega = u - w - if (omega < 0.0_DP) omega = omega + TWOPI - - return - end subroutine orbel_xv2el -end submodule s_orbel_xv2el diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 70a4a39c6..1a44b55ce 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -11,6 +11,7 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec !! !! Adapted from Hal Levison's Swift routine symba5_merge.f implicit none + ! Arguments class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -19,7 +20,6 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_plplenc - module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) !! author: David A. Minton !! @@ -29,6 +29,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec !! !! Adapted from Hal Levison's Swift routine symba5_merge.f implicit none + ! Arguments class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -37,4 +38,46 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_pltpenc + pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmtot, rlim, dt, lvdotr) result(lcollision) + !! author: David A. Minton + !! + !! Check for a merger between a single pair of particles + !! + !! Adapted from David E. Kaufmann's Swifter routines symba_merge_tp.f90 and symba_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + ! Arguments + real(DP), intent(in) :: xr, yr, zr !! Relative position vector components + real(DP), intent(in) :: vxr, vyr, vzr !! Relative velocity vector components + real(DP), intent(in) :: Gmtot !! Sum of G*mass of colliding bodies + real(DP), intent(in) :: rlim !! Collision limit - Typically the sum of the radii of colliding bodies + real(DP), intent(in) :: dt !! Step size + logical, intent(in) :: lvdotr !! Logical flag indicating that these two bodies are approaching in the current substep + ! Result + logical :: lcollision !! Logical flag indicating whether these two bodies will collide or not + ! Internals + real(DP) :: r2, rlim2, a, e, q, vdotr, tcr2, dt2 + + r2 = xr**2 + yr**2 + zr**2 + rlim2 = rlim**2 + + if (r2 <= rlim2) then ! checks if bodies are actively colliding in this time step + lcollision = .true. + else ! if they are not actively colliding in this time step, checks if they are going to collide next time step based on velocities and q + lcollision = .false. + vdotr = xr * vxr + yr * vyr + zr * vzr + if (lvdotr .and. (vdotr > 0.0_DP)) then + tcr2 = r2 / (vxr**2 + vyr**2 + vzr**2) + dt2 = dt**2 + if (tcr2 <= dt2) then + call orbel_xv2aeq(Gmtot, [xr, yr, zr], [vxr, vyr, vzr], a, e, q) + lcollision = (q < rlim) + end if + end if + end if + return + end function symba_collision_check_one + + end submodule s_symba_collision \ No newline at end of file From 6e37462eb32303ff468ee569696b5d232c89136a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:47:03 -0400 Subject: [PATCH 076/194] Enabled test particle/massive body collisions. --- src/modules/swiftest_globals.f90 | 1 + src/symba/symba_collision.f90 | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/modules/swiftest_globals.f90 b/src/modules/swiftest_globals.f90 index a1f0d7511..5ec55f6c6 100644 --- a/src/modules/swiftest_globals.f90 +++ b/src/modules/swiftest_globals.f90 @@ -86,6 +86,7 @@ module swiftest_globals integer(I4B), parameter :: SUPERCATASTROPHIC = -10 integer(I4B), parameter :: GRAZE_AND_MERGE = -11 integer(I4B), parameter :: HIT_AND_RUN = -12 + integer(I4B), parameter :: COLLISION = -13 !>Symbolic names for collisional outcomes from collresolve_resolve: integer(I4B), parameter :: COLLRESOLVE_REGIME_MERGE = 1 diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 1a44b55ce..a1662b661 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -36,6 +36,41 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec real(DP), intent(in) :: t !! current time real(DP), intent(in) :: dt !! step size integer(I4B), intent(in) :: irec !! Current recursion level + ! Internals + logical, dimension(:), allocatable :: lcollision, mask + real(DP), dimension(NDIM) :: xr, vr + integer(I4B) :: k + + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1(1:self%nenc), tpind => self%index2(1:self%nenc)) + allocate(lcollision(npltpenc), mask(npltpenc)) + mask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) .and. (pl%levelg(plind) >= irec) .and. (tp%levelg(tpind) >= irec)) + lcollision(:) = .false. + do concurrent(k = 1:npltpenc, mask(k)) + associate(i => plind(k), j => tpind(k)) + xr(:) = pl%xh(:, i) - tp%xh(:, j) + vr(:) = pl%vb(:, i) - tp%vb(:, j) + lcollision(i) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) + end associate + end do + + if (any(lcollision(:))) then + where(lcollision(1:npltpenc)) + pltpenc_list%status(1:npltpenc) = COLLISION + tp%status(tpind(1:npltpenc)) = DISCARDED_PLR + end where + do k = 1, npltpenc + if (pltpenc_list%status(k) /= COLLISION) cycle + write(*,*) 'Test particle ',tp%id(tpind(k)), ' collided with massive body ',pl%id(plind(k)), ' at time ',t + end do + end if + end associate + end select + end select + return end subroutine symba_collision_check_pltpenc pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmtot, rlim, dt, lvdotr) result(lcollision) From 9ddf1e2ae90696a471ffcd842f8933a98798bd66 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 11:57:42 -0400 Subject: [PATCH 077/194] Removed unnecessary symba_discard_tp subroutine. Flag collided bodies for discard to trigger base discard method. --- src/modules/symba_classes.f90 | 9 --------- src/symba/symba_collision.f90 | 1 + src/symba/symba_discard.f90 | 12 ------------ 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 86ccb38a2..0a6dcb290 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -105,7 +105,6 @@ module symba_classes integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains private - procedure, public :: discard => symba_discard_tp !! process test particle discards procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle @@ -194,14 +193,6 @@ module subroutine symba_discard_pl(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_pl - module subroutine symba_discard_tp(self, system, param) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine symba_discard_tp - module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) implicit none real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index a1662b661..59f43c69c 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -61,6 +61,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec where(lcollision(1:npltpenc)) pltpenc_list%status(1:npltpenc) = COLLISION tp%status(tpind(1:npltpenc)) = DISCARDED_PLR + tp%ldiscard(tpind(1:npltpenc)) = .true. end where do k = 1, npltpenc if (pltpenc_list%status(k) /= COLLISION) cycle diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index a71ee747a..3f8ada6fe 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -12,16 +12,4 @@ module subroutine symba_discard_pl(self, system, param) return end subroutine symba_discard_pl - module subroutine symba_discard_tp(self, system, param) - implicit none - ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - call discard_tp(self, system, param) - - return - end subroutine symba_discard_tp - end submodule s_symba_discard \ No newline at end of file From 6d84eeb1c22beb1ef83d7c11c6bb05f0e07b6c09 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 12:00:56 -0400 Subject: [PATCH 078/194] Updated test with successful run --- .../swiftest_vs_swifter.ipynb | 112 ++++++++---------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 3016031e3..71a2c4da6 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 1.355e-01\n", + "Reading in time 1.348e-01\n", "Creating Dataset\n", - "Successfully converted 199 output frames.\n", + "Successfully converted 198 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 6, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -103,7 +103,7 @@ } ], "source": [ - "swiftdiff['px'].plot.line(x=\"time (y)\")" + "swiftdiff['vx'].plot.line(x=\"time (y)\")" ] }, { @@ -465,41 +465,33 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    -       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0., nan])\n",
    +       "
    <xarray.DataArray 'vx' (time (y): 198)>\n",
    +       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    +       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
            "Coordinates:\n",
    -       "    id        int64 100\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355
  • " ], "text/plain": [ - "\n", - "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., nan])\n", + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", - " id int64 100\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" + " id float64 100.0\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348" ] }, "execution_count": 7, From 01413ddaafe43ac6e524cd687ddec23bb20c638a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 12:10:05 -0400 Subject: [PATCH 079/194] Working on adding Rhill to initial condition generator --- .../9pl_18tp_encounters/init_cond.py | 1 + python/swiftest/swiftest/init_cond.py | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py index 321c79932..82850837d 100755 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py @@ -37,6 +37,7 @@ sim.param['OUT_STAT'] = "UNKNOWN" sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' +sim.param['RHILL_PRESENT'] = 'YES' sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 6e5048c0f..3316e7fe2 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -121,7 +121,6 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): tlab.append('vx') tlab.append('vy') tlab.append('vz') - plab.append('Rhill') dims = ['time', 'id', 'vec'] t = np.array([0.0]) @@ -193,11 +192,16 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): p11.append(pldata[key].vectors()['vy'][0] * VCONV) p12.append(pldata[key].vectors()['vz'][0] * VCONV) if ispl: - Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) Rpl.append(planetradius[key] * DCONV) GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors - pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + if (param['RHILL_PRESENT'] == 'yes'): + print("We are appending the Hill sphere") + Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + else: + print("Why aren't we appending the Hill sphere?") + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]) plab = tlab.copy() From aed1bc90e2f44783365132a174fe99a04056087f Mon Sep 17 00:00:00 2001 From: David Minton Date: Tue, 27 Jul 2021 12:16:14 -0400 Subject: [PATCH 080/194] Fixed bug in initial conditions function for checking if RHILL_PRESENT is turned on --- .../9pl_18tp_encounters/cb.in | 2 +- .../9pl_18tp_encounters/cb.swiftest.in | 2 +- .../9pl_18tp_encounters/param.swifter.in | 2 +- .../9pl_18tp_encounters/param.swiftest.in | 1 + .../9pl_18tp_encounters/pl.in | 48 +++++++------- .../9pl_18tp_encounters/pl.swifter.in | 50 +++++++-------- .../9pl_18tp_encounters/pl.swiftest.in | 48 +++++++------- .../9pl_18tp_encounters/tp.in | 64 +++++++++---------- python/swiftest/swiftest/init_cond.py | 4 +- 9 files changed, 110 insertions(+), 111 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in index 81c636655..673a79459 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in @@ -1,5 +1,5 @@ 0 -0.00029591220819207774 +0.0002959122081920778 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in index 81c636655..673a79459 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 -0.00029591220819207774 +0.0002959122081920778 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in index aa33eeaa4..d87472e35 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in index 6504c9637..06edc324b 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index bd980fc4b..d85d737f5 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 +1 4.9125474498983625056e-11 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index 701e9a14f..ba4f47b86 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 0.00029591220819207775568 +0 0.00029591220819207776388 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751243077781048702 +1 4.9125474498983625056e-11 0.3870979888395936208 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 0.006759104275397271956 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 0.7233257098327222634 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 0.010044787321379672528 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 1.000013777403204962 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 0.007246743835971885302 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 1.523730802569037035 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 0.35527126534549128905 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 5.2035172582389037643 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 0.4376527512949726007 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 9.581689367400855417 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 0.4695362423191493196 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 19.232766114773518495 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 0.7812870996943599397 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 30.285501702709421323 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index bd980fc4b..d85d737f5 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 +1 4.9125474498983625056e-11 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 +-0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 +-0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 +2 7.243452483873647106e-10 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 +-0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 +0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 +3 8.997011382166018993e-10 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 +0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 +0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 +4 9.549535102761465872e-11 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 +-1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 +-0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 +5 2.8253459086313549713e-07 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 +4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 +0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 +6 8.45971518300641563e-08 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 +6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 +0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 +7 1.2920249163736673984e-08 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 +14.81940372833062014 13.046490834898889943 -0.14356031024960910769 +-0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 +8 1.5243589003230834746e-08 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 +29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 +0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in index c7cf002d6..e7424ed6f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in @@ -1,49 +1,49 @@ 16 101 -0.33208578766229190915 0.07439013071780828379 -0.02438290851908785084 --0.008988542188201206762 0.028710618792657981169 0.0034094833969203438596 +-0.032410259440139366216 0.30734953478203003163 0.0280888997405028297 +-0.031019262600390007378 -0.0019305604712619159943 0.0029264451427202888868 102 -0.33203966624962866216 0.07434400930514498129 -0.02438290851908785084 --0.014195641132219511543 0.028710618792657981169 0.0034094833969203438596 +-0.032456380852802668713 0.30730341336936678465 0.0280888997405028297 +-0.03622636154440830869 -0.0019305604712619159943 0.0029264451427202888868 103 --0.7187543234391324809 -0.011798260816488121555 0.041316403191083782287 -0.0065615071841567274707 -0.020313576971905909774 -0.00029114855617710840843 +-0.6608419365545701307 -0.28799974456994492655 0.034183953683804932377 +0.014290252347442427075 -0.018635382188272479886 -0.00071410720992500279457 104 --0.71886874402007694407 -0.011912681397432518804 0.041316403191083782287 --0.006132960226534060408 -0.020313576971905909774 -0.00029114855617710840843 +-0.6609563571355145939 -0.2881141651508892787 0.034183953683804932377 +0.0015957849367516391964 -0.018635382188272479886 -0.00071410720992500279457 105 -0.35683111163121072895 -0.9518327808922094624 4.4027442504036787155e-05 -0.022724479262608666269 0.0059737936889703449964 -3.3484113013969089573e-07 +0.5666051762815753623 -0.8427917875260713121 3.8152874628327130158e-05 +0.020893043539853186491 0.009533392738922031109 -5.008237574040859916e-07 106 -0.3567106558193317012 -0.95195323670408849015 4.4027442504036787155e-05 -0.008935598794060913702 0.0059737936889703449964 -3.3484113013969089573e-07 +0.56648472046969633453 -0.84291224333795033985 3.8152874628327130158e-05 +0.0071041630713054347915 0.009533392738922031109 -5.008237574040859916e-07 107 --1.5233391647104730371 0.6724145771476651712 0.051459143378398922164 --0.0020480822268840624331 -0.011607719813367209372 -0.000117479966462153095864 +-1.5854279813093821172 0.50603262218427835784 0.049495356229978339224 +-0.00065310310407921696313 -0.0121364162752466003825 -0.00016278089870573419053 108 --1.5234032495379807859 0.6723504923201574224 0.051459143378398922164 --0.008207040423331847523 -0.011607719813367209372 -0.000117479966462153095864 +-1.585492066136889866 0.50596853735677060904 0.049495356229978339224 +-0.0068120613005270029203 -0.0121364162752466003825 -0.00016278089870573419053 109 -4.050605826355517358 -2.9904269687677218492 -0.078187280837353656526 -0.041279424970441319642 0.006432188574295680597 -0.00012509257442073270106 +4.1112407225284242074 -2.8997027378816566667 -0.07992066204197022239 +0.041146757578404392908 0.006527961423420942065 -0.00012252307659855749943 110 -4.049284028339322994 -2.9917487667839162135 -0.078187280837353656526 --0.032485009432853539924 0.006432188574295680597 -0.00012509257442073270106 +4.109918924512229843 -2.901024535897851031 -0.07992066204197022239 +-0.032617676824890466658 0.006527961423420942065 -0.00012252307659855749943 111 -6.299479995832536261 -7.7058625321556393217 -0.11669919842191249504 -0.02612723553831041573 0.0035242303011843410798 -0.00022097170940726839814 +6.3554898083384054885 -7.6562954388962722874 -0.11978932080537739446 +0.026100461582326782428 0.0035567518157804990653 -0.00022047226166396519348 112 -6.2983790111222752728 -7.70696351686590031 -0.11669919842191249504 --0.01809910222875676239 0.0035242303011843410798 -0.00022097170940726839814 +6.3543888236281445003 -7.6573964236065332756 -0.11978932080537739446 +-0.018125876184740395691 0.0035567518157804990653 -0.00022047226166396519348 113 -14.856321905516212567 13.007829033301401722 -0.14417795763685259391 -0.010478935887110856981 0.0027821364817078499815 4.40781085949555924e-05 +14.819643486317822578 13.046730592886092381 -0.14356031024960910769 +0.010470819978811187617 0.002775224845039696818 4.4157032104701469965e-05 114 -14.855842389541807691 13.007349517326996846 -0.14417795763685259391 --0.015710591190212928187 0.0027821364817078499815 4.40781085949555924e-05 +14.819163970343417702 13.046251076911687505 -0.14356031024960910769 +-0.015718707098512599285 0.002775224845039696818 4.4157032104701469965e-05 115 -29.55768244045575699 -4.6291447957067299868 -0.58590957207831262377 -0.014905509815736753265 0.0031274056019462009859 -7.51415892482447254e-05 +29.56422775190525698 -4.58535534656341337 -0.5869609072731380994 +0.014900806169871520443 0.0031282283842968541462 -7.504927375628088796e-05 116 -29.557216915563323312 -4.6296103205991601115 -0.58590957207831262377 --0.0139657618108195089035 0.0031274056019462009859 -7.51415892482447254e-05 +29.563762227012823303 -4.585820871455843495 -0.5869609072731380994 +-0.013970465456684741726 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 3316e7fe2..995b30194 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -195,12 +195,10 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): Rpl.append(planetradius[key] * DCONV) GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors - if (param['RHILL_PRESENT'] == 'yes'): - print("We are appending the Hill sphere") + if (param['RHILL_PRESENT'] == 'YES'): Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) else: - print("Why aren't we appending the Hill sphere?") pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]) From 6703c5e28230363e9d6a4c7c45e4d9c3fe1a5a1f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:03:50 -0400 Subject: [PATCH 081/194] Added Rhill to initial conditions generator --- .../9pl_18tp_encounters/cb.in | 2 +- .../9pl_18tp_encounters/cb.swiftest.in | 2 +- .../9pl_18tp_encounters/pl.in | 16 +++--- .../9pl_18tp_encounters/pl.swifter.in | 18 +++--- .../9pl_18tp_encounters/pl.swiftest.in | 16 +++--- python/swiftest/swiftest/init_cond.py | 4 +- python/swiftest/swiftest/io.py | 56 +++++++++++++------ 7 files changed, 68 insertions(+), 46 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in index 673a79459..81c636655 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in @@ -1,5 +1,5 @@ 0 -0.0002959122081920778 +0.00029591220819207774 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in index 673a79459..81c636655 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 -0.0002959122081920778 +0.00029591220819207774 0.004650467260962157 4.7535806948127355e-12 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index d85d737f5..cd3c71538 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983625056e-11 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index ba4f47b86..e42b53b68 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -1,36 +1,36 @@ 9 -0 0.00029591220819207776388 +0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983625056e-11 0.3870979888395936208 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 0.7233257098327222634 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 1.000013777403204962 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 1.523730802569037035 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 5.2035172582389037643 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 9.581689367400855417 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 19.232766114773518495 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 30.285501702709421323 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index d85d737f5..cd3c71538 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983625056e-11 +1 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873647106e-10 +2 7.243452483873646905e-10 0.006759082196678506012 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.997011382166018993e-10 +3 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465872e-11 +4 9.549535102761465607e-11 0.0072467110395904559343 2.265740805092889601e-05 -1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 -0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.8253459086313549713e-07 +5 2.825345908631354893e-07 0.35527078496549785303 0.00046732617030490929307 4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.45971518300641563e-08 +6 8.459715183006415395e-08 0.43765573308845887078 0.00038925687730393611812 6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673984e-08 +7 1.2920249163736673626e-08 0.46957395507687206725 0.00016953449859497231466 14.81940372833062014 13.046490834898889943 -0.14356031024960910769 -0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834746e-08 +8 1.5243589003230834323e-08 0.7813323455417420909 0.000164587904124493665 29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 diff --git a/python/swiftest/swiftest/init_cond.py b/python/swiftest/swiftest/init_cond.py index 995b30194..f9a7378c0 100644 --- a/python/swiftest/swiftest/init_cond.py +++ b/python/swiftest/swiftest/init_cond.py @@ -196,8 +196,8 @@ def solar_system_horizons(plname, idval, param, ephemerides_start_date, ds): GMpl.append(GMcb[0] / MSun_over_Mpl[key]) # Generate planet value vectors if (param['RHILL_PRESENT'] == 'YES'): - Rhill.append(pldata[key].elements()['a'][0] * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) - pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12, Rhill]) + Rhill.append(pldata[key].elements()['a'][0] * DCONV * (3 * MSun_over_Mpl[key]) ** (-THIRDLONG)) + pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, Rhill, p7, p8, p9, p10, p11, p12]) else: pvec = np.vstack([p1, p2, p3, p4, p5, p6, GMpl, Rpl, p7, p8, p9, p10, p11, p12]) else: diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index aeaf742bb..2dd4ef7b3 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -678,7 +678,10 @@ def swiftest_xr2infile(ds, param, framenum=-1): print(pl.id.count().values, file=plfile) for i in pl.id: pli = pl.sel(id=i) - print(i.values, pli['Mass'].values, file=plfile) + if param['RHILL_PRESENT'] == 'YES': + print(i.values, pli['Mass'].values, pli['Rhill'].values, file=plfile) + else: + print(i.values, pli['Mass'].values, file=plfile) print(pli['Radius'].values, file=plfile) print(pli['px'].values, pli['py'].values, pli['pz'].values, file=plfile) print(pli['vx'].values, pli['vy'].values, pli['vz'].values, file=plfile) @@ -697,36 +700,55 @@ def swiftest_xr2infile(ds, param, framenum=-1): # Now make Swiftest files cbfile = FortranFile(param['CB_IN'], 'w') cbfile.write_record(cbid) - MSun = np.double(1.0) cbfile.write_record(np.double(GMSun)) - cbfile.write_record(np.double(rmin)) + cbfile.write_record(np.double(RSun)) cbfile.write_record(np.double(J2)) cbfile.write_record(np.double(J4)) cbfile.close() plfile = FortranFile(param['PL_IN'], 'w') - plfile.write_record(npl) + npl = pl.id.count().values + plid = pl.id.values + px = pl['px'].values + py = pl['py'].values + pz = pl['pz'].values + vx = pl['vx'].values + vy = pl['vy'].values + vz = pl['vz'].values + mass = pl['Mass'].values + radius = pl['Radius'].values + plfile.write_record(npl) plfile.write_record(plid) - plfile.write_record(p_pl[0]) - plfile.write_record(p_pl[1]) - plfile.write_record(p_pl[2]) - plfile.write_record(v_pl[0]) - plfile.write_record(v_pl[1]) - plfile.write_record(v_pl[2]) + plfile.write_record(px) + plfile.write_record(py) + plfile.write_record(pz) + plfile.write_record(vx) + plfile.write_record(vy) + plfile.write_record(vz) plfile.write_record(mass) + if param['RHILL_PRESENT'] == 'YES': + rhill = pl['Rhill'].values + plfile.write_record(rhill) plfile.write_record(radius) plfile.close() tpfile = FortranFile(param['TP_IN'], 'w') - ntp = 1 + ntp = tp.id.count().values + tpid = tp.id.values + px = tp['px'].values + py = tp['py'].values + pz = tp['pz'].values + vx = tp['vx'].values + vy = tp['vy'].values + vz = tp['vz'].values tpfile.write_record(ntp) tpfile.write_record(tpid) - tpfile.write_record(p_tp[0]) - tpfile.write_record(p_tp[1]) - tpfile.write_record(p_tp[2]) - tpfile.write_record(v_tp[0]) - tpfile.write_record(v_tp[1]) - tpfile.write_record(v_tp[2]) + tpfile.write_record(px) + tpfile.write_record(py) + tpfile.write_record(pz) + tpfile.write_record(vx) + tpfile.write_record(vy) + tpfile.write_record(vz) else: print(f"{param['IN_TYPE']} is an unknown file type") From bd2e19431e5ed49aad2643a8db3272da9e1b88ff Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:05:36 -0400 Subject: [PATCH 082/194] Fixed bad index bug --- src/symba/symba_collision.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 59f43c69c..b8060829c 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -53,7 +53,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec associate(i => plind(k), j => tpind(k)) xr(:) = pl%xh(:, i) - tp%xh(:, j) vr(:) = pl%vb(:, i) - tp%vb(:, j) - lcollision(i) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) end associate end do From f38d19e3483f2330a3bb3449ac51ac53089e95ca Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 14:33:24 -0400 Subject: [PATCH 083/194] Updated symba 9pl 18tp example notebook --- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 753 ------------------ .../swiftest_symba_vs_swifter_symba.ipynb | 753 ++++++++++++++++++ 2 files changed, 753 insertions(+), 753 deletions(-) delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb create mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb deleted file mode 100644 index d0d223ce7..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ /dev/null @@ -1,753 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import swiftest\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swifter file param.swifter.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swifter simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swifter.in'\n", - "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", - "swiftersim.bin2xr()\n", - "swifterdat = swiftersim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swiftest.in'\n", - "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", - "swiftestsim.bin2xr()\n", - "swiftestdat = swiftestsim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftestdat - swifterdat" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", - "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", - "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAElCAYAAADnZln1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAxL0lEQVR4nO3deZxcdZnv8c/TeyfdSUjSITtZWBISICYRUDECCoKDF1lEA4yACI7jOHoVt5m5KnoV1OuCg8sgm4BDZmQGRTZZArIPBEgggJElgXTWztL03tVV9dw/zqnu6k6vldr7+3696tWnTp3lqdPdT/3qd37nOebuiIhI8SvJdQAiIpIdSvgiIqOEEr6IyCihhC8iMkoo4YuIjBJK+CIio4QS/ihkZt8ys1vC6dlm1mJmpbmOazBm9l4z25DlfbqZHbyf23jJzI5PT0T7bHvA36OZHWhmj5hZs5n9yAI3mNleM3s6E/FI/lPCL0BmtsnMPtBn3oVm9thIt+Xub7l7jbvH0hfhyAwnsbr7o+5+WLZiShd3X+TuD0PvBJ2B/fT9PV4K7ALGufuXgOOAk4CZ7n50JmKQ/KeEL3nPzMpyHUMBOgh42XuurDwI2OTurSPdkI5/8VDCL1JmNt3M/svMGsxso5n94wDLzQlb2GVJ691hZnvM7DUzuyRp2VIz+yczez3sKnjWzGaFry0ws/vD9TaY2TlJ691oZj83s7vC9f7HzOaHrz0SLrYu7JL4mJkdb2b1ZvZVM9sO3JCYl7TNWWb23+H7221mVw9wDNrNbGLSvHeY2S4zKw+ff9LMXgm7Ov5kZgcNcJzGm9lN4f7eNLN/MbOSpNcvCbfTbGYvm9nScP4mM/uAmZ0C/BPwsfB9rjOzj5rZs3328yUz+/0AMcw1sz+H+7gfmNzf79HMbgQuAL4S7uvTwLXAu8Lnl4frnGZma82s0cyeMLMjk7a3KTz+LwCt4XaPDZdrDOM/Pmn5h83sO2b2eBjffWaWHN9xSetuNrMLw/mVZvb/zOwtM9thZr8ys+rwtclmdme4zh4zezT5mEsK3F2PAnsAm4AP9Jl3IfBYOF0CPAt8A6gA5gFvAB8MX/8WcEs4PQdwoCx8/mfgF0AVsARoAN4fvvZl4EXgMMCAo4BJwFhgM3ARUAYsJehOWBSudyOwBzg6fP23wKqk2B04OOn58UAU+D5QCVSH8+rD10uBdcBPwn1XAccNcKxWA5ckPf8h8Ktw+iPAa8DCMK5/AZ7oLy7gJuAPQG14zP4KXBy+9lFgC/DO8LgcDBzU93eVfNzD55XhcVmYNO954KwB3suTwI/D9VYAzYP8Hm8E/m9/fx/h86XATuCY8HheEMZamRT3WmBWePxnALuBDxH8fZ0UPq8Ll38YeB04NFz+YeDK8LXZYawrgXKCv5kl4Ws/Be4AJobH9o/AFeFrVwC/CtcpB94LWK7//wr5kfMA9Ejhlxb8M7YAjUmPNnoS/jHAW33W+TpwQzjdnXiSE0X4zx0DapPWuwK4MZzeAJzeTzwfAx7tM+/fgG+G0zcC1ya99iHgL0nP+0v4EaCqz7xEwn8XwQdR2TCO1aeA1eG0EXwwrQif30OYtMPnJeFxPCg5LoKE2AkcnrTsp4GHw+k/AZ8f5HfVb8IP5/0S+G44vQjYS5h0+yw3m+BDcGzSvH/v7/eYdMwHS/i/BL7TZx8bgPclxf3JpNe+CtzcZ/k/AReE0w8D/5L02t8D9yb97d3ez3syoBWYnzTvXcDGcPrbBB+yB/ddV4/UHvp6VLg+4u4TEg+Cf7CEg4Dp4VfhRjNrJOhOOHCIbU4H9rh7c9K8NwladxB8ILzez3oHAcf02d95wNSkZbYnTbcBNUPE0uDuHQO8Ngt4092jQ2wD4DaCrozpBK1iBx5NivuqpJj3ECShGX22MZngm9KbSfOGc1yG4zfAuWZmwN8C/+nunf0sNx3Y67374N/sZ7nhOgj4Up/f2axwPwmb+yz/0T7LHwdMS1pmoN/xQMenDhgDPJu0zXvD+RB8G3sNuM/M3jCzr438bUoynYwpTpsJWkmHjHC9rcBEM6tNSvqzCborEtudD6zvZ39/dveTUg24H4OVcd0MzDazsqGSvrs3mtl9wDkEXTe3eth8DLfzXXf/7RCx7AK6CE+EhvP6Oy5D2ec9uftTZhYh6K44N3z0ZxtwgJmNTUr6s/vb5jAl3vt3hxnvZoIW/iUDLTzEvvobGbQLaCfo+tvS98Xwb/BLBB9Mi4CHzOwZd38whRgEnbQtVk8DTeFJt2oLTrYuNrN3DraSu28GngCuMLOq8CTexQR97hCc+PuOmR1igSPNbBJwJ3Comf2tmZWHj3ea2cJhxruD4DzDSN7fNuBKMxsbxvqeQZb/d+ATwFnhdMKvgK+HySRxYvajfVf2YKjjfwLfNbNaC07sfhFIDLG8FrjMzJaFx+Vg6//k7w5gTj8nHm8Crgai7t7v0Fp3fxNYA1xuZhVmdhzw4UHe81B+DfydmR0TxjzWzP7GzGoHWP4W4MNm9sHw76nKghPpM4exr98CHzCzc8KTv5PMbIm7x8M4fmJmUwDMbIaZfTCcPi08lgY0EXQ35mz4cDFQwi9CYYL6MMFJ140ELalrgfHDWH0lQX/wVuB2gn74+8PXfkyQ+O4j+Ae8DqgOW2InAx8P19tOzwnX4fgW8Jvwa/05Qy2c9P4OBt4C6gnOIwzkDuAQYIe7r0vazu1hnKvMrIngm8upA2zjcwT9zW8AjxF8cFwfbud3wHfDec3A7wlOQvb1u/DnbjN7Lmn+zcDi8OdgziU4P7MH+CbBB0VK3H0NcAnBB81egq6TCwdZfjNwOkHXYANBq/3LDCOHuPtbBOdtvhTGvpbghD8E5wZeA54KfwcPEAwKgOB39gDB+aongV94eE2DpMZ6vt2KSC6EwxB3Akvd/dVcxyPFSy18kdz7DPCMkr1kmk7aiuSQmW0iGBn0kdxGIqOBunREREYJdemIiIwSSvhSNKyfKqLFwvrUPBJJhRK+FJQw6bVaUARsi5n92LJcy9/SUCdfJBeU8KUQHeXuNcD7Ccamp3L1p8ioo4QvBcvd/0JQF2dx39fM7GgzezK8mGubmV1tZhVJr7uZ/Z2ZvWpBaeSfh1d0Jl7vt2yy9V/OedhlfM3s3Wb2jJm9Hf58d9Jrg5YYTlpuRGWVRRKU8KVgmdnhBDVonu/n5RjwvwkKn72L4NvA3/dZ5jSCksZHEdTaSVzS/xGCK0rPJCjk9ShwK4C7rwjXPcqDO0z9B8EVpPXhsgeG6+4z/M2Cuvx3AT8jKBH8Y+CusDxFwrkEZaanEBRsu6yf93YHMLdP6YrzGfpKXRnl8j7hm9n1ZrbTzPoW7Ep1e/eGLbE7+8z/Bwtu+OH9taokrzxnZnsJaqdfC9zQdwF3f9bdn3L3qLtvIijX/L4+i13p7o3hpf8PEZSigKD08RXu/kpYnO17wJIB6uNAUFhtGkFZ5S4PbsfY33jnvwFedfebw7huBf5C75o4N7j7X929naCMxZK+Gwmraf4HQZInrAU0h6CmkciA8j7hE9T1PiWN2/shQRnavh4HPsD+lZyV7Fjq7ge4+3x3/5ewCFcvZnZo2M2yPazR8j2S7hAVGqic73DLJicMt4zvdPb9+0ouszxYTH0Nt6yySLe8T/ju/gjBP1w3M5sfttSfDftLF4xgew8SFLjqO//5sCUoxeGXBK3nQ9x9HEE3iw2+SrfNwKeT7zfg7tXu/kR/C7t7s7t/yd3nEbTWv2hm7+9n0a0EHybJksssD5u7P0Vwk5hEWWV158iQ8j7hD+Aa4HPuvoygj/MXOY5H8k8tQUXPlrBB8JkRrDtU2eRe5ZxHUMb3boIy0ueGZYI/BhxO6l0xQ5ZVFklWcBdxmFkN8G7gd0mDKirD184kuC1aX1vc/YPZiVDyxGUEDYOvEJzU/Q/gxOGs6O63h39nq8J++7eB++kpb/wtgnLO1cClBF0yVxOctN3LAGV83X23mZ0GXEXwDeQ14DR335Xie7wZ+E74EBlSQdTSMbM5wJ3uvtjMxgEb3H3aEKsNtr3jgcvc/bR+XtsELN+Pf0KRrFBZZRmpguvScfcmYGPiK7YFjhpiNZFipLLKMiJ5n/DN7FaCu90cZmb1ZnYxwQ2yLzazdcBLBHfiGe72HiX4av7+cHuJsdf/aGb1wEzgBTO7Nt3vRSRdwm+inye4BkBkWAqiS0dERPZf3rfwRUQkPfJ6lM7kyZN9zpw5uQ5DRKRgPPvss7vcva6/1/I64c+ZM4c1a9bkOgwRkYJhZgNWC1CXjojIKKGELyIySijhi4iMEnndh9+frq4u6uvr6ejoyHUoA6qqqmLmzJmUl5fnOhQRkW4Fl/Dr6+upra1lzpw5JNXSyRvuzu7du6mvr2fu3Lm5DkdEpFvBdel0dHQwadKkvEz2AGbGpEmT8vobiIiMTgWX8IG8TfYJ+R6fiIxOWU34ZrbJzF40s7VmpgH2IiJAeyTGbc/Wk+lSN7lo4Z/g7kvcfXkO9g3Au9/97n7nX3jhhdx2221ZjkZERrvv3PUyl/1uHU+9sWfohfdDQXbp7K8nnuj3TnUiIjmxtbEdgPauaEb3k+1ROk5wo2cH/s3dr+m7gJldSnAXIWbPnp2RIGpqamhpacHd+dznPsfq1auZO3duxr9OiYj0JxYPck9Jhs//ZbuF/x53XwqcCnzWzFb0XcDdr3H35e6+vK6u3/o/aXP77bezYcMGXnzxRX7961+r5S8iOZFI+GUlmU3JWU347r41/LkTuB04Opv77+uRRx5h5cqVlJaWMn36dE48cVi3PBURSatomPAzPcAvawnfzMaaWW1iGjgZWJ+t/Q9EQyhFJNcSLfyuWDyj+8lmC/9A4LHwtoRPA3e5+71Z3P8+VqxYwapVq4jFYmzbto2HHnool+GIyCiVaOFHoplN+Fk7aevubwB5dbPxM844g9WrV3PEEUdw6KGH8r73vS/XIYnIKBTvbuFnduBIwdXSSYeWlhYg6M65+uqrcxyNiIx2xdilIyIi/Ugk/IgSvohIcYvGg0SvFr6ISJGLZemkrRK+iEiORdWHLyIyOmRrlI4SvohIjmVrHL4Sfgo++clPMmXKFBYvXpzrUESkCHR0xQB16eSlCy+8kHvvzelFwiJSRDq6gkSvFn4eWrFiBRMnTsx1GCJSBKKxePf4+0y38Av6StvL//gSL29tSus2D58+jm9+eFFatykiMpCOpFZ9RCdtRUSKV3sk1j2tFv4g1BIXkUKXOGELOmkrIlLUkhO+TtrmoZUrV/Kud72LDRs2MHPmTK677rpchyQiBao9iy38gu7SyZVbb7011yGISJFI7sPXSVsRkSLWGXbjlBh0qUtHRKR4JUojj6ko00lbEZFiliiYNqaiVDdAEREpZtHkhK8uHRGR4pXo0qlWl46ISHFL7tJRPfw8s3nzZk444QQWLlzIokWLuOqqq3IdkogUsGgscdK2VOPw801ZWRk/+tGPWLp0Kc3NzSxbtoyTTjqJww8/PNehiUgB6oqrDz9vTZs2jaVLlwJQW1vLwoUL2bJlS46jEpFC1dPCL8v4KJ3CbuHf8zXY/mJ6tzn1CDj1ymEtumnTJp5//nmOOeaY9MYgIqNGYpROdRa6dNTCT1FLSwtnnXUWP/3pTxk3blyuwxGRAtWVuPCqPPMnbQu7hT/Mlni6dXV1cdZZZ3Heeedx5pln5iQGESkOyePwY3EnFndKSywj+1ILf4TcnYsvvpiFCxfyxS9+MdfhiEiBS/ThV1WUApmtmKmEP0KPP/44N998M6tXr2bJkiUsWbKEu+++O9dhiUiB6oo7ZSVGRWmQjjN54jbrXTpmVgqsAba4+2nZ3v/+Ou6443DPbD+biIwe0VicslKjoixI+JmsmJmLFv7ngVdysF8RkbwTjTvlJSWUhy38TJ64zWrCN7OZwN8A12ZzvyIi+Soac8pKLSnhF08L/6fAV4AB35GZXWpma8xsTUNDQ9YCExHJhWg8TllpSXeXTmcxdOmY2WnATnd/drDl3P0ad1/u7svr6uqyFJ2ISG50xZzyEqOi1MLnRZDwgfcA/8vMNgGrgBPN7JYs7l9EJO8EJ21LiqtLx92/7u4z3X0O8HFgtbufn639i4jko6548fbhF7yOjg6OPvpojjrqKBYtWsQ3v/nNXIckIgUsGotTXpKdPvyclFZw94eBh3Ox7/1VWVnJ6tWrqampoauri+OOO45TTz2VY489NtehiUgB2neUTpEMyywGZkZNTQ0Q1NTp6urCLDN1L0Sk+AVdOiXdV9pm8sKrgi6e9v2nv89f9vwlrdtcMHEBXz36q4MuE4vFWLZsGa+99hqf/exnVR5ZRFIWdOkY5WXFNUqnaJSWlrJ27Vrq6+t5+umnWb9+fa5DEpEC1bdLp6hq6aTTUC3xTJswYQLHH3889957L4sXL85pLCJSmLricWrKy3qKpxXDhVfFoqGhgcbGRgDa29t54IEHWLBgQW6DEpGCFY2F1TLLMn/StqBb+Lmwbds2LrjgAmKxGPF4nHPOOYfTTiu4op8ikie6snjhlRL+CB155JE8//zzuQ5DRIpENO6UlxrlRVZaQURE+ojG4pQlXXiVyZO2SvgiIjnUlRilU6KTtiIiRWHznjb+sr1pn/nReJyyEqOkxCgrMfXhi4gUuvf+4CEANl35N73mB+Pwg7Z3eWmJSiuIiBSrrvBKW4DyUstol86QLXwzmz3MbTW6+77fV0REZECxeE8Lv6KsNOddOr8BHBisQpgDNwI3pSGmghCLxVi+fDkzZszgzjvvzHU4IlKgEvXwASpy3cJ39xP6zjOzqe6+PTMhFYarrrqKhQsX0tSkLzUikrpEPXyA8rKSvByH/4m0RlFg6uvrueuuu/jUpz6V61BEpADE4z0nYt291/y4093Cz/RJ21RH6ZxuZm3A/e6+IZ0BjcT2732PzlfSWx65cuECpv7TPw26zBe+8AV+8IMf0NzcnNZ9i0hxao1Eu6e7Yk5FohRyPGjNlyeN0snHC6/OBF4DzjCza9MYT9678847mTJlCsuWLct1KCJSIJo6ehJ+RzTWPR0NW/Nl4Sidigx36aTUwnf3HcC94SNnhmqJZ8Ljjz/OHXfcwd13301HRwdNTU2cf/753HLLLVmPRUQKQ3NHV/d0Z1ccqoLp7oSfGKWT4ZO2KbXwzeznZnZjOH1yWiPKc1dccQX19fVs2rSJVatWceKJJyrZi8igmtp7WvidSS38ni6d5D78PEv4QAR4I5w+MU2xiIgUpeQWfkdXT0Lv6dJJ7sPPv5O2bcB4MysHhnthVtE5/vjjOf7443MdhojkuabkLp3kFn7Ymu8eh19Wkpc3Md8DtAM/Bx5PXzgiIsWnOfmkbXILPxyuWd594VUedemY2QQzuwE4K5x1E7A87VGJiBSRpvb+W/jRRAu/u0vH8ucm5u7eaGZXAnOAXcCRwH9nIC4RkaKR3MLvTGrhJy6y6nXSNs+6dC4GNrr7n4Bn0xyPiEjRSR6Hn9zCT0xXlpcCQWmFfDtpuxf4OzM7DFgHrHV33eRVRGQAyUk+uQ+/M2zNV5YlxuHn2YVX7n6FmT0I/BVYAqwAlPBFRAYQicapLCuhMxrvk/zDFn5Z0MLPuyttzezbQCmwlqB1/3CaY8p7c+bMoba2ltLSUsrKylizZk2uQxKRPBaJxqmtKqezpXPQFn7Ob4DSl7t/w8y+QTDC5ywzm+/ul6Q/tPz20EMPMXny5FyHISIFIBKLM666jF0tnX368IPkXlUeJPyxlWVE405HV4yqsF8/nVK90vZ6YCEwCfjFcFYwsyoze9rM1pnZS2Z2eYr7FhEpKIkWPvQepdPZp0tnXLhM8jDOdEr1wqt/JCivUAZcRdCPP5RO4ER3bwmv0H3MzO5x96dSjIFH//Ov7Nrckurq/Zo8q4b3nnPooMuYGSeffDJmxqc//WkuvfTStMYgIsUlEo0zpryU0hLrVS2zu0snbOGPrw4S/tvtXUwZV5X2OFJN+K8DhwB/cPf/PZwVPKj6n8jO5eEjc+OPMujxxx9n+vTp7Ny5k5NOOokFCxawYsVwPvNEZDSKxOKMrSyjqqykVwu/70nb5ISfCakm/JeAzcDFZvZDd3/ncFYys1KCsfsHAz939/9Jcf8AQ7bEM2X69OkATJkyhTPOOIOnn35aCV9EBhSJxqkoK6GyvLT/Fn7Zvi38TEi1D38+wYfFNcBFw13J3WPuvgSYCRxtZov7LmNml5rZGjNb09DQkGJ4mdPa2tp9p6vW1lbuu+8+Fi/e522IiHRLJPy+LfxsJ/xUW/ib3X21mU0Ddo505bBEw8PAKcD6Pq9dQ/BBwvLly/Ouy2fHjh2cccYZAESjUc4991xOOeWUHEclIvmsMxqnsjTRwk9O+DEqykowC0or5GvCP8XM/kpQLfNNgpO4gzKzOqArTPbVwAeA76e4/5yZN28e69aty3UYIlJAIrGwS6espHtkDgQjdqrKejpaaquClJxvXToTgK8CXyEYfTMc04CHzOwF4BmCG6DfmeL+RUQKRu8+/N5dOpVJ4+3LSkuoqSzLuxb+t4EF7r7BzGJDLg24+wvAO1Lcn4hIwYpE41SUBn34Hb1a+LHu/vuE8dXluW/hm9lRiWl3r3f3B8Lpr2UiMBGRYpHo0qmuKO2d8MMaO8nGVZf3ugduOo2kS+d5M3vBzL5iZrMyEo2ISJGJxZ1Y3KksK6W6vJT2SO/yyIkx+Anjq8sydqXtSBL+j4CxwJXARjN7yMw+mZGoRESKRKIYWqKF396nhZ+oo5OQF1067v5ld59PcEvDawnKKVyTkahERIpEr4Tft4XfFe+nhZ8HCd/MJpnZp4DvEVxsZQRX2446jY2NnH322SxYsICFCxfy5JNP5jokEclTnbEgwXcn/KQWfkc01l1HJ+GUxVP51HvnZiSWkYzS2U7wAbEXuAG4xd0fy0hUee7zn/88p5xyCrfddhuRSIS2trZchyQieSrRwq8sLWFM2KXj7phZ2MLvnfBPXHAgJy7ITCwjSfi3A7cA97h7Zr5vFICmpiYeeeQRbrzxRgAqKiqoqKjIbVAikreSu3SqKkpxT/Tdl/Z70jaThp3w3f2cTAaSioduvIadb76R1m1OOWgeJ1w4cLnjN954g7q6Oi666CLWrVvHsmXLuOqqqxg7dmxa4xCR4hCJ9e7DB2iPxMKEv28LP5Oyt6ciEY1Gee655/jMZz7D888/z9ixY7nyyitzHZaI5KnuFn5pUsIP+/ETLf1sSeWeth929z9mIpiRGqwlnikzZ85k5syZHHPMMQCcffbZSvgiMqC+wzIhKeH3c6VtJqWyp++mPYoCMnXqVGbNmsWGDRsAePDBBzn88MNzHJWI5Ku+wzKB7qGZHdH4PqN0MimVWjqW9igKzL/+679y3nnnEYlEmDdvHjfccEOuQxKRPNUZ67+FH43Fu6/AzZZUEn7e1ajPtiVLlrBmzZpchyEiBSC5Dz+e1MLve/OTbEi1WqaIiAxDJCmxh/c5ob1LCV9EpOgk9+GXlgQZvz0So7UzqIg5pjJ7aTiVPe1IexQiIkUqeRx+QntXjMa24PrVCeFtDbNhxAnf3U/KRCAiIsUouQ8/uYWfKJA2YUz2rtRXl46ISAYld+kkWvntXTEa2yNAz43Ls0FX2oqIZFByl05FaQkl1reFn+cJ38y+mDR9WPrCyX8bNmxgyZIl3Y9x48bx05/+NNdhiUie6kzq0jGz7hLJiT78bLbwR9SlY2YTgJ8AC8ysA3gBuJigPv6ocNhhh7F27VoAYrEYM2bM4IwzzshtUCKStzrC8gkWjsmsriijvSto4VeWleRvLR13bwQuMrMPAruAI4H/zkBcBeHBBx9k/vz5HHTQQbkORUTyVFskypiKnqReXVFCeyRGLOZZ7c6B1E/adrn7s2a2FdiZzoBGovGPrxPZ2prWbVZMH8uED88f1rKrVq1i5cqVad2/iBSXtkiMMRU9qfaAMRXsbo1QXV7ChOrs3ksj1ZO2p5jZTOBXBF08o04kEuGOO+7gox/9aK5DEZE81h6JddfQAZg2voptje00tnVltf8eUm/hTwC+CnwF+FTaohlpEMNsiWfCPffcw9KlSznwwANzFoOI5L+ghd+T8KdPqOaxV3dRWmLMmjgmq7Gk2sL/NvB7d98AxIZauBjdeuut6s4RkSG1d8W6yyIDzJhQTWskxuY9bVm9yhZST/hfB/42nH4oTbEUjLa2Nu6//37OPPPMXIciInmuvU8Lf9r4agBaI7Gsn7RNNeFHgMTNZE9IUywFY8yYMezevZvx48fnOhQRySMv1DfS3NHVa14wSqen93z6hKru6QPHVZFNqSb8NmC8mZUDs9MYj4hIQWrtjPK/rn6cL6xa22t+35O20ydUd09/cNHUbIUHpJ7wvwm8Dvwc+G36whERKUybdgdDxF/e1tRrfltX7y6duprK7ulsn7RNdZTOP7r7j2H0lVYQEenPxl1Bwp9U03tsfVufFn5JifHPH1rIkTOz3yWcSmmFXwIHhaUV1hEMyxyytIKZzQJuAqYCceAad79qpAGLiOSjTWHCnzi2pwUfizuRaJwx5b1T7SUr5mU1toQRl1Yws3rgEeB/gKMYfmmFKPAld3/OzGqBZ83sfnd/eUQRi4jkoTfChB+Lx7vntUXCu1pVZK9ezmBS6cPfDfwd8Inwef1wVnL3be7+XDjdDLwCzEhh/yIieSfRpdPcEe2e1x4JLlOqLtSE7+5XApcA3wI2Au8d6TbMbA7wDoJvCX1fu9TM1pjZmoaGhpFuOit+8pOfsGjRIhYvXszKlSvp6OjIdUgikmOb97QBvRN+W5jwC7aFb2bfBk4HTgK2uPvPRrh+DfBfwBfcvanv6+5+jbsvd/fldXV1Iw0v47Zs2cLPfvYz1qxZw/r164nFYqxatSrXYYlIjjWFiT55HH6+JfxU7mn7DTM7kKCFfpaZzXf3S4azbjhu/7+A37p7wZZVjkajtLe3U15eTltbG9OnT891SCKSQ12xePetDJuSu3S6gunqivy4m2yqUXwa+Dd3v3e4K1hQ/f864JXEkM79dc8997B9+/Z0bKrb1KlTOfXUUwd8fcaMGVx22WXMnj2b6upqTj75ZE4++eS0xiAihSXRkp84toI9rRE6ozEqy0rzroWf6oVX1wOfMbMfmtmSYa7zHoL6Oyea2drw8aEU958ze/fu5Q9/+AMbN25k69attLa2csstt+Q6LBHJocRonESphEQ/fiLhV2fxrlaDSfnCK4J6OmXAz4AVQ63g7o8BluL++jVYSzxTHnjgAebOnUvi/MKZZ57JE088wfnnn5/1WEQkP7R2Bol96rhKXtkWJPzJNZV0dBX4KJ3Q60AV8Ad3HzLZF5PZs2fz1FNP0dbWhrvz4IMPsnDhwlyHJSI5lGjhTw0rYSZO3BZLl85LwGrgYjN7Jo3x5L1jjjmGs88+m6VLl3LEEUcQj8e59NJLcx2WiORQTwu/d5dOS/hzbGVhn7SdD+wFrgl/jiqXX345l19+ea7DEJE80dPCD8oqJFr4u1sjVJSWUFvgCX+zu682s2nk8CbmIiL5oDXsukmctG1qDz4Adrd0MnFsBcEgxdzTTcxFRPZTW2eQ4GeEte73tEWCn62Rfapn5lKqCX8CPTcx70xbNMPk7tne5Yjke3wikl6JFn5dbSXV5aXsag7S4q7WCJOS6t/n2rATvpkdlfT02wQjdLJ+E/Oqqip2796dt0nV3dm9ezdVVdm9dZmI5E57d1XMMibXVtDQEiT83S2dTB6bPy38kfThP29m64FbgFvd/QEAd/9aRiIbwMyZM6mvrydfC6tB8KE0c+bMXIchIlnSGolRUVpCRVkJk2sq2dWd8CNMLNCE/yPgTOBK4Htm9ihws7tfn5HIBlBeXs7cuXOzuUsRkUG1dUYZUxmMta+rqeTN3W20RaK0d8UKs0vH3b/s7vOB5cC1BFfXXpOpwERECkVrJMbYsEDa5NpKGlo62d0SnLjNp5O2w27hm9kk4AzgbOAEgjIJb2UoLhGRgtEWiXZfTTu5ppK9bRF2NneEzwsw4QPbCb4R7AVuAG4J6+OIiIxqrZ0xxoQXV9XVVuIOr+5oAXrf4zbXRpLwbyc4YXuPu3cNtbCIyGjRFokytiLRhx+06J98YzfQMzY/HwyZ8M1sdjh5Wfhz2gBXjTX2dwcrEZFi19oZY/qEINFPDk/S3vnCNuZOHktdbWG18H8DJAa9D3R9sAM3AjelISYRkYLSGokyNhylc+jUWqrKS+joivPOOQfkOLLehkz47n5CNgIRESlUTe1djKsqB2BcVTkrDqnjvpd3cMTMCbkNrI/8KOEmIlKg3J2mjijjq8u75/3fjyxmbGUZpx0xLYeR7UsJX0RkP7RGYsTi3ivhTxlXxU8+tiR3QQ0g1eJpIiICvN0eDFocV53/7WclfBGR/dAUJvzkFn6+UsIXEdkP3S38KiV8EZGi1tOlo4QvIlLU1KUjIjJKqIUvIjJKNHVEMYPaSo3SEREpak3tXdRWllFSMlDlmfyhhC8ish+a2rsKojsHlPBFRPbL2+1dBXHCFpTwRUT2S6MSvojI6LD97Q6mjqvKdRjDkrWEb2bXm9lOM1ufrX2KiGRSLO7saOpg2gQl/L5uBE7J4v5ERDJqV0sn0bgzdXz+3MZwMFlL+O7+CLAnW/sTEcm0rY3tAEwfrxZ+SszsUjNbY2ZrGhoach2OiMiAtr3dAcA0tfBT4+7XuPtyd19eV1eX63BERAbU3cJXH76ISHHb/nYHVeUlGpYpIlLstjS2M318NWb5X1YBsjss81bgSeAwM6s3s4uztW8RkUzYsL2Zg6fU5DqMYctaeTd3X5mtfYmIZFprZ5SNu1s5fcmMXIcybOrSERFJcse6rVz32MYhl3tlWxPusGj6uCxElR5K+CIiSf7jmbe4fhgJ/6WtTQAsmqGELyJSkBqaO2lo6cTde83f/nYHH7/mSba9HQzFfKH+bSaNrSiYOjqghC8i0ktDcyeRaJym9miv+Xe+sJWn3tjDT+7/KwBPb9rN8jkHFMwIHVDCFxHpFonG2dsW3KN2Z3NHr9faIjEANuxoYUtjO5v3tHPsvElZj3F/KOGLiIR2t3Z2T+9s7uz12lt72gBYv+Vt/rR+OwDHzFXCFxEpSDubkhN+7xb+W7vbKC0xYnHnFw+/zoQx5SyYWpvtEPeLEr6ISKghqVWfnPwhaOF/+MhpjK0oZVdLJysOqSuIG5cnU8IXEQk1tPTfpdPRFWN7Uwfz6mo4Juy3f9+hhVfcUQlfRCSUaOFPH1/VK+HX7w3672dPHMP7F06hqryEFQWY8LNWWkFEJN81NHcyYUw5Mw6opiGpDz9xwnb2pDEsmTmBUxZNZVJNZa7CTJla+CIioYbmTupqKplS27uF/+bunhZ+SYkVZLIHJXwRkW47mzuoq62krraShqSTtm/taWNMRSmTxlbkMLr9p4QvIhJqaOnsTvjNnVHaw4ut3trdxuyJYwrqqtr+KOGLiADuTkNzJ1NqK5lSG3TZJMbiv7UnSPiFTglfRARo6YzS0RWnrraSKWFBtJ3NncTjzlt72jhokhK+iEhRSAzJrEtu4Td1svXtdjqjcWZPGpvL8NJCwzJFREhK+DVVvbp01m0OXj9yxvhchZY2SvgiIvRcZVtXW8kBYyooKzEamjvZsredyrISFk4rnBudDEQJX0SEnto5dbWVlJQYk2sq2fZ2B2/ubuWIGeOpKCv8HvDCfwciImmwq6WT0hJjQnU5AO+cO5EHXtnB+i1NvGP2hNwGlyZK+CIiwN62Lg4YU95dAXPl0bNo7oiCwcqjZ+c4uvRQl46ICNDYFmHCmJ4rad81bxLvXzCF4w6ZzLy6mhxGlj5K+CIiwN62CAeMKe9+bmZcd+E7cxhR+qlLR0QEaGzrYnx1YdfKGYoSvogIQcJPbuEXIyV8ERHCLp0Cr4Y5FCV8ERn1OrpidEbjTCjyFr5O2orIqLe3LQLAAWP6aeHv2Qgv/x52vQrN26B8DNQcCLOOgXnvg9qpw99RPA4Nf4HGt6CjEarGw/hZULcASjOfjpXwRWTU29vaBdDTh9/ZDC//Adb+O7z5eDCvdlrwaN4OGx+BNdeBlcD898PST8BhH+o/absH23juJnj1Pmjfu+8yVeNh3gnwjvOD7ZVkpvMlqwnfzE4BrgJKgWvd/cps7l9EpD+NbRHKiDJ315/h9oeDZN/VBhPnw4n/B476OIyf2bNCPAY71sMrfww+FP7zb2HcDFh2ESy7AGqmQEsDrPv3INHvfg0qx8GC02Due2HyYVA9AdobYc8bsPHPsOGe4JvEhINg+UVw7GehLL3nFMzd07rBAXdkVgr8FTgJqAeeAVa6+8sDrbN8+XJfs2ZNVuITkdHr7he30fK7i1hQ/SwtlTW0zz6W1tlH01wzheauZpojvR9NkSZaulpo62oj7nFi0Q482oHHolTGnWovYUw0xhiPM6a0htrxs6gdP4+ayvHUlI2lpnwsNWVjGVs6hpqyMVSXVhHpaKHjrSdp3/QoFmnhpK+uhRTusGVmz7r78v5ey2YL/2jgNXd/IwxqFXA6MGDCT9Wvv/IjOipi6d6siBS1E9nReiK0AnuAtV3AFgCqgCpqqKMGmDbyTdf3TEZw9tDCHlr6WXAicDrVkZKUkv1QsjlKZwawOel5fTivFzO71MzWmNmahoaGFHcVT3E9EZHcKyktzch2s9nC7+/jap/+JHe/BrgGgi6dVHZ0yQ++nMpqIiJFLZst/HpgVtLzmcDWLO5fRGRUy2bCfwY4xMzmmlkF8HHgjizuX0RkVMtal467R83sH4A/EQzLvN7dX8rW/kVERrusjsN397uBu7O5TxERCaiWjojIKKGELyIySijhi4iMEkr4IiKjRNZq6aTCzBqAN1NcfTKwK43hZEIhxAiKM50KIUZQnOmU7RgPcve6/l7I64S/P8xszUAFhPJFIcQIijOdCiFGUJzplE8xqktHRGSUUMIXERklijnhX5PrAIahEGIExZlOhRAjKM50ypsYi7YPX0REeivmFr6IiCRRwhcRGSWKLuGb2SlmtsHMXjOzr+VBPJvM7EUzW2tma8J5E83sfjN7Nfx5QNLyXw9j32BmH8xgXNeb2U4zW580b8Rxmdmy8P29ZmY/M0vffdkGiPFbZrYlPJ5rzexDOY5xlpk9ZGavmNlLZvb5cH6+HcuB4sy341llZk+b2bowzsvD+XlzPAeJMa+OZb/cvWgeBGWXXwfmARXAOuDwHMe0CZjcZ94PgK+F018Dvh9OHx7GXAnMDd9LaYbiWgEsBdbvT1zA08C7CO5odg9waoZj/BZwWT/L5irGacDScLoW+GsYS74dy4HizLfjaUBNOF0O/A9wbD4dz0FizKtj2d+j2Fr43TdKd/cIkLhRer45HfhNOP0b4CNJ81e5e6e7bwReI3hPaefujxDcqjnluMxsGjDO3Z/04K/3pqR1MhXjQHIV4zZ3fy6cbgZeIbhXc74dy4HiHEiu4nR3T9zduzx8OHl0PAeJcSA5OZb9KbaEP6wbpWeZA/eZ2bNmdmk470B33wbBPyIwJZyf6/hHGteMcLrv/Ez7BzN7IezySXy1z3mMZjYHeAdBiy9vj2WfOCHPjqeZlZrZWmAncL+7593xHCBGyLNj2VexJfxh3Sg9y97j7kuBU4HPmtmKQZbNx/hh4LhyEe8vgfnAEmAb8KNwfk5jNLMa4L+AL7h702CLDhBPruLMu+Pp7jF3X0Jw3+ujzWzxIIvnJM4BYsy7Y9lXsSX8vLtRurtvDX/uBG4n6KLZEX6dI/y5M1w81/GPNK76cLrv/Ixx9x3hP1sc+DU9XV45i9HMygmS6G/d/b/D2Xl3LPuLMx+PZ4K7NwIPA6eQh8ezb4z5fCwTii3h59WN0s1srJnVJqaBk4H1YUwXhItdAPwhnL4D+LiZVZrZXOAQgpM62TKiuMKv1s1mdmw4uuATSetkROKfPnQGwfHMWYzhNq8DXnH3Hye9lFfHcqA48/B41pnZhHC6GvgA8Bfy6HgOFGO+Hct+ZfKMcC4ewIcIRiC8DvxzjmOZR3B2fh3wUiIeYBLwIPBq+HNi0jr/HMa+gQyesQduJfja2UXQ0rg4lbiA5QR/2K8DVxNevZ3BGG8GXgReIPhHmpbjGI8j+Br+ArA2fHwoD4/lQHHm2/E8Eng+jGc98I1U/2cyFecgMebVsezvodIKIiKjRLF16YiIyACU8EVERgklfBGRUUIJX0RklFDCFxEZJZTwZVQwswlm9vdJz6eb2W0Z2tdHzOwbA7zWEv6sM7N7M7F/kYEo4ctoMQHoTvjuvtXdz87Qvr4C/GKwBdy9AdhmZu/JUAwi+1DCl9HiSmB+WKf8h2Y2x8I6+2Z2oZn93sz+aGYbzewfzOyLZva8mT1lZhPD5eab2b1hIbxHzWxB352Y2aFAp7vvCp/PNbMnzewZM/tOn8V/D5yX0XctkkQJX0aLrwGvu/sSd/9yP68vBs4lqH/yXaDN3d8BPElwyTsEN6P+nLsvAy6j/1b8e4Dnkp5fBfzS3d8JbO+z7BrgvSm+H5ERK8t1ACJ54iEP6sQ3m9nbwB/D+S8CR4ZVJt8N/C7ppkSV/WxnGtCQ9Pw9wFnh9M3A95Ne2wlMT0/4IkNTwhcJdCZNx5Oexwn+T0qARg9K4g6mHRjfZ95A9UuqwuVFskJdOjJaNBPc2i8lHtSO32hmH4Wg+qSZHdXPoq8AByc9f5ygaivs219/KD0VFUUyTglfRgV33w08bmbrzeyHKW7mPOBiM0tUP+3v9pmPAO+wnn6fzxPc+OYZ9m35nwDclWIsIiOmapkiaWZmVwF/dPcHhljuEeB0d9+bnchktFMLXyT9vgeMGWwBM6sDfqxkL9mkFr6IyCihFr6IyCihhC8iMkoo4YuIjBJK+CIio4QSvojIKPH/AR0puYBOqeiSAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "...\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n",
    -       "       6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n",
    -       "       3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n",
    -       "       4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n",
    -       "       3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n",
    -       "       1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n",
    -       "       4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n",
    -       "       2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n",
    -       "       4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n",
    -       "       3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n",
    -       "       1.17040422e-11])\n",
    -       "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " - ], - "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n", - " 6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n", - " 3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n", - " 4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n", - " 3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n", - " 1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n", - " 4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n", - " 2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n", - " 4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n", - " 3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n", - " 1.17040422e-11])\n", - "Coordinates:\n", - " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "swiftdiff['rmag'].sel(id=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "swiftestOOF", - "language": "python", - "name": "swiftestoof" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb new file mode 100644 index 000000000..500096a76 --- /dev/null +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -0,0 +1,753 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import swiftest\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swifter.in'\n", + "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swiftest.in'\n", + "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestdat - swifterdat" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", + "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", + "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    +       "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n",
    +       "       3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n",
    +       "       3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n",
    +       "       3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n",
    +       "       3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n",
    +       "       3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n",
    +       "       3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n",
    +       "       3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n",
    +       "       3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n",
    +       "       3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n",
    +       "       3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n",
    +       "       3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n",
    +       "       3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n",
    +       "       3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n",
    +       "       3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n",
    +       "       3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n",
    +       "       3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n",
    +       "       3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n",
    +       "       3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n",
    +       "       6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n",
    +       "...\n",
    +       "       1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n",
    +       "       1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n",
    +       "       1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n",
    +       "       1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n",
    +       "       1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n",
    +       "       1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n",
    +       "       1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n",
    +       "       1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n",
    +       "       1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n",
    +       "       1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n",
    +       "       1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n",
    +       "       1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n",
    +       "       1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n",
    +       "       1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n",
    +       "       1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n",
    +       "       1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n",
    +       "       1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n",
    +       "       1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n",
    +       "       1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n",
    +       "       1.25413096e+00])\n",
    +       "Coordinates:\n",
    +       "    id        int64 2\n",
    +       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + ], + "text/plain": [ + "\n", + "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n", + " 3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n", + " 3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n", + " 3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n", + " 3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n", + " 3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n", + " 3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n", + " 3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n", + " 3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n", + " 3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n", + " 3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n", + " 3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n", + " 3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n", + " 3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n", + " 3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n", + " 3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n", + " 3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n", + " 3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n", + " 3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n", + " 6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n", + "...\n", + " 1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n", + " 1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n", + " 1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n", + " 1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n", + " 1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n", + " 1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n", + " 1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n", + " 1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n", + " 1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n", + " 1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n", + " 1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n", + " 1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n", + " 1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n", + " 1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n", + " 1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n", + " 1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n", + " 1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n", + " 1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n", + " 1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n", + " 1.25413096e+00])\n", + "Coordinates:\n", + " id int64 2\n", + " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['rmag'].sel(id=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 49b18b06cf87595e6ecea0a0a68cde31cdda4a54 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 17:39:14 -0400 Subject: [PATCH 084/194] Replaced NR quicksort with simple insertion sort, as it performs better for partially sorted lists, and nearly every time we need to sort in SyMBA it's a nearly sorted list --- .../swiftest_symba_vs_swifter_symba.ipynb | 4 +- src/setup/setup.f90 | 2 +- src/util/util_sort.f90 | 279 +++--------------- src/util/util_valid.f90 | 1 - 4 files changed, 50 insertions(+), 236 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index 500096a76..b3b31d703 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -622,7 +622,7 @@ " 1.25413096e+00])\n", "Coordinates:\n", " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      2
      array(2)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index ceed089fe..cbd7aabfe 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -69,7 +69,6 @@ module subroutine setup_construct_system(system, param) return end subroutine setup_construct_system - module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! @@ -83,6 +82,7 @@ module subroutine setup_initialize_system(self, param) call self%cb%initialize(param) call self%pl%initialize(param) call self%tp%initialize(param) + call util_valid(self%pl, self%tp) call self%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 126f4f12d..108e7941d 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -4,260 +4,75 @@ module subroutine util_sort_dp(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using Quicksort algorithm + !! Sort input double precision array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_dp.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 implicit none ! Arguments real(DP), dimension(:), intent(inout) :: arr ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - real(DP) :: a, dum - integer(I4B) :: n, k, i, j, jstack, l, r - integer(I4B), dimension(NSTACK) :: istack + real(DP) :: tmp + integer(I4B) :: n, i, j - ! executable code n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_I4B" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) + end do + arr(j + 1) = tmp end do - return - end subroutine util_sort_dp module subroutine util_sort_i4b(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using Quicksort algorithm + !! Sort input integer array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_i4b.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 implicit none ! Arguments integer(I4B), dimension(:), intent(inout) :: arr ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - integer(I4B) :: a, n, k, i, j, jstack, l, r, dum - integer(I4B), dimension(NSTACK) :: istack - - ! executable code + integer(I4B) :: tmp + integer(I4B) :: n, i, j + n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_i4b" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) + end do + arr(j + 1) = tmp end do - return - - end subroutine util_sort_i4b + end subroutine util_sort_i4b + + module subroutine util_sort_sp(arr) + !! author: David A. Minton + !! + !! Sort input single precision array into ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + ! + implicit none + ! Arguments + real(SP), dimension(:), intent(inout) :: arr + ! Internals + real(SP) :: tmp + integer(I4B) :: n, i, j - module subroutine util_sort_sp(arr) - !! author: David A. Minton - !! - !! Sort input single precision array into ascending numerical order using Quicksort algorithm - !! - !! Adapted from David E. Kaufmann's Swifter routine: util_sort_DP.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1169-70 - implicit none - ! Arguments - real(SP), dimension(:), intent(inout) :: arr - ! Internals - integer(I4B), parameter :: NN = 15, NSTACK = 50 - real(SP) :: a, dum - integer(I4B) :: n, k, i, j, jstack, l, r - integer(I4B), dimension(NSTACK) :: istack - - ! executable code - n = size(arr) - jstack = 0 - l = 1 - r = n - do - if ((r - l) < NN) then - do j = l + 1, r - a = arr(j) - do i = j - 1, l, -1 - if (arr(i) <= a) exit - arr(i+1) = arr(i) - end do - arr(i+1) = a - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = arr(k); arr(k) = arr(l+1); arr(l+1) = dum - if (arr(l) > arr(r)) then - dum = arr(l); arr(l) = arr(r); arr(r) = dum - end if - if (arr(l+1) > arr(r)) then - dum = arr(l+1); arr(l+1) = arr(r); arr(r) = dum - end if - if (arr(l) > arr(l+1)) then - dum = arr(l); arr(l) = arr(l+1); arr(l+1) = dum - end if - i = l + 1 - j = r - a = arr(l+1) - do - do - i = i + 1 - if (arr(i) >= a) exit - end do - do - j = j - 1 - if (arr(j) <= a) exit - end do - if (j < i) exit - dum = arr(i); arr(i) = arr(j); arr(j) = dum - end do - arr(l+1) = arr(j) - arr(j) = a - jstack = jstack + 2 - if (jstack > NSTACK) then - write(*, *) "Swiftest Error:" - write(*, *) " NSTACK too small in util_sort_I4B" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if + n = size(arr) + do i = 2, n + tmp = arr(i) + do j = i - 1, 1, -1 + if (arr(j) <= tmp) exit + arr(j + 1) = arr(j) end do - - return - - end subroutine util_sort_sp + arr(j + 1) = tmp + end do + return + end subroutine util_sort_sp end submodule s_util_sort diff --git a/src/util/util_valid.f90 b/src/util/util_valid.f90 index ac81673ca..ac9cc2fad 100644 --- a/src/util/util_valid.f90 +++ b/src/util/util_valid.f90 @@ -32,7 +32,6 @@ module subroutine util_valid(pl, tp) call util_exit(FAILURE) end if end do - deallocate(idarr) end associate return From 81ecfaf1a151158cdcb9d64151776634555ece29 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 17:56:13 -0400 Subject: [PATCH 085/194] Replaced all the old sorting routines with new ones. util_index is now part of the generic util_sort --- .../9pl_18tp_encounters/pl.swiftest.in | 4 +- src/modules/swiftest_classes.f90 | 26 +++-- src/util/util_index.f90 | 103 ------------------ src/util/util_sort.f90 | 87 ++++++++++++++- 4 files changed, 105 insertions(+), 115 deletions(-) delete mode 100644 src/util/util_index.f90 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index cd3c71538..8bc636061 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,5 +1,5 @@ 8 -1 4.9125474498983623693e-11 0.0014751237493860230134 +201 4.9125474498983623693e-11 0.0014751237493860230134 1.6306381826061645943e-05 -0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 -0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 @@ -7,7 +7,7 @@ 4.0453784346544178454e-05 -0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +1003 8.9970113821660187435e-10 0.010044863223462002622 4.25875607065040958e-05 0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 313893e5d..b16df1020 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -20,7 +20,7 @@ module swiftest_classes public :: tides_kick_getacch_pl, tides_step_spin_system public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & - util_index, util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & + util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** @@ -789,12 +789,6 @@ module subroutine util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_tp - module subroutine util_index(arr, index) - implicit none - integer(I4B), dimension(:), intent(out) :: index - real(DP), dimension(:), intent(in) :: arr - end subroutine util_index - module subroutine util_peri_tp(self, system, param) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object @@ -856,15 +850,33 @@ module subroutine util_sort_i4b(arr) integer(I4B), dimension(:), intent(inout) :: arr end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr,ind) + implicit none + integer(I4B), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_i4b + module subroutine util_sort_sp(arr) implicit none real(SP), dimension(:), intent(inout) :: arr end subroutine util_sort_sp + module subroutine util_sort_index_sp(arr,ind) + implicit none + real(SP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_sp + module subroutine util_sort_dp(arr) implicit none real(DP), dimension(:), intent(inout) :: arr end subroutine util_sort_dp + + module subroutine util_sort_index_dp(arr,ind) + implicit none + real(DP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + end subroutine util_sort_index_dp end interface interface diff --git a/src/util/util_index.f90 b/src/util/util_index.f90 deleted file mode 100644 index fcece8809..000000000 --- a/src/util/util_index.f90 +++ /dev/null @@ -1,103 +0,0 @@ -submodule (swiftest_classes) s_util_index - use swiftest -contains - module subroutine util_index(arr, index) - !! author: David A. Minton - !! - !! Index input real array into ascending numerical order using Quicksort algorithm - !! - !! Adapted from David E. Kaufmann's Swifter routine: util_index.f90 - !! Adapted from Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing, by Press, Teukolsky, - !! Vetterling, and Flannery, 2nd ed., pp. 1173-4 - implicit none - ! Arguments - integer(I4B), dimension(:), intent(out) :: index - real(DP), dimension(:), intent(in) :: arr - ! Internals - integer(I4B), parameter :: nn = 15, nstack = 50 - integer(I4B) :: n, k, i, j, indext, jstack, l, r, dum - integer(I4B), dimension(nstack) :: istack - real(DP) :: a - - n = size(arr) - if (n /= size(index)) then - write(*, *) "Swiftest Error:" - write(*, *) " array size mismatch in util_index" - call util_exit(FAILURE) - end if - index = arth(1, 1, n) - jstack = 0 - ! l is the counter ie 'the one we are at' - l = 1 - ! r is the length of the array ie 'the total number of particles' - r = n - do - if ((r - l) < nn) then - do j = l + 1, r - indext = index(j) - a = arr(indext) - do i = j - 1, l, -1 - if (arr(index(i)) <= a) exit - index(i+1) = index(i) - end do - index(i+1) = indext - end do - if (jstack == 0) return - r = istack(jstack) - l = istack(jstack-1) - jstack = jstack - 2 - else - k = (l + r)/2 - dum = index(k); index(k) = index(l+1); index(l+1) = dum - ! if the mass of the particle we are at in our counting is greater than the mass of the last particle then put the particle we are at above the last one - if (arr(index(l)) > arr(index(r))) then - dum = index(l); index(l) = index(r); index(r) = dum - end if - ! if the mass of the particle above the one we are at in our counting is greater than the last particle then put that particle above the last one - if (arr(index(l+1)) > arr(index(r))) then - dum = index(l+1); index(l+1) = index(r); index(r) = dum - end if - ! if the mass of teh particle we are at in our counting is greater than the one above it, then put it above the one above it - if (arr(index(l)) > arr(index(l+1))) then - dum = index(l); index(l) = index(l+1); index(l+1) = dum - end if - i = l + 1 - j = r - indext = index(l+1) - a = arr(indext) - do - do - i = i + 1 - if (arr(index(i)) >= a) exit - end do - do - j = j - 1 - if (arr(index(j)) <= a) exit - end do - if (j < i) exit - dum = index(i); index(i) = index(j); index(j) = dum - end do - index(l+1) = index(j) - index(j) = indext - jstack = jstack + 2 - if (jstack > nstack) then - write(*, *) "Swiftest Error:" - write(*, *) " nstack too small in util_sort" - call util_exit(FAILURE) - end if - if ((r - i + 1) >= (j - l)) then - istack(jstack) = r - istack(jstack-1) = i - r = j - 1 - else - istack(jstack) = j - 1 - istack(jstack-1) = l - l = i - end if - end if - end do - - return - - end subroutine util_index -end submodule s_util_index diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 108e7941d..73e1a4978 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -4,7 +4,7 @@ module subroutine util_sort_dp(arr) !! author: David A. Minton !! - !! Sort input double precision array into ascending numerical order using insertion sort. + !! Sort input double precision array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) !! implicit none @@ -26,10 +26,37 @@ module subroutine util_sort_dp(arr) return end subroutine util_sort_dp + module subroutine util_sort_index_dp(arr, ind) + !! author: David A. Minton + !! + !! Sort input double precision array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + real(DP) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + end do + ind(j + 1) = i + end do + return + end subroutine util_sort_index_dp + module subroutine util_sort_i4b(arr) !! author: David A. Minton !! - !! Sort input integer array into ascending numerical order using insertion sort. + !! Sort input integer array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) !! implicit none @@ -51,10 +78,37 @@ module subroutine util_sort_i4b(arr) return end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr, ind) + !! author: David A. Minton + !! + !! Sort input integer array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + integer(I4B), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + integer(I4B) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + end do + ind(j + 1) = i + end do + return + end subroutine util_sort_index_i4b + module subroutine util_sort_sp(arr) !! author: David A. Minton !! - !! Sort input single precision array into ascending numerical order using insertion sort. + !! Sort input single precision array in place into ascending numerical order using insertion sort. !! This algorithm works well for partially sorted arrays (which is usually the case here) ! implicit none @@ -75,4 +129,31 @@ module subroutine util_sort_sp(arr) end do return end subroutine util_sort_sp + + module subroutine util_sort_index_sp(arr, ind) + !! author: David A. Minton + !! + !! Sort input single precision array by index in ascending numerical order using insertion sort. + !! This algorithm works well for partially sorted arrays (which is usually the case here) + !! + implicit none + ! Arguments + real(SP), dimension(:), intent(in) :: arr + integer(I4B), dimension(:), intent(out) :: ind + ! Internals + real(SP) :: tmp + integer(I4B) :: n, i, j + + n = size(arr) + ind = [(i, i=1, n)] + do i = 2, n + tmp = arr(ind(i)) + do j = i - 1, 1, -1 + if (arr(ind(j)) <= tmp) exit + ind(j + 1) = ind(j) + end do + ind(j + 1) = i + end do + return + end subroutine util_sort_index_sp end submodule s_util_sort From 99396624902297788899c9bd4ff405c70f97ee3e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 18:19:33 -0400 Subject: [PATCH 086/194] Added new sorting methods for swiftest bodies --- src/modules/swiftest_classes.f90 | 20 ++++++++++++++++++-- src/util/util_sort.f90 | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index b16df1020..d9758570b 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,7 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_sort_pl, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -186,6 +186,7 @@ module swiftest_classes procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: sort => util_sort_body !! Sorts a body by an attribute (base method only allows for sorting by id. Override to add other capabilities) procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure end type swiftest_body @@ -228,6 +229,7 @@ module swiftest_classes procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: sort => util_sort_pl !! Sorts a body by an attribute (adds ability to sort by mass) procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl @@ -877,9 +879,23 @@ module subroutine util_sort_index_dp(arr,ind) real(DP), dimension(:), intent(in) :: arr integer(I4B), dimension(:), intent(out) :: ind end subroutine util_sort_index_dp - end interface + end interface util_sort interface + module subroutine util_sort_body(self, sortby, reverse) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, reverse) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_pl + module subroutine util_spill_body(self, discards, lspill_list) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 73e1a4978..1f201179f 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,6 +1,29 @@ submodule (swiftest_classes) s_util_sort use swiftest contains + module subroutine util_sort_body(self, sortby, reverse) + !! author: David A. Minton + !! + !! Sort a Swiftest body structure in-place. + !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. + !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, reverse) + !! author: David A. Minton + !! + !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. + !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest body object + character(*), optional, intent(in) :: sortby !! Sorting attribute + logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + end subroutine util_sort_pl + module subroutine util_sort_dp(arr) !! author: David A. Minton !! From ba99dd75b6548122f9f31b125e943387b3f8c23a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Tue, 27 Jul 2021 22:48:08 -0400 Subject: [PATCH 087/194] Started a polymorphic sorting method --- src/modules/swiftest_classes.f90 | 22 ++++--------- src/util/util_sort.f90 | 56 ++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d9758570b..fe9b7e86d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,7 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_sort_pl, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -229,7 +229,6 @@ module swiftest_classes procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: sort => util_sort_pl !! Sorts a body by an attribute (adds ability to sort by mass) procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl @@ -884,23 +883,16 @@ end subroutine util_sort_index_dp interface module subroutine util_sort_body(self, sortby, reverse) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) end subroutine util_sort_body - module subroutine util_sort_pl(self, sortby, reverse) - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_pl - module subroutine util_spill_body(self, discards, lspill_list) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards end subroutine util_spill_body module subroutine util_spill_pl(self, discards, lspill_list) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 1f201179f..190561002 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -8,21 +8,49 @@ module subroutine util_sort_body(self, sortby, reverse) !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_body + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + ! Internals + class(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body + integer(I4B), dimension(:), allocatable :: ind - module subroutine util_sort_pl(self, sortby, reverse) - !! author: David A. Minton - !! - !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. - !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. - implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest body object - character(*), optional, intent(in) :: sortby !! Sorting attribute - logical, optional, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) - end subroutine util_sort_pl + associate(n => self%nbody) + allocate(body_sorted, source=self) + allocate(ind(n)) + select case(sortby) + case("id") + if (reverse) then + call util_sort(-self%id(1:n), ind(1:n)) + else + call util_sort(self%id(1:n), ind(1:n)) + end if + end select + + self%id(1:n) = body_sorted%id(ind(1:n)) + self%name(1:n) = body_sorted%name(ind(1:n)) + self%status(1:n) = body_sorted%status(ind(1:n)) + self%ldiscard(1:n) = body_sorted%ldiscard(ind(1:n)) + self%xh(:,1:n) = body_sorted%xh(:,ind(1:n)) + self%vh(:,1:n) = body_sorted%vh(:,ind(1:n)) + self%xb(:,1:n) = body_sorted%xb(:,ind(1:n)) + self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) + self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) + self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) + self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) + self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) + self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) + self%a(1:n) = body_sorted%a(ind(1:n)) + self%e(1:n) = body_sorted%e(ind(1:n)) + self%inc(1:n) = body_sorted%inc(ind(1:n)) + self%capom(1:n) = body_sorted%capom(ind(1:n)) + self%omega(1:n) = body_sorted%omega(ind(1:n)) + self%capm(1:n) = body_sorted%capm(ind(1:n)) + self%mu(1:n) = body_sorted%mu(ind(1:n)) + end associate + return + end subroutine util_sort_body module subroutine util_sort_dp(arr) !! author: David A. Minton From bcb2f461e04b1463bc62781235ea53e05b1d4cd6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 01:36:49 -0400 Subject: [PATCH 088/194] Added new methods for sorting bodies in various ways --- src/modules/swiftest_classes.f90 | 125 ++++++++++------ src/util/util_sort.f90 | 236 +++++++++++++++++++++++++++++-- 2 files changed, 304 insertions(+), 57 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fe9b7e86d..7f91f93f2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -21,7 +21,9 @@ module swiftest_classes public :: user_kick_getacch_body public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, util_sort, util_sort_body, util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, & + util_sort, util_sort_body, util_sort_pl, util_sort_tp, util_sort_rearrange_body, util_sort_rearrange_pl, util_sort_rearrange_tp, & + util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -130,8 +132,8 @@ module swiftest_classes contains private procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data - procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body procedure, public :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body + procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body end type swiftest_cb !******************************************************************************************************************************** @@ -172,22 +174,23 @@ module swiftest_classes procedure(abstract_step_body), public, deferred :: step procedure(abstract_accel), public, deferred :: accel ! These are concrete because the implementation is the same for all types of particles - procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables - procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators - procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators - procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file - procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors - procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements - procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) - procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays + procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables + procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators + procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators + procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file + procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors + procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements + procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) - procedure, public :: sort => util_sort_body !! Sorts a body by an attribute (base method only allows for sorting by id. Override to add other capabilities) - procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + procedure, public :: sort => util_sort_body !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -217,19 +220,21 @@ module swiftest_classes private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass + procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body + procedure, public :: sort => util_sort_pl !! Sorts body arrays by a sortable component + procedure, public :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** @@ -247,16 +252,18 @@ module swiftest_classes private ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies - procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and - procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure, public :: sort => util_sort_tp !! Sorts body arrays by a sortable component + procedure, public :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -289,10 +296,10 @@ module swiftest_classes ! Concrete classes that are common to the basic integrator (only test particles considered for discard) procedure, public :: discard => discard_system !! Perform a discard step on the system procedure, public :: dump => io_dump_system !! Dump the state of the system to a file - procedure, public :: initialize => setup_initialize_system !! Initialize the system from input files procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure, public :: initialize => setup_initialize_system !! Initialize the system from input files procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system @@ -881,12 +888,44 @@ end subroutine util_sort_index_dp end interface util_sort interface - module subroutine util_sort_body(self, sortby, reverse) + module subroutine util_sort_rearrange_body(self, ind) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine util_sort_rearrange_body + + module subroutine util_sort_rearrange_pl(self, ind) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine util_sort_rearrange_pl + + module subroutine util_sort_rearrange_tp(self, ind) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine util_sort_rearrange_tp + + module subroutine util_sort_body(self, sortby, ascending) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, ascending) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine util_sort_pl + + module subroutine util_sort_tp(self, sortby, ascending) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine util_sort_tp module subroutine util_spill_body(self, discards, lspill_list) implicit none diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 190561002..fdaded124 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,33 +1,185 @@ submodule (swiftest_classes) s_util_sort use swiftest contains - module subroutine util_sort_body(self, sortby, reverse) + module subroutine util_sort_body(self, sortby, ascending) !! author: David A. Minton !! !! Sort a Swiftest body structure in-place. - !! sortby is a string. The only valid input the body class takes is "id," which is also the default value. - !! Sort order is ascending order by default. Set reverse=.true. to sort in descending order. + !! sortby is a string indicating which array component to sort. implicit none ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: reverse !! Logical flag indicating whether or not the sorting should be in reverse (descending order) + class(swiftest_body), intent(inout) :: self !! Swiftest body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals - class(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body integer(I4B), dimension(:), allocatable :: ind - associate(n => self%nbody) - allocate(body_sorted, source=self) - allocate(ind(n)) + associate(body => self, n => self%nbody) select case(sortby) case("id") - if (reverse) then - call util_sort(-self%id(1:n), ind(1:n)) + if (ascending) then + call util_sort(body%id(1:n), ind(1:n)) + else + call util_sort(-body%id(1:n), ind(1:n)) + end if + case("a") + if (ascending) then + call util_sort(body%a(1:n), ind(1:n)) + else + call util_sort(-body%a(1:n), ind(1:n)) + end if + case("e") + if (ascending) then + call util_sort(body%e(1:n), ind(1:n)) + else + call util_sort(-body%e(1:n), ind(1:n)) + end if + case("inc") + if (ascending) then + call util_sort(body%inc(1:n), ind(1:n)) + else + call util_sort(-body%inc(1:n), ind(1:n)) + end if + case("capom") + if (ascending) then + call util_sort(body%capom(1:n), ind(1:n)) + else + call util_sort(-body%capom(1:n), ind(1:n)) + end if + case("mu") + if (ascending) then + call util_sort(body%mu(1:n), ind(1:n)) + else + call util_sort(-body%mu(1:n), ind(1:n)) + end if + case default + write(*,*) 'Cannot sort structure by component '//trim(adjustl(sortby)) + end select + + call body%rearrange(ind) + end associate + + return + end subroutine util_sort_body + + module subroutine util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(:), allocatable :: ind + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("Gmass","mass") + if (ascending) then + call util_sort(pl%Gmass(1:npl), ind(1:npl)) + else + call util_sort(-pl%Gmass(1:npl), ind(1:npl)) + end if + case("rhill") + if (ascending) then + call util_sort(pl%rhill(1:npl), ind(1:npl)) + else + call util_sort(-pl%rhill(1:npl), ind(1:npl)) + end if + case("radius") + if (ascending) then + call util_sort(pl%radius(1:npl), ind(1:npl)) + else + call util_sort(-pl%radius(1:npl), ind(1:npl)) + end if + case("density") + if (ascending) then + call util_sort(pl%density(1:npl), ind(1:npl)) else - call util_sort(self%id(1:n), ind(1:n)) + call util_sort(-pl%density(1:npl), ind(1:npl)) end if + case("k2") + if (ascending) then + call util_sort(pl%k2(1:npl), ind(1:npl)) + else + call util_sort(-pl%k2(1:npl), ind(1:npl)) + end if + case("Q") + if (ascending) then + call util_sort(pl%Q(1:npl), ind(1:npl)) + else + call util_sort(-pl%Q(1:npl), ind(1:npl)) + end if + case("tlag") + if (ascending) then + call util_sort(pl%tlag(1:npl), ind(1:npl)) + else + call util_sort(-pl%tlag(1:npl), ind(1:npl)) + end if + case default + call util_sort_body(pl, sortby, ascending) end select + call pl%rearrange(ind) + end associate + + return + end subroutine util_sort_pl + + module subroutine util_sort_tp(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(:), allocatable :: ind + + associate(tp => self, ntp => self%nbody) + select case(sortby) + case("peri") + if (ascending) then + call util_sort(tp%peri(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%peri(1:ntp), ind(1:ntp)) + end if + case("atp") + if (ascending) then + call util_sort(tp%atp(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%atp(1:ntp), ind(1:ntp)) + end if + case default + call util_sort_body(tp, sortby, ascending) + end select + + call tp%rearrange(ind) + end associate + + return + end subroutine util_sort_tp + + module subroutine util_sort_rearrange_body(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(swiftest_body), allocatable :: body_sorted !! Temporary holder for sorted body + + associate(n => self%nbody) + allocate(body_sorted, source=self) self%id(1:n) = body_sorted%id(ind(1:n)) self%name(1:n) = body_sorted%name(ind(1:n)) self%status(1:n) = body_sorted%status(ind(1:n)) @@ -48,9 +200,65 @@ module subroutine util_sort_body(self, sortby, reverse) self%omega(1:n) = body_sorted%omega(ind(1:n)) self%capm(1:n) = body_sorted%capm(ind(1:n)) self%mu(1:n) = body_sorted%mu(ind(1:n)) + deallocate(body_sorted) end associate return - end subroutine util_sort_body + end subroutine util_sort_rearrange_body + + module subroutine util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(swiftest_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + + call util_sort_rearrange_body(self,ind) + associate(n => self%nbody) + allocate(pl_sorted, source=self) + self%mass(1:n) = pl_sorted%mass(ind(1:n)) + self%Gmass(1:n) = pl_sorted%Gmass(ind(1:n)) + self%rhill(1:n) = pl_sorted%rhill(ind(1:n)) + self%radius(1:n) = pl_sorted%radius(ind(1:n)) + self%xbeg(:,1:n) = pl_sorted%xbeg(:,ind(1:n)) + self%xend(:,1:n) = pl_sorted%xend(:,ind(1:n)) + self%vbeg(:,1:n) = pl_sorted%vbeg(:,ind(1:n)) + self%density(1:n) = pl_sorted%density(ind(1:n)) + self%Ip(:,1:n) = pl_sorted%Ip(:,ind(1:n)) + self%rot(:,1:n) = pl_sorted%rot(:,ind(1:n)) + self%k2(1:n) = pl_sorted%k2(ind(1:n)) + self%Q(1:n) = pl_sorted%Q(ind(1:n)) + self%tlag(1:n) = pl_sorted%tlag(ind(1:n)) + deallocate(pl_sorted) + end associate + return + end subroutine util_sort_rearrange_pl + + module subroutine util_sort_rearrange_tp(self, ind) + !! author: David A. Minton + !! + !! Rearrange Swiftest massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(swiftest_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + + call util_sort_rearrange_body(self,ind) + associate(n => self%nbody) + allocate(tp_sorted, source=self) + self%isperi(1:n) = tp_sorted%isperi(ind(1:n)) + self%peri(1:n) = tp_sorted%peri(ind(1:n)) + self%atp(1:n) = tp_sorted%atp(ind(1:n)) + deallocate(tp_sorted) + end associate + return + end subroutine util_sort_rearrange_tp module subroutine util_sort_dp(arr) !! author: David A. Minton From c85f8a97e1e06675edaeb4bd5ce5888afbad538e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:32:15 -0400 Subject: [PATCH 089/194] Corrected allocation of polymorphic parameter file for SyMBA and fixed bugs in param reader. Added all sorting methods and sort by mass in symba_setup_system --- .../1pl_1tp_encounter/init_cond.py | 2 +- .../9pl_18tp_encounters/init_cond.py | 1 + .../9pl_18tp_encounters/param.swiftest.in | 2 +- .../9pl_18tp_encounters/pl.in | 48 +++--- .../9pl_18tp_encounters/pl.swifter.in | 48 +++--- .../9pl_18tp_encounters/pl.swiftest.in | 48 +++--- .../9pl_18tp_encounters/tp.in | 64 +++---- src/io/io.f90 | 4 +- src/main/swiftest_driver.f90 | 10 +- src/modules/symba_classes.f90 | 45 ++++- src/symba/symba_io.f90 | 5 +- src/symba/symba_setup.f90 | 2 + src/symba/symba_util.f90 | 161 ++++++++++++++++++ src/util/util_sort.f90 | 6 +- 14 files changed, 325 insertions(+), 121 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index 5ef0d4df7..86c13a50e 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -173,7 +173,7 @@ print(f'DU2M {DU2M}') print(f'TU2S {TU2S}') print(f'RHILL_PRESENT yes') - +print(f'MTINY 1e-12') diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py index 82850837d..18ef4ce48 100755 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py @@ -38,6 +38,7 @@ sim.param['GR'] = 'NO' sim.param['CHK_CLOSE'] = 'YES' sim.param['RHILL_PRESENT'] = 'YES' +sim.param['MTINY'] = 1.0e-12 sim.param['MU2KG'] = swiftest.MSun sim.param['TU2S'] = swiftest.JD2S diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in index 06edc324b..e9ed6376c 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in @@ -33,4 +33,4 @@ ENERGY NO GR NO YARKOVSKY NO YORP NO -MTINY 0.0 +MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in index cd3c71538..fea43297f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in @@ -1,33 +1,33 @@ 8 -1 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in index e42b53b68..79614abb4 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in @@ -2,35 +2,35 @@ 0 0.00029591220819207775568 0.0 0.0 0.0 0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -3 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in index 8bc636061..fea43297f 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in @@ -1,33 +1,33 @@ 8 -201 4.9125474498983623693e-11 0.0014751237493860230134 +1 4.9125474498983623693e-11 0.0014751238438755500459 1.6306381826061645943e-05 --0.032433320146471017464 0.30732647407569840814 0.0280888997405028297 --0.033622812072399158034 -0.0019305604712619159943 0.0029264451427202888868 -2 7.243452483873646905e-10 0.006759082196678506012 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 4.0453784346544178454e-05 --0.6608991468450423623 -0.28805695486041710263 0.034183953683804932377 -0.007943018642097033136 -0.018635382188272479886 -0.00071410720992500279457 -1003 8.9970113821660187435e-10 0.010044863223462002622 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 4.25875607065040958e-05 -0.5665449483756358484 -0.84285201543201082597 3.8152874628327130158e-05 -0.0139986033055793102076 0.009533392738922031109 -5.008237574040859916e-07 -4 9.549535102761465607e-11 0.0072467110395904559343 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 2.265740805092889601e-05 --1.5854600237231359916 0.50600057977052448344 0.049495356229978339224 --0.0037325822023031099417 -0.0121364162752466003825 -0.00016278089870573419053 -5 2.825345908631354893e-07 0.35527078496549785303 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 0.00046732617030490929307 -4.1105798235203270252 -2.9003636368897538489 -0.07992066204197022239 -0.0042645403767569648595 0.006527961423420942065 -0.00012252307659855749943 -6 8.459715183006415395e-08 0.43765573308845887078 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 0.00038925687730393611812 -6.3549393159832749944 -7.6568459312514027815 -0.11978932080537739446 -0.0039872926987931916337 0.0035567518157804990653 -0.00022047226166396519348 -7 1.2920249163736673626e-08 0.46957395507687206725 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 0.00016953449859497231466 -14.81940372833062014 13.046490834898889943 -0.14356031024960910769 --0.002623943559850705834 0.002775224845039696818 4.4157032104701469965e-05 -8 1.5243589003230834323e-08 0.7813323455417420909 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 0.000164587904124493665 -29.563994989459040141 -4.5855881090096284325 -0.5869609072731380994 -0.00046517035659338968386 0.0031282283842968541462 -7.504927375628088796e-05 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in index e7424ed6f..7c1b15bd6 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in @@ -1,49 +1,49 @@ 16 101 --0.032410259440139366216 0.30734953478203003163 0.0280888997405028297 --0.031019262600390007378 -0.0019305604712619159943 0.0029264451427202888868 +-0.0658187108448175795 0.30391138014159824188 0.030872485461978960153 +-0.030537616761930286291 -0.0049297226604189817514 0.0026371811668407158825 102 --0.032456380852802668713 0.30730341336936678465 0.0280888997405028297 --0.03622636154440830869 -0.0019305604712619159943 0.0029264451427202888868 +-0.065864832257480881994 0.3038652587289349949 0.030872485461978960153 +-0.035744715705948587603 -0.0049297226604189817514 0.0026371811668407158825 103 --0.6608419365545701307 -0.28799974456994492655 0.034183953683804932377 -0.014290252347442427075 -0.018635382188272479886 -0.00071410720992500279457 +-0.6526399503364792576 -0.30651935535365792962 0.033456491497379246824 +0.014807065041004032965 -0.0184014319837384685 -0.0007407193515014080928 104 --0.6609563571355145939 -0.2881141651508892787 0.034183953683804932377 -0.0015957849367516391964 -0.018635382188272479886 -0.00071410720992500279457 +-0.65275437091742372075 -0.30663377593460228177 0.033456491497379246824 +0.0021125976303132450868 -0.0184014319837384685 -0.0007407193515014080928 105 -0.5666051762815753623 -0.8427917875260713121 3.8152874628327130158e-05 -0.020893043539853186491 0.009533392738922031109 -5.008237574040859916e-07 +0.58052308875528702004 -0.8331397763444912119 3.7646553415201541957e-05 +0.020730998066553867065 0.009770187318278569788 -5.1179589633921335467e-07 106 -0.56648472046969633453 -0.84291224333795033985 3.8152874628327130158e-05 -0.0071041630713054347915 0.009533392738922031109 -5.008237574040859916e-07 +0.58040263294340799227 -0.83326023215637023966 3.7646553415201541957e-05 +0.0069421175980061153657 0.009770187318278569788 -5.1179589633921335467e-07 107 --1.5854279813093821172 0.50603262218427835784 0.049495356229978339224 --0.00065310310407921696313 -0.0121364162752466003825 -0.00016278089870573419053 +-1.5891096979602641337 0.49388011604967890777 0.049330990309104823244 +-0.00055132825635455804184 -0.012168467501132099878 -0.00016594932370266260858 108 --1.585492066136889866 0.50596853735677060904 0.049495356229978339224 --0.0068120613005270029203 -0.0121364162752466003825 -0.00016278089870573419053 +-1.5891737827877718825 0.49381603122217127 0.049330990309104823244 +-0.0067102864528023435653 -0.012168467501132099878 -0.00016594932370266260858 109 -4.1112407225284242074 -2.8997027378816566667 -0.07992066204197022239 -0.041146757578404392908 0.006527961423420942065 -0.00012252307659855749943 +4.1155004823659924185 -2.893171407164709663 -0.080043092204059404504 +0.0411371945893665783 0.006534697671907701254 -0.00012233719535540690457 110 -4.109918924512229843 -2.901024535897851031 -0.07992066204197022239 --0.032617676824890466658 0.006527961423420942065 -0.00012252307659855749943 +4.114178684349798054 -2.8944932051809040274 -0.080043092204059404504 +-0.032627239813928281265 0.006534697671907701254 -0.00012233719535540690457 111 -6.3554898083384054885 -7.6562954388962722874 -0.11978932080537739446 -0.026100461582326782428 0.0035567518157804990653 -0.00022047226166396519348 +6.3594761400945154506 -7.652737529060036792 -0.12000977499446359442 +0.02609853948273724994 0.0035590677039893160206 -0.00022043610541731448703 112 -6.3543888236281445003 -7.6573964236065332756 -0.11978932080537739446 --0.018125876184740395691 0.0035567518157804990653 -0.00022047226166396519348 +6.3583751553842544624 -7.65383851377029778 -0.12000977499446359442 +-0.01812779828432992818 0.0035590677039893160206 -0.00022043610541731448703 113 -14.819643486317822578 13.046730592886092381 -0.14356031024960910769 -0.010470819978811187617 0.002775224845039696818 4.4157032104701469965e-05 +14.817019253266252576 13.049505570448612701 -0.14351615042000470668 +0.010470241012353788054 0.002774730265364384104 4.416262654344997005e-05 114 -14.819163970343417702 13.046251076911687505 -0.14356031024960910769 --0.015718707098512599285 0.002775224845039696818 4.4157032104701469965e-05 +14.8165397372918477 13.049026054474207825 -0.14351615042000470668 +-0.015719286064969997113 0.002774730265364384104 4.416262654344997005e-05 115 -29.56422775190525698 -4.58535534656341337 -0.5869609072731380994 -0.014900806169871520443 0.0031282283842968541462 -7.504927375628088796e-05 +29.564692754289236376 -4.5822270889269072214 -0.5870359532621901577 +0.014900470225798949711 0.0031282868879460171488 -7.5042704502708602616e-05 116 -29.563762227012823303 -4.585820871455843495 -0.5869609072731380994 --0.013970465456684741726 0.0031282283842968541462 -7.504927375628088796e-05 +29.564227229396802699 -4.582692613819337346 -0.5870359532621901577 +-0.013970801400757312458 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/src/io/io.f90 b/src/io/io.f90 index 82c87dfc7..7c50242cb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -259,10 +259,10 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Determine if the GR flag is set correctly for this integrator select case(integrator) - case(WHM, RMVS) + case(WHM, RMVS, SYMBA) write(*,*) "GR = ", self%lgr case default - write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' end select end associate diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 4ed7cf3fe..4c6bccc72 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -10,9 +10,9 @@ program swiftest_driver implicit none class(swiftest_nbody_system), allocatable :: nbody_system !! Polymorphic object containing the nbody system to be integrated - type(swiftest_parameters) :: param + class(swiftest_parameters), allocatable :: param !! Run configuration parameters integer(I4B) :: integrator !! Integrator type code (see swiftest_globals for symbolic names) - character(len=:),allocatable :: param_file_name !! Name of the file containing user-defined parameters + character(len=:),allocatable :: param_file_name !! Name of the file containing user-defined parameters integer(I4B) :: ierr !! I/O error code integer(I8B) :: iloop !! Loop counter integer(I8B) :: idump !! Dump cadence counter @@ -31,6 +31,12 @@ program swiftest_driver end if !$ start_wall_time = omp_get_wtime() !> Read in the user-defined parameters file and the initial conditions of the system + select case(integrator) + case(symba) + allocate(symba_parameters :: param) + case default + allocate(swiftest_parameters :: param) + end select param%integrator = integrator call setup_construct_system(nbody_system, param) call param%read_from_file(param_file_name) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 0a6dcb290..98108e9df 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -89,10 +89,12 @@ module symba_classes type(symba_particle_info), dimension(:), allocatable :: info contains private - procedure, public :: discard => symba_discard_pl !! Process massive body discards - procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other - procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure, public :: discard => symba_discard_pl !! Process massive body discards + procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure, public :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl !******************************************************************************************************************************** @@ -105,9 +107,11 @@ module symba_classes integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains private - procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure, public :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen + procedure, public :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_tp !******************************************************************************************************************************** @@ -390,5 +394,32 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B), intent(in) :: nrequested !! New size of list needed end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) + implicit none + class(symba_pl), intent(inout) :: self !! Symba massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine symba_util_sort_pl + + module subroutine symba_util_sort_tp(self, sortby, ascending) + implicit none + class(symba_tp), intent(inout) :: self !! Swiftest test particle object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine symba_util_sort_tp + + module subroutine symba_util_sort_rearrange_pl(self, ind) + implicit none + class(symba_pl), intent(inout) :: self !! Symba massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine symba_util_sort_rearrange_pl + + module subroutine symba_util_sort_rearrange_tp(self, ind) + implicit none + class(symba_tp), intent(inout) :: self !! Symba massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine symba_util_sort_rearrange_tp + + end interface end module symba_classes \ No newline at end of file diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index bebb225b5..acc3aabf9 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -51,6 +51,7 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms call random_seed(size = nseeds) if (allocated(param%seed)) deallocate(param%seed) allocate(param%seed(nseeds)) + rewind(unit) do read(unit = unit, fmt = linefmt, iostat = iostat, end = 1) line line_trim = trim(adjustl(line)) @@ -121,8 +122,10 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms return end if end associate - return + iostat = 0 + + return end subroutine symba_io_param_reader module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, iomsg) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 5ac26c220..9efb37e9a 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -104,6 +104,7 @@ module subroutine symba_setup_system(self, param) !! author: David A. Minton !! !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. + !! This subroutine will also sort the massive bodies in descending order by mass !! implicit none ! Arguments @@ -121,6 +122,7 @@ module subroutine symba_setup_system(self, param) call system%plplenc_list%setup(1) select type(pl => system%pl) class is (symba_pl) + call pl%sort("mass", ascending=.false.) select type(param) class is (symba_parameters) pl%lmtiny(:) = pl%Gmass(:) > param%MTINY diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 031ae4ae5..24a59a9cc 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -65,5 +65,166 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) return end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! Symba massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("nplenc") + if (ascending) then + call util_sort(pl%nplenc(1:npl), ind(1:npl)) + else + call util_sort(-pl%nplenc(1:npl), ind(1:npl)) + end if + case("ntpenc") + if (ascending) then + call util_sort(pl%ntpenc(1:npl), ind(1:npl)) + else + call util_sort(-pl%ntpenc(1:npl), ind(1:npl)) + end if + case("levelg") + if (ascending) then + call util_sort(pl%levelg(1:npl), ind(1:npl)) + else + call util_sort(-pl%levelg(1:npl), ind(1:npl)) + end if + case("levelm") + if (ascending) then + call util_sort(pl%levelm(1:npl), ind(1:npl)) + else + call util_sort(-pl%levelm(1:npl), ind(1:npl)) + end if + case("peri") + if (ascending) then + call util_sort(pl%peri(1:npl), ind(1:npl)) + else + call util_sort(-pl%peri(1:npl), ind(1:npl)) + end if + case("atp") + if (ascending) then + call util_sort(pl%atp(1:npl), ind(1:npl)) + else + call util_sort(-pl%atp(1:npl), ind(1:npl)) + end if + case default + call util_sort_pl(pl, sortby, ascending) + end select + call pl%rearrange(ind) + end associate + + return + end subroutine symba_util_sort_pl + + module subroutine symba_util_sort_tp(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a Swiftest test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Swiftest test particle object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + + associate(tp => self, ntp => self%nbody) + select case(sortby) + case("nplenc") + if (ascending) then + call util_sort(tp%nplenc(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%nplenc(1:ntp), ind(1:ntp)) + end if + case("levelg") + if (ascending) then + call util_sort(tp%levelg(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%levelg(1:ntp), ind(1:ntp)) + end if + case("levelm") + if (ascending) then + call util_sort(tp%levelm(1:ntp), ind(1:ntp)) + else + call util_sort(-tp%levelm(1:ntp), ind(1:ntp)) + end if + case default + call util_sort_tp(tp, sortby, ascending) + end select + call tp%rearrange(ind) + end associate + + return + end subroutine symba_util_sort_tp + + module subroutine symba_util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange SyMBA massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! Symba massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(symba_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i, j + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%lcollision(1:npl) = pl_sorted%lcollision(ind(1:npl)) + pl%lencounter(1:npl) = pl_sorted%lencounter(ind(1:npl)) + pl%nplenc(1:npl) = pl_sorted%nplenc(ind(1:npl)) + pl%ntpenc(1:npl) = pl_sorted%ntpenc(ind(1:npl)) + pl%levelg(1:npl) = pl_sorted%levelg(ind(1:npl)) + pl%levelm(1:npl) = pl_sorted%levelm(ind(1:npl)) + pl%isperi(1:npl) = pl_sorted%isperi(ind(1:npl)) + pl%peri(1:npl) = pl_sorted%peri(ind(1:npl)) + pl%atp(1:npl) = pl_sorted%atp(ind(1:npl)) + pl%info(1:npl) = pl_sorted%info(ind(1:npl)) + pl%kin(1:npl) = pl_sorted%kin(ind(1:npl)) + do i = 1, npl + do j = 1, pl%kin(i)%nchild + pl%kin(i)%child(j) = ind(pl%kin(i)%child(j)) + end do + end do + deallocate(pl_sorted) + end associate + return + end subroutine symba_util_sort_rearrange_pl + + module subroutine symba_util_sort_rearrange_tp(self, ind) + !! author: David A. Minton + !! + !! Rearrange SyMBA test particle object in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Symba massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(symba_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + + associate(tp => self, ntp => self%nbody) + call util_sort_rearrange_tp(tp,ind) + allocate(tp_sorted, source=self) + tp%nplenc(1:ntp) = tp_sorted%nplenc(ind(1:ntp)) + tp%levelg(1:ntp) = tp_sorted%levelg(ind(1:ntp)) + tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) + deallocate(tp_sorted) + end associate + return + end subroutine symba_util_sort_rearrange_tp end submodule s_symba_util \ No newline at end of file diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index fdaded124..044e56428 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -12,7 +12,7 @@ module subroutine util_sort_body(self, sortby, ascending) character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals - integer(I4B), dimension(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(body => self, n => self%nbody) select case(sortby) @@ -73,7 +73,7 @@ module subroutine util_sort_pl(self, sortby, ascending) character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals - integer(I4B), dimension(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(pl => self, npl => self%nbody) select case(sortby) @@ -140,7 +140,7 @@ module subroutine util_sort_tp(self, sortby, ascending) character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals - integer(I4B), dimension(:), allocatable :: ind + integer(I4B), dimension(self%nbody) :: ind associate(tp => self, ntp => self%nbody) select case(sortby) From c15eaeb60bbbcdc15064cd50ef71bf6bcc63b030 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:45:28 -0400 Subject: [PATCH 090/194] Fixed issue in polymorphic sorting where sorting would be attempted more than once. --- src/symba/symba_util.f90 | 4 ++-- src/util/util_sort.f90 | 45 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 24a59a9cc..a89da7b6a 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -118,10 +118,10 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) end if case default call util_sort_pl(pl, sortby, ascending) + return end select call pl%rearrange(ind) end associate - return end subroutine symba_util_sort_pl @@ -160,10 +160,10 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end if case default call util_sort_tp(tp, sortby, ascending) + return end select call tp%rearrange(ind) end associate - return end subroutine symba_util_sort_tp diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 044e56428..34fe600ed 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -54,8 +54,8 @@ module subroutine util_sort_body(self, sortby, ascending) end if case default write(*,*) 'Cannot sort structure by component '//trim(adjustl(sortby)) + return end select - call body%rearrange(ind) end associate @@ -121,8 +121,8 @@ module subroutine util_sort_pl(self, sortby, ascending) end if case default call util_sort_body(pl, sortby, ascending) + return end select - call pl%rearrange(ind) end associate @@ -158,6 +158,7 @@ module subroutine util_sort_tp(self, sortby, ascending) end if case default call util_sort_body(tp, sortby, ascending) + return end select call tp%rearrange(ind) @@ -216,22 +217,22 @@ module subroutine util_sort_rearrange_pl(self, ind) ! Internals class(swiftest_pl), allocatable :: pl_sorted !! Temporary holder for sorted body - call util_sort_rearrange_body(self,ind) - associate(n => self%nbody) + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_body(pl,ind) allocate(pl_sorted, source=self) - self%mass(1:n) = pl_sorted%mass(ind(1:n)) - self%Gmass(1:n) = pl_sorted%Gmass(ind(1:n)) - self%rhill(1:n) = pl_sorted%rhill(ind(1:n)) - self%radius(1:n) = pl_sorted%radius(ind(1:n)) - self%xbeg(:,1:n) = pl_sorted%xbeg(:,ind(1:n)) - self%xend(:,1:n) = pl_sorted%xend(:,ind(1:n)) - self%vbeg(:,1:n) = pl_sorted%vbeg(:,ind(1:n)) - self%density(1:n) = pl_sorted%density(ind(1:n)) - self%Ip(:,1:n) = pl_sorted%Ip(:,ind(1:n)) - self%rot(:,1:n) = pl_sorted%rot(:,ind(1:n)) - self%k2(1:n) = pl_sorted%k2(ind(1:n)) - self%Q(1:n) = pl_sorted%Q(ind(1:n)) - self%tlag(1:n) = pl_sorted%tlag(ind(1:n)) + pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) + pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) + pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) + pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) + pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) + pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) + pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) + pl%density(1:npl) = pl_sorted%density(ind(1:npl)) + pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) + pl%rot(:,1:npl) = pl_sorted%rot(:,ind(1:npl)) + pl%k2(1:npl) = pl_sorted%k2(ind(1:npl)) + pl%Q(1:npl) = pl_sorted%Q(ind(1:npl)) + pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) deallocate(pl_sorted) end associate return @@ -249,12 +250,12 @@ module subroutine util_sort_rearrange_tp(self, ind) ! Internals class(swiftest_tp), allocatable :: tp_sorted !! Temporary holder for sorted body - call util_sort_rearrange_body(self,ind) - associate(n => self%nbody) + associate(tp => self, ntp => self%nbody) + call util_sort_rearrange_body(tp,ind) allocate(tp_sorted, source=self) - self%isperi(1:n) = tp_sorted%isperi(ind(1:n)) - self%peri(1:n) = tp_sorted%peri(ind(1:n)) - self%atp(1:n) = tp_sorted%atp(ind(1:n)) + tp%isperi(1:ntp) = tp_sorted%isperi(ind(1:ntp)) + tp%peri(1:ntp) = tp_sorted%peri(ind(1:ntp)) + tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) deallocate(tp_sorted) end associate return From afcf1b979e60c3326291a0e407a88eaaeb1a20ef Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 02:51:48 -0400 Subject: [PATCH 091/194] Removed obsolete nrutil module. No more numerical recipes code --- Makefile | 1 - src/modules/module_nrutil.f90 | 189 ---------------------------------- src/modules/swiftest.f90 | 1 - 3 files changed, 191 deletions(-) delete mode 100644 src/modules/module_nrutil.f90 diff --git a/Makefile b/Makefile index 7154c63b1..63cfb0ee0 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,6 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ rmvs_classes.f90 \ helio_classes.f90 \ symba_classes.f90 \ - module_nrutil.f90 \ lambda_function.f90\ swiftest.f90 diff --git a/src/modules/module_nrutil.f90 b/src/modules/module_nrutil.f90 deleted file mode 100644 index ce8eeabbc..000000000 --- a/src/modules/module_nrutil.f90 +++ /dev/null @@ -1,189 +0,0 @@ -!********************************************************************************************************************************** -! -! Unit Name : module_nrutil -! Unit Type : module -! Project : SWIFTEST -! Package : module -! Language : Fortran 90/95 -! -! Description : Definition of data and utility functions taken from Numerical Recipes in Fortran 90 -! -! Input -! Arguments : N/A -! Terminal : N/A -! File : N/A -! -! Output -! Arguments : N/A -! Terminal : N/A -! File : N/A -! -! Invocation : N/A -! -! Notes : Reference: Press, W. H., Teukolsky, S. A., Vetterling, W. T. & Flannery B. P. 1996. Numerical Recipes in -! Fortran 90, The Art of Scientific Computing, 2nd Edition, Vol. 2 of Fortran Numerical Recipes, -! (Cambridge University Press). -! -!********************************************************************************************************************************** -MODULE module_nrutil - - USE swiftest_globals - IMPLICIT NONE - - INTEGER(I4B), PARAMETER :: NPAR_ARTH = 16 - INTEGER(I4B), PARAMETER :: NPAR2_ARTH = 8 - INTEGER(I4B), PARAMETER :: NPAR_CUMSUM = 16 - - INTERFACE arth - MODULE PROCEDURE arth_d, arth_i - END INTERFACE - - INTERFACE cumsum - MODULE PROCEDURE cumsum_i - END INTERFACE - - INTERFACE outerdiff - MODULE PROCEDURE outerdiff_d, outerdiff_i - END INTERFACE - - INTERFACE outerprod - MODULE PROCEDURE outerprod_d - END INTERFACE - -CONTAINS - - FUNCTION arth_d(first, increment, n) - INTEGER(I4B), INTENT(IN) :: n - REAL(DP), INTENT(IN) :: first, increment - REAL(DP), DIMENSION(n) :: arth_d - INTEGER(I4B) :: k, k2 - REAL(DP) :: temp - IF (n > 0) arth_d(1) = first - IF (n <= NPAR_ARTH) THEN - DO k = 2, n - arth_d(k) = arth_d(k-1) + increment - END DO - ELSE - DO k = 2, NPAR2_ARTH - arth_d(k) = arth_d(k-1) + increment - END DO - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - DO - IF (k >= n) EXIT - k2 = k + k - arth_d(k+1:MIN(k2, n)) = temp + arth_d(1:MIN(k, n-k)) - temp = temp + temp - k = k2 - END DO - END IF - RETURN - END FUNCTION arth_d - - FUNCTION arth_i(first, increment, n) - INTEGER(I4B), INTENT(IN) :: first, increment, n - INTEGER(I4B), DIMENSION(n) :: arth_i - INTEGER(I4B) :: k, k2, temp - IF (n > 0) arth_i(1) = first - IF (n <= NPAR_ARTH) THEN - DO k = 2, n - arth_i(k) = arth_i(k-1) + increment - END DO - ELSE - DO k = 2, NPAR2_ARTH - arth_i(k) = arth_i(k-1) + increment - END DO - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - DO - IF (k >= n) EXIT - k2 = k + k - arth_i(k+1:MIN(k2, n)) = temp + arth_i(1:MIN(k, n-k)) - temp = temp + temp - k = k2 - END DO - END IF - RETURN - END FUNCTION arth_i - - RECURSIVE FUNCTION cumsum_i(arr, seed) RESULT(ans) - INTEGER(I4B), DIMENSION(:), INTENT(IN) :: arr - INTEGER(I4B), OPTIONAL, INTENT(IN) :: seed - INTEGER(I4B), DIMENSION(SIZE(arr)) :: ans - INTEGER(I4B) :: n, j, sd - n = SIZE(arr) - IF (n == 0_I4B) RETURN - sd = 0_I4B - IF (PRESENT(seed)) sd = seed - ans(1) = arr(1) + sd - IF (n < NPAR_CUMSUM) THEN - DO j = 2, n - ans(j) = ans(j-1) + arr(j) - END DO - ELSE - ans(2:n:2) = cumsum_i(arr(2:n:2) + arr(1:n-1:2), sd) - ans(3:n:2) = ans(2:n-1:2) + arr(3:n:2) - END IF - RETURN - END FUNCTION cumsum_i - - FUNCTION iminloc(arr) - REAL(DP), DIMENSION(:), INTENT(IN) :: arr - INTEGER(I4B), DIMENSION(1) :: imin - INTEGER(I4B) :: iminloc - imin = MINLOC(arr(:)) - iminloc = imin(1) - RETURN - END FUNCTION iminloc - - FUNCTION outerdiff_d(a, b) - REAL(DP), DIMENSION(:), INTENT(IN) :: a, b - REAL(DP), DIMENSION(SIZE(a), SIZE(b)) :: outerdiff_d - outerdiff_d = SPREAD(a, DIM = 2, NCOPIES = SIZE(b)) - SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerdiff_d - - FUNCTION outerdiff_i(a, b) - INTEGER(I4B), DIMENSION(:), INTENT(IN) :: a, b - INTEGER(I4B), DIMENSION(SIZE(a), SIZE(b)) :: outerdiff_i - outerdiff_i = SPREAD(a, DIM = 2, NCOPIES = SIZE(b)) - SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerdiff_i - - FUNCTION outerprod_d(a, b) - REAL(DP), DIMENSION(:), INTENT(IN) :: a, b - REAL(DP), DIMENSION(SIZE(a), SIZE(b)) :: outerprod_d - outerprod_d = SPREAD(a, DIM = 2, NCOPIES = SIZE(b))*SPREAD(b, DIM = 1, NCOPIES = SIZE(a)) - RETURN - END FUNCTION outerprod_d - - FUNCTION upper_triangle(j, k, extra) - INTEGER(I4B), INTENT(IN) :: j, k - INTEGER(I4B), OPTIONAL, INTENT(IN) :: extra - LOGICAL , DIMENSION(j, k) :: upper_triangle - INTEGER(I4B) :: n - n = 0 - IF (PRESENT(extra)) n = extra - upper_triangle = (outerdiff(arth_i(1, 1, j), arth_i(1, 1, k)) < n) - RETURN - END FUNCTION upper_triangle - -END MODULE module_nrutil -!********************************************************************************************************************************** -! -! Author(s) : David E. Kaufmann -! -! Revision Control System (RCS) Information -! -! Source File : $RCSfile$ -! Full Path : $Source$ -! Revision : $Revision$ -! Date : $Date$ -! Programmer : $Author$ -! Locked By : $Locker$ -! State : $State$ -! -! Modification History: -! -! $Log$ -!********************************************************************************************************************************** diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 2ab44a9d5..10578c5b6 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -10,7 +10,6 @@ module swiftest use rmvs_classes use helio_classes use symba_classes - use module_nrutil use lambda_function !use advisor_annotate !$ use omp_lib From 5588444ec278bdc28a32f28789dce604f5339baa Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 08:55:01 -0400 Subject: [PATCH 092/194] Refactored and rearranged some subroutine calls to maintain consistency and make it easier to find things --- src/modules/rmvs_classes.f90 | 6 +++--- src/modules/symba_classes.f90 | 6 +++--- src/modules/whm_classes.f90 | 12 ++++++------ src/rmvs/rmvs_setup.f90 | 6 +++--- src/symba/symba_setup.f90 | 6 +++--- src/whm/whm_setup.f90 | 27 ++------------------------- src/whm/whm_util.f90 | 23 +++++++++++++++++++++++ 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 8b0ad2c2f..c167906fc 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -26,7 +26,7 @@ module rmvs_classes contains private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => rmvs_setup_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures + procedure, public :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures procedure, public :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step end type rmvs_nbody_system @@ -152,12 +152,12 @@ module subroutine rmvs_setup_pl(self,n) integer, intent(in) :: n !! Number of test particles to allocate end subroutine rmvs_setup_pl - module subroutine rmvs_setup_system(self, param) + module subroutine rmvs_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(rmvs_nbody_system), intent(inout) :: self !! RMVS system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine rmvs_setup_system + end subroutine rmvs_setup_initialize_system module subroutine rmvs_setup_tp(self,n) implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 98108e9df..3fe5a1824 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -160,7 +160,7 @@ module symba_classes class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure contains private - procedure, public :: initialize => symba_setup_system !! Performs SyMBA-specific initilization steps + procedure, public :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary @@ -332,12 +332,12 @@ module subroutine symba_setup_plplenc(self,n) integer, intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_plplenc - module subroutine symba_setup_system(self, param) + module subroutine symba_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine symba_setup_system + end subroutine symba_setup_initialize_system module subroutine symba_setup_tp(self,n) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 46a4e3743..a61cefb78 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -41,7 +41,7 @@ module whm_classes procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. - procedure, public :: set_ir3 => whm_setup_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure, public :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl @@ -72,7 +72,7 @@ module whm_classes contains private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => whm_setup_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses + procedure, public :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses procedure, public :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step end type whm_nbody_system @@ -199,10 +199,10 @@ module subroutine whm_setup_pl(self,n) integer(I4B), intent(in) :: n !! Number of test particles to allocate end subroutine whm_setup_pl - module subroutine whm_setup_set_ir3j(self) + module subroutine whm_util_set_ir3j(self) implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object - end subroutine whm_setup_set_ir3j + end subroutine whm_util_set_ir3j module subroutine whm_util_set_mu_eta_pl(self, cb) use swiftest_classes, only : swiftest_cb @@ -211,12 +211,12 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine whm_util_set_mu_eta_pl - module subroutine whm_setup_system(self, param) + module subroutine whm_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(whm_nbody_system), intent(inout) :: self !! WHM nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine whm_setup_system + end subroutine whm_setup_initialize_system !> Reads WHM test particle object in from file module subroutine whm_setup_tp(self,n) diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 4cda7bd6f..58002401e 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -46,7 +46,7 @@ module subroutine rmvs_setup_pl(self,n) return end subroutine rmvs_setup_pl - module subroutine rmvs_setup_system(self, param) + module subroutine rmvs_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize an RMVS nbody system from files and sets up the planetocentric structures. @@ -64,7 +64,7 @@ module subroutine rmvs_setup_system(self, param) integer(I4B) :: i, j ! Call parent method - call whm_setup_system(self, param) + call whm_setup_initialize_system(self, param) ! Set up the pl-tp planetocentric encounter structures for pl and cb. The planetocentric tp structures are ! generated as necessary during close encounter steps. @@ -116,7 +116,7 @@ module subroutine rmvs_setup_system(self, param) end select end select - end subroutine rmvs_setup_system + end subroutine rmvs_setup_initialize_system module subroutine rmvs_setup_tp(self,n) !! author: David A. Minton diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 9efb37e9a..51aaf69ba 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -100,7 +100,7 @@ module subroutine symba_setup_plplenc(self,n) return end subroutine symba_setup_plplenc - module subroutine symba_setup_system(self, param) + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. @@ -115,7 +115,7 @@ module subroutine symba_setup_system(self, param) ! Call parent method associate(system => self) - call whm_setup_system(system, param) + call whm_setup_initialize_system(system, param) call system%mergeadd_list%setup(1) call system%mergesub_list%setup(1) call system%pltpenc_list%setup(1) @@ -131,7 +131,7 @@ module subroutine symba_setup_system(self, param) end select end associate return - end subroutine symba_setup_system + end subroutine symba_setup_initialize_system module subroutine symba_setup_tp(self,n) !! author: David A. Minton diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 1f098df26..940ba0b26 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -71,7 +71,7 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) end subroutine whm_util_set_mu_eta_pl - module subroutine whm_setup_system(self, param) + module subroutine whm_setup_initialize_system(self, param) !! author: David A. Minton !! !! Initialize a WHM nbody system from files @@ -91,29 +91,6 @@ module subroutine whm_setup_system(self, param) call self%tp%v2pv(param) end if - end subroutine whm_setup_system - - module subroutine whm_setup_set_ir3j(self) - !! author: David A. Minton - !! - !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - ! Internals - integer(I4B) :: i - real(DP) :: r2, ir - - if (self%nbody > 0) then - do i = 1, self%nbody - r2 = dot_product(self%xh(:, i), self%xh(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3h(i) = ir / r2 - r2 = dot_product(self%xj(:, i), self%xj(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3j(i) = ir / r2 - end do - end if - end subroutine whm_setup_set_ir3j + end subroutine whm_setup_initialize_system end submodule s_whm_setup \ No newline at end of file diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 275130df9..67c7ef4a1 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -89,4 +89,27 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end subroutine whm_util_fill_pl + module subroutine whm_util_set_ir3j(self) + !! author: David A. Minton + !! + !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + ! Internals + integer(I4B) :: i + real(DP) :: r2, ir + + if (self%nbody > 0) then + do i = 1, self%nbody + r2 = dot_product(self%xh(:, i), self%xh(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3h(i) = ir / r2 + r2 = dot_product(self%xj(:, i), self%xj(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3j(i) = ir / r2 + end do + end if + end subroutine whm_util_set_ir3j + end submodule s_whm_util From 720f15eee06914737d679533da6f13a9869a903e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 09:05:41 -0400 Subject: [PATCH 093/194] Switched to a default public model, since that was effectively what we were doing anyway, and this simplifies the code quite a bit --- src/modules/helio_classes.f90 | 39 +++---- src/modules/rmvs_classes.f90 | 57 +++++----- src/modules/swiftest_classes.f90 | 177 +++++++++++++------------------ src/modules/symba_classes.f90 | 86 +++++++-------- src/modules/whm_classes.f90 | 54 +++++----- 5 files changed, 189 insertions(+), 224 deletions(-) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 2f8a52808..d03466676 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -7,21 +7,22 @@ module helio_classes use swiftest_classes, only : swiftest_cb, swiftest_pl, swiftest_tp, swiftest_nbody_system use whm_classes, only : whm_nbody_system implicit none + public !******************************************************************************************************************************** ! helio_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(whm_nbody_system) :: helio_nbody_system + type, extends(whm_nbody_system) :: helio_nbody_system contains - procedure, public :: step => helio_step_system !! Advance the Helio nbody system forward in time by one step + procedure :: step => helio_step_system !! Advance the Helio nbody system forward in time by one step end type helio_nbody_system !******************************************************************************************************************************** ! helio_cb class definitions and method interfaces !******************************************************************************************************************************* !> Helio central body particle class - type, public, extends(swiftest_cb) :: helio_cb + type, extends(swiftest_cb) :: helio_cb real(DP), dimension(NDIM) :: ptbeg !! negative barycentric velocity of the central body at the beginning of time step real(DP), dimension(NDIM) :: ptend !! negative barycentric velocity of the central body at the end of time step contains @@ -32,15 +33,15 @@ module helio_classes !******************************************************************************************************************************* !! Helio massive body particle class - type, public, extends(swiftest_pl) :: helio_pl + type, extends(swiftest_pl) :: helio_pl contains - procedure, public :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) - procedure, public :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) - procedure, public :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities - procedure, public :: step => helio_step_pl !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) + procedure :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities + procedure :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl !******************************************************************************************************************************** @@ -48,15 +49,15 @@ module helio_classes !******************************************************************************************************************************* !! Helio test particle class - type, public, extends(swiftest_tp) :: helio_tp + type, extends(swiftest_tp) :: helio_tp contains - procedure, public :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) - procedure, public :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) - procedure, public :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure, public :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure, public :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities - procedure, public :: step => helio_step_tp !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) + procedure :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities + procedure :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp interface diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index c167906fc..37a88993c 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -6,28 +6,27 @@ module rmvs_classes use swiftest_globals use whm_classes, only : whm_cb, whm_pl, whm_tp, whm_nbody_system implicit none - public + integer(I4B), private, parameter :: NTENC = 10 integer(I4B), private, parameter :: NTPHENC = 3 integer(I4B), private, parameter :: NTPENC = NTENC * NTPHENC - real(DP), private, parameter :: RHSCALE = 3.5_DP - real(DP), private, parameter :: RHPSCALE = 1.0_DP - real(DP), private, parameter :: FACQDT = 2.0_DP + real(DP), private, parameter :: RHSCALE = 3.5_DP + real(DP), private, parameter :: RHPSCALE = 1.0_DP + real(DP), private, parameter :: FACQDT = 2.0_DP !******************************************************************************************************************************** ! rmvs_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(whm_nbody_system) :: rmvs_nbody_system + type, extends(whm_nbody_system) :: rmvs_nbody_system !> In the RMVS integrator, only test particles are discarded logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations real(DP) :: rts !! fraction of Hill's sphere radius to use as radius of encounter region real(DP), dimension(:,:), allocatable :: vbeg !! Planet velocities at beginning ot step contains - private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures - procedure, public :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step + procedure :: initialize => rmvs_setup_initialize_system !! Performs RMVS-specific initilization steps, including generating the close encounter planetocentric structures + procedure :: step => rmvs_step_system !! Advance the RMVS nbody system forward in time by one step end type rmvs_nbody_system type, private :: rmvs_interp @@ -41,7 +40,7 @@ module rmvs_classes ! rmvs_cb class definitions and method interfaces !******************************************************************************************************************************* !> RMVS central body particle class - type, public, extends(whm_cb) :: rmvs_cb + type, extends(whm_cb) :: rmvs_cb type(rmvs_interp), dimension(:), allocatable :: outer !! interpolated heliocentric central body position for outer encounters type(rmvs_interp), dimension(:), allocatable :: inner !! interpolated heliocentric central body position for inner encounters logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations @@ -52,7 +51,7 @@ module rmvs_classes !******************************************************************************************************************************* !! RMVS test particle class - type, public, extends(whm_tp) :: rmvs_tp + type, extends(whm_tp) :: rmvs_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as rmvs_setup_tp and rmvs_util_spill_tp ! encounter steps) @@ -67,14 +66,13 @@ module rmvs_classes integer(I4B) :: ipleP !! index value of encountering planet logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - private - procedure, public :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered - procedure, public :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the - !! if the test particle is undergoing a close encounter or not - procedure, public :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered + procedure :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + !! if the test particle is undergoing a close encounter or not + procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -82,19 +80,18 @@ module rmvs_classes !******************************************************************************************************************************* !> RMVS massive body particle class - type, public, extends(whm_pl) :: rmvs_pl - integer(I4B), dimension(:), allocatable :: nenc !! number of test particles encountering planet this full rmvs time step - integer(I4B), dimension(:), allocatable :: tpenc1P !! index of first test particle encountering planet - integer(I4B), dimension(:), allocatable :: plind ! Connects the planetocentric indices back to the heliocentric planet list - type(rmvs_interp), dimension(:), allocatable :: outer !! interpolated heliocentric central body position for outer encounters - type(rmvs_interp), dimension(:), allocatable :: inner !! interpolated heliocentric central body position for inner encounters - class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric - logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations + type, extends(whm_pl) :: rmvs_pl + integer(I4B), dimension(:), allocatable :: nenc !! number of test particles encountering planet this full rmvs time step + integer(I4B), dimension(:), allocatable :: tpenc1P !! index of first test particle encountering planet + integer(I4B), dimension(:), allocatable :: plind !! Connects the planetocentric indices back to the heliocentric planet list + type(rmvs_interp), dimension(:), allocatable :: outer !! interpolated heliocentric central body position for outer encounters + type(rmvs_interp), dimension(:), allocatable :: inner !! interpolated heliocentric central body position for inner encounters + class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric !! Planetocentric version of the massive body objects (one for each massive body) + logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - private - procedure, public :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7f91f93f2..eff9f4077 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -5,25 +5,7 @@ module swiftest_classes !! Adapted from David E. Kaufmann's Swifter routine: module_swifter.f90 use swiftest_globals implicit none - private - public :: discard_pl, discard_system, discard_tp - public :: drift_all, drift_body, drift_one - public :: eucl_dist_index_plpl - public :: gr_kick_getaccb_ns_body, gr_p4_pos_kick, gr_pseudovel2vel, gr_vel2pseudovel - public :: io_dump_param, io_dump_swiftest, io_dump_system, io_get_args, io_get_token, io_param_reader, io_param_writer, io_read_body_in, & - io_read_cb_in, io_read_param_in, io_read_frame_body, io_read_frame_cb, io_read_frame_system, & - io_toupper, io_write_discard, io_write_encounter, io_write_frame_body, io_write_frame_cb, io_write_frame_system - public :: kick_getacch_int_pl - public :: obl_acc_body, obl_acc_pl, obl_acc_tp - public :: orbel_el2xv_vec, orbel_xv2el_vec, orbel_scget, orbel_xv2aeq, orbel_xv2aqt - public :: setup_body, setup_construct_system, setup_initialize_system, setup_pl, setup_tp - public :: tides_kick_getacch_pl, tides_step_spin_system - public :: user_kick_getacch_body - public :: util_coord_b2h_pl, util_coord_b2h_tp, util_coord_h2b_pl, util_coord_h2b_tp, util_exit, util_fill_body, util_fill_pl, util_fill_tp, & - util_peri_tp, util_reverse_status, util_set_beg_end_pl, util_set_ir3h, util_set_msys, util_set_mu_pl, & - util_set_mu_tp, util_set_rhill, util_set_rhill_approximate, & - util_sort, util_sort_body, util_sort_pl, util_sort_tp, util_sort_rearrange_body, util_sort_rearrange_pl, util_sort_rearrange_tp, & - util_spill_body, util_spill_pl, util_spill_tp, util_valid, util_version + public !******************************************************************************************************************************** ! swiftest_parameters class definitions @@ -31,7 +13,7 @@ module swiftest_classes !> User defined parameters that are read in from the parameters input file. !> Each paramter is initialized to a default values. - type, public :: swiftest_parameters + type :: swiftest_parameters integer(I4B) :: integrator = UNKNOWN_INTEGRATOR !! Symbolic name of the nbody integrator used integer(I4B) :: nplmax = -1 !! Maximum allowed number of massive bodies integer(I4B) :: ntpmax = -1 !! Maximum allowed number of test particles @@ -78,33 +60,31 @@ module swiftest_classes logical :: lyarkovsky = .false. !! Turn on Yarkovsky effect logical :: lyorp = .false. !! Turn on YORP effect contains - private - procedure, public :: reader => io_param_reader - procedure, public :: writer => io_param_writer - procedure, public :: dump => io_dump_param - procedure, public :: read_from_file => io_read_param_in + procedure :: reader => io_param_reader + procedure :: writer => io_param_writer + procedure :: dump => io_dump_param + procedure :: read_from_file => io_read_param_in end type swiftest_parameters !******************************************************************************************************************************** ! swiftest_base class definitions and methods !******************************************************************************************************************************** - type, abstract, public :: swiftest_base + type, abstract :: swiftest_base !! An superclass for a generic Swiftest object logical :: lintegrate = .false. !! Flag indicating that this object should be integrated in the current step contains !! The minimal methods that all systems must have - private procedure :: dump => io_dump_swiftest - procedure(abstract_initialize), public, deferred :: initialize - procedure(abstract_read_frame), public, deferred :: read_frame - procedure(abstract_write_frame), public, deferred :: write_frame + procedure(abstract_initialize), deferred :: initialize + procedure(abstract_read_frame), deferred :: read_frame + procedure(abstract_write_frame), deferred :: write_frame end type swiftest_base !******************************************************************************************************************************** ! swiftest_cb class definitions and methods !******************************************************************************************************************************** !> A concrete lass for the central body in a Swiftest simulation - type, abstract, public, extends(swiftest_base) :: swiftest_cb + type, abstract, extends(swiftest_base) :: swiftest_cb character(len=STRMAX) :: name !! Non-unique name integer(I4B) :: id = 0 !! External identifier (unique) real(DP) :: mass = 0.0_DP !! Central body mass (units MU) @@ -130,17 +110,16 @@ module swiftest_classes real(DP), dimension(NDIM) :: L0 = 0.0_DP !! Initial angular momentum of the central body real(DP), dimension(NDIM) :: dL = 0.0_DP !! Change in angular momentum of the central body contains - private - procedure, public :: initialize => io_read_cb_in !! I/O routine for reading in central body data - procedure, public :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body - procedure, public :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: initialize => io_read_cb_in !! I/O routine for reading in central body data + procedure :: read_frame => io_read_frame_cb !! I/O routine for reading out a single frame of time-series data for the central body + procedure :: write_frame => io_write_frame_cb !! I/O routine for writing out a single frame of time-series data for the central body end type swiftest_cb !******************************************************************************************************************************** ! swiftest_body definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest bodies - type, abstract, public, extends(swiftest_base) :: swiftest_body + type, abstract, extends(swiftest_base) :: swiftest_body !! Superclass that defines the generic elements of a Swiftest particle logical :: lfirst = .true. !! Run the current step as a first integer(I4B) :: nbody = 0 !! Number of bodies @@ -167,37 +146,36 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains - private - procedure(abstract_discard_body), public, deferred :: discard - procedure(abstract_kick_body), public, deferred :: kick - procedure(abstract_set_mu), public, deferred :: set_mu - procedure(abstract_step_body), public, deferred :: step - procedure(abstract_accel), public, deferred :: accel + procedure(abstract_discard_body), deferred :: discard + procedure(abstract_kick_body), deferred :: kick + procedure(abstract_set_mu), deferred :: set_mu + procedure(abstract_step_body), deferred :: step + procedure(abstract_accel), deferred :: accel ! These are concrete because the implementation is the same for all types of particles - procedure, public :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables - procedure, public :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators - procedure, public :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators - procedure, public :: initialize => io_read_body_in !! Read in body initial conditions from a file - procedure, public :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure, public :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors - procedure, public :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements - procedure, public :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays - procedure, public :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure, public :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure - procedure, public :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) - procedure, public :: sort => util_sort_body !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure, public :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables + procedure :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators + procedure :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators + procedure :: initialize => io_read_body_in !! Read in body initial conditions from a file + procedure :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors + procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements + procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays + procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure + procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen + procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** ! swiftest_pl definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest massive bodies - type, abstract, public, extends(swiftest_body) :: swiftest_pl + type, abstract, extends(swiftest_body) :: swiftest_pl !! Superclass that defines the generic elements of a Swiftest particle real(DP), dimension(:), allocatable :: mass !! Body mass (units MU) real(DP), dimension(:), allocatable :: Gmass !! Mass gravitational term G * mass (units GU * MU) @@ -217,31 +195,30 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_pl and util_spill_pl contains - private ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_pl !! Placeholder method for discarding massive bodies - procedure, public :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix - procedure, public :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies - procedure, public :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays - procedure, public :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body - procedure, public :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. - procedure, public :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass - procedure, public :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body - procedure, public :: sort => util_sort_pl !! Sorts body arrays by a sortable component - procedure, public :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure, public :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => discard_pl !! Placeholder method for discarding massive bodies + procedure :: eucl_index => eucl_dist_index_plpl !! Sets up the (i, j) -> k indexing used for the single-loop blocking Euclidean distance matrix + procedure :: accel_int => kick_getacch_int_pl !! Compute direct cross (third) term heliocentric accelerations of massive bodies + procedure :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays + procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) + procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) + procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. + procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass + procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body + procedure :: sort => util_sort_pl !! Sorts body arrays by a sortable component + procedure :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** ! swiftest_tp definitions and methods !******************************************************************************************************************************** !> An abstract class for a generic collection of Swiftest test particles - type, abstract, public, extends(swiftest_body) :: swiftest_tp + type, abstract, extends(swiftest_body) :: swiftest_tp !! Superclass that defines the generic elements of a Swiftest test particle integer(I4B), dimension(:), allocatable :: isperi !! Perihelion passage flag real(DP), dimension(:), allocatable :: peri !! Perihelion distance @@ -249,28 +226,27 @@ module swiftest_classes !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_tp and util_spill_tp contains - private ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure, public :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure, public :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies - procedure, public :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure, public :: setup => setup_tp !! A base constructor that sets the number of bodies and - procedure, public :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) - procedure, public :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure, public :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - procedure, public :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure, public :: sort => util_sort_tp !! Sorts body arrays by a sortable component - procedure, public :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure, public :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component + procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** ! swiftest_nbody_system class definitions and methods !******************************************************************************************************************************** !> An abstract class for a basic Swiftest nbody system - type, abstract, public, extends(swiftest_base) :: swiftest_nbody_system + type, abstract, extends(swiftest_base) :: swiftest_nbody_system !! This superclass contains a minimial system of a set of test particles (tp), massive bodies (pl), and a central body (cb) class(swiftest_cb), allocatable :: cb !! Central body data structure class(swiftest_pl), allocatable :: pl !! Massive body data structure @@ -289,19 +265,18 @@ module swiftest_classes !! separately from massive bodies. Massive body variables are saved at half steps, and passed to !! the test particles contains - private !> Each integrator will have its own version of the step - procedure(abstract_step_system), public, deferred :: step + procedure(abstract_step_system), deferred :: step ! Concrete classes that are common to the basic integrator (only test particles considered for discard) - procedure, public :: discard => discard_system !! Perform a discard step on the system - procedure, public :: dump => io_dump_system !! Dump the state of the system to a file - procedure, public :: read_frame => io_read_frame_system !! Append a frame of output data to file - procedure, public :: write_discard => io_write_discard !! Append a frame of output data to file - procedure, public :: write_frame => io_write_frame_system !! Append a frame of output data to file - procedure, public :: initialize => setup_initialize_system !! Initialize the system from input files - procedure, public :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. - procedure, public :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. + procedure :: discard => discard_system !! Perform a discard step on the system + procedure :: dump => io_dump_system !! Dump the state of the system to a file + procedure :: read_frame => io_read_frame_system !! Append a frame of output data to file + procedure :: write_discard => io_write_discard !! Append a frame of output data to file + procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure :: initialize => setup_initialize_system !! Initialize the system from input files + procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. + procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system abstract interface diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 3fe5a1824..fc3520079 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -8,6 +8,7 @@ module symba_classes use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind implicit none + public integer(I4B), private, parameter :: NENMAX = 32767 integer(I4B), private, parameter :: NTENC = 3 @@ -16,28 +17,26 @@ module symba_classes character(*), parameter :: PARTICLE_OUTFILE = 'particle.dat' integer(I4B), parameter :: PARTICLEUNIT = 44 !! File unit number for the binary particle info output file - type, public, extends(swiftest_parameters) :: symba_parameters + type, extends(swiftest_parameters) :: symba_parameters character(STRMAX) :: particle_file = PARTICLE_OUTFILE !! Name of output particle information file real(DP) :: MTINY = -1.0_DP !! Smallest mass that is fully gravitating integer(I4B), dimension(:), allocatable :: seed !! Random seeds logical :: lfragmentation = .false. !! Do fragmentation modeling instead of simple merger. contains - private - procedure, public :: reader => symba_io_param_reader - procedure, public :: writer => symba_io_param_writer + procedure :: reader => symba_io_param_reader + procedure :: writer => symba_io_param_writer end type symba_parameters !******************************************************************************************************************************** ! symba_cb class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA central body particle class - type, public, extends(helio_cb) :: symba_cb + type, extends(helio_cb) :: symba_cb real(DP) :: M0 = 0.0_DP !! Initial mass of the central body real(DP) :: dM = 0.0_DP !! Change in mass of the central body real(DP) :: R0 = 0.0_DP !! Initial radius of the central body real(DP) :: dR = 0.0_DP !! Change in the radius of the central body contains - private end type symba_cb !******************************************************************************************************************************** @@ -45,17 +44,16 @@ module symba_classes !******************************************************************************************************************************* !> Class definition for the particle origin information object. This object is used to track time, location, and collisional regime !> of fragments produced in collisional events. - type, public, extends(swiftest_base) :: symba_particle_info + type, extends(swiftest_base) :: symba_particle_info character(len=32) :: origin_type !! String containing a description of the origin of the particle (e.g. Initial Conditions, Supercatastrophic, Disruption, etc.) real(DP) :: origin_time !! The time of the particle's formation real(DP), dimension(NDIM) :: origin_xh !! The heliocentric distance vector at the time of the particle's formation real(DP), dimension(NDIM) :: origin_vh !! The heliocentric velocity vector at the time of the particle's formation contains - private - procedure, public :: dump => symba_io_dump_particle_info !! I/O routine for dumping particle info to file - procedure, public :: initialize => symba_io_initialize_particle_info !! I/O routine for reading in particle info data - procedure, public :: read_frame => symba_io_read_frame_info !! I/O routine for reading in a single frame of particle info - procedure, public :: write_frame => symba_io_write_frame_info !! I/O routine for writing out a single frame of particle info + procedure :: dump => symba_io_dump_particle_info !! I/O routine for dumping particle info to file + procedure :: initialize => symba_io_initialize_particle_info !! I/O routine for reading in particle info data + procedure :: read_frame => symba_io_read_frame_info !! I/O routine for reading in a single frame of particle info + procedure :: write_frame => symba_io_write_frame_info !! I/O routine for writing out a single frame of particle info end type symba_particle_info !******************************************************************************************************************************** @@ -72,7 +70,7 @@ module symba_classes ! symba_pl class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA massive body class - type, public, extends(helio_pl) :: symba_pl + type, extends(helio_pl) :: symba_pl logical, dimension(:), allocatable :: lcollision !! flag indicating whether body has merged with another this time step logical, dimension(:), allocatable :: lencounter !! flag indicating whether body is part of an encounter this time step logical, dimension(:), allocatable :: lmtiny !! flag indicating whether this body is below the MTINY cutoff value @@ -88,37 +86,35 @@ module symba_classes type(symba_kinship), dimension(:), allocatable :: kin !! Array of merger relationship structures that can account for multiple pairwise mergers in a single step type(symba_particle_info), dimension(:), allocatable :: info contains - private - procedure, public :: discard => symba_discard_pl !! Process massive body discards - procedure, public :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other - procedure, public :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle - procedure, public :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: discard => symba_discard_pl !! Process massive body discards + procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen + procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl !******************************************************************************************************************************** ! symba_tp class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA test particle class - type, public, extends(helio_tp) :: symba_tp + type, extends(helio_tp) :: symba_tp integer(I4B), dimension(:), allocatable :: nplenc !! number of encounters with planets this time step integer(I4B), dimension(:), allocatable :: levelg !! level at which this particle should be moved integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains - private - procedure, public :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure, public :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle - procedure, public :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen - procedure, public :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen + procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_tp !******************************************************************************************************************************** ! symba_pltpenc class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA class for tracking pl-tp close encounters in a step - type, public :: symba_pltpenc + type :: symba_pltpenc integer(I4B) :: nenc !! Total number of encounters logical, dimension(:), allocatable :: lvdotr !! relative vdotr flag integer(I4B), dimension(:), allocatable :: status !! status of the interaction @@ -126,49 +122,47 @@ module symba_classes integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains - procedure, public :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body - procedure, public :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other - procedure, public :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion - procedure, public :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another - procedure, public :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small + procedure :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body + procedure :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other + procedure :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion + procedure :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** ! symba_plplenc class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA class for tracking pl-pl close encounters in a step - type, public, extends(symba_pltpenc) :: symba_plplenc + type, extends(symba_pltpenc) :: symba_plplenc real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure, public :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide - procedure, public :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure, public :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another + procedure :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide + procedure :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** - type, public, extends(helio_nbody_system) :: symba_nbody_system + type, extends(helio_nbody_system) :: symba_nbody_system class(symba_pl), allocatable :: mergeadd_list !! List of added bodies in mergers or collisions class(symba_pl), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure contains - private - procedure, public :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps - procedure, public :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step - procedure, public :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system - procedure, public :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary - procedure, public :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step + procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps + procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step + procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary + procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system interface - module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index a61cefb78..a6ab59958 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -12,7 +12,7 @@ module whm_classes ! whm_cb class definitions and method interfaces !******************************************************************************************************************************* !> Swiftest central body particle class - type, public, extends(swiftest_cb) :: whm_cb + type, extends(swiftest_cb) :: whm_cb contains end type whm_cb @@ -21,7 +21,7 @@ module whm_classes !******************************************************************************************************************************* !> WHM massive body particle class - type, public, extends(swiftest_pl) :: whm_pl + type, extends(swiftest_pl) :: whm_pl real(DP), dimension(:), allocatable :: eta !! Jacobi mass real(DP), dimension(:,:), allocatable :: xj !! Jacobi position real(DP), dimension(:,:), allocatable :: vj !! Jacobi velocity @@ -30,20 +30,20 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_pl and whm_util_spill_pl contains - procedure, public :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates - procedure, public :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates - procedure, public :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure, public :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure, public :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure, public :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure, public :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies - procedure, public :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles - procedure, public :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. - procedure, public :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) - procedure, public :: step => whm_step_pl !! Steps the body forward one stepsize - procedure, public :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates + procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates + procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates + procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates + procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. + procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure :: step => whm_step_pl !! Steps the body forward one stepsize + procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -51,29 +51,27 @@ module whm_classes !******************************************************************************************************************************* !! WHM test particle class - type, public, extends(swiftest_tp) :: whm_tp + type, extends(swiftest_tp) :: whm_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_tp and whm_util_spill_tp contains - private - procedure, public :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure, public :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles - procedure, public :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction - procedure, public :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure, public :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations - procedure, public :: step => whm_step_tp !! Steps the particle forward one stepsize + procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles + procedure :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations + procedure :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp !******************************************************************************************************************************** ! whm_nbody_system class definitions and method interfaces !******************************************************************************************************************************** !> An abstract class for the WHM integrator nbody system - type, public, extends(swiftest_nbody_system) :: whm_nbody_system + type, extends(swiftest_nbody_system) :: whm_nbody_system contains - private !> Replace the abstract procedures with concrete ones - procedure, public :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses - procedure, public :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step + procedure :: initialize => whm_setup_initialize_system !! Performs WHM-specific initilization steps, like calculating the Jacobi masses + procedure :: step => whm_step_system !! Advance the WHM nbody system forward in time by one step end type whm_nbody_system interface From 5b5d8e8891c2a663343a44e6bbce0b7d1e921f4d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 10:27:51 -0400 Subject: [PATCH 094/194] Cleaned up a few comments --- src/modules/symba_classes.f90 | 8 ++++---- src/symba/symba_util.f90 | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index fc3520079..7eab9e5c7 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -390,27 +390,27 @@ end subroutine symba_util_resize_pltpenc module subroutine symba_util_sort_pl(self, sortby, ascending) implicit none - class(symba_pl), intent(inout) :: self !! Symba massive body object + class(symba_pl), intent(inout) :: self !! SyMBA massive body object character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine symba_util_sort_pl module subroutine symba_util_sort_tp(self, sortby, ascending) implicit none - class(symba_tp), intent(inout) :: self !! Swiftest test particle object + class(symba_tp), intent(inout) :: self !! SyMBA test particle object character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine symba_util_sort_tp module subroutine symba_util_sort_rearrange_pl(self, ind) implicit none - class(symba_pl), intent(inout) :: self !! Symba massive body object + class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine symba_util_sort_rearrange_pl module subroutine symba_util_sort_rearrange_tp(self, ind) implicit none - class(symba_tp), intent(inout) :: self !! Symba massive body object + class(symba_tp), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine symba_util_sort_rearrange_tp diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index a89da7b6a..be47c9b96 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -68,11 +68,11 @@ end subroutine symba_util_resize_pltpenc module subroutine symba_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! - !! Sort a Swiftest test particle object in-place. + !! Sort a SyMBA massive body object in-place. !! sortby is a string indicating which array component to sort. implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! Symba massive body object + class(symba_pl), intent(inout) :: self !! SyMBA massive body object character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals @@ -128,11 +128,11 @@ end subroutine symba_util_sort_pl module subroutine symba_util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! - !! Sort a Swiftest test particle object in-place. + !! Sort a SyMBA test particle object in-place. !! sortby is a string indicating which array component to sort. implicit none ! Arguments - class(symba_tp), intent(inout) :: self !! Swiftest test particle object + class(symba_tp), intent(inout) :: self !! SyMBA test particle object character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals @@ -207,7 +207,7 @@ end subroutine symba_util_sort_rearrange_pl module subroutine symba_util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! - !! Rearrange SyMBA test particle object in-place from an index list. + !! Rearrange SyMBA test particle object in-place from an index list. !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. implicit none ! Arguments From 570717efc6a58047d98b25880e6ac4b597d2da54 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 10:39:09 -0400 Subject: [PATCH 095/194] Added sort and rearrange methods to WHM --- src/modules/whm_classes.f90 | 43 ++++++++++++++++--------- src/whm/whm_util.f90 | 62 +++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 14 deletions(-) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index a6ab59958..c242d2521 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -30,20 +30,22 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_setup_pl and whm_util_spill_pl contains - procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates - procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates - procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates - procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies - procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction - procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles - procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. - procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) - procedure :: step => whm_step_pl !! Steps the body forward one stepsize - procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates + procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates + procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates + procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates + procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. + procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure :: sort => whm_util_sort_pl !! Sort a WHM massive body object in-place. + procedure :: rearrange => whm_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: step => whm_step_pl !! Steps the body forward one stepsize + procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -209,6 +211,19 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine whm_util_set_mu_eta_pl + module subroutine whm_util_sort_pl(self, sortby, ascending) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine whm_util_sort_pl + + module subroutine whm_util_sort_rearrange_pl(self, ind) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine whm_util_sort_rearrange_pl + module subroutine whm_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 67c7ef4a1..791b5d651 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -112,4 +112,66 @@ module subroutine whm_util_set_ir3j(self) end if end subroutine whm_util_set_ir3j + module subroutine whm_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a WHM massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if + associate(pl => self, npl => self%nbody) + select case(sortby) + case("eta") + call util_sort(direction * pl%eta(1:npl), ind(1:npl)) + case("muj") + call util_sort(direction * pl%muj(1:npl), ind(1:npl)) + case("ir3j") + call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) + case default + call util_sort_pl(pl, sortby, ascending) + return + end select + call pl%rearrange(ind) + end associate + return + end subroutine whm_util_sort_pl + + module subroutine whm_util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange WHM massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) + pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) + pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) + pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) + pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + deallocate(pl_sorted) + end associate + return + end subroutine whm_util_sort_rearrange_pl + end submodule s_whm_util From f3ef56c63ae28a76c4f262a9befea5fe92e4ab09 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 10:45:06 -0400 Subject: [PATCH 096/194] Simplified sorting methods with direction variable --- src/symba/symba_util.f90 | 72 +++++++++--------------- src/util/util_sort.f90 | 118 ++++++++++++++------------------------- src/whm/whm_util.f90 | 3 + 3 files changed, 72 insertions(+), 121 deletions(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index be47c9b96..397cd789e 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -77,50 +77,35 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if associate(pl => self, npl => self%nbody) select case(sortby) case("nplenc") - if (ascending) then - call util_sort(pl%nplenc(1:npl), ind(1:npl)) - else - call util_sort(-pl%nplenc(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%nplenc(1:npl), ind(1:npl)) case("ntpenc") - if (ascending) then - call util_sort(pl%ntpenc(1:npl), ind(1:npl)) - else - call util_sort(-pl%ntpenc(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%ntpenc(1:npl), ind(1:npl)) case("levelg") - if (ascending) then - call util_sort(pl%levelg(1:npl), ind(1:npl)) - else - call util_sort(-pl%levelg(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%levelg(1:npl), ind(1:npl)) case("levelm") - if (ascending) then - call util_sort(pl%levelm(1:npl), ind(1:npl)) - else - call util_sort(-pl%levelm(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%levelm(1:npl), ind(1:npl)) case("peri") - if (ascending) then - call util_sort(pl%peri(1:npl), ind(1:npl)) - else - call util_sort(-pl%peri(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%peri(1:npl), ind(1:npl)) case("atp") - if (ascending) then - call util_sort(pl%atp(1:npl), ind(1:npl)) - else - call util_sort(-pl%atp(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%atp(1:npl), ind(1:npl)) case default call util_sort_pl(pl, sortby, ascending) return end select + call pl%rearrange(ind) + end associate return end subroutine symba_util_sort_pl @@ -137,32 +122,29 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if associate(tp => self, ntp => self%nbody) select case(sortby) case("nplenc") - if (ascending) then - call util_sort(tp%nplenc(1:ntp), ind(1:ntp)) - else - call util_sort(-tp%nplenc(1:ntp), ind(1:ntp)) - end if + call util_sort(direction * tp%nplenc(1:ntp), ind(1:ntp)) case("levelg") - if (ascending) then - call util_sort(tp%levelg(1:ntp), ind(1:ntp)) - else - call util_sort(-tp%levelg(1:ntp), ind(1:ntp)) - end if + call util_sort(direction * tp%levelg(1:ntp), ind(1:ntp)) case("levelm") - if (ascending) then - call util_sort(tp%levelm(1:ntp), ind(1:ntp)) - else - call util_sort(-tp%levelm(1:ntp), ind(1:ntp)) - end if + call util_sort(direction * tp%levelm(1:ntp), ind(1:ntp)) case default call util_sort_tp(tp, sortby, ascending) return end select + call tp%rearrange(ind) + end associate return end subroutine symba_util_sort_tp diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 34fe600ed..a3e2d37a4 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -13,50 +13,35 @@ module subroutine util_sort_body(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if associate(body => self, n => self%nbody) select case(sortby) case("id") - if (ascending) then - call util_sort(body%id(1:n), ind(1:n)) - else - call util_sort(-body%id(1:n), ind(1:n)) - end if + call util_sort(direction * body%id(1:n), ind(1:n)) case("a") - if (ascending) then - call util_sort(body%a(1:n), ind(1:n)) - else - call util_sort(-body%a(1:n), ind(1:n)) - end if + call util_sort(direction * body%a(1:n), ind(1:n)) case("e") - if (ascending) then - call util_sort(body%e(1:n), ind(1:n)) - else - call util_sort(-body%e(1:n), ind(1:n)) - end if + call util_sort(direction * body%e(1:n), ind(1:n)) case("inc") - if (ascending) then - call util_sort(body%inc(1:n), ind(1:n)) - else - call util_sort(-body%inc(1:n), ind(1:n)) - end if + call util_sort(direction * body%inc(1:n), ind(1:n)) case("capom") - if (ascending) then - call util_sort(body%capom(1:n), ind(1:n)) - else - call util_sort(-body%capom(1:n), ind(1:n)) - end if + call util_sort(direction * body%capom(1:n), ind(1:n)) case("mu") - if (ascending) then - call util_sort(body%mu(1:n), ind(1:n)) - else - call util_sort(-body%mu(1:n), ind(1:n)) - end if + call util_sort(direction * body%mu(1:n), ind(1:n)) case default - write(*,*) 'Cannot sort structure by component '//trim(adjustl(sortby)) + write(*,*) 'Cannot sort structure by component ' // trim(adjustl(sortby)) return end select + call body%rearrange(ind) + end associate return @@ -74,56 +59,37 @@ module subroutine util_sort_pl(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if associate(pl => self, npl => self%nbody) select case(sortby) case("Gmass","mass") - if (ascending) then - call util_sort(pl%Gmass(1:npl), ind(1:npl)) - else - call util_sort(-pl%Gmass(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%Gmass(1:npl), ind(1:npl)) case("rhill") - if (ascending) then - call util_sort(pl%rhill(1:npl), ind(1:npl)) - else - call util_sort(-pl%rhill(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%rhill(1:npl), ind(1:npl)) case("radius") - if (ascending) then - call util_sort(pl%radius(1:npl), ind(1:npl)) - else - call util_sort(-pl%radius(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%radius(1:npl), ind(1:npl)) case("density") - if (ascending) then - call util_sort(pl%density(1:npl), ind(1:npl)) - else - call util_sort(-pl%density(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%density(1:npl), ind(1:npl)) case("k2") - if (ascending) then - call util_sort(pl%k2(1:npl), ind(1:npl)) - else - call util_sort(-pl%k2(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%k2(1:npl), ind(1:npl)) case("Q") - if (ascending) then - call util_sort(pl%Q(1:npl), ind(1:npl)) - else - call util_sort(-pl%Q(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%Q(1:npl), ind(1:npl)) case("tlag") - if (ascending) then - call util_sort(pl%tlag(1:npl), ind(1:npl)) - else - call util_sort(-pl%tlag(1:npl), ind(1:npl)) - end if + call util_sort(direction * pl%tlag(1:npl), ind(1:npl)) case default call util_sort_body(pl, sortby, ascending) return end select + call pl%rearrange(ind) + end associate return @@ -141,27 +107,27 @@ module subroutine util_sort_tp(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order ! Internals integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if associate(tp => self, ntp => self%nbody) select case(sortby) case("peri") - if (ascending) then - call util_sort(tp%peri(1:ntp), ind(1:ntp)) - else - call util_sort(-tp%peri(1:ntp), ind(1:ntp)) - end if + call util_sort(direction * tp%peri(1:ntp), ind(1:ntp)) case("atp") - if (ascending) then - call util_sort(tp%atp(1:ntp), ind(1:ntp)) - else - call util_sort(-tp%atp(1:ntp), ind(1:ntp)) - end if + call util_sort(direction * tp%atp(1:ntp), ind(1:ntp)) case default call util_sort_body(tp, sortby, ascending) return end select call tp%rearrange(ind) + end associate return diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 791b5d651..9ebeb0b3f 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -131,6 +131,7 @@ module subroutine whm_util_sort_pl(self, sortby, ascending) else direction = -1 end if + associate(pl => self, npl => self%nbody) select case(sortby) case("eta") @@ -143,7 +144,9 @@ module subroutine whm_util_sort_pl(self, sortby, ascending) call util_sort_pl(pl, sortby, ascending) return end select + call pl%rearrange(ind) + end associate return end subroutine whm_util_sort_pl From 1bd12ac47a0d7b2185341586722d7b97155978de Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 10:47:56 -0400 Subject: [PATCH 097/194] Rearranged rmvs_util implementations into alphabetical order --- src/rmvs/rmvs_util.f90 | 134 ++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 69 deletions(-) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 0781c6429..379c1d4c0 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -1,6 +1,70 @@ submodule(rmvs_classes) s_rmvs_util use swiftest contains + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new RMVS massive body structure into an old one. + !! This is the inverse of a fill operation. + !! + implicit none + ! Arguments + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + class(swiftest_body), intent(inout) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals + integer(I4B) :: i + + associate(keeps => self) + select type(inserts) + class is (rmvs_pl) + + keeps%nenc(:) = unpack(keeps%nenc(:), .not.lfill_list(:), keeps%nenc(:)) + keeps%nenc(:) = unpack(inserts%nenc(:), lfill_list(:), keeps%nenc(:)) + + call whm_util_fill_pl(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' + end select + end associate + + return + end subroutine rmvs_util_fill_pl + + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new RMVS test particle structure into an old one. + !! This is the inverse of a fill operation. + !! + implicit none + ! Arguments + class(rmvs_tp), intent(inout) :: self !! RMVS massive body object + class(swiftest_body), intent(inout) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + associate(keeps => self) + select type(inserts) + class is (rmvs_tp) + + keeps%lperi(:) = unpack(keeps%lperi(:), .not.lfill_list(:), keeps%lperi(:)) + keeps%lperi(:) = unpack(inserts%lperi(:), lfill_list(:), keeps%lperi(:)) + + keeps%plperP(:) = unpack(keeps%plperP(:), .not.lfill_list(:), keeps%plperP(:)) + keeps%plperP(:) = unpack(inserts%plperP(:), lfill_list(:), keeps%plperP(:)) + + keeps%plencP(:) = unpack(keeps%plencP(:), .not.lfill_list(:), keeps%plencP(:)) + keeps%plencP(:) = unpack(inserts%plencP(:), lfill_list(:), keeps%plencP(:)) + + call util_fill_tp(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' + end select + end associate + + return + end subroutine rmvs_util_fill_tp + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! @@ -30,39 +94,7 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) end associate return - - end subroutine rmvs_util_spill_pl - - module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new RMVS massive body structure into an old one. - !! This is the inverse of a fill operation. - !! - implicit none - ! Arguments - class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i - - associate(keeps => self) - select type(inserts) - class is (rmvs_pl) - - keeps%nenc(:) = unpack(keeps%nenc(:), .not.lfill_list(:), keeps%nenc(:)) - keeps%nenc(:) = unpack(inserts%nenc(:), lfill_list(:), keeps%nenc(:)) - - call whm_util_fill_pl(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' - end select - end associate - - return - - end subroutine rmvs_util_fill_pl + end subroutine rmvs_util_spill_pl module subroutine rmvs_util_spill_tp(self, discards, lspill_list) !! author: David A. Minton @@ -97,42 +129,6 @@ module subroutine rmvs_util_spill_tp(self, discards, lspill_list) end associate return - end subroutine rmvs_util_spill_tp - module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new RMVS test particle structure into an old one. - !! This is the inverse of a fill operation. - !! - implicit none - ! Arguments - class(rmvs_tp), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - - associate(keeps => self) - select type(inserts) - class is (rmvs_tp) - - keeps%lperi(:) = unpack(keeps%lperi(:), .not.lfill_list(:), keeps%lperi(:)) - keeps%lperi(:) = unpack(inserts%lperi(:), lfill_list(:), keeps%lperi(:)) - - keeps%plperP(:) = unpack(keeps%plperP(:), .not.lfill_list(:), keeps%plperP(:)) - keeps%plperP(:) = unpack(inserts%plperP(:), lfill_list(:), keeps%plperP(:)) - - keeps%plencP(:) = unpack(keeps%plencP(:), .not.lfill_list(:), keeps%plencP(:)) - keeps%plencP(:) = unpack(inserts%plencP(:), lfill_list(:), keeps%plencP(:)) - - call util_fill_tp(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' - end select - end associate - - return - - end subroutine rmvs_util_fill_tp - end submodule s_rmvs_util From 2536428866532ec74cf5abee0005d4754e3a3bde Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 10:48:57 -0400 Subject: [PATCH 098/194] Cleaned up formatting and corrected comment typos --- src/rmvs/rmvs_util.f90 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 379c1d4c0..29d0b7b2a 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -13,7 +13,7 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) class(swiftest_body), intent(inout) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps ! Internals - integer(I4B) :: i + integer(I4B) :: i associate(keeps => self) select type(inserts) @@ -39,9 +39,9 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) !! implicit none ! Arguments - class(rmvs_tp), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + class(swiftest_body), intent(inout) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps associate(keeps => self) select type(inserts) @@ -73,11 +73,11 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! Adapted from David E. Kaufmann's Swifter routine discard_discard_spill.f90 implicit none ! Arguments - class(rmvs_pl), intent(inout) :: self !! Swiftest massive body body object + class(rmvs_pl), intent(inout) :: self !! RMVS massive body body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards ! Internals - integer(I4B) :: i + integer(I4B) :: i associate(keeps => self) select type(discards) @@ -104,11 +104,11 @@ module subroutine rmvs_util_spill_tp(self, discards, lspill_list) !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 implicit none ! Arguments - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards ! Internals - integer(I4B) :: i + integer(I4B) :: i associate(keeps => self) select type(discards) From 952ffc8966e926a60fa2492d6f9c7978d0c53365 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 11:13:12 -0400 Subject: [PATCH 099/194] Added RMVS sorting methods and cleaned up some comment typos and formatting --- src/modules/rmvs_classes.f90 | 84 +++++++++++++++------- src/modules/symba_classes.f90 | 4 +- src/rmvs/rmvs_util.f90 | 130 ++++++++++++++++++++++++++++++++++ src/symba/symba_setup.f90 | 4 +- src/symba/symba_util.f90 | 10 +-- src/util/util_sort.f90 | 12 +++- src/whm/whm_util.f90 | 2 + 7 files changed, 208 insertions(+), 38 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 37a88993c..de4cdec4c 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -66,13 +66,15 @@ module rmvs_classes integer(I4B) :: ipleP !! index value of encountering planet logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - procedure :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered - procedure :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body - procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the - !! if the test particle is undergoing a close encounter or not - procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => rmvs_discard_tp !! Check to see if test particles should be discarded based on pericenter passage distances with respect to planets encountered + procedure :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body + procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the + !! if the test particle is undergoing a close encounter or not + procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen + procedure :: rearrange => rmvs_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -89,9 +91,11 @@ module rmvs_classes class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric !! Planetocentric version of the massive body objects (one for each massive body) logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles - procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen + procedure :: rearrange => rmvs_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface @@ -117,22 +121,6 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) logical :: lencounter !! Returns true if there is at least one close encounter end function rmvs_encounter_check_tp - module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) - use swiftest_classes, only : swiftest_body - implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_fill_pl - - module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) - use swiftest_classes, only : swiftest_body - implicit none - class(rmvs_tp), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_fill_tp - module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none @@ -162,10 +150,52 @@ module subroutine rmvs_setup_tp(self,n) integer, intent(in) :: n !! Number of test particles to allocate end subroutine rmvs_setup_tp + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + class(swiftest_body), intent(inout) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine rmvs_util_fill_pl + + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(rmvs_tp), intent(inout) :: self !! RMVS massive body object + class(swiftest_body), intent(inout) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine rmvs_util_fill_tp + + module subroutine rmvs_util_sort_pl(self, sortby, ascending) + implicit none + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine rmvs_util_sort_pl + + module subroutine rmvs_util_sort_tp(self, sortby, ascending) + implicit none + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine rmvs_util_sort_tp + + module subroutine rmvs_util_sort_rearrange_pl(self, ind) + implicit none + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine rmvs_util_sort_rearrange_pl + + module subroutine rmvs_util_sort_rearrange_tp(self, ind) + implicit none + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine rmvs_util_sort_rearrange_tp + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards end subroutine rmvs_util_spill_pl diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 7eab9e5c7..01fb7bbf4 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -316,13 +316,13 @@ end subroutine symba_setup_pl module subroutine symba_setup_pltpenc(self,n) implicit none - class(symba_pltpenc), intent(inout) :: self !! Symba pl-tp encounter structure + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure integer, intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_pltpenc module subroutine symba_setup_plplenc(self,n) implicit none - class(symba_plplenc), intent(inout) :: self !! Symba pl-tp encounter structure + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure integer, intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_plplenc diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 29d0b7b2a..745888a64 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -65,6 +65,136 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) return end subroutine rmvs_util_fill_tp + module subroutine rmvs_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a RMVS massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("nenc") + call util_sort(direction * pl%nenc(1:npl), ind(1:npl)) + case("tpenc1P") + call util_sort(direction * pl%tpenc1P(1:npl), ind(1:npl)) + case("plind") + call util_sort(direction * pl%plind(1:npl), ind(1:npl)) + case("outer", "inner", "planetocentric", "lplanetocentric") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default ! Look for components in the parent class + call whm_util_sort_pl(pl, sortby, ascending) + return + end select + + call pl%rearrange(ind) + + end associate + return + end subroutine rmvs_util_sort_pl + + module subroutine rmvs_util_sort_tp(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a RMVS test particle object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if + + associate(tp => self, ntp => self%nbody) + select case(sortby) + case("plperP") + call util_sort(direction * tp%plperP(1:ntp), ind(1:ntp)) + case("plencP") + call util_sort(direction * tp%plencP(1:ntp), ind(1:ntp)) + case("lperi", "cb_heliocentric", "xheliocentric", "index", "ipleP", "lplanetocentric") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default ! Look for components in the parent class (*NOTE whm_tp does not need its own sort method, so we go straight to the swiftest_tp method) + call util_sort_tp(tp, sortby, ascending) + return + end select + + call tp%rearrange(ind) + + end associate + return + end subroutine rmvs_util_sort_tp + + module subroutine rmvs_util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange RMVS massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(rmvs_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) + pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) + pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) + pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) + pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + deallocate(pl_sorted) + end associate + return + end subroutine rmvs_util_sort_rearrange_pl + + module subroutine rmvs_util_sort_rearrange_tp(self, ind) + !! author: David A. Minton + !! + !! Rearrange RMVS test particle object in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(rmvs_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + + associate(tp => self, ntp => self%nbody) + call util_sort_rearrange_tp(tp,ind) + allocate(tp_sorted, source=self) + tp%lperi(1:ntp) = tp_sorted%lperi(ind(1:ntp)) + tp%plperP(1:ntp) = tp_sorted%plperP(ind(1:ntp)) + tp%plencP(1:ntp) = tp_sorted%plencP(ind(1:ntp)) + tp%xheliocentric(:,1:ntp) = tp_sorted%xheliocentric(:,ind(1:ntp)) + deallocate(tp_sorted) + end associate + return + end subroutine rmvs_util_sort_rearrange_tp + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 51aaf69ba..8ae223228 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -50,7 +50,7 @@ module subroutine symba_setup_pltpenc(self, n) !! implicit none ! Arguments - class(symba_pltpenc), intent(inout) :: self !! Symba pl-tp encounter structure + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure integer, intent(in) :: n !! Number of encounters to allocate space for self%nenc = n @@ -80,7 +80,7 @@ module subroutine symba_setup_plplenc(self,n) ! implicit none ! Arguments - class(symba_plplenc), intent(inout) :: self !! Symba pl-tp encounter structure + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure integer, intent(in) :: n !! Number of encounters to allocate space for call symba_setup_pltpenc(self, n) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 397cd789e..71db85cc3 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -99,7 +99,9 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) call util_sort(direction * pl%peri(1:npl), ind(1:npl)) case("atp") call util_sort(direction * pl%atp(1:npl), ind(1:npl)) - case default + case("lcollision", "lencounter", "lmtiny", "nplm", "nplplm", "kin", "info") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default ! Look for components in the parent class call util_sort_pl(pl, sortby, ascending) return end select @@ -138,7 +140,7 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) call util_sort(direction * tp%levelg(1:ntp), ind(1:ntp)) case("levelm") call util_sort(direction * tp%levelm(1:ntp), ind(1:ntp)) - case default + case default ! Look for components in the parent class call util_sort_tp(tp, sortby, ascending) return end select @@ -156,7 +158,7 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! Symba massive body object + class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) ! Internals class(symba_pl), allocatable :: pl_sorted !! Temporary holder for sorted body @@ -193,7 +195,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. implicit none ! Arguments - class(symba_tp), intent(inout) :: self !! Symba massive body object + class(symba_tp), intent(inout) :: self !! SyMBA test particle object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) ! Internals class(symba_tp), allocatable :: tp_sorted !! Temporary holder for sorted body diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index a3e2d37a4..c81ced32d 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -35,8 +35,10 @@ module subroutine util_sort_body(self, sortby, ascending) call util_sort(direction * body%capom(1:n), ind(1:n)) case("mu") call util_sort(direction * body%mu(1:n), ind(1:n)) + case("lfirst", "nbody","xh", "vh", "xb", "vb", "ah", "aobl", "atide", "agr") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' case default - write(*,*) 'Cannot sort structure by component ' // trim(adjustl(sortby)) + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not found!' return end select @@ -83,7 +85,9 @@ module subroutine util_sort_pl(self, sortby, ascending) call util_sort(direction * pl%Q(1:npl), ind(1:npl)) case("tlag") call util_sort(direction * pl%tlag(1:npl), ind(1:npl)) - case default + case("xbeg", "xend", "vbeg", "Ip", "rot", "k_plpl", "nplpl") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default ! Look for components in the parent class call util_sort_body(pl, sortby, ascending) return end select @@ -121,7 +125,9 @@ module subroutine util_sort_tp(self, sortby, ascending) call util_sort(direction * tp%peri(1:ntp), ind(1:ntp)) case("atp") call util_sort(direction * tp%atp(1:ntp), ind(1:ntp)) - case default + case("isperi") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default ! Look for components in the parent class call util_sort_body(tp, sortby, ascending) return end select diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 9ebeb0b3f..7e1b02f50 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -140,6 +140,8 @@ module subroutine whm_util_sort_pl(self, sortby, ascending) call util_sort(direction * pl%muj(1:npl), ind(1:npl)) case("ir3j") call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) + case("xj", "vj") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' case default call util_sort_pl(pl, sortby, ascending) return From bc943d3c9102302782238e41eb4327ad9367143a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 11:23:11 -0400 Subject: [PATCH 100/194] Fixed swiftest_body sort method to accept all defined componenbts. Added sort method to initilization to ensure bodies are in correct heliocentric order before computing Jacobis --- src/util/util_sort.f90 | 6 +++++- src/whm/whm_setup.f90 | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index c81ced32d..c08343cee 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -25,6 +25,10 @@ module subroutine util_sort_body(self, sortby, ascending) select case(sortby) case("id") call util_sort(direction * body%id(1:n), ind(1:n)) + case("status") + call util_sort(direction * body%status(1:n), ind(1:n)) + case("ir3h") + call util_sort(direction * body%ir3h(1:n), ind(1:n)) case("a") call util_sort(direction * body%a(1:n), ind(1:n)) case("e") @@ -35,7 +39,7 @@ module subroutine util_sort_body(self, sortby, ascending) call util_sort(direction * body%capom(1:n), ind(1:n)) case("mu") call util_sort(direction * body%mu(1:n), ind(1:n)) - case("lfirst", "nbody","xh", "vh", "xb", "vb", "ah", "aobl", "atide", "agr") + case("lfirst", "nbody", "ldiscard", "xh", "vh", "xb", "vb", "ah", "aobl", "atide", "agr") write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' case default write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not found!' diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 940ba0b26..733adc871 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -53,8 +53,8 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) !! Sets the Jacobi mass value eta for all massive bodies implicit none ! Arguments - class(whm_pl), intent(inout) :: self !! Swiftest system object - class(swiftest_cb), intent(inout) :: cb !! Swiftest central body particle data structure + class(whm_pl), intent(inout) :: self !! WHM system object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object ! Internals integer(I4B) :: i @@ -82,6 +82,9 @@ module subroutine whm_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters call setup_initialize_system(self, param) + ! First we need to make sure that the massive bodies are sorted by heliocentric distance before computing jacobies + call util_set_ir3h(self%pl) + call self%pl%sort("ir3h", ascending=.false.) ! Make sure that the discard list gets allocated initially call self%tp_discards%setup(self%tp%nbody) call self%pl%set_mu(self%cb) From 7694a02ae84774aedcc098ba04e10d170c249b47 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 14:16:02 -0400 Subject: [PATCH 101/194] Cleaned up WHM initial conditions generator script --- examples/whm_swifter_comparison/init_cond.py | 5 -- .../whm_swifter_comparison/param.swifter.in | 2 +- .../whm_swifter_comparison/param.swiftest.in | 1 + 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/whm/whm_setup.f90 | 1 + 8 files changed, 67 insertions(+), 70 deletions(-) diff --git a/examples/whm_swifter_comparison/init_cond.py b/examples/whm_swifter_comparison/init_cond.py index aac82eed9..cc86e7635 100755 --- a/examples/whm_swifter_comparison/init_cond.py +++ b/examples/whm_swifter_comparison/init_cond.py @@ -1,10 +1,5 @@ #!/usr/bin/env python3 import swiftest -import numpy as np -import sys -from astroquery.jplhorizons import Horizons -import astropy.constants as const -from scipy.io import FortranFile sim = swiftest.Simulation() diff --git a/examples/whm_swifter_comparison/param.swifter.in b/examples/whm_swifter_comparison/param.swifter.in index 5cf0cb8b9..417c3ab04 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 J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/whm_swifter_comparison/param.swiftest.in b/examples/whm_swifter_comparison/param.swiftest.in index 73818e198..13fdad2ec 100644 --- a/examples/whm_swifter_comparison/param.swiftest.in +++ b/examples/whm_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/whm_swifter_comparison/pl.swifter.in b/examples/whm_swifter_comparison/pl.swifter.in index e0ef4e881..141e997da 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.0014751243077781048702 +1 6.5537098095653139645e-06 0.0014751238438755500459 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 -2 9.663313399581537916e-05 0.006759104275397271956 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-12.104810966946379345 -1.8005812017180330847 0.9632304211885714761 +2 9.663313399581537916e-05 0.006759080797928606587 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 -3 0.000120026935827952453094 0.010044787321379672528 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +3.0899533953493179043 -6.72112303206047562 -0.2705477431358893059 +3 0.000120026935827952453094 0.010044868190633438806 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 -4 1.2739802010675941456e-05 0.007246743835971885302 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +5.053802748240266633 3.568560918001247615 -0.0001869334511378976778 +4 1.2739802010675941456e-05 0.0072467082986392815006 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 -5 0.037692251088985676735 0.35527126534549128905 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-1.3261523862597792352 -4.4445327547884994806 -0.060612990482397517785 +5 0.037692251088985676735 0.3552707649709459117 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 -6 0.011285899820091272997 0.4376527512949726007 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +1.5541304908644199467 2.386798324664287883 -0.044683660603562371893 +6 0.011285899820091272997 0.43765596788571493287 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 -7 0.0017236589478267730203 0.4695362423191493196 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +1.4556566113591374531 1.2999494788820976765 -0.08051428750367411639 +7 0.0017236589478267730203 0.46957663585116591335 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 -8 0.0020336100526728302319 0.7812870996943599397 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.9586068527340353378 1.013470229424341294 0.01613039934499510156 +8 0.0020336100526728302319 0.7813355837717117843 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.1697807691732287658 1.1426067858222827636 -0.027409347819614317105 diff --git a/examples/whm_swifter_comparison/pl.swiftest.in b/examples/whm_swifter_comparison/pl.swiftest.in index 9d49cc3da..a5ed4ef1c 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 +1 6.5537098095653139645e-06 0.0014751238438755500459 1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --4.2340114788918336805 10.486553514018327622 1.2453138107251555947 -2 9.663313399581537916e-05 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-12.104810966946379345 -1.8005812017180330847 0.9632304211885714761 +2 9.663313399581537916e-05 0.006759080797928606587 4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.07826338813583945357 -7.419533988988633545 -0.10634201014368884618 -3 0.000120026935827952453094 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +3.0899533953493179043 -6.72112303206047562 -0.2705477431358893059 +3 0.000120026935827952453094 0.010044868190633438806 4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -5.7819217550992820422 2.18192814489641851 -0.00012230072278352209966 -4 1.2739802010675941456e-05 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +5.053802748240266633 3.568560918001247615 -0.0001869334511378976778 +4 1.2739802010675941456e-05 0.0072467082986392815006 2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --1.8728417739956807141 -4.239719661832373223 -0.042909557750301418264 -5 0.037692251088985676735 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-1.3261523862597792352 -4.4445327547884994806 -0.060612990482397517785 +5 0.037692251088985676735 0.3552707649709459117 0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -1.6060801375519682711 2.349356876761497338 -0.045690062807172619064 -6 0.011285899820091272997 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +1.5541304908644199467 2.386798324664287883 -0.044683660603562371893 +6 0.011285899820091272997 0.43765596788571493287 0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -1.4661378456572359413 1.2872251175075805794 -0.08070991686100478242 -7 0.0017236589478267730203 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +1.4556566113591374531 1.2999494788820976765 -0.08051428750367411639 +7 0.0017236589478267730203 0.46957663585116591335 0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.9554310497290159123 1.0161753499437922057 0.016099529164307530124 -8 0.0020336100526728302319 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.9586068527340353378 1.013470229424341294 0.01613039934499510156 +8 0.0020336100526728302319 0.7813355837717117843 0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.17162147939801157335 1.1422848961108499101 -0.027445465472921385952 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.1697807691732287658 1.1426067858222827636 -0.027409347819614317105 diff --git a/examples/whm_swifter_comparison/tp.swifter.in b/examples/whm_swifter_comparison/tp.swifter.in index b37f04011..d4bba791e 100644 --- a/examples/whm_swifter_comparison/tp.swifter.in +++ b/examples/whm_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 --2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 +2.1778219831071528034 1.7945000787160070299 -0.344538568144980073 +-2.4660672364316131263 2.6696516059587804457 0.5387135399929646282 102 -3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 -0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 +3.0442667013982411817 -0.9663926835590784803 0.40722457070173800897 +0.50161667633754136036 2.5842510880432738114 -1.8324318157740491254 103 --0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 -3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 +-0.34517723265404320898 -3.1406497314215879868 0.72728042419722227496 +3.0867794854837949715 0.086392107735322389756 -0.14509697121440676101 104 --2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 -1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 +-1.9619853530057589364 -0.98771442784664698067 0.2682528168870427776 +2.180176917968356245 -3.7664581464574479557 -0.15265740558307136673 diff --git a/examples/whm_swifter_comparison/tp.swiftest.in b/examples/whm_swifter_comparison/tp.swiftest.in index b37f04011..d4bba791e 100644 --- a/examples/whm_swifter_comparison/tp.swiftest.in +++ b/examples/whm_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.2759060918449769417 1.6823262546111898974 -0.3661544509052930274 --2.3097811686367798667 2.7916683305060454227 0.51377483806222698173 +2.1778219831071528034 1.7945000787160070299 -0.344538568144980073 +-2.4660672364316131263 2.6696516059587804457 0.5387135399929646282 102 -3.0206599411327550442 -1.0715345879373190385 0.4820489106686373093 -0.64736314289225124926 2.5354787229381968757 -1.8109825958052419904 +3.0442667013982411817 -0.9663926835590784803 0.40722457070173800897 +0.50161667633754136036 2.5842510880432738114 -1.8324318157740491254 103 --0.47156753362343428737 -3.1411451968218520037 0.73253063903937232215 -3.067486522793096946 -0.061867034122113133084 -0.11064022385054755856 +-0.34517723265404320898 -3.1406497314215879868 0.72728042419722227496 +3.0867794854837949715 0.086392107735322389756 -0.14509697121440676101 104 --2.0454358521790818592 -0.83017357434175576003 0.27369621627497042748 -1.8825682786003801814 -3.9015333153827542793 -0.112405737336568095776 +-1.9619853530057589364 -0.98771442784664698067 0.2682528168870427776 +2.180176917968356245 -3.7664581464574479557 -0.15265740558307136673 diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 733adc871..40dcd4f75 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -85,6 +85,7 @@ module subroutine whm_setup_initialize_system(self, param) ! First we need to make sure that the massive bodies are sorted by heliocentric distance before computing jacobies call util_set_ir3h(self%pl) call self%pl%sort("ir3h", ascending=.false.) + ! Make sure that the discard list gets allocated initially call self%tp_discards%setup(self%tp%nbody) call self%pl%set_mu(self%cb) From ea58038b6f7f08c27f9340e3b1d528ed31ac4ded Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 16:45:59 -0400 Subject: [PATCH 102/194] Fixed encounter check code for particles so that it overwrites the encounter list rather than appending --- src/symba/symba_encounter_check.f90 | 36 ++++++++++++++--------------- src/symba/symba_step.f90 | 6 ++++- src/symba/symba_util.f90 | 2 ++ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 796df5d4a..1a202ba60 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -15,7 +15,6 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc ! Result logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - integer(I4B) :: nenc_old integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr logical, dimension(:), allocatable :: lencounter, loc_lvdotr @@ -35,15 +34,14 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc lany_encounter = any(lencounter(:)) if (lany_encounter) then associate(plplenc_list => system%plplenc_list, nenc => system%plplenc_list%nenc) - nenc_old = nenc - call plplenc_list%resize(nenc_old + count(lencounter(:))) - plplenc_list%status(nenc_old+1:nenc) = ACTIVE - plplenc_list%level(nenc_old+1:nenc) = irec - plplenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:), lencounter(:)) - plplenc_list%index1(nenc_old+1:nenc) = pack(pl%k_plpl(1,:), lencounter(:)) - plplenc_list%index2(nenc_old+1:nenc) = pack(pl%k_plpl(2,:), lencounter(:)) - pl%lencounter(plplenc_list%index1(nenc_old+1:nenc)) = .true. - pl%lencounter(plplenc_list%index2(nenc_old+1:nenc)) = .true. + call plplenc_list%resize(count(lencounter(:))) + plplenc_list%status(1:nenc) = ACTIVE + plplenc_list%level(1:nenc) = irec + plplenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(:), lencounter(:)) + plplenc_list%index1(1:nenc) = pack(pl%k_plpl(1,:), lencounter(:)) + plplenc_list%index2(1:nenc) = pack(pl%k_plpl(2,:), lencounter(:)) + pl%lencounter(plplenc_list%index1(1:nenc)) = .true. + pl%lencounter(plplenc_list%index2(1:nenc)) = .true. end associate end if end associate @@ -135,7 +133,7 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 - integer(I4B) :: i, j, nenc_old + integer(I4B) :: i, j real(DP), dimension(NDIM) :: xr, vr logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr @@ -154,16 +152,16 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc lany_encounter = any(lencounter(:,:)) if (lany_encounter) then associate(pltpenc_list => system%pltpenc_list, nenc => system%pltpenc_list%nenc) - nenc_old = nenc - call pltpenc_list%resize(nenc_old + count(lencounter(:,:))) - pltpenc_list%status(nenc_old+1:nenc) = ACTIVE - pltpenc_list%level(nenc_old+1:nenc) = irec - pltpenc_list%lvdotr(nenc_old+1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) - pltpenc_list%index1(nenc_old+1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) - pltpenc_list%index2(nenc_old+1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) + call pltpenc_list%resize(count(lencounter(:,:))) + pltpenc_list%status(1:nenc) = ACTIVE + pltpenc_list%level(1:nenc) = irec + pltpenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) + pltpenc_list%index1(1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) + pltpenc_list%index2(1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) select type(pl) class is (symba_pl) - pl%lencounter(pltpenc_list%index1(nenc_old+1:nenc)) = .true. + pl%lencounter(:) = .false. + pl%lencounter(pltpenc_list%index1(1:nenc)) = .true. end select end associate end if diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 4e7082c4b..09102d82c 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -137,7 +137,11 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) - + if (ireci /=0) then + if (pl%levelg(2) == ireci) then + write(14,*) ireci,j,pl%xh(1,2) + end if + end if if (lencounter) call system%recursive_step(param, t+dth,irecp) call plplenc_list%kick(system, dth, irecp, 1) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 71db85cc3..a19886853 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -60,6 +60,8 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) call self%setup(2 * nrequested) call self%copy(enc_temp) deallocate(enc_temp) + else + self%status(nrequested+1:nold) = INACTIVE end if self%nenc = nrequested return From d1f6b0dea2df3d954843336b8e3c2e08a3df6625 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 17:19:49 -0400 Subject: [PATCH 103/194] Fixed encounter list level change code using loop instead of where assignment, due to duplication of pl indexes when multiple particles are in an encounter state --- src/symba/symba_step.f90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 09102d82c..876149edb 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -137,11 +137,6 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) - if (ireci /=0) then - if (pl%levelg(2) == ireci) then - write(14,*) ireci,j,pl%xh(1,2) - end if - end if if (lencounter) call system%recursive_step(param, t+dth,irecp) call plplenc_list%kick(system, dth, irecp, 1) @@ -158,8 +153,14 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) plind2 => plplenc_list%index2(1:plplenc_list%nenc), & plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) - where(pl%levelg([plind1,plind2,plind3]) == irecp) pl%levelg(:) = ireci - where(tp%levelg(tpind) == irecp) tp%levelg(:) = ireci + do i = 1, plplenc_list%nenc + if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = ireci + if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = ireci + end do + do i = 1, pltpenc_list%nenc + if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = ireci + if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = ireci + end do end associate where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci From 0b2ed95100e470f143fbf2217df6c197505b5854 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 17:36:15 -0400 Subject: [PATCH 104/194] Updated symba comparision notebook --- .../swiftest_symba_vs_swifter_symba.ipynb | 258 +++++++++--------- 1 file changed, 129 insertions(+), 129 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index b3b31d703..d099a32a1 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -104,7 +104,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACDnUlEQVR4nO2dd3wkR5m/n5qsGeW82l2tNgevN3mdcw4YjAPGCYOxsQ0Hxx3HAXfc74C744ALgDkObOMD42xjG7POOefN3pyDVjmPJof6/VE9Mz1BWkmrtFI9n89IPV3d1W/3zNS36q2qt4SUEo1Go9FoEljG2gCNRqPRjC+0MGg0Go0mDS0MGo1Go0lDC4NGo9Fo0tDCoNFoNJo0tDBoNBqNJg0tDJqcCCF+KIR4wNiuFUL0CiGsY21XfwghThdCbB9rO+DwtozmMxVCvCGEuMXYvl4I8ZIp7VQhxE7Dls8KIaqEEG8JIbxCiP8eads04xMtDBMUIcQ+IcR5Gfu+JIR4Z7B5SSkPSCnzpZSx4bNwcAghpBBiTn/HSCnfllLOHy2b+iPTlszPY6yeqZTyQSnlBaZd/wL82rDlKeBWoA0olFL+3Wjaphk/aGHQTAiEELaxtuEoZQawOeP9FjmEma/6M5g4aGGYxAghaoQQTwghWoUQe4UQf93HcXVGjd1mOm+VEKJDCLFLCPEV07FWIcQ/CiF2G+6INUKI6UbaAiHEy8Z524UQV5vOu1cI8b9CiGeN8z4UQsw20t4yDttguDw+L4Q4SwhRL4T4rhCiCfhDYp8pz+lCiCeN+2sXQvy6j/v7oRDicSHEo8a11wohlprSFxrumC4hxGYhxGdMaZcIIbYY5x0SQnzb2J+0RQhxP1ALPG3Y/51BPtMfCiEeE0LcZ1xnsxBiZT+f6/lCiG1CiG7jnoUpLdlqFELsBmaZ7HoY+CLwHeP9eUIIixDie8bn2W7YUZrxvbhZCHEAeM3Y/2UhxFYhRKcQ4kUhxAzT9aUQ4nbDfdVpfOZm+75inOs1nusK0/PJ+V0VQpwghFgthOgRQjQLIX7e17PRDBAppX5NwBewDzgvY9+XgHeMbQuwBvhnwIEqIPYAFxrpPwQeMLbrAAnYjPdvAr8BXMAyoBU410j7e+ATYD6qQFoKlAEe4CBwE2ADVqBcFscY590LdAAnGOkPAo+YbJfAHNP7s4Ao8DPACeQZ++qNdCuwAfiFcW0XcFofz+qHQAS4CrAD3wb2Gtt2YBfwj8ZzOgfwAvONcxuB043tEmCFyb76vj6PQT7THwJB4BLjvn4CfNDHvZQDPaZ7+VvjOd2S+R3ow657gX8zvf8b4ANgmvGc7wIezriH+4xnnAd81nheC43P8Z+A9zI+x2eAYpRYtgIXGWmfAw4Bx6O+O3NQLZjDfVffB75gbOcDJ4317+9of425Afo1Qh+s+sH3Al2ml5+UMJwIHMg45x+APxjbPySHMADTgRhQYDrvJ8C9xvZ24LIc9nweeDtj313AD4zte4F7TGmXANtM73MJQxhwZexLCMPJRqFjG8Cz+iGmgtYoiBqB041XE2AxpT8M/NDYPgDchvLJk8sW0+eRUxgG8Ex/CLxiSlsEBPq4lxsz7kUA9QxdGLZiCJTxfgpKRG2me5hlSn8euDnjWfqBGabP8TRT+mPA94ztF4Fv5rinw31X3wJ+BJSP9e9uory0K2li81kpZXHiBXzNlDYDqDHcI11CiC5UrbjqMHnWAB1SSq9p335gqrE9Hdid47wZwIkZ17seqDYd02Ta9qNqf/3RKqUM9pE2HdgvpYweJo8EBxMbUso4qjCtMV4HjX0JzPd7JUrE9gsh3hRCnDzA65k53DOF7GfjErl9+jUZ9yLN74fADODPps9sK0rEzN+TgxnH32E6vgMlTv3dS+Jz7u+709939WZgHrBNCPGxEOLSQd+lJg3dWTR5OQjslVLOHeR5DUCpEKLAVJDVolwAiXxnA5tyXO9NKeX5QzU4B/11kB4EaoUQtgGKw/TEhhDCgnKdNCTShBAWkzjUAjsApJQfA5cJIezA11E14GReA7T1cM90MDRm3Ivow56BchD4spTy3cwEIUSdsSkzjv+xlPLBIV5rdh/7+/yuSil3Atcan9sVwONCiDIppW8INmjQnc+TmY+AHqPzNk+oTuPFQojj+ztJSnkQeA/4iRDCJYRYgqqxJQqCe4B/FULMFYolQogylF95nhDiC0IIu/E6XgixcID2NqN8y4O5v0bgp0IIj2Hrqf0cf5wQ4gqjFv43QAjlW/8Q8KE6ZO1CiLOATwOPCCEcQs0LKJJSRlC+/b6Gn/Zp/wCe6WB4FjjGdC9/TXqrbLDcCfw40YEshKgQQlx2mOP/QQhxjHF8kRDicwO81j3At4UQxxnfnTnGdfv9rgohbhBCVBjC3WXkNWZDqycCWhgmKVKNn/80qqNzL6oj+B6gaACnX4vyLzcAf0b1E7xspP0cVWt+CVVQ/h+QZ9SELwCuMc5rItVxPBB+CPzRcCVcfbiDTfc3B9UPUI/q5+iLvxjpncAXgCuklBEpZRj4DHAx6hn9BrhRSrnNOO8LwD4hRA9wO3BDH/n/BPgnw/5v50jv75kOGCllG6oT96dAOzAXyKrtD4I7gFXAS0IIL0osT+zn+n9Gfa6PGM9kE+rZDcT2PwE/Bh5CdfA/BZQO4Lt6EbBZCNFr2HtNPy5GzQAQRueNRjNpEUL8ENWx3VehrtFMKnSLQaPRaDRpaGHQaDQaTRralaTRaDSaNHSLQaPRaDRpaGHQTDpEjsizEwWREYNJoxkKWhg0ExKjcPQJFQzukBDi52KU15MQAwgVrtGMR7QwaCYyS6WU+cC5wHXAVw5zvEajQQuDZhJgTEZ7G1icmWaEbH7fmHjWKIT4tRDCYUo/XJjonCGmRe5Q4eVCiGeMa3UIId42wjhkIYQ4xYj70238P8WU9oYQ4l+FEO8KFZ76JSFEeY48PieEWJOx7++EEE8N7glqJhtaGDQTHiHEIlSU1HU5kmOo0NTlqIis55IebBDgUlQo6KXA1cCFRr6fRQVzuwKoQInPwwBSyjOMc5dKtTrao8DfoWZgV6ACwP0jOWIoCbXewbPAr1Ahy38OPGuEFklwHSqEeSUqFHWu2dSrgJkZYUduAO7PcaxGk0QLg2Yis1YI0Qk8jQqh8IfMA6SUa6SUH0gpo1LKfahQ4GdmHPZTKWWXlPIA8DoqNAOocNs/kVJuNQL1/TuwTJgWpskgggpbPcMIt/G2zD1e/FPATinl/YZdDwPbUGEhEvxBSrlDShlAhSBZlpmJlDIEPIoRpsOIX1SHilul0fSJFgbNRGaFlLJESjlbSvlPGaGzARBCzDPcO01GbJ9/R7UezPQVJnogIabN/CdqEZuXhBB7hBDf6+O4GlTYbTOHC8PdV4jyPwLXGe6vLwCPGYKh0fSJFgbNZOe3qNr4XCllIcq9I/o/JclB4DbzmhdSyjwp5Xu5DpZSeqWUfyelnIWq/X9LCHFujkMbUKJjZkhhuKWUH6AWNDod5X7SbiTNYdHCoJnsFKCiwPYKIRYAXx3EuYcLMZ0WalsIcakRSlqQCtGdKzz0c6gQ5dcJIWxCiM+jVm0bqgvoPuDXQFRK+c4Q89BMIrQwaCY730bVpL3A71A++QExgBDTPyQ9VPhc4BXUkqvvA7+RUr6RI992VIf336FCZ38HuNQIqT0U7keNyNKtBc2A0LGSNJoJjhAiD2hB9bnsHGt7NOMf3WLQaCY+XwU+1qKgGSg6nopGM4ERQuxDdaZ/dmwt0RxNaFeSRqPRaNLQriSNRqPRpDFqriQhxO9RIy1apJRZMWtMxx2PWnD881LKxw+Xb3l5uayrqxs2OzUajWYysGbNmjYpZUWutNHsY7gXNZb6vr4OMMIi/wx4caCZ1tXVsXr16iM2TqPRaCYTQojM2fVJRs2VJKV8CxUyoD++ATyBGlqn0Wg0mjFg3PQxCCGmApejZpNqNBqNZowYN8IA/BL4rpQyV4iANIQQtwohVgshVre2to68ZRqNRjOJGE/zGFaiQguAim55iRAiKqV8KvNAKeXdwN0AK1euzBpvG4lEqK+vJxgMjqzFR4jL5WLatGnY7faxNkWj0WiSjBthkFLOTGwLIe4FnsklCgOhvr6egoIC6urqMC22Na6QUtLe3k59fT0zZ848/AkajUYzSozmcNWHgbOAciFEPfADwA4gpRzWfoVgMDiuRQFACEFZWRnaFabRaMYboyYMUsprB3Hsl470euNZFBIcDTZqNJrJx7hxJWk0Gs1EozvUzdrmtTT6GukJ91DsLKYmv4YVlSvId/S16N7Yo4WhH0455RTeey97Ma4vfelLXHrppVx11VVjYJVGoxnPRGIRXjnwCo9tf4y1LWuJZ68oi03YOK76OD4///OcPf1sbJbxVRSPL2vGGblEQaPRaHIRiUd4evfT3LnhThp9jUzLn8ZXjv0KJ005iZlFMyl0FtIV7GJv917ea3iPF/a9wLfe+BbVnmqumX8Nn5v/OQodhWN9G4AWhn7Jz8+nt7cXKSXf+MY3eO2115g5cyY6Iq1Go0kQjUd5ds+z3L3xbg54D7C4bDH/dNI/cdrU07CI9KliFe4KKtwVnDDlBL6x/Bu8Vf8WD259kF+u/SV3b7ybq+ZdxQ0Lb2BK/pR+rxmKhXh699PML5nPsRXHDvs9aWEYAH/+85/Zvn07n3zyCc3NzSxatIgvf/nLY22WRqMZZvwRP1979WvML5nPNQuuYWZR30PJA9EAL+x9gd998jsOeg+yoHQB/3PO/3DmtDMHNLDEarFydu3ZnF17Nlvbt3Lv5nt5cOuDPLT1IU6uOZnzZpzH4vLFzCicgQULnaFOtrZv5c36N3lp/0t0h7q5YeENWhjGirfeeotrr70Wq9VKTU0N55xzzlibpNFoRoD9PftZ07yGNc1reGjbQywsXchpU09jXsk8yvLKiMQi7PfuZ33Let44+Ab+qJ+FpQu54+w7OHv62UMeabiwbCE/O+Nn/M2Kv+Hh7Q/z0r6X+MF7P8h5bJ4tj3Nqz+GKOVdwfPXxR3C3faOFYYDooaUazcSnK9QFwH+d+V809jby2sHXuOeTe5Cku49LXaVcUHcBn5n9GVZWrRy28mFK/hS+ddy3+NsVf8vurt3s6NxBfW89AoHH7mFB6QIWli0kz5Y3LNfrCy0MA+CMM87grrvu4sYbb6SlpYXXX3+d6667bqzN0mg0w0x3qBuA2UWzubDuQr60+EsEo0H29+ynK9SFw+qg2l1Ntad6RCuLQgjmlMxhTsmcEbtGf2hhGACXX345r732Gsceeyzz5s3jzDPPHGuTNBrNCJBoMRS7ipP7XDYX80vnj41BY4QWhn7o7e0FlHr/+te/HmNrNBrNSJMQhiJH0dgaMsaMp7DbGo1GM6Z0h7rx2D3YrZM74rEWBo1GozHoCnVR7CweazPGHC0MGo1GY9AV6qLIObndSKCFQaPRaJJ0h7p1iwHd+azRaCY43rCXdw69w5b2Lezr2Udcxsmz5TG3eC5LK5eysmplMohdV6iLaQXTcmckJXQfhObN0LwJWraCvx3CPrC7wV0G5XOhYj5ULISyOWBz5M7H2wQtm428NkPXAfC1gYyrvIqmQfkcKJsLlYugciE4Ry8aqxYGjWYSIqWkM9RJMBrEZXNR4iwZ0XH5/oifl/a/xEeNH7G1Y2ty9E+Vu4r5pfM5peYUTp96Om67e9iuubV9K/+36f94/cDrhONhHBYHtYW1OKwOvGEvL+57EYASZwmXzLqE6xder/oYDq6Bx25UBX08BiEvdO2Htl1gzHMAoLgW8qvB4YFIABrWwZanVOEOIKxQNhsKa8BZCLEw+DugbTsETfkUToXSWVC1CCw2CPvV9Xa/BrFQ+nGecrDlQTSghOS4m+DMvx+2Z5ZAC8MI8eUvf5lnnnmGyspKNm3aNNbmaMYhwWiQbR3b6Ah2EI6HqXZXU1dYlzaGfjjpDffy0v6XeGX/K6xvXY837E2mFToKObbiWM6Zfg4X1l04bH72rmAXD25T8X96wj2UukpZUr6EpRVLAWj0NfLyvpd5cueT5NvzuWzOZXx+/uf7jVF0OD5p/YS7Nt7Fm/VvUmAv4Kp5V3HxzItZXL44Lby1L+Ljg8YPeGHvCzy6/VEe3vYwcRmnuLMeovUQj6iC2uGB4hmw5HNQdQxULTZq8AXZF48EoW0HtG6H1m3q1duiWghWB7iKYPGVqhVQsUDl5y7NfSPxmGpJtGyB5i3QsQd8rUosXIVQeYyyYwQQR3uk0JUrV8rVq1en7du6dSsLF47MAxsob731Fvn5+dx44439CsN4sHUy0xns5OOmjznoPUhnsBOPw0NlXiXLq5Yzs3DmsNei/RE/L+9/mb/s/gvrWtYRjUezjllctphzZ5zLFXOvoNTVR6ExCLpD3Ty49UEe2PoA3rCXqflTOaXmFGYWzSTfno8/6mdn507WNK9hX88+7BY7F9VdxHULr2Nx+eIhXbPJ18QfN/+RJ3Y+QSAa4OzpZ/PlxV9macXSrGcajUdZ37Kex3c+zov7XiQaj3Lq1FO5cdGNnDzl5AF/BqubVnPPJ/fwbsO7FDmL+MLCL3DdwusocOQowDNo8bfwyLZHeHbH4/zT/u2cfu1foPakId370YIQYo2UcmXONC0MI8e+ffu49NJLtTAchiZfE+83vM+G1g20+FsIxUKUukqpK6rjhOoTWFa5DLtl+MaVx+IxXj/4Og9ufTBtIRWX1UUwFkweV+Op4TNzPsPlcy6nJr/miK7pi/h4eNvD3Lf5PjpDndQW1HLejPNYWrGUak81NouNJl8TW9u38lb9W2xs24jD4uDimRfzhUVfGNLM245gB/dtvo9Htj+CL+LjnOnncPOxN3Ns+bE5C1spJds6tvHkzidZtXsV/qifJeVLuHbhtVw448IBje3f072Hezfdy9N7nkZKySUzL+HLi7884NAObYE2Ht/xOI9se4T2YDtziudw7YJrOaf2HMrzyrOO90f8vH7w9eSiOKWuUm5cdCPXLLgGj90zoGumseER+PNt8I21yg00gZnUwvCjpzezpaFnWK+5qKaQH3z6mMMeNxGEQUrJI9sfoTKvktOmnYbT6hy2vDe1beJ3G3/HawdfA6DYWcwUzxRcNhftgXbqe+uJyzilrlI+M/szXD3vaqYXTh/y9cKxMH/e+Wf+uOWPHPQeZGr+VD4z+zOcNvU0ZhfPxmP3EIlHOOQ9xOrm1by8/2Xeb3gfIQTnTD+HGxbdwIrKFYNqRXjDXiUIW+6jO9TNqVNP5ebFNx828Nqerj08tO0hVu1eRSAa4MQpJ/LFRV/k1KmnZsX4z6TeW8+DWx/kiZ1PEIwGubDuQr6y5CvMK5k3YLt7w738ZfdfeHjbw+zv2U+Zq4zPzf8cF9ddTF1RXZoNncFO3m14l6d3P817De/htDq5fM7lfGnxl5iaP3XA1zQTjoV5fu/z3L/lfrZ3bkcgmFcyj1nFsyiwFxCKhdjbvZftndsJxULUeGq48ZgbuWLuFUcWYO69/4GX/gm+d0C5fSYwWhi0MAyZnZ07uWLVFQB47B4un3M51y+8vu+RG4dBSsnHTR/zu09+xweNH1DgKODaBddyUd1FzCmek1ZY9oR7+LjxY57e8zRvHnyTmIxxxrQzuG7hdYNyMSQE4Xef/I5mfzNLypfwpcVf4pzp52C1WPs9t7G3kUe2P8LjOx6nJ9zDwtKF3LDoBi6quwiHNceIE4MWfwtP7HiC+7fejzfs5YxpZ3D7ktsHHTu/O9TNEzuf4MEtD9ISaKHGU8NFMy/ixOoTWVC2gAJHAXEZ52DPQda2rOW1g68pMUNwycxLuGXJLcwqmjWoa5qJyzjvNbzHQ1sf4p1D7yCRFDoKqXRX4rQ6aQ200upvRSKpcldx9fyruXLulZTllQ35mmaklOzo3MFrB15jY9tG9nbvJRANYBM2agtrWVS2iHNqz2F55fLDCuaAeOn/wYd3wT81wwSPqDwuhEEI8XvgUqBFSpnluBRCXA9813jbC3xVSrnhcPlqV9LI8si2R/jxhz/m3079N95vfJ8X975InDjn1Z7HFxZ9IafPOBdxGeet+rf43Se/Y2PrRspcZXzxmC9y9fyrB9Tkb/W38tiOx3hs+2N0BDuYVTSL6xdez6WzLu1zJEtboI1Vu1fx8LaHafI1sbRiKV9b9rVBiUqCQDTA07uf5sGtD7Knew+lrlJOm3oaK6tWUpNfg8vmoifUw/bO7Xzc9DEfNH5AXMY5e/rZ3L70dhaVLRrU9TKJxCK8tP8lntnzDO83vE9MxnIeNzV/KpfMvISr519Ntaf6iK6ZyaHeQ3zU+BGftH1CR7CDYDRIeV45tYW1nFJzCovKFg1P4TyW/PmrsPct+NbmsbZkxBkvwnAGqsC/rw9hOAXYKqXsFEJcDPxQSnni4fLVwjCyfOfN77CmZQ2vXPUKQgiafE08vO1h/rTjT3jDXuYUz+GqeVdxYd2FOX3Azb5mXtr/Eo9tf4x9PfuYmj+Vm465ic/O/eyQ3FLhWJgX973IA1sfYEv7FpxWJ8srl7OobBHleeVE41FaA61saNnA5vbNxGSM46qO49Zjb+XkmsELQiZSSt5vfJ+ndj7F+43vJ4ddmplZNJNza8/ls3M+y4zCGUd0vVx4w162tG9hR+cO/BE/ANMLpjO/dD6zimbptUOOhAeuVMNAb3tzrC0ZccaFMBiG1AHP5BKGjONKgE1SysM6KMerMFx77bW88cYbtLW1UVVVxY9+9CNuvvnmrOPGg639ce6fzuW4yuP4jzP/I22/P+Lnub3P8cSOJ9jUroSvrrCOGYUzKHQU0hPu4YD3AHu79wKwpGIJ18y/hotmXjQsHclSSja0buDFfS/yYdOH7O3emxzh47A4WFS2iBOmnMCnZn6KWcVDd6X0R1zGqffW0+RrIhgLUugopLawdlhGEmnGiLvOgPwquP5PY23JiNOfMIzXeQw3A8/3lSiEuBW4FaC2tna0bBoUDz/88FibcMREYhFa/C3MLs4eneG2u7lq3lVcNe8qtnds592Gd1nXvI4mfxM7O3dS6CxkRsEMrpx7JafWnDrsC44IIVhWuYxllcsAJRTdoW5sFhseu2dUas0WYaG2sJbawvH5HZxwxGNq1rD1CIuteAzCveq/qwjM/Uy+NjVPYZIz7oRBCHE2ShhO6+sYKeXdwN2gWgyjZNqkwxtRE6AONw58ful8NZxyDH9PQogRmximGSDeZmjcAE0bVciI5i1qQlbIq8I8eMqMSV2L1cSu6mOhZCZYMvolIkE1MazpE5VX4wZo363CTyDBYofi6SrsROUClc+UZVBSl95hLKWaXNa8ychno/rfvlvlA4BQ4SeqFkP1Yug5pGYXT3LGlTAIIZYA9wAXSynbx9qeyU5vWC1UNJAJQppJRCQIT94CoV41mzfQoWbo9janjimuVYXtzDNUjJ+wH3wtSix2vJAKG+HIV8e6itVM40AndOyFROe6Ix+ql8CCTykXj9Whavud+1Ssop0vQmKSoN0NBdXqnGhIzTbODGFRvQSOuVxdT1jU9Tr3KhHaYTgpSupG9vkdBYwbYRBC1AJPAl+QUu4Ya3s0qRZDvn30gndpjgI698LWp1V8H0e+Cukw+1yj5r5U1bz7mwMQCahCvXkTNG1StfRAp8qrcKoquKsWq1fprOwWhZloSIWMaNygwlB4myDiB5tTiVLZbBV+ovrYvkNPmO1q362C4E1yRk0YhBAPA2cB5UKIeuAHgB1ASnkn8M9AGfAbwz8c7atjRDM6JGLp5Du0MGhMGCOhuPDfYf7Fgz/fngdTV6jXkWJzQs1y9TpS7HlK1DSjJwxSymsPk34LcMsomaMZANqVpMlJxAgbYj+CGcaacc1RPhtFM5IkWwzalaQxEwmo/8MYIlszvtDCMEIcPHiQs88+m4ULF3LMMcdwxx13jLVJg6Y3olsMmhxEDWGwucbWDs2IMW46nycaNpuN//7v/2bFihV4vV6OO+44zj//fBYtOrLQCKNJwpWkWwyaNHSLYcKjWwwjxJQpU1ixQnWuFRQUsHDhQg4dOjTGVg0Ob8SL2+Y+bKA5zSQj0fms+xgmLBO/xfD899QY5eGk+li4+KcDPnzfvn2sW7eOE088bOincUVvuFePSNJkozufJzy6xTDC9Pb2cuWVV/LLX/6SwsLCsTZnUPRGeimw6/4FTQa6xTDhmfgthkHU7IebSCTClVdeyfXXX88VV1wxZnYMlZ5wj24xaLKJ6M7niY5uMYwQUkpuvvlmFi5cyLe+9a2xNmdIaFeSJifRgOp41uG9JyxaGEaId999l/vvv5/XXnuNZcuWsWzZMp577rmxNmtQaFeSJieRgG4tTHAmvitpjDjttNM42pdN9Ya9usWgySYS0ENVJzi6xaDpk96wbjFochAJ6I7nCY4WBk1OwrEw4XhYz3rWZBMJgF27kiYyWhg0OdGRVTV9EtWupImOFgZNThJxknQ4DE0W2pU04dHCoMlJosWgXUmaLCJ+sGlhmMhoYdDkRIfc1vRJJKhbDBMcLQwjRDAY5IQTTmDp0qUcc8wx/OAHPxhrkwaFDrmt6RM9XHXCo+cxjBBOp5PXXnuN/Px8IpEIp512GhdffDEnnXTSWJs2IJIht3XnsyaTiF+3GCY4usUwQgghyM9XhWokEiESiSCOohAC2pWk6ZNoUA9XneBM+BbDzz76Gds6tg1rngtKF/DdE7572ONisRjHHXccu3bt4q/+6q+OqrDbelSSJidSGi0G7UqayIxai0EI8XshRIsQYlMf6UII8SshxC4hxEYhxIrRsm2ksFqtrF+/nvr6ej766CM2bcp56+MSb1gv0qPJQVSvxTAZGM0Ww73Ar4H7+ki/GJhrvE4Efmv8PyIGUrMfaYqLiznrrLN44YUXWLx48VibMyC8Ya/ueNZk07ZD/fdUjq0dmhFl1IRBSvmWEKKun0MuA+6TKvLcB0KIYiHEFCll4+hYOLy0trZit9spLi4mEAjwyiuv8N3vjr1IDZTeSO/AhUFK6NwHjeuhcQM0b4FQD8Rj4KmA4ulQsxymroTSWWDpp6EaCULzZpVX00boaYBgD9ic4C6DyoUwZSlMWQYFVf3bFexR9jSshdbt0Nus8ne4oWAKVCyA6sVQvQTyivvPy9sEjRuVTa3bINAFsRDklULhVKhZpu6xdHb/92d+Vg3robse/O1gdYCrCCrmq/urXnL4+5MSOvak8uo6AGGfelb5VSqvmhVqxcHD9Qkkn/s6aNkG/ja1z1WonlX1seqZf/InsNhg/sX956c5qhlPfQxTgYOm9/XGvixhEELcCtwKUFtbOyrGDZbGxka++MUvEovFiMfjXH311Vx66aVjbdaA6Q33qv6FsB9+dzZY7KpwKJyiCrBIEHqbVIHbtAlC3epEiw3K54O7VBV2nftgzxvw4Z0q3VWkCr3KhZBfqXzVwW7oPqQK8datEI+mji2pA2ehcmE0rIPNfwaMqLUFU1RhVTEfPOWAUHm1bVfLuXbsSd1QwRQoqFYTs3qboX41rP1jKr1kpircKxeBs0AVur3NqobcsA68pq9hUS14ytT9NW+GHS+kXCyOAqMQXQKFNSqvUK8SliZDWILGs7I6oGiaEpd4BFq2wCePpa5TOFWJTeVCVdBbbMq/37FXiVPjxtRztzqgeAY4PBALw/53IdCZ+kwqFijBqZgPeSXqWfnboX0nNGQ8d2cR5Fcod1GrV3028UjKrrkXqs9XM2EZT8KQa8hOzrjVUsq7gbsBVq5cOS5jWy9ZsoR169aNtRlDxhvxUuoqhUNrVCE0ZRnseR16W0DG1EGuIlXgLL5CFapTlqqC1eZMzyweUwJyaLUqkJs3w/qHwRj5BEIV7NXHwrwLUi2C4trsxWBCXlXoN6xTteTG9bDr5VShBkpMqo+FpdeqgrVmuSEcGfS2QtMGo1WxHg6tNYTHwGKHkhlQd7qRzzKoOkbdt5lYVIlRwzqVV+MGWHtfaglMAKtTnXvM5er+alYYz8qRnlegC5o3qTwOrVXPf9uzpP0UHAVQMS/13GuWQ8XC9LykVK2thrWGXRth58uw/sH067nL1LOed4H6X7MMiqanP/do2BCi9SqfZddlP0vNhGI8CUM9MN30fhrQMEa2THr8ET/TC6bDwQ/Vji/8WdUS43GI+FRNf6Ad0xYrVC1SrxU3pvZHwyovRwFYB/hVdBbAjFPUK4GUqhYuBDjyB25XfgXMOU+9kjaFlDsGVM16IEOMrTZV6FcdA8tvSNkU9imXmiNf2T2QvPKKoe409UoQi4KvFZCqFu8qPnxeQkDRVPVa+OnU/mCPelYyrj5PR/7h87I5VAtoypLD26+ZEIwnYVgFfF0I8Qiq07n7aO1fmAj4o37ybHmw/2Mom5tyHVgsqpAbDmyO7BrzUBDi8H0EA8XmzG7xDAUhwJmvXkeK1aZceMOBq1C9NJp+GDVhEEI8DJwFlAsh6oEfAHYAKeWdwHPAJcAuwA/cNFq2abIJRANKGOo/hnm6o1GjmUyM5qikaw+TLoG/GiVzNIchGA2SZ3GoDsrSurE2R6PRjCI6JIYmi2g8SiQewZUYD+As6v8EjUYzodDCoMkiEA0A4E4Ig/ZJazSTCi0MI0wsFmP58uVH1RyGhDDkJUZIDldns0ajOSo4bB+DEGKgM8i6pJQ9R2jPhOOOO+5g4cKF9PQcPY8maEzWypOGMmhh0GgmFQPpfP4janZNf4OdJSoWUl9xkCYl9fX1PPvss3z/+9/n5z//+VibM2CSLYa4MZFNC4NGM6k4rDBIKc/O3CeEqJZSNo2MScNL07//O6Gtwxt227lwAdX/+I+HPe5v/uZv+I//+A+8Xu9hjx1PJITBFUuESNB9DBrNZGKofQw3Hv6Qyc0zzzxDZWUlxx133FibMmj8URXKIS9qxMfRLQaNZlIx1HkMlwkh/MDLUsrtw2nQcDOQmv1I8O6777Jq1Sqee+45gsEgPT093HDDDTzwwANjYs9gSLqSoiG1Q7cYNJpJxVBbDFegZihfLoS4ZxjtmTD85Cc/ob6+nn379vHII49wzjnnHBWiAKbO50hYBZIbjhARGo3mqGFILQYpZTPwgvHSTDCSLYZIcODB3zQazYRhSC0GIcT/CiHuNbYvGFaLJiBnnXUWzzzzzFibMWBSwuDX/QsazSRkqK6kMJBYBeWcYbJFM05ICkPIr/sXNJpJyFCFwQ8UCSHswPhcQk0zZILRIFZhxR726haDRjMJGeqopA4gAPwv8O7wmaMZDyRCbgtvr1pSUqPRTCoG1WIQQhQLIf4AXGnsug9YOexWacaUQDSAy+ZSq4/pAHoazaRjUC0GKWWXEOKnQB3QBiwBnhwBuzRjSHL1Nv/u7PWNNRrNhGcorqSbgb1SyheBNcNsj2YcEIgGyBM2tTZw5cKxNkej0YwyQxGGTuB2IcR8YAOwXkq5bnjNmhjU1dVRUFCA1WrFZrOxevXqsTZpQASjwVQAvSnLxtQWjUYz+gxaGKSUPxFCvArsAJYBZwBaGPrg9ddfp7y8fKzNGBT+iB9PJATCClXHjLU5Go1mlBm0MAgh/gWwAutRrYU3htkmzRjji/ioDHqhYgHY88baHI1GM8oMpcXwz0KIKmA5cKUQYraU8isDOVcIcRFwB0pY7pFS/jQjvQh4ADU3wgb8l5TyD4O10czbj+2g7WDvkWSRRfn0fE6/et5hjxNCcMEFFyCE4LbbbuPWW28dVjtGCl9vA+7eVlh0y1ibotFoxoChzmO4DbhLSjngWElCCCtq3sP5QD3wsRBilZRyi+mwvwK2SCk/LYSoALYLIR6UUoaHaOeY8u6771JTU0NLSwvnn38+CxYs4Iwzzhhrsw6LLxok31MJZ49NZFqNRjO2DFUYfg98VQjhAR6UUq4fwDknALuklHsAhBCPAJcBZmGQQIEQQgD5qIl00SHaCDCgmv1IUVNTA0BlZSWXX345H3300bgXBiklfiQee74OnqfRTFKGGhLjr1GiYgN+NcBzpgIHTe/rjX1mfg0sBBqAT4BvSinjmRkJIW4VQqwWQqxubW0drO2jgs/nS67c5vP5eOmll1i8ePEYW3V4grEgMQFum+5b0GgmK0MVht2AC/iLlHKgVeBc1U+Z8f5CVKd2DWrE06+FEFlTb6WUd0spV0opV1ZUVAzY6NGkubmZ0047jaVLl3LCCSfwqU99iosuumiszTosvogPAI8WBo1m0jJUV9JmVO3/ZiHEf0opjx/AOfXAdNP7aaiWgZmbgJ9KKSWwSwixF1gAfDREO8eMWbNmsWHDhrE2Y9D4I2pZT4/dM8aWaDSasWKoLYZ5qJFFd6MK84HwMTBXCDFTCOEArgFWZRxzADgXwBj5NJ9UeG/NKOALdgHgceioqhrNZGWowrAANant28CAxmBKKaPA14EXga3AY1LKzUKI24UQtxuH/StwihDiE+BV4LtSyrYh2qgZAr5AOwAehw6ep9FMVobqSioGvgt8BxU7aUBIKZ8DnsvYd6dpuwHQK8KNIf6EMDh18DyNZrIyVGH4F2CBlHK7ECJr1JDm6MUX7ATA4yoeW0M0Gs2YMSBXkhDCKoRoFELcAiClrJdSvmJsf28kDdSMLr1GH4PbVTq2hmg0mjFjQMIgpYwBm4DZI2uOZqzxh7oB8OSVjLElGo1mrBhM57Mb+I4xsWyV8frLSBk2Eejq6uKqq65iwYIFLFy4kPfff3+sTTosvrCalOd2H10RYTUazfAxmD6Gk43/K4wXZE9Q05j45je/yUUXXcTjjz9OOBzG7/ePtUmHxRfpJS8ex+rUo5I0msnKYIRh5ohZMQHp6enhrbfe4t577wXA4XDgcDjG1qgB4Iv48MQlOPU8Bo1msjJgYZBS7h9JQ0aK1++9m5b9wztHrnLGLM7+Uv/TN/bs2UNFRQU33XQTGzZs4LjjjuOOO+7A4xnfM4r9ET8eGQfH+LZTo9GMHEOd4KY5DNFolLVr1/LVr36VdevW4fF4+OlPf3r4E8eY3lgAd1yCzTXWpmg0mjFiqPMYjhoOV7MfKaZNm8a0adM48cQTAbjqqquOCmHwxUJ4sOiQ2xrNJGbQLQYhxKdHwpCJRnV1NdOnT2f79u0AvPrqqyxatGiMrTo8/liYfGEdazM0Gs0YMpQWw4+Bp4fbkInI//zP/3D99dcTDoeZNWsWf/jDEa1SOir4ZBS3FgaNZlIzFGHQPoYBsmzZMlavXj3WZgwKn4zisYz/0VMajWbkGErns567MIHxy7gWBs2gaO4Jcuebu3lzR/ZqilJKXtjUxAubmojFs4uOgx1+3tzRSm8oewXfSCzOpkPddPlzL/ne5Q/jDUZypkkpicZ0GLehokclaZJE41GCQuK2OsfaFM1RxL3v7eOnz2/jK/etziqMdzT3cvsDa7j9gTW8tTNbOG67fw1f/P1H/PtzW7PzfXcfl/7PO1z4y7dQa3elaOoOsuxfXubYH77EJ/XdWefe8sfVzPn+89z15u6stBc2NbL8X17iK/dlt+Z7Q1Gu+M27fO7O92joCmSl//aN3Xzh/z7MKYJbGnr45iPr+ON7+7LSYnHJL17ewa9f20kgHMtKf393O/e8vYf6zuxJsF3+ME+urWdrY09W2kihhUGTJLWspx6qqhk425tUGJVwNM6BjvSCzVyYbWv0pqWFo3G2N6t9mxuyC70N9V0ANPeEaPWG0tI+OZQSg3UHO9PS4nHJe7tV+PhcBfgb21vp9Ed4eUszPRktjo0Hu1h7oIuP93Xy7q7spWDueXsPb+9s4/73s6d1Pb6mnr+sb+AHqzYTiqYX/psOdXPHqzv5r5d28Mb2lqxzv/vERv7t2a3814vbs9LufW8f33psA1ff+T7xHK2ukWAowtA87FZoxgWJZT3zrXq9Z83A2dHspa7MbWz3ZqXZLILyfAc7m9OFYW+bj1hcUuK2s6vZm9Uq2Nnci9th7TNfAItQx5k51BUgEFEF886W9DTzuQC7WnLnC7CrNT2t0xem3Rc2zku/F3Wt1L59bekCac4306ZAOMZBo6WQeZ+QElRvKMqhHK2YkWDQwiClPH8kDNGMPYkWg1uv96wZIL2hKPWdAS45dgqQXWDuaPYyq8LDwimFWQViorVw6ZIafOEYDd3BZFokFmdPW28y35058p1anMey6cVphW4iDeD8RVW0ekNpfRRSSnY293LGvAplb6bgtPRSlGdnflVBdpqR79LpxRzo8BOMxLLSF1QX5LR3Z0svDpuFmiJX1nPY3dqLlFBT5GJPW29Wq2BHi5dSj+r3yxSrkUK7kjRJfBH1pfPY88fYEs3RQqIVsLy2hKnFeVk13u3NXuZVFTC3soBdLemF3s5mL1aL4MJjqtPyAtjX5iMSk5wyu4xitz1Hi6GXeVX5yXwz0wA+lRSrVHpjdxBvKMo58ytw2CzZBXizl3lV+cypys8qwHe0JPKtJi5ViydBdyBCc0+IC4+pRojcLZHZFfnMq85lr7Lh4mOnEIzE01oFoWiM/e1+Ll6sntHuHC2gkUALwwixfft2li1blnwVFhbyy1/+cqzN6hdf0FiLwamFQTMwEoXn3Mp85mUUpoFwjIMdAeZVFTCvKp9AJEZ9Z6rQS7igjqlRkXzNLqFEa0KJSn5aSyQai7O7pVelVeXT7gvT3pvqg9jZ7KW60MVxM9SaIuaCOFEIL5xSyOyKdHullGxv8jLXuObBzvRWwc5mLwVOG6fNqcjKNyFqS6YVMa0kL6vw32kI2ZyKfPa09qaN0NrZ0ovdKjh3YWVWvgl32wkzSyn1OLLyHSmGJAxCiG+ZtucPnzkTh/nz57N+/XrWr1/PmjVrcLvdXH755WNtVr/4E8t6OvR6z5qB0dil3D81xXlML3WnjeRp7Fbb00ryqC1VfRD1XSnfe31ngBllHko8DgpdtqSfPZEGUFfuYWa5h33tqbQWb4hwLE5duYdZFcrtaU7f3+FnZrmHqcV5OGwW9phq9vuM7ZkVHuZU5rOnNZXW4QvTE4wyuyKfOZX5SEla+p5WH7Mq85lV4cGS0SrY3ZoQyALmVOSnpfnDqm9gTkU+c6vyCUXjaaOPdjb3UlfmYWG1Esh0wek735FkUMIghCgWQvwB+JwQ4mtCiNOAAS/tKYS4SAixXQixSwiR8zwhxFlCiPVCiM1CiDcHY9945dVXX2X27NnMmDFjrE3pl96gGsnhdmph0AyMpp4g5fkOHDYLVYUuugORZC27qUeJRnWhi6oiNdKtuSfVj9DcE6KqUA2Nri5ypaU1dQfJd9rId9qoLnTR3htKDoU151tdqAZKtGScW13kwmIRVBe6aDL1XTR7Q9itgnKPk5oiF009wWSnd3OPanXUFLmoKc7LsrexO0BNkQuX3UpFgTMpfCotmLyPbIFUadNKlXgCHDK1nBq6AkwvdecUyIRbqbbMzcxyD/s7RmdNl0HNfJZSdgE3CSE+BTQBFwBPDuRcIYQV+F/gfKAe+FgIsUpKucV0TDHwG+AiKeUBIUTlYOzLRdfTuwk3+A5/4CBw1Hgo/vTAVzl95JFHuPbaa4fVhpEg4UrKd2lh0AyMlp4glQWq0K8qTBX+M8o8yUK1qshlSlOFbyQWp90XSu6vKnTR1JNyB7V4g1QaolFZ6CIuoa03rATEKGgrC51JYUmIhZSSFm/QlK8zXYy6lb0Wi6Cy0EU4GqfLH6HE40geV1mYsrfJdG5LT4jT51Yk7W022ducIZA9wSiBcIw8hzX1HApcVCeeg9eUrzfI0unqN9efQFYVuWgzBNJmHdlegKHmfiZq2OpJqIJ+IJwA7JJS7pFShoFHgMsyjrkOeFJKeQBASpk94PcoIxwOs2rVKj73uc+NtSmHxR9WY8k9rrIxtkRztNDUo2rnQLLQS9TQEwVnVaErWbgl0lq8IaQkTRiyav2FGfn2JPJNtRhKPQ7sVpG8VocvTCQmk4KhCnBTvj3BVCslo5BO5lvkorLAmbbPF4riDUXT7M1s/eQSSPN/s0A2dacEsq03PCCBrCp0Ig2BHGmGGna7GPgu8B3g5gGeMxU4aHpfD5yYccw8wC6EeAMoAO6QUt6XmZEQ4lbgVoDa2tr+DR1EzX4keP7551mxYgVVVVVjasdA8IV6sEmJQ7cYNAOkuSfIkmnq+5JZezfXdhPpmYVltalm3+INEYtLrBZV0J8ws1Qdk+GGaupR7qAStwMhBJUFLlO+oYx8Xby6tQUpJUIImnuCzKsqSLO3uSfEguqU3ZUFTuxWC+X5DtM1E6KRKqRX7+tIew5ZAtkTpK7ckyaQHqeNAqctmW+LN5WW+L+rJTWxri+BTFxrpBhqi+FfgL9IKbcDAw1Ikiv4XuY0PhtwHPAp4ELg/wkh5mWdJOXdUsqVUsqVFRUVgzB79Hn44YePCjcSqOGqnngcHO6xNkVzFJBV2zUKqxajIGw21c4hvZZtdgeBKvRicUm7L0Q8nu4OqixMr70n3FcWizDyzRacKlMhHYjE6AlGjfR095XZluaeEOX5DuyGm8bsLjK7gxL5dvpT/Snme63KsDdTICsLnbRktlJyCGSf9ppaKiPFkIRBSlkvpXzF2B5o53M9MN30fhrQkOOYF6SUPillG/AWsHQoNo4H/H4/L7/8MldcccVYmzIg/BG/Wu/ZoYarPrb6IBuNsASZNHUH+dhUY8pkX1vf/TqjNa1fM7IkaruJQq3AaSPPbk1z+SQKs8RxmQVtdbLwTxTSITr8yh1UbRSw5R6n0YpI1d7NglNtdCKb880UlZaeIL2hKL2haLK2nSk4mfZWmTquMwUnYW+rN9SnQKZaBTnsTeR7BAI5kgx1uOr/CiHuNbYvGOBpHwNzhRAzhRAO4BpgVcYxfwFOF0LYhBBulKspO7rWUYLb7aa9vZ2ioqPDNdMb8SXXe97f7uM7j2/kpj98nPPY0//jNT535/s5I2Y+ubaes/7rDd7KEacmGotzzA9e5D9e2JYz30c/PsBfPbQ2Z1qHL8x3Ht9Apy+3j/X5TxqTcXsy6fSF2ZIjHo85b83gSBRuiYJLCJHWedrcE0oW/KAK0xZvkHhcprmDwOTv7wlmFe4Wi6CywJn0y2e6UioLXMlWSlNPECFI9hGY3S+pfFWa02al1OPoU8iqDHsT92K2yWxvpjsoIZCJc5q6M/ItGJhAdvrT+0syBXIkGaorKQzsMbbPGcgJUsoo8HXgRVRh/5iUcrMQ4nYhxO3GMVuBF4CNwEfAPVLKTUO0UTNIfLGAajHY3dxnBAkLR7M9hbtbe4nElCBkBk0D+N3be4HcgdFe3tJMIBLjN29kR72MxOJ894lPeHZjY1ZwM4B/e2YLj62u59lPGrPSGroCfPXBtXzx9x/lvLfzf/Eml/zq7ZytlZc2N7HiX1/mgz3tWWnxuOSCX7zJ3W9l2wvw3CeNfP/Pn+RM8wYj/OyFbX2Ghv5gTzsH+xh+6A9H+0wDxkVI6cSQTHMhXVXopLE7SDQWp8WbXoBXFzqJxCTtvjBN3YEMd5A6rrEnmBKcovRCutkYWpoYWZTMt8iVbA009wQp8ziT7qBU/0QoWTs3F9KVBc60QjpdGJy09YYJR+M5+kuyBac6QyCb+hDIqqKBCWRTRr4JgUzYm6tSNlwMVRj8QJEQwg703/trQkr5nJRynpRytpTyx8a+O6WUd5qO+U8p5SIp5WIp5S+HaJ9mCPijIaOPwZOMSukLR7Niwjy7MVUwb29KL/wPdQWSETVzTcZ56KMDABS4bFlB017anIrPuCOj5h+OxnnNiEppnj2bzPdDlW9XILvmf6grkBzJkevc3xqhmdcd6MpKe2tnKzuae/n357JbOLG45GsPruXBDw/kXE/gP17Yzm/f2M3TG7KFrL03xDV3f9CnkF3xm/c4/T9ez3pGoARlzvefz+nmk1Ly1QfW8LDxnDN5Z2cbv3h5R860YCTGH97dm/V5J9jR7KXNNMN4T6sPIaCuLBVba2a5h71tPuo7A0RikpnlqbQZ5YnJaD72tvnS0ioKnDhtFva3+ZKhJsz5TivJY3+Hj7beML5wjBllqX6wqcacg4Mdfva3+5lWkgoCWVXoQgiVlpgfMK04dW5NcR6HugL4w1HaesNMLU4V4FOKEiOIghzqCiTfQ0pwGruCSYHMFJUmk0CmiVyBEsgOf98CmdbC6UMgj//xK/z8pexorMPBUIWhA9iNmpfw7vCZoxlLfPEQbgRY7XiDEQpcNuIyO3plfaefApcNIWBrRijlRN+C3SrY3pzdYkgc7w1Gk03wBGsPpMInb2vKDozW5Vc170wxAnhhcxMAkZjMCnm8an2qK2tbxrkt3iDrD3YBsLctW8ge+EAVsIWu7AF8ZldZZuTQWFzyomFTrrj+j65WA/RytbjaekPJ+88VTfOOV3YC8E6OsNCr93fy/KYm/uHJ7FaMlJIb/u9D7ng195oAv35tFz96egtPrTuUleYNRrjgF29x8x9Taxjsbu1lanEeeY7UUrCzK/Lp8IWT/U+zK1PhVeZUqO1dLb3sbvUxuyJV8FstglkV+exuVWklbnsycBzAnMp86jsDbG7oTl7HfM1Uvr3MMV3TZbcyrSSP3a297GrpxWmzMNUkHLPKPexp7WV3iy8r31nGtrKpNy2tKE/Zt6dNnSsEaUJXV5YukLPMAmkI3r62fgSy3ZecdW0WyKkleRzo8NPWG6bDF6bE9IyGk6HOfL7S2HUfsHLYrRpjzLM3M4nF41kFj5lcNbyjBV88ggf1I/cGoxxfp4YLZhamDV1BZlfkU1fmyfLpJwrBs+ZXsqO5N83lEYrGaOsNceqcMiPf9HMbuwPMLPdQ4LT1me+siuxrSik51BmgssBJLC6TP/IEBzp8yfDNmefuafWR+Mhy9U9sMuL+9wSjabVlIM31lHnuzhZvUvgy7xPgGaMVIYRyoZkxC1lm5NAuf5jV+1Whe7AjWzQe+EC5AAuc2UK2en9KeDNbc1JKnt6ormuOcpogIRYbDBEFsgpLSAnBS1tU6292eSp9anEeTpuFd3e10RuKphXgoAr/XTkK4USalMoVab4OqO+EELD+YBfNPaHsc41QErtbVSFstYi0fEPReHIRoVxCtrWphwPtfmZXevrIN1sg51Qqgfwol0BWHl4gE2lZAlmRz4EOf06BHE4GJQzGzOefAj8CPgTmMsCZz0cLsXicA+3+ZGdWJg1dQXa3+HIKQCAcZXNDTzIWfCb1Hf4+lylcf7Crz+Z/PC55fVtLn6N5ekPRrMJlKPjjETwWG7G4xB+OsbimELtVsLs1vaBt6A5QU+wygqZlFu6qUDlrfgXhaDxtCn+z0Xl49nw1oT2z5t/QFVT5Vhf0KQxnz6+koTtIdyDlt+8ORAhEYql8m3MLWW2pm23N2WIEcOa8CnY0p0f/TLgBVhrB2LJs6g4yrSQPt8OaVfgn7FURR7OF4WCHn6I8O5GYTIvSCSpwWqLwysx3V0uqfydXvmuMwt8bimZ10r+5PdXC2Z5x7p42H/uNeEOZrR+AJw1hcNgsxOKSeFyyp9WXXbgbBdXLW5opz3dS5LYn0yxGoZdwGWaJSoWH+s4AWxp6cqSlBMftsDLF5LZx2a1ML3Hz0pamZD5pNlXms6fNpyKc5hAjgBc3N2ERpLmoSjwOyjwOXtvaQjQuc4pgQhj6FEij1ZgpkC67hXd3t/cpkDv7yHdulRLIV7ZmC+RwMhRX0s3ALCnlGinlH6SUTw+3UWOJNxhFInMW7lJKvMEI0XiccI6CuCsQIS4lvhz+5nA0Roc/TKc/d0fkf7+0nf/31KacrZGXtjRz070f51yNKh6XXPTLt3Ku/ATw4If7ueWPuUcWdfsj/MOTn9DlDyOlxEcMj7An/eWFeXZjxEeqBimlpLEryJSiPGqK89LCAoAqEMvzHckvdCLIGihBAVhQXUhRnj3L39/YHWBKUR6zyj3s7/BlpAVx2CycaEx6Mg+HbTCuccqcMmwWkVUbVvm6mFdVkFXoJc49a34FgUgsLU5NszdEXKo0yNHC6QowtTiPuVUFWYX0ISPfsxdUcKDDjz+c+k54gxG8oWgy31wiOK+qgJoiV1ZfS6I2f8LMUnY0pS9uE4tLmrqDLJ6qgrFl2tTQFaCq0InDZslKS3wW5fmOLNEA9bwdNgvhaJx97T5+9dpOApFYVsGVaBVAdgENqtBL/HZyFdJSqopOZu18ZrlqFbR6QyqInUVknZtoQeXKNxyNU98ZyNkSAdhY301tqRunzZqWPrsyP9nSynVupz/C5hxCNtfI95WtLbkFsjyfFzclhCxbXA91Bdh8qLtPe1/c3EyePV0gh5OhCEMncLsQ4pdCiJuEEMuH26ixxGtMhAlFY1m9/v5wjKixL5ePNnFuIu0Xv/gFxxxzDIsXL+aaa68lFAwSCMeyWhu+UJQP93QQjUt2NGX7uV81agcbc6xtu6G+i/rOAB/uzT2n4IEPDvDK1pacQzxXbWzg4Y8O8Nq2FgLRAHHAY3UkhaHAZVOdaCZhSNTOpxjT+xOjQRI0dCvRyDUZJ1E7n1LsyophE4nFafGGqDHybTVN8knl62JKUXZws0TtvLbUTYVpWGPyul1BaorzmFaSl2zRmM8tdquFWSDdp5/I99hpxRQ4bVmjhBq7g0wtzmN2hSer1t/YFcBmEZwyuxxIj9KZsOH0uRXGCmTZhX9NkYv51QVsz+jfaTS1nLyhaJrbp603RDQuOWueajllCUN3gOklbuZU5GeJUSLfM+dVsq/Nl+ZKDYRjdPojnG0I2Qubmvil0c+xYkZxWj4Wi0jOhF46PT0NYNEUJVplHkdySGmCxCI3QHJ2cgKX3ZqM0Donh/skUWBaBMnjMtMytwGK3apVALndMnMyXFZmzMKXmW9NkWoVZB5nPv5wAukLx3IKpKUfgRwuBh0SQ0r5EyHEq8AOYBlwBrBumO0aM3zhKFaLIBaXBCMxPCZfbaIAFIisPohwNJ7cF4jEOHToEL/61a/YsmULeXl5fOqyK3hh1ZNcdvV1RGMSuy31gb6zqy35JdnU0M2x01LzHuJxyeuGCyDhVzTz+jY1UmdrY09WcK3G7tQIoS2NPZw6pzznuZsbejhjoSrIPVYXvYbA5TvtVBW60gqYBlOY5UTrprknSH6yhaD6CZKxZrzB7HMN4cgMQiYlTCnOIxqLE5dq5E5iXHejMSqkqih7kk9CcGqK85KjNhL0GLXzKUUqEJs3GMUfjuJ22IxzDSHLEf0zIQw1RSo6qDktFpc09QSZUuxCSvVDjcdl8ofaaIxdT4yYUTV59bkmxKeuzG1E6UwXq8buAMfNKMYiBGszRko1dAUocNo41sjrYIc/eY2Evctri3E7rOzNWF6yoSvI0unFWETK5ZRM6w5iEXD63HKeWFvP3jYfC41CPNHSO2NeBS9taeZtwx//wM0nssAIFW3m3ptOoK03xPSS7Bn0N51ax4raYqaVuhEis9ZfwD03qi7LRLA6Mz+9Ygkb6ru4ZPGUrLRrjp9OOBpn8dSi5FDVBIunFnHlimkIAWfMLc8697oTa3lrRyufWzktK+2seRW8tLmZlTNKKHDZ09IWTy3C7bASi0tW1pWkpSmBLOajvR2smJGeBnBMTSGrNjRQnp8tkPNNAjk/4/k6bVaml7rZ3+7PEs/hZNDCIIT4F8AKrAfWSynfGGabxgwpJZGYpCjPTpc/TCCcLgyRqCp47RZBIJLuSkqM93c7bCqqopREo1ECgQB2ux2f309NTQ2ghMNuS3151x3owm4VuGzWZGdngj1tvbT1hnDZLTnnBby1sw2LgFA0zp42X9qXxexT3nSoO00YgpEY7+1Wo1o2N3Tji6iaidvmojek3F35LhtVhS7e2Zka/ZKs9Re5ku625p5gynXUHeTUOeXJmDDmvppE7TzPYaWq0MXuFnO+JsExhW1OCkN3kBNnllKWnORjyrc7aKwrrKJtptXOTUKW6Idp7gkxs9yWtGlaibmFk8o3YdOU4rysFk6LN0gsLplSlEcsLonG1fj8CuNH3tCl+mGS+ZoEMmHTlISQmUZn+cNRuvwRaorzkDI1EMJltybvNdHiSjz71PNN3Wt1oSvtmnHDzXTxYhcIFbYiET8oYW9lgYtaw8fe1B1MCkPC3lnl+ZR5nGw6pL6HibhBmXictrTfjRmX3cqJs/oO0njeor5jip08u4yTZ+c+d1ZFPj/8zDE505w2K/99dd8BFP7ugvn83QW5l5W54JhqLjBWmMukPN/Jxh9cgNUiskQO4N6bjqfLH0kb5prgi6fUcdyMEmaUeXIIZD6//9JKbBYLp83JFrKfXbmETYe6ufjYbIEcLobSYvhnIcQ/o9xQVwohZkspvzL8pg0Pzz//PE1NTQM6VgL+UBSHzUo4FsduEThMBXgwEkciKa+sYsmJZ6adG4mrQqfAZcMfjlJeNYVvf/vb1NbWkpeXxwmnncXFF11IW2+IQCRGYV6q9tHUHaC6SNUuMwv/hO/39LkVvLylmc6MIWr7232snFHKR/s62HSoO00YdhiLqRfn2bPy3dHsJRiJU1ngZHNDD71hVQh4bO5kXJl8p43KQifeUBRfKIrHaUu6LmqK85ItqETh3xOM0GvUzkGNvzbHwm/sDlJjuIISMWEStWxz7dwfTghOaiJPonZutQgq8tML6cauAFWFKq2q0MX7u1OjhRqSrQkXwUhCGILJIYKN3UGOrytNTl7KzLfAZYQ8LnCluetShbCLcFQm800KQ3eAFbUllOc7sIhMwQlgEWo8e1WhK81FZW5VJYSspSeULLAbuwOqZZQRlyiRlji3stCZ1jfU7gsTjsWpKVZCFo7F6fRHkiNeGrsDhuDkaDl1pzrSqwqdye9SmSe3MEwm+gt/7XbYki3TTFx2KyuNUX+5OGdB3wJ50qwyTupHXIeDoc5j+D2wEChDrZ8wIUj4/i1CPZjMMUASiUBgERCJy7S+gsSP2GMMWWtpa+cvf/kLe/fuZd+BegJ+P395/BFsFkvWCKLG7iBTCvOYWe5JW9kJUmEHEk3gve2p2nAwony/p8wpw24VWeviNvUo98uimqKsIaeJ2vC5C6vwBqPs7zBWb7N7kq6kQpctbSYmpHznqnaemoyj0lI1YTCCm6W5klQtWqW5krVslZZeizZfM9HfMKXInG96i2Fq8pqpWPhpNuXo9/CFonQHIkwpToQjcGYUiCYhM81WVc/P7L5Kr70naudTivKwWS2U5zuTs24T91pV6MJmtWT14ZhbZIlJVGnpRsd/ZlyiRL5uh5XCPPW5NeVwi6Xlm2FTTXFe0q2R69yqImfy+2CzCIry0l0rmonDUMNu/zUqLIYNuAPVzzAuufjiiwd8bE8gwr52NQSvqTtIXKZ3Km1u6KbY7cBps9DQFSAWl9isqhkYialwwQ5jVMOrr77CzJkzqaiowBeKcu7Fn2bNRx9y3qevIhpLl5ymniBLphVTVehKTsFPtFQau1XslyXTigHSCpjED3taiTst9HCChP98WkkeH2aEe0gce9KsUh7+6AAHupUw5Nvz2WO0BBKuJHV8iFkV+UnfudUismrZqZqlUfhn1LITtXMgGdIgUctu7E7Vzl02CxaRWpUr4ZM3i8p+01KOjUbtPJGWyLeu3JOsnVcWONNcX4nzgGThX53R79HQFUiKRmK2aqc/TFm+M01wEiOOEue2+UJEYjLN3kyBTLSqqgtddPlT7iKz6yvT3mAkRrsvTE2RKysuUSLfmuI8hBDJPpyEu8gsZCHD7dnsDbKIQqSUNHQFOG9hpSnctKkl0hU0Jl5Zk669snzHiHV8asaeobYYdgMuVOjtcSsKgyVRk7dbLNitlrTJWbG4JBaX2K0Ce1IMUumRaBy71ZIUiilTp/HBBx/g9/uJRGN8+O6bLFq4ELu1jxZDUWp1pxZveuFfnu9MTvNPr10mCidXWsRG87nVRlrCHWQ+124VHFOjOjGbvUoY3I4CU+ezLVkbTthkrvWDEULYKETMhaVKS9Wy/eH02nlmjP2GrlTtPFHLbsoswE2tgkRBa66dqzRnVr6J2nm+04bbkQpuZvbJJ/PNeL7mNJWvOvdQVwCPw0qhy0Z5vhMhcrScilLnprvUAslWVaKgbTHlK4Q6J7OFY+7zgEScn4x8E268wtTqZJn3mnxGRn6d/gihaDzN3kxXUk3GWgPl+dqNNJEZqjBsBl4DbhZC5B4kfxQSiSlXkc2qXpFYyl2UFA2rBZvFkjw+eW5cCYNFCGwWC8cuX8lVV13FihUrOPn4FcTjcW677dZkvgnicUk4Gu9zXdymHiUapR4HDqslTRjMK05VZ/yYo8bwT7PgmM9NRHxMFCTthjB4nEV4DQHxOGxUG4VFotbeaCqEQRUUiZaCuXau0lJB08y+c8he1KWxO11wzCtZZRe0zmQtu603u3YOJF1N5sIyUZPOFJxEekLkpFQj0jqM2jlkh1JOFO5CCKOWnfLpm902CXsTs6CllGmur8xVxBq7A1Tkq7kGhS4bLrslzY0HqZaTajGku9RqijKEzJSv02ahxG03tdYSAplDeDNaIpnCW6aFYUIzVGGYjXIj3Q3cNHzmjC2RWBybVSR/7BKZnLcQNQlDYjhcWoshJpMtCbtR+P/oRz9i27ZtvPb+an76q7tx57lUSyQeJ24ITsz4n1aAm8bhJ1ZwEkIoH3hGZy4Yi60Xpi9s3tYbJhaXVJvX282stRalVpTqDiiXj8dZhDcYId9pw2K4i8rzHRxo96dq56YCfEaZmwOGW8dcOweSHaYHOvzZhXCBC7tVJCclNXYHkzVhUIXfIaO/paE7VTtXeaTEqqE7XTQSLZFEYZdwryRIBDdL2CsEaStvhWNxOnxhU2ssvaBtMtXeM/NNudTUf3O/R4cvTCiqXEHhaDytZg/prYLEc0gJWSgtX3Phn/jMQ9EYrd5Q0qbEiCHzvSbcTA6bhTJTuOmGHK66hD1SyvSWU1GixTAyMXo044OhCsNBKeUqYBdH8XoJmURi8WShn/ifEISwUcu3W0SqX8EQjbiURDPOTXczKdFQgiPS8k1M4qruo2bfaIxYArI6FJu6AxS61NDA6iIn/nAsWdtPFMTVhbk7MZWbKfVj7wl0YJOSPFcxvcEoBaagcTOMgGBtvpAa2WJqMdSVeWj3hekJRtJq54nzQM2abcxw21gtguml7uRkKnPtHKCu3MPBDtWP09gVTNbOVZoSnP3tvqxadKFLxZbZ3+7LKtQAZpR6kv0TDV2qdp743BLj7g90+JP5mvsYbBaRHEGkXF8pe2uK8pIjyBq7ArjsFoqN2a6JZ9LYFcxq/ZijdIISO3O+yg2VEjnzOWZ3USLcSLIjvSBdcBpytMhaMl1UplZBW2+YSCxOTyCKPxxLiYaRb4VuMUxohioMFwkhpgF3Ar8YRnvGlHAsjsNU64eUu8jsSrIIgc1qIWp04qVaE6lzo2mtidTEs1Rrw2iJmISh2G3HYUu5DnyhKD1B0wLkGa6DxjTfesJXrc5N1BRViyHdbZMoMM0doN3RZmqiUSzOfHpD0WTceVCF//52v6lQyy7897f5jc7aVCE8vcSNRagCvKE75TtPMLPMw752X1bBlEgLx+I0dAWyBKcuKTj+rFq0ssnNvja/UUuPp9tb7qatN4Q3GMkSjTpTWOhkh7ep32N6qZt97b5kMECzvXXlHvZ3qFZVYlhuSshS+ZqHfoKK0lnstrMvIWRd6TbVGpOZQIl9mceRnNOQ6Hc60OFPDcs1fR+sFmESq3QXYE2xK3mPDV2BZCtCfQ6JlmsweUzi3KnFedgsIi20tWbiMVRhKAa+C3wHyB1tbowZbJTTxOS2xMQzuyXdXRQ2OpcTIzHsFpFsMSQmtzmMQt9mtRCNy6S7SAlOKi2Rr5SpDu3KAmOkiakZn/hRJn6EibTEvTV0p0bNZLqhzD9ot8NGgcuW1dloXkvWTxvTI1Gwe/AGo2kTlOrK3DT1BJMzoNMLU1XL3tPWaxSIqULYYYQ43tfuN2IoOdPmhcwwBKcho3aeSINEYRpMK/hLPQ4KnDYlKhm1czi84ADquhm16OmleVgE7G3zp9x0aYLkZm+bPym6ZnvryjyEo3EaugMqdn9xtpDtbfNltUQS6fvafWnhRpL2lnto8YbwhaJJd5A5LfmMMlpODpuFaSV57G3zEYnFafamfzaJa8bjMhluJPHdnmG2tzs93yK3nVVfP43PrTSv0quZaAxVGP4FNSJpO9B3DOoxwuVy0d7ePihxSHQ0pwpw5fpJhKowu5mAZEAxMLmZbBmtgqjqS4jEUsNP7caPLxyN097eTos/ztTivGQ0zepCV7JmnpjTMM1wcVQXqslfiQloBzsCSfdHpg+8vlP55UuMAtPshkrlm/JHB63dTItGwaGGeJrXqE0ssPLk2kPk2a1pU/ZnlKq05z9pImSEJDCjWhs+NtZ3J+MRJZhZ7iYQiSWDA84yRaBMFHobDnbR6k1N8ALle68r97Cv3c++dh9TTW4mwBimGkxGfp2ao1Wwu7U3qxbttFmpKc5TLqpuFQwwUTtPnLvf1JqYmkMg97Wp/hSzkJXnO/A4rOxrUyJnrp0n7nVfmz9rlFTi+QGG0KW3nGpL3QiRKMCzRTCxJkAi3Ehm6ygYidPUE0yGG0kwqzxdlDNtWlRTmPZcNBOPAc1jEEJYgXrg/0kp75FS1hvvkVJ+bwTtGxLTpk2jvr6e1tbsaKR9oTrvwsQ6HLQYX/r2niDdFkFXvuqwdNgsRNrVD7o7oGb5xjryVLTMYBRbj6r1h6JxNSmrw4HNCN8Q8djpMGZBtnYF6HVYmVJayCObfcmCH2B6qZt3jQVYEh2z040CPFGQH+zwI8rcdAciyX1TitVKVYlCv77Tz3RTPJrESlXp+arrluTHiFnDTItEkXY39Z1NyRDWkKplv7+nndPnlqcJZJ7DSnWhK7lQzokz02dk1pV5uN9YI+DbF6RP4U/UTB/56AB1Ze6MdXyduOwWHltdD6hoounnull/sAtvMMqFx6TPEq0zCZnTZmFedX7aeaAi1gYisWTYh+S9lnvY1+YjGpdZgdFmlnvwh2O8bYQIqTMtsJIQsk8OddPiDTG9NFvI9rb7ybNbsoWszMNT6w+xq1VNUExzmxmCs7fNR0NXMBmUD9Ts2ZqiPPa1+fA4bZQY4UbMNq3e15E1zNVs77421do4yRRqoqLAicdhZU+rjzyHNTmhUTN5GJAwSCljQohNqNFI4x673c7MmTMHdc6fVh/k71dt5I1vn5X8wf/XHz9kf3c9P76qltufeoXTF3i4YFE1ebY8NjXB3a+389o3L+eeV/by4d4u3v2eWv661Rvisz9+hR9+ehGzK/P5yqqPePTWk1hoTGP/3v++S4HTxgO3LGVH627OW2gqhMvdPLE2wIGuRta1rMVVvJNXDnUTr4/T6g9jK2jmjf0OloVmATJZADltqUICVIvB7AeuK3Ozdn8nUsqkeEwvVel57i71PhqlI2InFI2nFWwLpxQYo25CLK/NDgh27sJKHjSW1jQX7gAnzipNCkPmNP4FUwqwCLUIziUZcV8sFsG8qgI21ndjM0XsTDCrIp9njCVGM+PnJITs7Z1tnDK7LC2Ustuh5mY828e5ZiH72/PmpaWZhWxaSV5ai6GqwIXLbuFPqw8iJcmJfMl8yz1srO/CF4olw22n0txICX9eW4/DakkTq0SL4ZUtzfSGoiycktnqUoID2RE+68rc+MKxZKyrOlOrKyEMmxt6aOoJplVOUi0yJTiJUCSThcC2DuK+CEgJ0nBLS4zXAPYhIa72S1M6ZOyLp/al55nKO3tfep55i8pwL0+VH8PFYGY+u4HvCCHOBxJLTEkp5WXDbtUYcKDDh8XZwvrO13hs71a2tG9hA1uIFgW45WVw1MCHPfDhB6lz8mfD5c/egT1Wg6uilse2t7GgdAFzi+cq10G7H2eio9BU0NaVuVmzv5NAOEZbb5Diwl5e2f8KW9q38GbXejxzt/Kpv6jao30K/MS0LHDeNLhr50OwEzxzPTywbxHbw8eysGwhU8rD7G13IKXkYIc/rSCeUebBG4rS7gtzsNNPsdtOXPh5v2EL67qeVzZGoxzyK3sTogGqX+QXVy/jpns/5uLF1VnP7u8umM+DHx7gihVTs9IuWTwFh3UD4Vg8OXs7QWWBi8uXT+OJtfU5I1B+/ew53Hr/GtwOa1ac/M8fP51fvapCP2e2UhZOKaCyQM0dOC5HvucsqEouimQu3AFW1pWYhCy9cF9YrYSs0x/h3IXprRSLRTC3soBPDnVjtQiW16bf6+xyT0qMMgQyUUi/vr2VE2aWprlpPE4blQVOnjJWdTO3GECJSmK966+fPSc9XyOw4UMfHWBKkSstHHV1oQunzcJjqw8Sl3BCDiHbdKgbfzjGKX0ErpuIhBt9tN+7eXgzTWiqEGpbCIQguZ2+L/E+Yx+oWD1CCXfiGEftyERYHYwwnGz8X2G8IDucUL8IIS5ChdCwAvdIKX/ax3HHAx8An5dSPj6YawyVV1vuwTPrRf7fe+C0OplfMp/FRWfzwdY8vnb6Sv7n5WZ+dfWpnDizDF/Ex5aWg/z1n97g7GPjfNy4kZhzPf/6wTsAWIUVZ10Vr3dMZ2uoCmep5MPWCKJVEpdxuhzbaXPu5uYXH8AzdzMPNvh5sAFswsZUTx2x3vlcfuxJvL9NUOoq57fXnondYicaj3Lhr55l8QxBQUEXL+1aS7C8h/u23Ec0HgU7YHVx43PHECuDeubw0NYNWISF+pgXR9kO/u39D1ndtRemH+S0R1JhMkqC+dRFIrxihFvKDJl8ypxytv3rRTmjSJZ6HKz5p/NyRtS0WATvfu+c5MiXTP71s8ewcEoBn1lak5V2/qIqvnnu3JyiMbU4jx9fvpj3dren+b9BCdkvP7+ML937MRflELJvXzCPhz86wGeXZV/z00tq+PafNhCJSZZlFO6VhSkhW5lLyM6Zw233ryHPbs3ywX9u5XR+9douILuVsnBKYbJFlivfs+dXJteInp6x1sDKGaXJdalPysh3QXVBcnGbK5ZPTfvsLBbBnMp8Njf0YLWILAE1C9mkEoY9XQBUfHUp1kJHsqAWGYU4iX+WjIIdkVHgk/M3M94ZjDAMzjeTgdFP8b/A+aj+iY+FEKuklFtyHPcz4MUjud5gaQ/vxyGm8NBl/8Os4lnYLXbe3NHK2x98xNY9VcRDghVTZ1DhzqOCCmoLZmDx91Iamkr33pV885y5fO5kD9vat7GlYwuPf/IhXdFddPrX4KiK8oP30he6sxZ4aPZNIdq7iFuOP52L5h7PvNJ5BMMWlv7oJaYvW8Azbbs56dgplOelaomziubi65LM9BRha5/LE399IZF4hF1du7jz/Td5cdcauou8WD31fNS5jg8/Sg2bdVbCu035RGIFlNhnc8PyL7CobBELSxfy1M+/h1NuYb8Ra29ajlj6/X3B+5sJW1HgTEYdzcTtsHHL6bNypgkh+Nvz5+VMA7j+xBlcf+KMnGmnzClnex9CVpbvZPU/nZc2JDeBxSJ473vnUt/pz2qlgBKy+dX5XLYsu3V0waIq/vqcOSzPUbhPL3Xzb59dzDs727Kerd1q4edXL+OLv/8oy6UG8PcXzefR1Qf5dA7x/MxSJWTRuEzGi0pQVejis8um8ud1h3JG8vyrs+fwtQfX4rBa0vomAK46LiVkma2UiUxofw/WIifOGdnrTEwmDisMQohaYzNn68CU3iWlzF4wIMUJwC4p5R7jvEeAy4AtGcd9A3gCOP5wtg0ngVgP5XnVzC9NxWVfUF2AA3hnUzPLKvLxRKCzyUcsKonH4qz0uPnoowZmxCwca3EQ3GmnNrqYqbFFRPyn8M6ONvIsgrlVTk6fW4yIq0Kq0wt/3thIaZ6d2lCUlVUz6K638KHcD3HJpREnB16q50QvzNgd4NV7jUckYEVznMaeIJEDET4tXbzx0HbVUhVWTug8Cd+e2SwIFFDe6OUzy6rxuEBYBBLJfR8eYnltOWsOdrJ8RgnHNVdhabNQb/VRFKxmTegSWrZ5WWlx0rilA4tVYLEILFaB1W7FZrdgtVmw2i1qO/GyWcZlQLX+hKy/ztTDCdmtZ+TuahNC8K0+4voD3HDSDG44KbeQnTqnnB3/dnHO51ie7+Tj7/cjZP9wDgc7AjlHCv3bZxcztyqfzy7PFpWLF1fztbNm53S31Za5+dfLjuHNHW1ZrRSAmDdMPBBVvm5Q/vB4ajvNb56xL+UnT5xITv+5OV3m3JdxbOKaZO9L5k36OZn9AqHdXTjnZj+PyYY43JBOIcTrqEfX3y9fAvdKKe/rJ5+rgIuklLcY778AnCil/LrpmKnAQ8A5wP8BzxzOlbRy5Uq5evXqfu/hcAQjMY774xksKFrJE5+7I7nf1xXi9//4Lpbs5Z2PDKFmS8cBixA4HFaEUD9yIQTeUJRQLI5Exe+xGhPnkMakt0AUAXicVhXvXSbCdkh6ApGki7LAZQcpiUuQMUkkGh/y+OTDocTDki0eaUKixMXmtGJP/Hdasdmt2J0WbA4rNoexz2FJptmcxrZDnX80Ns0nErHuEI0/+yjVeTqREFB67QLcS7JXkJtoCCHWSClX5ko7bItBSnn2cNmRK/uM978EvmuMguo7IyFuBW4FqK2t7fO4gVLf6UdY/VS405vbHU0+LHHYXgRXnFVHdUkeVqsFi01gtVqISsm3ntjAibPL+MpZs7FYLVhtIvn/m4+tZ83BLt75h3PIc9oQFuWHFELwv6/v4r9f3M7PrjyWzx+ffg8f7e3g6rveZ+m0Iv7y9dPS0nqCEU79yWt4Q1Ge/evTktFRE1z12/dYvb+TG06q5VufPTYt7WcvbOO3r+8m32Hl/e+eg8MiiMck8bik986L+KC7nB9GbuLb583lgoXVybR4NE4sFicWiRONxIlFTdvG++R2JE40atqOxIlFY0RCMQK9EWKROJFQjEg4RjSsjhkUAiUeDpOQOEzC4VAiY3dYU8JjiI3dYYhRLgEy3ltz9INo0om0+CEOhefVYqtwZ3eoJvzsFpMv3typSh9+e+MnLzL3peWdY39in0XlndWxizmPHJ27ZOwbh63f0Wao6zEMhXrAPF1yGqnRTQlWAo8YolAOXCKEiEopnzIfJKW8GxXAj5UrVw5uinMOdrd1ICxRagrTfam+LjWL+F/+7iSKK7Ob0wAPzj8Tl92atc4swM+uX67WQzZNZkpw06l1WITgM0uzfdUnzCzlltNmcvzMbL9wocvO18+Zw2vbWpILq5v5xrlz+dIfPuLSJdmugy+fOpPfv7OXMxdUUmAOgiYl7shWogUX0t0juejU2lGLnhmPS6KGSERCMaJhQzRCMSLhuHpv7E8ckxCVqOn4SCiGvyecPF7loURrMFgswhCPVIsmKTIOo/Viep8SFYtJgDKOn2CtnVin+l24V1RhK3Ud5mjNcCPjkmhU/TasVguOvOEvxkdTGD4G5gohZgKHgGuA68wHSCmTHdxCiHtRrqSnRtqwne3NANQWpTcfe40fQH5x34Vk5gLhADISIbhlC9atW6loaKSp1wtWG7ayUhx1M8lbthR3dTVfPavvaSH/dOmiPtNuO3M2t52Z+9wz51Xw8ffPy+lDryhw8vjtp6TNagbA34GIBjh55VJ+Wr5kwKIQD4UI7dxF5MB+Yj09yHgcW0kJ9qlTcc6fj8V5+HwsFoHDZcMxQuVLPBZXgmISmEgobgiPeV8qLSVM6n/YHyHY4cUbiBCNQjQmiMYgGhlkncTU2jG3UnK2aNKER4mO1Wbq28nhrkvus6lW7WBFKB4KEW1sREajYLVinzIFiyv7g4l2BsEC1j7WfB7vSCmRgQDC4UDYjqwIlFISj8lkKzrZeja1mhP74lFJNGpUaoxKT6LCEw3HiEaMilAyLU40Yko3HZdgxYUzOPny4Z9eNmrCIKWMCiG+jhptZAV+L6XcLIS43Ui/c7RsyWRfRwsAtd27YPOfAQFhH76tTpyOAmwvfguC3eoVCYDVDlYn5JVA0VQomobMr8G3o53uNz7G++Y7SL+aXYzNhjU/HxmNEO9NLcvpmF5F0anHUHTOCdinTAVnAeRXgKcSnPk5rBw4/XWsHpsxUQyAbjXcsWbGPK5e2H8MnFhPDz3PPUfPiy8SWLMWGQ7nPE44HOQtXUrBhRdSePFF2MrGZsijxWrBkTf4WlVw+3a6Vz2D7933CO3YAfHslocoKMR5wknknXoGztPOJm5zEM0QlnThMbV4QuliFPRF0sQoEo6nOnOHSFIwDLGwpomIQAiJ7Ook3tmJ7OpABnoR8TgWGUPIGELGsbqdOCorcE6rwVlXhzXPQemODhwOK+tfO5gcoJBwkwJJV4wQCdcpae6ghGCl0lOupUSntEQijUcuTR3Z0tSRLGWONFSNOlFgx2OSSLeX4I5dhBqbiLR1EPOrECFSWJEOJ6KwCEtxKZayCiwlpcQRyJgkFlODTGJRmSzgE67SuEkABjdoP8fnZLcol6Yj4Q5Vgm9zWHHl25MVA7vdgtVItxv/K0do9NRhO5/HO8PR+XzTI/exOvSf3N/QxLJQqqB7tvMf8MYquWbGT8BVpF72PIhFIBYCfwfxjgY6dzro2JZPNGDF4ohTWBvCMxXyKgW2vBgi3ANI4hFByGvD3+Kg95ALf6sThCR/SoiyRV7c5Wq1Lexu8FRAfqUSivwKyCuFaAjCXgh5IdAFgU71CnapL6fNCXYX5FdD0TQlWoXToHAKFNRAXjFYbOoV8Rvnd8H6B2HrKrj1TahZlvMZBbdsof0P9+J96SVkKIRjzmzyTz2NvBUrcNTVYS0pRghBtKOT8IH9BNauw/fOO4R27gS7naJLLqH0S1/EtXDhEX1WI0k8HKb7ySfpfOhhJQY2G+7jV+I+biXOOXOwVVYiLIK430/4wAGCmzfT++67RBsaEW43hZdcTOl11+Fa1Hdrb6BIKYlHZVJcDlcbPVyN1dz3E+n2EmpoJtLeSTwukXYHwl0AThfSaiOOBZksFOPEY3EkFlWQWqyclm8lLuE937gLk9YvQsYRQqo13S0ghETEY4hoBMIBRCyGxSKxFRZgLyvB5nEnB1Vktsqstlxim2jBqVF86n92eqrwN9yLR9CnkVi6dUjPo5/OZy0MwNX338HW+D08417KjDO/DzIOdjeP/qYZT7GLS7++LOucWK+PzoceouPee4l1dOBetpCSC44jf24hllAHxMKqIBdCtSxcxapgdhWBsxBchYRbeuh6+gW6nn6ZWLcX9zF1lF9yLJ5pduhtht4W8LWq/4EOsOWp1oSzQOVpzldY1PUifvA2Qnc9dB9SAjYQnIXwt5vBlV4D8a9dS9udd+J7620s+fkUfebTFF1xJa5jFg3oCxncsYOuPz1O1xNPIP1+PKecTNltt+M+4fhx42+PBwJ0PfYY7f/3e6ItLbgWL6b4yisouOgibCX9D12UUhLcsIHOxx+n57nnkX4/+WeeSflXbydv2bLRuYEB4l+7jva77qL3zTcRLhcFF5xP8RVX4D7hBISl7053GY8TWL+e7r+somvVKjxn/Ahoo+DyebiOOz5nzT31Hsio/feVnizkRKo1ofqFBcJiammYOpkzWycyHKL7mWfpeugB4o0NOKdPpfCSiyn59CU4+wmTEw+H8X/0Md1//rOq/EQieE49lfKvfRX3cccd+cMfZvxr19H2299SeNFFFF95xZDy0MJwGG6456/ZYH+dd5Z8h6LlX0ju//3fv83MZRWcff2C5L5YTw8d999Px333E+/uxnP66ZR/9XbcK1bkynpAxP1+Oh99jPb/+z9ibW3krTyOiq99DffJJ6cKTylTU+MHipTga1NC4W2EYA/EIxCPqlZJXokhVsVQMAUcbuM0if/DD2n739/g//hjrCUllH7xi5Rcfx3WgqFNwY/19KjC949/JNbaRt7y5ZR/9XY8p58+ZgIR6+2l86GHU+J+wgnqszzppCHZFPN66XzQqCx0deE55WTKv/pV3MeP6pScNKSU+D/4gLbf/FZ9lsXFlNx4IyXXXou1sIi0eQT0Pb8A41+kvo22P+wicuBVgmsfxbVkCeW3307+2WeNqdDHen10PfoI7X+4V/2Gli+n/Pbb8JxxxqDtinZ20vX443Tc+0di7e24jz9eCcQQvxfDie+jj2j77W/xv/8B1pISKr/9dxRfeeWQ8tLCcBi+8tvL+DhvN+uueBlRqGaeRiMx7vrGm5zw6Zkc/6mZRNva6Ljvfjofeoh4by/5555L+e23kXfssYfJfeDEg0G6/vQ47b/7HdGWFvXl/trX8Jx26qh8IaWU+N59j7bf/IbA2rXYKioovfnLlFx9NRZ37lFZgyUeCtH1xBO033MP0YZGXIsWUXb7bRScd16/tdbhJNrZSef9D9DxwAPEe3qUuN9+27DUDGM9YTqf2EZoXzOx9g5kLIbF7cFaWoolz502IQzME6yAjAliMnlcX5O7yMgvvRZOTCLjMWMWkkCI4Xm+Fo+NspsW4n/nBdp/dw+RQ4dwzp9P+W23UnDhhQjr6IXkjnV10fHAg3Tcb1TUhrFFGg8E6PrTn2i/5//G5PeYQEqJ7733aP/tnfhXr8ZaXk7ZzTdT8vkj+11qYTgMt/7mdLa6Onj7y6ngWd2tAR74f+9zxqcqKV/zON1P/hkZiVBw4YWU334brgUL+snxyIiHQnQ/+SRtd/+OaGOjqpV99XbyzzxzRApPGY3iff112u+5h+CGjdiqqyn7yi0UX3XVgEYWDema4TDdTz9D2913Edl/AMec2ZTfdhuFF198xCNF+iLS2Ej7H/5A158eRwYC5J9zjnL5DJO4x8MxWu5YS6wnjHNOMcTjRBoOEd63j3gwiLW4COfs2dgqK9Lj7SR7bTO2SblKcqZljNNX25LwwXoC69cRbWnB4vGQt3wZrgULEDZr9th/SI7/T84tIFe+JGMDuRaWYTNG6slIhO5nn6X97t8R3rMHR10dZV/5CkWf+TTCnj1ib7iINDbSce8f6fzTn5T77pxzVEVtyZJhv1bO3+PXvqp+jyMoEDIex/vqq7TfdTfBTZuwVVVRdsstFH/uqpyjxQaLFobD8MXfnESjs5eXbt4EKH/j7sde56V37Czb+GvKvLsouvxyyr58E466umGwemDIcJiup56i/a67iRw6hH1GLSVXf56iKy4/rO97IESam+letYrOhx8m2tCIfepUym69laLLP4vFkZrnEOsNE++N5AwhrP6THfoguZ2Rllb7BRmL4f94DT3PP0+koQFbZSUF552He8UKVcMmo1adkb+E9Jq2KX+JhLgkvGcP/rXrCG7dBkDe4sW4Tz4ZW3lFbpsH4FLJrPkjJZFmP8GtHZTfshjXnNTnkyxYfvc7og2NOBcsoOSaz1N46aex5qfWdDgSYt3ddD/1FB0PPkTkwAH1Wd52K8Wf/SzCkT2PZriRsRjel1+m7a67CW3diq1mCmU330zx5ZcPW2tTSklg3Tq6Hn2U7mefAykpuvRTlN58M655fcfUGi4yf4/OuXMouf56ij7zmWG7R1Auye6/qN9lePdu7LW1lH3lFoouuyztd3mkaGE4DNf99jgiMsQ9U39M75tv0vv2OzTkzWPLoi9z0eyd1H7xcuyVwx/zfKDISISeF16g85FHCaxZAzYbnhOOJ/+888g//XTs06YNqOYi43FCu3bh//AjvC++iH/NGpAS94knUnLD9RScfXZWbT24u4u232+C2NH9PRkRhPm/qlnnnzSF4k/nHlcuw2G6V62i44EHCW3bhnC7KTjvXArOORfPaacNWiRiXV30vvMuPc89R+/bb0MkQt6KFZTecD0F558/ojX2vpBS4nvrLdruvIvAunVqtNb551F46aW4Tzhh0C1QKSWhHTvpff11up9+mvDu3VjcboquuIKym76EfWr2BNGRRkYidD/zLB3330doy1YsBQUUnH8+hRdfjOekE4f03OOhEL5338P70kv0vPgiMhDAdcwxlH75JgovvHBEWtFaGA7DVXcu48qXIizbEsdaXk7+mWdwoPZ81qyL85VfnoHDNZrzAPsnuGMHPU8/g/eVVwjv3QuAtaQE17GLcdTOwFZRga2sVNWyo1Fivb1E6g8ROXiA4OYtxLq7AXDMnk3hJRdTePElOGflHq0hY5LGn3yIJc9G4QUzUuKTy/2R8Dik7Tc2skIdkNiRngZIAeHde/C9/Sbet98h3tmh7K2djn3mTOzTpmKfUoPF7VLNaSmJ93QT7e4mcrCe0K5dhHfvJB4IIGw28lYsp+CiC8k//XRVKGWGSDDbYbI326WSfm9H4kKQUhLcuJHOP/2J3ldeJdbVhbDbcS5aSN4xi3EuXIC9qgpbeTkWjwcZiSDDYSItLUQOHCS8by/+1WvUkFrAVlVF4cUXU/SZTw/LUNnhQEpJYO1aup96ip4XXiTu9SKcTvJWLFfDf2fNxFFXp4YAO50Ip5O4z0eso4NoayvBrdsIbtlCYM0aIg0qQELe8uUUX3UVhRddiMUzPC2tI0G1YNbT9eijeF95hbjPh6WgAPeKFeStPI68Y47BPm0a9urqtFZbPBgk2tpKeP8BAhs3ENywEd/HHyP9fiz5+RRefBHFV3+evGMXj6j9WhgOw2fuWsI3Ho0xd8pyZtx/H8Ji4e1Hd7Dt/Ua+8sszh8nS4Se0ezf+j1cT+GQjwU82EWlsJO71Zh1nLS7GPn06zrlzca9cifv4lQNqZYQbemn51TpKr5mPe9not5hkLEZwy1Z8H7yP/8OPCO3eTbSxsc/jLW43zgULcC1ciOfkk/CcfPK4KED6Q0ajBNatw/vGGwQ3fkJw82bifn+/51jcbjV7/vjjcZ94InnLlo1ax/1QiIdC+N57D/8HH+L78ENC27YN6DxbdTV5xy7Gc8YZ5J9xJvaqsWu1H454KITvnXfofeMN/KvXJCttgKqEOJ2qU17K9M9XCByzZ+E+biUF552H58QTRsX1py59BEH0JjrhaJyQJU5Br8Q+tSb5A+vtCuEpGd9xYJyzZ+OcPZuSaz6f3BcPBIh1dKgZPFYrFrcba/7QZlKHD6go6o7asYlNL6xW8o5drGpOX/kKoIb2RhoaiAcCqlUgBNaSEqzFxVhLS8d1AZkLYbOpAt4Y0ipjMSKNjURbW4m2tSH9fuWasNuxlZXjmFGr7nOczAEZCBank4Kzz6bg7LMB9R0NHzhIeO9eYp0dxIMhZCikvqulpdjKy3DOnTtms+WHgsXppODccyk491wAou3thHbtJlJfT+TQIeLBIMSiAFhLy7BVVGCvqcF1zKIhDwEfSSa9MPjDUYJCku+Taf0IvZ0h8kuOvlgwlrw8LMPkdw3v92LJt2MdR8/B4nbjnDPn8AcepQirFce0aTimTRtrU0YMS14ervnzcM0f+Q7jscJWVqaE7cQTxtqUIXF0Va9GAH84hjUM1hjYTMLg6wz2GzxvMhA+0IOjtvCoqp1qNJojZ9ILgy8UwW2sc2yrVAu8dzX78fWEKSgb366kkSTWGybaHsQ5Y/w1czUazcgy6YWhw+elOCkMqsXw7hO7sDutLDote02DyUL4gOrEHqv+BY1GM3ZMemHo9LVTahKGWDTOgU3tHHP6VDxHabz54SB8wAsWgWPakYUA12g0Rx+TXhi8/lZKksJQQVezn3hcUlE7uQvE8IEe7DUeRI4F5jUazcRGC4Ovg5JeScxtx+Jw0NGgFtMpq5m8wiClJNzgwzF18j4DjWYyM+mFwR/sJD8AMj8PgPaGXiwWQXHV8MU+OdqIe8PIYBR71fieHKbRaEYGLQyhLjxBEIYwdDT4KKpyY7VN3kcTaVIzM22TWBw1msnM5C39DALhHjxBmZx92Nnkp7R6cheIkWblTrNrYdBoJiWTXhhCUS+eIDiKCpFS0tsZJH8Sz18AiDT71Yzn/NGJ2aLRaMYXk14YwjEf+UGwF5cS8keJhuOTfsZzpNGHvVr3L2g0k5VRFQYhxEVCiO1CiF1CiO/lSL9eCLHReL0nhFg60jZFon48QXCWlOHrCgGQP86D540k8XCMSGMvjul6xrNGM1kZNWEQQliB/wUuBhYB1wohMoPH7wXOlFIuAf4VuHvE7Qr5sUqwlZTT25kQhsnbYojUeyEOjhl6xrNGM1kZzRbDCcAuKeUeKWUYeAS4zHyAlPI9KWWn8fYDYMRDTNoDAQCsJWX0dgYB8ExiV1IoEQpDtxg0mknLaArDVOCg6X29sa8vbgaez5UghLhVCLFaCLG6tbX1iIyyBcIAWIrL6O0KIQS4iyZvp2t4fw+28jysntFfFlKj0YwPRlMYcsVuzrl8nBDibJQwfDdXupTybinlSinlyoqKiiMyyh5UwmAtKsLXGcJd6MBqnZx98lJKwge8OGp1a0GjmcyM5kI99cB00/tpQEPmQUKIJcA9wMVSyvaRNsoRNFZVKio8KlZtG0liHUHivojuX9BoJjmjWTX+GJgrhJgphHAA1wCrzAcIIWqBJ4EvSCl3jIZRjpAhDIWFR+2qbcNFSIfa1mg0jKIwSCmjwNeBF4GtwGNSys1CiNuFELcbh/0zUAb8RgixXgixeqTtcgRjAFiKivB1Bid1x3N4fw/CadUznjWaSc6orvkspXwOeC5j352m7VuAW0bTJkcojgSiFifhYGxST24LH+jBMb0AYdFLeWo0k5nJ2ctqwhaVROzg61ad0JPVlRQPx4g0+XTHs0aj0cJgjcaVMEzyyW3hg8bENt2/oNFMeia9MNgjkqhN0NuVmNw2OUclBbd3AODULQaNZtIzqn0M4xFbBKJ2kQyH4Ske2uQ237oW4j0hpHlmhkz+Sc3YSEuXuTbT32Tll55n+i7TtTJniPSRp5QqE9/HTbiXV2Jx64ltGs1kZ9ILgz0qidks9HaFyCuwYxvCGsfhRh+dj24fPqNErm3R935AZKWJAeWVOM9e7aHoUzOPwGiNRjNR0MIQgajdQtehXooq8oaUR3BzGwio/s7xWPPtDLRQNu8XQo8E0mg04wMtDFGIuvNo3udlxQW1Q8ojsLUDx/QCbJN41rRGo0lHuWkl0vD5Sql8vOqfsT+eSDf2I5Pu3dR+5fuV8XhWvg5XHk738K+dMqmFIRaL44hAT/4cZFwybUHJ4PPwRYgc6qXw/BlHbM+AvkhZXxro78uU9sXqI//+rpWZf2pbGm+z8z/ie4mb003XGfJzSeXRn91DeS79Xetwz0XGTXkPIK9UPpn2ZNuZ+RwP9zlmFzrm55V9DSnjOe6pr/s223L4zy/1XNI/076ukf5cBvD7iMf7+Q6k33faZ2R6Fn39Rsyf9Whw/GVXccZ1Xxr2fCe1MASiYZwRCLhmY7EJqmcVpaf3enn0B98l2Ovt8wtUZa/lpOJLee7RX9J6fz2D+RKlfek1GiEQhqtRuRaF6gMSAiEshhdSGO8x0kXafpUHCIvFyDK1L5WecQ1L9j7zOQk3ZzKvvvIR6feQ2FYTJlO2WoQl7R7SrmGxZF03tZ3jvhN59WVr5vmW3Lam3bfpGql7zmFr1jUsyXxz2prjXvu1NSMvkfHchBBU1I1Mv+CkFobekB9nBCL2corK87A50juem3btoL3+AHOOPxl3YVHOL1B5WxWyQ1J10gKqLAsG8SXK/eH390UaUn7JL392/n1dK3dhkvs6mYVAf4VWv4XTUPIbxHPp+1oDfy7m/NOvNYR7sYjs+9BoxgmTWxiCvTgjELUWU5ZjYlvHIbV8xPm3fl0JQw5a795IPC/G2V++dURt1Wg0mtFiUk9w8/u7cEYhJgpzhttuP3QQV0Fhn6Igo3HCB/X6BRqNZmIxqYXB191OXFiIifycwfM6Dh2kbGrfq4uG9vcgI3Fcc0tG0kyNRqMZVSa1MIR6Ogg7CgFLzhhJ7YfqKZ06PfvExPk7O8EicM7K3aLQaDSao5HJLQzdHYScxQBZ6zD4e7oJenso60cYgju7cNQWYHFN6q4ajUYzwZjUwhDxdRFyKjdQfkYfQ0e96njuq8UQD8eINPbq1oJGo5lwTGphiPp6CRothkxXUrsxIqmvFoMOU63RaCYqk1oYYn4vQVc5FksUpzvdHdTRUI/N6aSgrDznueEDPYAOU63RaCYek1sYAj587iqc7mDWJKOOQwcprZmWnJ2YSXi/F1tFng5TrdFoJhyTWhjiAT9+TzV5BbGstPZDB/t0I0kp1frI2o2k0WgmIKMqDEKIi4QQ24UQu4QQ38uRLoQQvzLSNwohVoykPfFAjJCzhPzS9FAYPW0teNtaqZiROw5JtC1A3B/FOUMLg0ajmXiM2jhLIYQV+F/gfKAe+FgIsUpKucV02MXAXON1IvBb4/+IEGiJgB3KpqQX8NvefQuAuSeeSk9PD5FIJP28LW10Cz+2ogiBtrZBXVMOMWDeUM4bzWsN9byJeq3xzniNzzRe7YLxaVt+fj6FhcNfQRWj9aUXQpwM/FBKeaHx/h8ApJQ/MR1zF/CGlPJh4/124CwpZWNf+a5cuVKuXr160PY89P2f0WiRxnVzHyOtAq8MDDpvjUajGQ1OPfVUzj///CGdK4RYI6VcmSttNGdmTQUOmt7Xk90ayHXMVCBNGIQQtwK3AtTWDm1xHavTiicgQYDVnvEYBDicedgcdpa6ynBbs2dF2yo9uOYU93uNodQwhlor0dc6uq41GMZzi2W82jZe7YLhta20tHTY8jIzmsKQ6xeU+YQGcgxSyruBu0G1GIZizOf/+dtDOU2j0WgmPKPZ+VwPmIf5TAMahnCMRqPRaEaQ0RSGj4G5QoiZQggHcA2wKuOYVcCNxuikk4Du/voXNBqNRjP8jJorSUoZFUJ8HXgRsAK/l1JuFkLcbqTfCTwHXALsAvzATaNln0aj0WgUoxoWVEr5HKrwN++707Qtgb8aTZs0Go1Gk86knvms0Wg0mmy0MGg0Go0mDS0MGo1Go0lDC4NGo9Fo0hi1kBgjhRCiFdg/xNPLgcEFOxobtJ3Dx9FgI2g7h5OjwUYYfTtnSCkrciUc9cJwJAghVvcVK2Q8oe0cPo4GG0HbOZwcDTbC+LJTu5I0Go1Gk4YWBo1Go9GkMdmF4e6xNmCAaDuHj6PBRtB2DidHg40wjuyc1H0MGo1Go8lmsrcYNBqNRpOBFgaNRqPRpDFphUEIcZEQYrsQYpcQ4ntjbMs+IcQnQoj1QojVxr5SIcTLQoidxv8S0/H/YNi9XQhx4Qja9XshRIsQYpNp36DtEkIcZ9zfLiHEr8QwL3vWh50/FEIcMp7peiHEJWNppxBiuhDidSHEViHEZiHEN4394+p59mPnuHmeQgiXEOIjIcQGw8YfGfvH27Psy85x8yz7REo56V6osN+7gVmAA9gALBpDe/YB5Rn7/gP4nrH9PeBnxvYiw14nMNO4D+sI2XUGsALYdCR2AR8BJ6NW6HseuHgU7Pwh8O0cx46JncAUYIWxXQDsMGwZV8+zHzvHzfM08ss3tu3Ah8BJ4/BZ9mXnuHmWfb0ma4vhBGCXlHKPlDIMPAJcNsY2ZXIZ8Edj+4/AZ037H5FShqSUe1FrV5wwEgZIKd8COo7ELiHEFKBQSvm+VN/w+0znjKSdfTEmdkopG6WUa41tL7AVtZ75uHqe/djZF6Nup1T0Gm/txksy/p5lX3b2xZj9hjKZrMIwFThoel9P/1/+kUYCLwkh1gghbjX2VUlj9Trjf6Wxf6xtH6xdU43tzP2jwdeFEBsNV1PCrTDmdgoh6oDlqBrkuH2eGXbCOHqeQgirEGI90AK8LKUcl8+yDzthHD3LXExWYcjlnxvLcbunSilXABcDfyWEOKOfY8eb7Qn6smus7P0tMBtYBjQC/23sH1M7hRD5wBPA30gpe/o7tA97xsrOcfU8pZQxKeUy1LrwJwghFvdz+Jg9yz7sHFfPMheTVRjqgemm99OAhjGyBSllg/G/BfgzyjXUbDQhMf63GIePte2Dtave2M7cP6JIKZuNH2Uc+B0pd9uY2SmEsKMK2wellE8au8fd88xl53h8noZdXcAbwEWMw2eZy87x+izNTFZh+BiYK4SYKYRwANcAq8bCECGERwhRkNgGLgA2GfZ80Tjsi8BfjO1VwDVCCKcQYiYwF9UxNVoMyi6jSe8VQpxkjKS40XTOiJEoIAwuRz3TMbPTyPP/gK1Syp+bksbV8+zLzvH0PIUQFUKIYmM7DzgP2Mb4e5Y57RxPz7JPRrJnezy/gEtQIy52A98fQztmoUYibAA2J2wByoBXgZ3G/1LTOd837N7OCI5OAB5GNXUjqFrLzUOxC1iJ+vLvBn6NMeN+hO28H/gE2Ij6wU0ZSzuB01DN/43AeuN1yXh7nv3YOW6eJ7AEWGfYsgn456H+Zkb4WfZl57h5ln29dEgMjUaj0aQxWV1JGo1Go+kDLQwajUajSUMLg0aj0WjS0MKg0Wg0mjS0MGg0Go0mDS0MGo0JIUSxEOJrpvc1QojHR+hanxVC/HMfab3G/wohxAsjcX2Npi+0MGg06RQDSWGQUjZIKa8aoWt9B/hNfwdIKVuBRiHEqSNkg0aThRYGjSadnwKzjTj5/ymEqBPGOg9CiC8JIZ4SQjwthNgrhPi6EOJbQoh1QogPhBClxnGzhRAvGEER3xZCLMi8iBBiHhCSUrYZ72cKId4XQnwshPjXjMOfAq4f0bvWaExoYdBo0vkesFtKuUxK+fc50hcD16Hi2/wY8EsplwPvo0IVgFrU/RtSyuOAb5O7VXAqsNb0/g7gt1LK44GmjGNXA6cP8X40mkFjG2sDNJqjjNelWqfAK4ToBp429n8CLDGikp4C/Mm0yJYzRz5TgFbT+1OBK43t+4GfmdJagJrhMV+jOTxaGDSawREybcdN7+Oo35MF6JIq1HJ/BICijH19xadxGcdrNKOCdiVpNOl4UUtaDgmp1i7YK4T4HKhopUKIpTkO3QrMMb1/FxXlF7L7E+aRisCp0Yw4Whg0GhNSynbgXSHEJiHEfw4xm+uBm4UQiYi5uZaNfQtYLlL+pm+iFmn6mOyWxNnAs0O0RaMZNDq6qkYzRggh7gCellK+cpjj3gIuk1J2jo5lmsmObjFoNGPHvwPu/g4QQlQAP9eioBlNdItBo9FoNGnoFoNGo9Fo0tDCoNFoNJo0tDBoNBqNJg0tDBqNRqNJQwuDRqPRaNL4/73hU2v2Hj+4AAAAAElFTkSuQmCC\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": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAElCAYAAADOTWQ3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABroElEQVR4nO2dd3wc1bX4v2dX2lXv3XLvNi4YN3oPJRBISE+AEBJCCC+8dH5JXh4pLyE9Ly+EhCQESIGQkAIBQgvdYFywjbvlKlm9r8r2+/tjZmdXsiRLsprt8/181jtz587MmfFqzpxz7j1HjDEoiqIoynBxjbcAiqIoyvGNKhJFURTlmFBFoiiKohwTqkgURVGUY0IViaIoinJMqCJRFEVRjglVJMqIISJ3iMjv7eUpItIhIu7xlmsgRORsEdk13nLA0WUZy3sqIi+IyMfs5Q+JyNMJ284UkT22LFeLSLGIvCQiPhH54WjLpkw8VJEoDiJyQEQu6tX2ERF5ZajHMsYcMsZkGGMiIyfh0BARIyKzBupjjHnZGDN3rGQaiN6y9P7/GK97aoz5gzHmbQlN3wB+Zsvyd+AmoBHIMsZ8bixlUyYGqkiUkxYRSRpvGY5TpgLbeq1vN8OY3az/BycGqkiUISEiZSLyiIg0iMh+Efl0P/2m2RZBUsJ+j4pIs4hUiMjHE/q6ReTLIrLXdo9sEJHJ9rZ5IvKMvd8uEXlvwn73ichdIvK4vd9aEZlpb3vJ7rbZdsG8T0TOE5EqEfmSiNQCv421JRxzsoj81b6+JhH5WT/Xd4eI/EVE/mSfe6OILEnYPt92D7WKyDYReUfCtstFZLu932ER+bzd7sgiIr8DpgCP2fJ/cYj39A4ReVhEHrDPs01Elg/w/3qxiOwUkTb7miVhm2OVisheYEaCXA8C1wNftNcvEhGXiNxu/3822XLk9fpd3Cgih4B/2+0fFZEdItIiIk+JyNSE8xsRudl2p7XY/+eJ8n3c3tdn39dlCfenz9+qiKwUkfUi0i4idSLyo/7ujTIIjDH60Q/GGIADwEW92j4CvGIvu4ANwNcAD9YDZR9wib39DuD39vI0wABJ9vqLwM+BFGAp0ABcaG/7AvAWMBfrAbYEyAfSgUrgBiAJWIblQllo73cf0AystLf/AXgoQXYDzEpYPw8IA98FvECq3VZlb3cDm4Ef2+dOAc7q517dAYSAdwPJwOeB/fZyMlABfNm+TxcAPmCuvW8NcLa9nAssS5Cvqr//jyHe0zsAP3C5fV3fAV7v51oKgPaEa/mMfZ8+1vs30I9c9wHfSlj/T+B1oNy+z78EHux1DQ/Y9zgVuNq+X/Pt/8evAmt6/T/+E8jBUq4NwKX2tvcAh4EVWL+dWVgW0tF+q68B19rLGcDq8f77O54/4y6AfibOx35AdACtCZ8u4opkFXCo1z7/D/itvXwHfSgSYDIQATIT9vsOcJ+9vAu4qg953ge83Kvtl8B/28v3Ab9O2HY5sDNhvS9FEgRSerXFFMnp9kMqaRD36g4SHsz2g6sGONv+1AKuhO0PAnfYy4eAT2DFFOhLloT/jz4VySDu6R3AswnbFgDd/VzLdb2uRYAqhq9IdmArNHu9FEvpJiVcw4yE7U8CN/a6l13A1IT/x7MStj8M3G4vPwXc1sc1He23+hLwdaBgvP/uToSPuraU3lxtjMmJfYBbErZNBcpsd02riLRivXUXH+WYZUCzMcaX0HYQmGQvTwb29rHfVGBVr/N9CChJ6FObsNyF9XY5EA3GGH8/2yYDB40x4aMcI0ZlbMEYE8V6+JbZn0q7LUbi9V6DpfQOisiLInL6IM+XyNHuKRx5b1Kk75hEWa9rMYnrw2Aq8LeE/7MdWEov8XdS2av//yb0b8ZSZgNdS+z/eaDfzkC/1RuBOcBOEVknIlcM+SoVBw10KUOhEthvjJk9xP2qgTwRyUx48E3BcknEjjsT2NrH+V40xlw8XIH7YKCAcCUwRUSSBqlMJscWRMSF5cqpjm0TEVeCMpkC7AYwxqwDrhKRZOBWrDds51iDlPVo93Qo1PS6FulHnsFSCXzUGPNq7w0iMs1eNL36/48x5g/DPNfMftr7/a0aY/YAH7D/394F/EVE8o0xncOQ4aRHLRJlKLwBtNvB6lSxguSniMiKgXYyxlQCa4DviEiKiCzGeiOMPTh+DXxTRGaLxWIRycfyi88RkWtFJNn+rBCR+YOUtw7LNz6U66sB7hSRdFvWMwfof5qIvMt+y/9PIIAVG1gLdGIFoJNF5DzgSuAhEfGINS8j2xgTwopN9Dect1/5B3FPh8LjwMKEa/k0Pa2+ofIL4H9iAXMRKRSRq47S//+JyEK7f7aIvGeQ5/o18HkROc3+7cyyzzvgb1VEPiwihbaib7WPNW5D1Y93VJEog8ZY8xeuxArs7scKfP8ayB7E7h/A8o9XA3/DinM8Y2/7EdZb+dNYD9bfAKn2m/bbgPfb+9USD5QPhjuA+23XxnuP1jnh+mZhxTGqsOI0/fEPe3sLcC3wLmNMyBgTBN4BXIZ1j34OXGeM2Wnvdy1wQETagZuBD/dz/O8AX7Xl/3wf2we6p4PGGNOIFbS+E2gCZgNHWBND4H+BR4GnRcSHpVxXDXD+v2H9vz5k35OtWPduMLL/Gfgf4I9YAxr+DuQN4rd6KbBNRDpsed8/gMtTOQpiB54URRkCInIHViC/PyWgKCcNapEoiqIox4QqEkVRFOWYUNeWoiiKckyoRaIoiqIcE6pIFGUCIb1Stg/Qz0nZPxEQK+/Zt8ZbDmV8UEWiHLdIvD5H7GNEpDNh/exhHPOIVPq9tp8nIlH7+D6xEkneMEz5eyRhhD5TtivKhEdntivHLcaYQySkRBERAywxxlSM8qmrjTHl9gzwq7BmRa81xmwf7AH6SVWiKMclapEoJyQi4hWRH4jIIbHShP9CRFLtbQUi8k97ol+ziLwsVurzI1K3D3QOY/F3rAmJC0Tk7SLyplipySvtuSYxefpKnx5Ldd9qn+906VVITEQWSjyNfp2IfLmf610tImvsa9psz6aPbfuIiOyzLaj9IvKhAe7ZT0Sk2v78RES89rZYCv7PiUi9iNT0Z4mJyFYRuTJhPVlEGkVk6UD3Uzl+UUWinKh8Fysp31KsmeqTsFKKA3wOa9Z6IVYSvy9j6YVrsWa0X2ms6n/fG+gEtvJ5J1Z687ew0qJcZ6+/HfikiFzda7dzsdKlXwKcY7fl2Od7rdfxM4FngX9hJVacBTzXhxyTsNKcfAvIw0pp/4idmiQd+ClwmTEmEzgD2NTPJX0FWI11z5Zgpef/asL2EqyZ4ZOw0rHcJSK5fRznAXrO1r8cqDHG9Hde5ThHFYlywmG7nD4OfMYYE8uQ+22sVCtgpTQvxUpTHjJWiduhjIMvEyubbCPw31h1LXYZY14wxrxljIkaY7ZgpY4/t9e+dxhjOo0x3YM4zxVArTHmh8YYvzHGZ4xZ20e/DwNPGGOesM/9DLAe6wEOEAVOEZFUY0yNMWZbH8cAK7PyN4wx9caYBqw069cmbA/Z20PGmCewSg70Vab498DlIpJlr18L/G4Q16scp6giUU5ECoE0YIPEU4j/y24H+D5WIaWnbZfP7UM8frWdZj/PGLPUGPMQgIisEpHnxarI14aVR6ug175DSc/eX4r03kwF3iM9U6afBZTa2WzfZ8tSI1Y1yXn9HKcMKxV9jIN2W4ymXlmR+0zbb4ypxsrVdY2I5GDlzRpOMknlOEEViXIi0gh0Y1VSjNVWyTbGZADYb/afM8bMwErs91kRudDe91hm6P4RK1nhZGNMNlZWW+nVx/Sz3Bf9pUjvq9/vEuvIGGPSjTF3AhhjnrJT8ZcCO4Ff9XOcaiylFGMK8bT4Q+V+LEvpPcBrxpjhpLdXjhNUkSgnHHZq8F8BPxaRIrDiCCJyib18hVjpxoV4GvdYCvGhpp5PJBOr2JRfRFYCHzxK/wYst1N/5/snUCIi/2kHwjNFpK8sur8HrhSRS8RKl55iB8fLRaRYRN5hx0oCWO6o/tKlP4iVbbhQRAqwYkrDnavyd6zSyLdhxUyUExhVJMqJypew3Fevi5Wa/Fni/vzZ9noHVu3unxtjXrC3HS11+0DcAnxDrNTpX8NKjd8vxpgurBTor9rnW91ruw+4GMtqqgX2AOf3cZxKrGHIX8ZSTpXAF7D+vl1YgwuqsSoPnkvPqpeJfAsrtrIFa/DARrttyNgxoEeA6cBfh3MM5fhBc20pijIqiMjXgDmaav/ERydFKYoy4ohIHtYQ4WuP1lc5/lHXlqIoI4qIfBzLvfakMealo/VXjn/UtaUoiqIcE2qRKIqiKMfESRkjKSgoMNOmTRtvMRRFUY4rNmzY0GiMKezdflIqkmnTprF+/frxFkNRFOW4QkQO9tWuri1FURTlmFBFoiiKohwTY6pIRORSsSrKVfSVKE8sfmpv3yIiy+z2FBF5w66zsE1Evp6wT55dr2GP/d1XWmtFURRllBgzRSIibuAurEygC4APiMiCXt0uw0pfMRu4Cbjbbg8AFxhjlmDVSrg0IZ3E7cBzxpjZWLUahprJVVEURTkGxtIiWQlUGGP2GWOCwENY+YESuQp4wK489zqQIyKl9nqH3SfZ/piEfe63l+8Hrh7Ni1AURVF6MpaKZBI9azFU2W2D6mNnNd0E1APPJBT4KTbG1ADY30V9nVxEbhKR9SKyvqGh4VivRVEURbEZS0XSuy4DHFmPod8+xpiIMWYpUA6sFJFThnJyY8w9xpjlxpjlhYVHDINWFEVRhslYKpIqrIpvMco5smjOUfsYY1qBF4BL7aY6ESkFsL/rR0xiRVGUE4TaNj8/fHoX+xo6jt55iIylIlkHzBaR6SLiwaqf/WivPo8C19mjt1YDbcaYGrvQTg6AiKQCF2FVeovtc729fD3wj1G+DkVRlAnNjfet46Ifvdij7VBzF//37wqqW/0jfr4xm9lujAmLyK3AU4AbuNcYs01Ebra3/wJ4ArgcqyBRF3CDvXspcL898ssFPGyM+ae97U7gYRG5ETiEVdpTURTlpOW5nZZjJhSJkuy27IX27hAAWakj/9gf0xQpxpgnsJRFYtsvEpYN8Kk+9tsCnNrPMZuAC/vapiiKcjKzs8bHovJsAHwBS5FkpiSP+Hl0ZruiKMpxSjRq+NubVYQi0T63bzzU4iy3d4cByEoZeftBFYmiKMpxyl82VvGZP23md6/FcykmKpVNla3Oss+vFomiKIrSi/2NnQC02fEPgJauoLNc2xYPrLf7w6Qku/AkjfxjXxWJoijKcUpMgbgkPgWvpTOuVNr9CcvdIbJGwRoBVSSKoijHLVUt3QA0dQactuZOyyIpzU7pYan4/GEyRyE+AqpIFEVRjltikwsbfHFFEnNtTc1Pc4b8gmWdZKWqRaIoinJS8uf1lXz24U0EwhGnzR+KcLjVskgaO460SKYXpOMLhIlGrUxU7f7wqATaQRWJoijKhOc3r+znrxsP861/7nDaqlu7MXa2wsaOeIC9xVYkU/LSMQZ8AWvYr687NCpDf0EViaIoyoTBGMNDbxyiw374x4i5pNYdaHba2v1Wn+kF6b1cWyEyvEkUZHisfrZ7S11biqIoJwG76zq4/a9v8eimnvls27osZdDa1XMUFsCMgnQ6AmG6g5bbq6UrSE5asqM02hxFosF2RVGUE57qNivmUdXS1aO9tTvY4xviQ3unF6QD8ThJW3eInLRksm1F0t4dwh+KEAxHdfivoijKiU5sAmFsWC9Y7q4W2xLxh6L4Q5blEUt5MqMwA4grkth8kZjSaOsO4fOPXnoUUEWiKIoyYahxFEncIvGHogTDUSbnpQKJrirre0peWo/2NluRZKclO/3anMy/apEoiqKcMPhDESf/VYxax7UVt0hi7qxp+ZYLKxYn8flDJLmEkuwUoKeCyU5NdqyPtu6QM7ckL90zKteiikRRFGUceNuPX+L07/y7R1vMIqn3BRwXVkxxTM1Ps9ctpdDebQXPc9J6BdW7w2SlJpHhTcIl1npsbklumioSRVGUE4I9dT4ONXcdMcy3ts2Py06bFVMqMWvCsUh6DeeNBdVbu0IEw1G6QxGyU5MREbJSky2LJKZI1CJRFEU5MXhk42FnORiOp32vbfMztyQLgMO2eys29DemSGLrsaB6sttFusdNW3fIiZvEYiF5aR6au4I0x1xbapEoiqIcX/hDEabd/jgPvnGoR3tfubE6A2F8gTDzSzMBnId/zAKZVmC7tuyYSbs/7JTNzUnz0NoVD6rHrJSCTC8N7QFau0KkJLtI9bhH5TpVkSiKoowS9e2WwvjK397q0Z6YlTcWv4gpjOkxy8NejymaSTlpJLnEiZkkpoW3XFjBeF12u70o00u9z09zZ3DUrBFQRaIoijJqNNhzO+y8iQ5t3UEnFhJTJDGX1RQ7qN7WFW/3JlnWRE5acs8Yia0wcuxYSHyYr2WpFGWmUO8L0NIZHLX4CKgiURRFGTUSs/LGRmGBFRiPzUh3FImtBAozvKQmu5311q6QMzIrOzXZGbWVWF8kJy2Z1q6Qk38r5toqyvLSFYxQ1dI9akN/QRWJoijKiHDvK/u55u41PdoSYyE7a33Oclt3yJmRHlMkiYHymGIAO3dWqqUEctM8tHSGCEWidAUjTlA927ZIeru2CjO8AOyq843a0F9QRaIoijIifOOf29lwsKXHKKxEi2RPnaVIjDG0doeYlp+GCDT1skiy7SG9MRdWa3fcIinI8NLYEXCUjGOp2C6v3jPYi7K8zvlz00ZnVjuoIlEURTlmjIkHQRLL3jb4AiTZwZDYQz6W8iQv3Ut2arIzx6M9QQnELAywYiQxhZGf4aGpM+hYOjGLIzs1mWA4Sn27H0+Si5Rka3RWUWaKI8sJEyMRkUtFZJeIVIjI7X1sFxH5qb19i4gss9sni8jzIrJDRLaJyG0J+9whIodFZJP9uXwsr0lRFCU2eRDiI7XAskimF6Tjdokz+irR8shL98RdW90hRCDTa81Wb+vDtZWf4aWlK0hdu3W+wkxLkcTcVpsqWynPSXXOX5QZt0gWl2eP7EUnMGaKRETcwF3AZcAC4AMisqBXt8uA2fbnJuBuuz0MfM4YMx9YDXyq174/NsYstT9PjOZ1KIqi9GZLVZuzXO9LVCRBCjO95KTGYx6xeSA5acnkp3scC6atO0SmNwmXS2zXVtBxg+Wkx1xbHoyB3babrMC2SGKB+81VbcwoTHfOH7NkirO8nD+3aFSuHcbWIlkJVBhj9hljgsBDwFW9+lwFPGAsXgdyRKTUGFNjjNkIYIzxATuASWMou6IoCgBv+/GL/OCpXT3aKurjgfTEAHuDL0BBhteJYUA8d1Z2arITPAdLkcQy9uakeWjrDjlusJhFElMcO2ragbhFMq8k0zlnLIgPICL8+3Pn8uIXzkdERuDq+2YsFckkoDJhvYojlcFR+4jINOBUYG1C8622K+xeEcnt6+QicpOIrBeR9Q0NDcO8BEVRTma6gxF213Xws+crnGG4YJW39bitx2m9L+7mauywFElOwrDdRNdWLOYB9kz1lPgoLH8oSq3twnJiJHacY2etjzSPm3RvfGZ7qZ0FeGaCRQKWYonFTEaLsVQkfalDM5Q+IpIBPAL8pzGm3W6+G5gJLAVqgB/2dXJjzD3GmOXGmOWFhYVDFF1RlJMNY0yPIDrE05YAPLo5Xg63tStEQYaHvHSP49ryhyJ0BSPkZ3jItVOYQHziYU6aFSNp6bJcWG3dIWf+R+z7QFMnEB9xlW9bJDtrfY41EmOubZUkWiRjxVgqkipgcsJ6OVA92D4ikoylRP5gjPlrrIMxps4YEzHGRIFfYbnQFEVRjolHNh5m5bef6zGct7kjrkhiAW+IuaU8FGZ4HddWe+Jw3rQjYyQx11YkamjvDvdQJDEL5GBjp93XskRio7Qg7uaKMb/USvY4o6CnRTIWjKUiWQfMFpHpIuIB3g882qvPo8B19uit1UCbMaZGLOfeb4AdxpgfJe4gIqUJq+8Eto7eJSiKcrKw4WALDb4ANW3xIlOJFklzZzxfVlt3kJzUZIqyvI5FEouJ5KQlk5PqcVxbzZ0hkt1ChjeJ/AxLQTR1BnrkzirJstxUO2p8zjHASn0SG05c2EuR3HDGNP7vA6c6VstYMmaKxBgTBm4FnsIKlj9sjNkmIjeLyM12tyeAfUAFlnVxi91+JnAtcEEfw3y/JyJvicgW4HzgM2N0SYqinMAcarasgcRqhc32CKtktzjzPyCexqQww0tjTJHEXFipHnLTkukMRgiGozR3BshL9yAi5KV77eMGewTbY/m2Nle1Wsew20XEKa3be15IUVYKVy4pG7kbMARGpxJ8P9hDc5/o1faLhGUDfKqP/V6h7/gJxphrR1hMRVEUDjZZddMrm+P102NWyMzCjB7WSavtlsrwJjnzRWIWSE5asqMIWruDViZeW4HEMvLua+wkEI468z4KM7ykedxOWpXE9CY///Ay/u/fFVyxONEZM76MqSJRFEU5HgiGo1S3Hlk/vbkzgNslTM1PY78dv3AC5WnJZKUk0xWM4A9FHNdWdmoyObYiaOsK0dQZdEZf5dmura2HrXkok+zJhDHLY2etj5mF6T1GXc0ryeKuDy4bzcsfMpoiRVGUkxpjDP/YdLiH5VHV0uWkfq9s6WmR5KZ5yEv3OtZJ4lyPWIbd5s6gMzorO8EiaekK2RaJrUjSeiqS0oRZ6TEX1oppeSN+zSONKhJFUU5qvvfULm57aBM/f6HCaTtoK5XUZPcRFkl+uhXziA3bTZypHnNBxWIebpeQ6U0i33ZlNfgCNHfEFUmqx01qsput1dZshrKceG6sUMQaLbZsap9T4yYUqkgURTmpiZXB7QzE64XE3FrLp+X2ipEEyU235n9EooZ2f7jHTPWYgmjpCtLaHSQ7NRkRcVxWB5o68QXCjmsLIC/dQzAcJdktFKTHR1wtm5Jrf+eMwlWPLKpIFEU5KTjY1MnX/rHVedMHCEeizkzzxKy9MeUwrySTxo4AUdvP1dwZJD/d61geLZ3BhNFZyT1cW61dIXJS48N20zxux4UVi40ATMq1lExJdgouV3xM0SfPm8mznz2XWUXx9CcTFVUkiqKcFHz9se088NpB1u1vdtraukPEJq83+hJSnnQGSU12U5KdStTEi04lWiRgzStxUp6kJVgkvYbzighlOalsrbYUSaJFcvVSKwtUYtZggCS3i1lFYz9LfTioIlEU5aTAbb/t77fTjgDOUN3MlCSnvjpYw3lz05LJs7PuNncGiUStTLx56V5nDodlkcRiJB7blQXNXaEeFglAWU4qlc2Wyyxx0uA7llpzP8YjtclIocN/FUU5KXDb2W+3V7c7bU12ypM5xZlsPNRCKBIl2e2itStIdpon7sLqsuIdxkBeWrIz2qqpI15kKj/dg9sl5NjFqlq6gj0SKJZlxwPpifXTM7xJPP7ps45IeXI8oRaJoignHPXtfjoD4R5tsUy62xIUScwimVOciTHx+uktXTGLJBbzCDl98zK8Tgnbep+fel+A7NRkZ66HlbjRT22b34l/gGWRAKR73JQntAMsLMumOCuF4xVVJIqinFBEo4aV336Oj92/vkd7rV3FcGdtOxEneG7FN+YWW26lBie9SdDJzmv1CzjWS16ah5RkNzlpydS2+6n3+XtUIsxL97CpspVw1DCjIO6uSvNYiuayRaV4k0Y3rftYo4pEUZQTii32yKjX9jU5beFIlHqfn6yUJPyhqBPXSLRIwKofArHcWZ6+LRK7rTgzhbr2APW+gGOhAEzNT6fODpwnViu8YnEZVy8t46tvnz/yFz3OqCJRFOWE4oVd9UDPmES9L0DUWC4kiLuwmjqCpHvcjguqwReIl7dNTSY12Y03yUVLV9ApQOUokuwU6tv91LcHKMqMn2vFtPgEwsQAekl2Cj95/6lOupQTCVUkiqKcULxa0QhAMBIvSlVju7UWllk1O+KxkCC56R4n0N3YEcQXCBOJGnLTYhl6PTR3Bp1sv7n2SK7iTC81bX4afIEerq1YSpOCDI9TX+RERxWJoijHJfsaOrjqrledWegxqlstpdHUGSBsTz6stwPtC3opkmY7gWK615ow2NgR6JEjCywLpKXTskgyvElOfKM4K4V6X4BgJNqjWuH0gnTy0z1MH4cCU+OFKhJFUY5L/rWtls2Vrfzg6V092lu6gqQkuzAGxx0VS/k+254l3pSgSGKupgK7umEsFhIb+puX7qG5K9gj2SJYrq0YRQkjrkSEb119Cp+5aM6IXu9ERhWJoijHJbEZ6S/uanBGYcXqpM8tsSyP2GzxmFsqFvyOx0gCjlurMNNLY0cgnvIkVic93UN9e8Ce1Z6gSBKskKJe9dMvW1TKGbMKRu5iJziqSBRFmfBsPdzG3oaOHm0xd1VTZ5AqO9V7TEHMs0dh1fv8dnuIDG8S6d4kMlOSaO60Mvc2dgQpyIhZJB4afAGnVG5MwcwozOBwazcHm7ooSFAkC8qyKMjwsGJaruMyO1nRme2Kokx4Pv3gm0zJT+O+G1Y6bbEHPlhB8qn56XFFUprZo48VVI/HPJo6g7T7wwQj0R4WyRv7mzlsp40vtV1Xc0usYx1q7uIdCaVsy3PTWP/Vi0fleo83VJEoijKh6QqG2d/UienVXtduzQtp94dp6ogrDIC5MYvEdm01dwadtCbWKKyAs09BZjxG0tIV4mBTJ4WZXmemeuxYAKceByndxwN1bSmKMqHZXdeBMVbVwlgsBCxrY36p5VJq7IgHz8EKfuemJTuurdgwX7BiHs2dIWefmEUS+95yuM2pHwJWpcKUZOtRuXRyzmhd5nGNKhJFUSY0O2us3FihiHHyZRljeiiSmHXRnDBpsCgzxXFt9WWRxGaxx6oXxobwVtR39FAkLpcwtziTKXlpPbL2KnHUtaUoyoRmZ63PWT7U1MWknFTau8MEw1HKc1PJTElyhvO2dAYRsaoVFmV54zGShBFXxVkpNPgCziTFRNdWjEm9kip++fL5hCK9nWtKDLVIFEWZELT7Q3zqjxu57aE36QrGM/fubehwCkHFyt7GXFZFWSkUZnidWiLNXUFyUpNxu4TCTC8N7X4C4QidwYgzB2RafjpRA5sqWxHBsVSm5KU550y0SABWzcjnrNknz3DeoaKKRFGUCcGbh1p5fEsN/9hUzdbD8VTvDb4Ai8qzcbuEQ7YiiWXpLczwkp/h6eHaiimMoswUGjoCtNgZfmMTDKcVWApjw4Fm8tI8JLmtx2Bhppf3Li8HrLxYyuBR15aiKGOOPxQhagxpnvgjqCFhOG/M4gBLOSwuz6YkK4XDdjqURtuVVZjpIT/d68wxaewIOjGPokwvoYhhn70tVu1wWr41KbG6zd9jRBbA/7xzEefMKeSCeUUjer0nOke1SERkyiA/R52RIyKXisguEakQkdv72C4i8lN7+xYRWWa3TxaR50Vkh4hsE5HbEvbJE5FnRGSP/Z3b+7iKokwsPvfwZm7+/cYebYnKIzZs1xhDS1eQfLuYVCxAHrNA8tK9FGR6nPa6dr+T0j32vamqFYBCO0NvXrrHGYUVmyMSI9nt4orFZSS71VkzFAZjkdwPGEAG6GOA+4AH+usgIm7gLuBioApYJyKPGmO2J3S7DJhtf1YBd9vfYeBzxpiNIpIJbBCRZ+x9bweeM8bcaSun24EvDeK6FEUZJ9463EZjR4BI1Di11Bt8AdI9boKRqBMkb/eHCUUM+XaG3liMpKkjiEsgJzWZ/HRr/kcoEqWu3c/F84sBnNTur+216pLEyt6KCP6QlczxXcsmjd1Fn8AcVZEYY87v3SYiJcaY2iGeayVQYYzZZx/jIeAqIFGRXAU8YIwxwOsikiMipcaYGqDGlscnIjuASfa+VwHn2fvfD7yAKhJFmbCEIlEOt3YTiRoONHUy067ZYRWISiEQiiSkNokP5y3M9PLmoRbAyuybl+7F5RInML6r1oc/FHXiG7H8V2v3NZOf7ulRB2TltDzeONDM2bMLx+aiT3CGa79dN4x9JgGVCetVdtuQ+ojINOBUYK3dVGwrGuzvPp2bInKTiKwXkfUNDQ3DEF9RlJHgcEu3M7EwsX56gy9AYaaXQnt4LlglbsFSJAUZXpo6g4Qj0R45smL1z9cfaAbimXhLslPwJLkIRqI9KhUC3HvDCtZ95SLHGlKOjeEqkqtE5FYRmTuEffr6H+s9MHvAPiKSATwC/Kcxpr2Pvv1ijLnHGLPcGLO8sFDfQhRlLIhGDc9sr+sxI/2g7Z4C2J6gSBptRVKU6XViJLE66fnpXgozvRhjDfFt6giQ7ygSexTWoVYASmxFkpLs5hzb4uhdGyTDm9SjhohybAxXkbwLqADeKSK/HuQ+VcDkhPVyoHqwfUQkGUuJ/MEY89eEPnUiUmr3KQXqB3sRiqKMLne/uJePP7Cep7bFPeGHmjoBK9vu7rr4ZMN6u9JgUab3SNdWhodCW3E0+AI0dcZHZ5XmpOASazgvxBUJwNn23A8ZMMSrHCvDUiTGmDpjzL+MMXcaYz42yN3WAbNFZLqIeID3A4/26vMocJ09ems10GaMqRERAX4D7DDG/KiPfa63l68H/jGca1IUZWQxxnDvK/uBeCEpgANNXaQku1hYlu24sLqCYToCYdsiSaGlK0QwHHX2y7djJGArko6gY5Eku12UZqdS3RabpBi3NK45rZzLTinhpnNnjP4Fn8QMS5GIyF0icp+9/LbB7GOMCQO3Ak8BO4CHjTHbRORmEbnZ7vYEsA/L2vkVcIvdfiZwLXCBiGyyP5fb2+4ELhaRPVgjwu4czjUpijKyHGjqchRBbVu8HO7hlm4m5aT2sDwSJxgW24qg3uenqSNImsdNSrKbwgzL0qhq6aYjEO4zpUlOWrKTtRcsF9bdHz7NCegro8NwJyQGgTp7+QLg6cHsZIx5AktZJLb9ImHZAJ/qY79X6Gf4sTGmCbhwUFIrijIqVNT7qPcFOGNmPI1IbVt8XkhNa3y5qdOOhWR5aewIEo0aR5EklqytafPT1BmPhcRyYu2steIqiWVvM7zWo+ysk6gq4URiuIqkC8i24xZTRlAeRVGOQ678v1fpDkXY+c1LHYsglv8qOzWZ6gSLpLEjyIKyLAozvESi1oTD+gSLxJNkvTNWt3ZT3dpNWbZlbaR5kshP9/D0NusdNtHK+NhZ05mSl8btl80b/YtVjmC4wfZmYC/WBMNXR04cRVGOR7pDEQBe2BUf69JoK4fF5dlOpl2Axo4AhRleZ6Z5Q0cg7trK9FJqK47qVj+Vzd3OqCyAU6fkUu8L4HYJp0yKJ9M4Y1YBd7xjYQ+3ljJ2DEmR2BMEfwtcYzc9ACwfcakURTmuyEyxnBv/3FLjtDV0BEh2C/NLs6hp82OMwR+K4POHKcjwOEHxBp+lSNwuIS/dQ7o3iezUZA40dlLn8zvzRACWT7MyIM0pzuyRp0sZX4akSIwxrVjB7K9jTQicDfx1oH0URTlxCEei3PV8hTMsF6wRVz6/lfZ9V0LtkAZfgIIML2XZKc4IrNh++RleCu1geX17gHqfn/x0jzNBsCwnlfUHmzEGJiekdz9tqqVItFLhxGI4Kv1GYL8x5ilgwwjLoyjKBObZHfV8/6ld1LR1862rFwHWKCywRkzVtfdyYWV6KbVTmNS0+jH2/OKCDG98OK/t2koctjspJ4Vnd1huskSLZHF5Niun53HF4tJRvEplqAxHkbQAN9uz2jcDm4wxb46sWIqiTERiI6YCdtJDwEntvmxKLv/eWU93MEKqx02DL0BxVooTLK9u68ZjZ9XNz7BcWOket22RBJzcWIATJ4GeFok3yc3Dnzh99C5QGRZDDrYbY74DfBy4A9gPnDPCMimKMkFZZ88eT5xgGFckOQA95oYUZngpzbGC6jWt3c5Irphbqzw3jQNNnU6erRhLElxXxZrKZMIzZItERL4BuIFNWNbICyMsk6IoE5BwJMrGg60AHGjsdNoPt3Tbo6iyAahrDzA5N42mziCFmV7y0z14klzUtPmdDLyxuSHzSzN5bV8TjR0BJ+07wDXLJpHhddPeHXYqGCoTlyErEmPM10SkGCsD7zUiMtMY8/GRF01RlPGipq2bbYfbuXB+EVaGIqjzBegOWbXPDzV3EY5ESXK7qG33U5zppcyOhdS1+2nqDBKJGgozvYgIpdkpVLf5CUaipHnczoir+aVZ/H2TlXIvsWa6iHDpKRoHOV4Yrqr/BPCmnWtLlYiinGD86OndfOyB9Xzl71udtno7kL5yWh7hqHFcWg2+AIVZKRTbFkVdu58aewJiqV0bpDQ7hZrWbvY3djqlbsFSJDEumK/lbY9XhqtI7gU+KSLfF5GlIyiPoigTgFgs48m3EuaF2JMGV0zPA6xcWrH2wgwvWalJeJJc1PsCVNspUWJWSll2KjVtfirqO5hVFJ+RPq80Xuo2MXeWcnwxXEXyaSy3WBLw05ETR1GUseaN/c10BcM92mJ5slq6QnQHrVnrsTQmSydn2326nfaiLMuFVZzlpbbtSIukJDuFw63dVLV091AkRZkpfGjVFH5348pRvEJltBmuItkLpAD/MMboqC1FOU6p9/l53z2vcd+aAz3aa9r8pHvc9nLchSUCC0qzEbH6BMNRmjuDztDd8pw0DjV3Ud3ajTfJ5SRWTBzCm6hIAP7nnYu05O1xznAVyTbg38CNIrJuBOVRFGUM2VHjwxjYXNnqtHUFw7R1h1hmzyKP5cmq9wXIT/eQ6nFTkOGlptVPo+0Ci424mlWUwd6GDqrb/JTlpDqB+ssTAuezizSl+4nGcBXJHKwhwPcAN4ycOIqijCU7a6wJhlsPx0vexhTHsimWIqlOCKrH4hil2SnUtPsdd1fMIplVlIHPH2ZLVavj1gLITkvmE+fOIMklTM3vWfZWOf4ZriKZB7wJfB64aeTEURRlLInlxjrc2u3kwYrFR061JxjGFEuDz+/UC4mNwoqN5IqlN4mldq9s7u4xOx3g/102nx3fvBRPks4LOdEY7v9oDvAl4IuAf+CuiqJMBGraunl9X1OPth21PrLszL1vHW4D4hbI9IJ08tM9PWIkhY5FkkptW9wiKUywSGL0joWAVRZXOfEY7v/qN7AC7buA6NE6K4oyvrR1hzj9O//m/fe8jlWIFKJRw976Di5aUAzEZ6vHLJLirBRKc1KobvUTiRoaOuKJFUuyU/AFwuyoaSfZLY7Lqzgh8eJ1p08ds+tTxpdBKRIRcYtIjYh8DMAYU2WMedZevn00BVQU5dj549pDznLMimjuChKMRFk0KRuP2+VUMaxus1K6pyS7Kc9Jo7Kli9p2P6GIYbJdZCoW/3hqWx0LSrMcS0NE+O0NK3jmM+eQ7tV6IScLg1IkxpgIsBWYObriKIoyGhxqjufGOmhPJIylfC/NTqEkO8Wpq17b1u0kWpxWkE5lcxf7Gjqs9XxLkSyfZk1KbOwIHFEb5Py5RcwuzkQ5eRiKaysN+KKIrBeRR+3PP0ZLMEVRhsdX//4Wr1Y09mirafOTaVsIB5sspRJTJMVZKZTlpDixkJo2PyVZVqB8RkE6oYjh1QortjLFViSTclJZUm5NTFxqB+WVk5ehKJLTAQGWAVckfBRFmSC0dAb5/euH+NCv1/Zor2n1c9q0XFwClc0xi8RyccVqhsTSmtS0+SlLsEgAXtzdQLJbeozEumyRNTfktCl5o3tRyoRnKE7M6aMmhaIoI8K+xg5nubkz6Mwsr2nrZtWMPEqzUznY3NO1ZVUxTKG23Y/PH6KtO0RJdkyRWBbIjpp2ZhSkO6VwAT565nRWTMtzrBTl5GXQFokx5mBfn9EUTlGUobG3IR4LeW5HHQCdgTDt/jCl2alMzU9LiJEEKMjwkOx2UZqdSiRqeKvKGgIcq2pYmOElNdlKldJbYXiSXE4NdeXkZkwHdYvIpSKyS0QqROSI0V5i8VN7+xYRWZaw7V4RqReRrb32uUNEDovIJvtz+Vhci6KMN4dbu/nLhqoebfsbO3G7BJG4UolNKCzNTmFqvpULCyyLJJbaJObKWn+wBcCxSESE5dMsZXHWrIJRviLleGXMxueJiBu4C7gYqALWicijxpjtCd0uA2bbn1XA3fY3wH3Az4AH+jj8j40xPxgl0RVlQnL1Xa/S4Atwwbwix4W1r6GDaflphKOGqhZLYSRm4p2Sl05zZxCfP0Rdu99RGHPsUVZP2GnjyxJiIffdsJJwNIo3yT1m16YcXwzZIhGRK4d5rpVAhTFmnzEmCDwEXNWrz1XAA8bidSBHREoBjDEvAc3DPLeinFD4QxGnPkhFfTwusq+hkxmFGUzKSXUKT8WG9cZcW4CTobfYTnlSnpvGpJxUdtb6KMr0Up4bVyRul6gSUQZkOK6t/xnmuSYBlQnrVXbbUPv0xa22K+xeEenTaSsiN9lDl9c3NDQMRW5FmXC8tDv+G95Tb+XLMsZQ2dLF1Lw0ynNTOdxiKZKqli5cAqU5KU45240HW2jpCvXIxLtqhjX66m0Li3ElBNUV5WgMR5EM9xfW135mGH16czfWRMmlQA3ww746GWPuMcYsN8YsLyzU2gfK8c3uOkt5uF3CnjrLImntCuEPRSnNSWVSThr1vgD+UITKFiuBYrLb5QTMn95uBeLnlsQnDp4+Ix+ASxaWjOWlKCcAw4mRHO3B3h9VwOSE9XKgehh9egpjTF1sWUR+BfxzmPIpyoTkcw9vZnZxBjefG08sUd3mJy/dw+TcVMe1FUtxUpadQmeqVdWwps1PZXOX46rKSkkmNy2Zl/dYExbnJMxAv/rUSeSlezSorgyZsRy1tQ6YLSLTRcQDvB94tFefR4Hr7NFbq4E2Y0xN7wMlEouh2LwTK5WLopwQhCNRHtlYxZ1P7uTpbbVOe3VrN2U5KcwqynRcW04sJCfVURyHW7qpbOnqUaFwil0PJMObREGGx2lPdru4cH6xU4xKUQbLmCkSY0wYuBV4CtgBPGyM2SYiN4vIzXa3J4B9QAXwK+CW2P4i8iDwGjBXRKpE5EZ70/dE5C0R2QKcD3xmbK5IUUaf2NBdgOd31cfbW/2UZqcyozCduvYAXcGwMzqrLDuFabay2F7TRl17oEfw/Ho7K29OWrIqDWVEGI5rq+7oXfrGGPMElrJIbPtFwrIBPtXPvh/op/3a4cqjKBOJUCTK7jofC8uynbbY5EHAmf8BlkVy+sx8ZxTWwaYuqtv8Tkp3Eatq4eNvWVZMLGsvwLuWlZPhTXJqiCjKsTJki8QYc/FoCKIoJzsPvnGIK/7vFScXFsSVx4ppuY5SafeH8AXC1gTDPMvyONjUSY09nNflEkSEJZNznFrsia4tgLctLOHUKTorXRkZtFyZokwQXq1oxBjYYM8uBzjY3EmyW1g1PZ/q1m6C4WiPWMiUXhZJ4kTCWHZeb5KLxeXZKMpooYpEUSYAxhje2G/Nt914KK5IKpu7mJybxrSCdKLGSosSK4Vblp1CdmoyeekeDjR1sqfO5yRZBFhi1wm55bxZpCTrhEJl9BiWIhGRzyYszx05cRTl5KSivoOWrhAu6alIDjVbI67isZBO9tslcafaAfWp+Wm8sKuBlq4QyxLcVWfNKuCRT57Bpy+cNYZXopyMDEmRiEiOiPwWeI+I3CIiZwFaaldRhkh1azddwbCzvrXayrp78YJidtT4CIQjGGM42NTFlLw0ptoxjgONnexr7CArJT50d25xpjO6KzEbr4hw2tRcHZmljDpDUiTGmFZjzA3At4C1wNnAX0dDMEU5UfnBU7s4485/871/7XLaqpotd9X5c4uIRA2VzV20dYfw+cNMzU+jMNNLbloyO2t97K3vZGZRhqMgrj9jmnOcmYUZKMpYM9zsv+cCPwVWA6XAYyMmkaKc4Dy07hAAm+wRVQBVLd0UZHidlCX7G7voDFiz0yfnpSEiLCzLZmt1Gw2+AGfNiqf5mV+axUfOmIYImiNLGReGq0hygC8BXwRuHLiroigxfP4QjR1BAA40dWKMQUQ43NpNeW4q0+3StgcaO/GHLEUSi48sLMvily/tA2BmUXqP497xjoVjdQmKcgTDHbX1DeAfxphdQHQE5VGUE4baNj9f+PNmOgLxWMiBRmsuyMrpebR2hWjqtJRKVYuVDysnzUNOWjL7mzqdOSSxyYQLyrKc46gLSxmITU89zpo//2HMzjcsRWKMqTLGPGsva7BdUfrg1y/v488bqvjD6/GK1PubrBFXF88vBmBvfQfRqOFwazeT7DQm0/LTOdDYyaGmLgoyvKR7LcdBbETWimm5nDdXM1gr/fPcvXfz2l8epHL7W2NyvuEO/71LRO6zl982ohIpyglCY4dVeOrFhNohB+yhuxfMLwKgoqGDel+AUMRQblse0wvS2dfQyc46H9MT5oVMzktj83+/jYc/cboWmlIGJC07B4ANj/9jTM43XNdWECu5IsAFIySLopxQvHXYGtL72r4mWmwX1oHGTkqzU5hRkE66x83uWp/jwoolVlwxLY/adj+bK1s5Z3ZPyyM7VRMtKgNjjCHYZf2mOpobx+Scw1UkXUC2iCQDU0ZQHkU5LmnuDPaIhXQEwuxr7OS0qbkYA3vsmiH7mzqZXpCOiDCvNIsdNT521rYD1nwQgLcvKsXjtv4036ZFppQhEuzuIhyyXlw6W1uO0ntkGK4iaQb2AncBr46cOIpy/OEPRVj2zWe48b51TtvOmnaMgauWlgGwt8FSJAcaO5lmj8yaX5rJjpp2th5uIzctmdJsq356dloyly8qYW5xJnOKNaiuDI2Y8sgqLKarrRUTHf3xUMOd2X6N3fQAsHzEpVKU44j71hwAYK2dKwtw0picNasAb5KLvfUdtHWFaOkKMd1ObbKgNBtfIMxT2+pYWJbdw2X13Xcv5q+3nKFuLGXIxBRJ0bTpRCMRujt8o37OIc9sB+4Evo41s302OrNdOcl58q14Ec9mOxZyqLkLt0uYnJdmBc8bO50RW4kWCUBbd4iFCUN7AbxJbme0lqIMhc4W64WmcOoMALrGwL01HNfWjcAMY8wGY8xvjTE6q105aTHGsK+xkxmFlnLYZufMOtDUxaScVJLdLmYWZbC3ocMZsRUbiTW/NIviLKu41IppeeMgvXIi0tnaCkDRtBk91keT4SiSFuBmEfmJiNwgIqeOtFCKMhGpbfPz7rvXOMoCLAvE5w9zxaJSALZVW4HzQ02dzoz0WYUZVDZ3saWqDZfEi0ylJLt57fYLeePLF3KhPRxYUY6VzrYWXO4k8iZNdtZHm+FUSPwO8HHgDmA/cM4Iy6QoE5KX9zSw/mALb//pK076kgO2u2rplBwm5aQ6iuRgs5W1F+Ds2QVEDfx5QyWTclN7zAFxuYSirBSNhSgjRldrC2k5OWTkWhNYx2Lk1pAViYh8A7gKuBg4bIz53xGXSlEmIDtr40HLWM2Q/XbKk+kFGSwoy2JbdRttXSFau0KORXLqlFzy0z34/GHeeWr52AuunFR0+9pJy8wmOSWVJK93YioSY8zXgIC97zUi8qsRl0pRJiDbq9uZlGNNGtxlK5X9jR24XUJ5biqnlGWzv7GTDYesYGcsH5bbJbxtYTHpHjcfSUj5riijQbevnZTMTESE9JzcCRtsB7gXmA/kAz8fOXEUZWLw3X/t5DtP7HDWjTFsr2nnnDmF5KYlO4pkX0MnU/LSSHa7WFiWhTFw35qDiMDyqfEA+pcvn88Tt51NXrpnzK9FObno9rWTmmGNCEzPzp2YFonNp7FS0CcB6tpSTih8/hD3vrKfP6w9RChiTeaqbvPT1h1iQVkWc0syHTfXrlqfMyN94SRrCO9LuxuYV5JFdlqyc8zMlGSnNK6ijCZ+n4/ULOu3mJ7TU5E0V1eNyjmHq0j2AilYqeQ12K6cUPxray2BcJSOQJjNdvGpPXWW4phbnMm8kix21/noDITZ39TJPHs+SElWCsvtUrenTskZD9GV45j9mzbgO8bcWNFoBH9XJykZliJJsxVJKODnhQd+xW8/+0kq1q8dCXF7MFxFsg34N3CjiKw7WmdFOZ54bkc9hZleROCVCusPe2+DNTprVlEGC0qz6ApGeOKtGoyBeSXWH62IcO8NK/jIGdP42FnTx01+5fgjEg7x1+/8N7+//T+P6Tj+jg4whtRM27WVk4O/w8f9X/gPNjz+D5ZcdBlTFi4aAYl7MlxFMhPLrXUPcMNgdxKRS0Vkl4hUiMgRdUzE4qf29i0isixh270iUi8iW3vtkyciz4jIHvs7d5jXpCgA7Kn3cerkHBaWZfGGnfakor6D3LRk8tI9nDErH4B77GqFsRnqAFkpydzxjoXM0MJTyhBoq68HsHJjGTPs4/jtdCipGZkE/d1UbtsCQDQS5j3/9W0u+tgteFLTBjrEsBiuIqk0xjwKVAA7jtYZQETcWEkeLwMWAB8QkQW9ul2GlXZlNnATcHfCtvuAS/s49O3Ac8aY2cBz9rqiHJW27hBv/+nLXPl/r3C4tRuAUCTKwaYuZhZlsGhSDtuq2zHGsLehwxmFVZ6bxrT8NPbUd5CZkuRUMFSU4dJaV+0sNx46MOzjdPssRdLe1Mj9n7+Vym1WYavLP/VZppyy+JhkHIjhKpJLRaQc+AXw40HusxKoMMbsM8YEgYew5qMkchXwgLF4HcgRkVIAY8xLWFmHe3MVcL+9fD9w9ZCuRDlp2XiwhW3V7bx1uI0Xd1nFpw42dRGOGmYVZrBoUjZt3SGqWrrZl6BIAE6fWQDAf12xAJdLJxMqx0Zrba2zHLMihkN7o/U7fuXB+3Enubn447cCEOjuOjYBj8Jws8LlAF8Cvgh8bJD7TAIqE9argFWD6DMJqKF/io0xNQDGmBoR6TPXhIjchGXlMGWKllBRYHuNNQvd7RK2VLXywVVTnHTvM4syiOmH53bU0dgRZFZRXJH81xXzedeySZojSxkR2upqSPJ6wcSVwVA5sGkD/77Xmo2x6MJLOP8jN9Hdbv3GR3sI8HAVyTeAecaYXSISGeQ+fb229XYGDqbPsDDG3IMV02H58uUjckzl+KGtO0QgFKEoK8Vp217TzuS8VKblp7O5ysqfVWEXoJpZmI4nyUWSS/jOkzsBODehTnqaJ0mViDJitNbVkFtcSjgUxNfcNKR9/Z0dvPDAr9n2wrNOid1zP3wjyR4vYq+PtiIZlGtLRNwiUiMiHwMwxlQZY561lwcbk6gCJieslwPVw+jTm7qY+8v+rh+kPMpJxO2PbOHqu14lHIkX+dlR086C0iyWlOewu85HdzDCjpp2yrJTyExJxpvk5uIFxQTCUTxuF7OLNICujA6ttTVkF5eSkVdAxxAUyd4Nb3D/525h+0v/ZuXV72HB2efjcrvxpFoZGJKSk0nJyBz1DMCDUiTGmAiwFWu01nBZB8wWkeki4gHeDzzaq8+jwHX26K3VQFvMbTUAjwLX28vXA2NT7V45bvCHIrywq4HqNj/P7bRHxwTD7G/sZH5pFksn5xCJGt6sbOHNQ62cOiU+8O+/r1yICNx20WxNrKiMGh0tTWQWFJCZlz+oOuvdvnae+NkP+fv3vkFKZhYf+p8fcfYHrsff2UFqVs8iaWORJmUorq004IsicjFxK8EYY3oHzPvEGBMWkVuBpwA3cK8xZpuI3Gxv/wXwBHA51miwLhKGFovIg8B5QIGIVAH/bYz5DVahrYdF5EbgEPCeIVyTchLw+r4mukMRklzCw+squWRhCTtrfRgDC0qzWDUjD7dLeGTDYQ63dnPDmdOcfUuyU9j+9UvxJg13XIqiDEwoGCDY3U16di7JHi8dzU2YaBRx9f2b2732VZ77zd34O3ysvuYDrH7Xe3EnWVkUutpaHfdWjPScnAkVIznd/l5mf2CI8QtjzBNYyiKx7RcJywb4VD/7fqCf9ibgwqHIoZxcvLynEW+Si7cvLuWZ7XVEo4YddqB9QVkWmSnJnDo5h0c2Wukjlk3tORUp1eM+4piKMlJ0t1nxubTsHDxpaUQjEbra20jP6fk77Gxt4bl772bP2jUUTZvJNV/+hlO8KkZXWyvpvRRJWnYuNRW7RvUahqJIdKquMuHpDIR58I1DvHfFZLJSrLe07dXtzC/NYvWMfP668TD7GjvYXt1OVkqSk8337NmFrD/YQlGm94iyt4oymsQKT6Vl5xCNWmOXOpqbHEVijGHHKy/w/H33EAr4Oev917H8ynfhTjry8d3Z1uoUtIoRy7dljBk19+xRFYmIxMbK9ml9JGxvNca0j5RgijJUIlHDB3+9ls2VrQQjUW45bxbGGHbWtnPpKSUss/NfvXmole01lnKJ/WHdcNY0JuWmcsG8oh6FpxRltOlqawWwLAn79+hrbqJ4xizaGxt49td3sf/N9ZTOmcclN99Gfi9FEcMY049rK5dwIEDI3z0qs9phcBbJ/VhKZCBVZrBmnj8wAjIpyrDYXedzkiyuqWjilvNm0eAL0NIVYm5xJjMKMshMSeLlPY3srPHxvhXxP8islGTefZoWnVLGntiIqrTsHNzJlhXta2xgy7P/4sXf/4ZoNMr513+cpZdegcvV/0tOsLuLSCjUpyKxztMyforEGHP+qJxZUUaYmBK5aH4xL+1psIbz2une55Vm4XIJF88v5q9vHgbgisWl4yWqojjELJK07BzcSUmIy8W6xx7B19jAlFMWc/FNnyanuOSox4kppCNiJAmKJLd00kiK7qBDUZTjkqaOAFsPt/Vo21zVSnZqMh9aPYVgOMobB5qdoPq8Eiux4m0XzSbJJZw2NZflOqFQmQB0tbfiSU3DleRm45OPYaJROluaufimW3n3V/9nUEokdhxgAIukdQSl7slwZ7YryrjypUfe4tkddTzyydM5za5EuKmyjSWTc1g9PR+P28UrexrYWetjdlEGOWlWZcKp+enc+5EVTM7TRIvKsVNbsZvimcc2x6irtZWU9HQe+u8vUbN7J970dPLLJ7P4wr5y1A5wnATLJpG4IukrVeHIoBaJctwRjRpe2mPlI/ryX62qAl3BMLvrfCwtzybV42bF9Fye3l7H2v3NnDunsMf+58wpZHqBVitUjo2q7Vv5w1c+y76Nwy/JFAmHqa3YTXtTIy3Vh7n81s8x5ZSldPs6hnysrphrq9ew4dTMLJKSPbQ3jF7SD1UkynHHzlofwXCUOcUZ7KrzUd/uZ1t1O5GoYcnkHMAaznuwqYtgONojR5aijBSV260U7ZXbNg9r//oD+/jjVz5HW0MdGbl5fOSHP2f+2eeTVVBAR1PjkOuSdLY2I+IiNbPn8HURIbu4hLb62n72PHbUtaVMeCJRgzshVfsrFZY18oVL5vHxB9bz2r4mGnwBABaX5wDwzlMn8dbhNqJRw8rpGgtRRp7Du7YDULVj25D2C4dCvP7IQ6x79C+kZGSS5PEye9UZjiWRkZtPKOAn0NVJSvrg87v5mhpJz8vD5T5yZFd2UTFtdaOnSNQiUSY0lc1dnPqNp/mrPescrHkgk/OsOR+ZKUm8vq+JTZWtTMpJpTDTC0BxVgp3fXAZd3/4NJ0Xoow40UiE6t07cbnd1O/fR3CQ9T5q9uzi97ffxtq//Yl5Z57Lh7/9Y8LBABm5+U6fjHyr1s1QkjeClX4+0963N9nFJbTW1x1T9cWBUEWiTGi+/th22v1h/rj2kNO2paqNJeU5uF3CObMLeeKtWt7Y38ySydnjKKlyMtFSW03I383sVWdiTJT6A/sG7B8K+HnhgV/z4H99gWB3N++6/Q4u+9RnCYdDAGTkxq3mzDxLGfiajp68MRFfUwNZ+X27cXOKSgj5u+n2jc6ccVUkyoSlqSPAszvqKMlKYf3BFg41ddHYEeBwazdLbBfWTefMoK07RL0vwIdWTR1fgZWTBp8duJ6+9DQAWgdwGx3aupkHvvAfbHj87yy+6BKu/8FdTD91OQCdzdZIqvQERZJdVAxAW33doOUxxtDR1ERmQd+KJNseQjxacRKNkSgTlk32BMMvXTaXz/xpM09srWFOseUzXlxuWR9LJudw41nTKcjwcuasvs16RRlp2pusON2kuQsQl4vW2iOrXXR3+Hjxd79h2wvPklNcynu/9m0mL+xZN72jxXJfJbq20nNySUr20Fp3tAoaCefytRMOBft3bRVZiqS1tobSWXMHfdzBoopEmRC0+0O8eaiVVdPzSEm2YhobD7WQ5BIuXVjKbybt5+lttVQ2Z5GS7GJRedyN9V9XLBgvsZWTFF9jAyIusgqLyC4sprU2Xn/PGMOu117m+fvuodvXzsqr3s3qd3+AZI/3iON0tFgWSUZe3CIRl4usIQbHfXZ53v4USU5JGeJy0Xy4ss/tx4oqEmVCcNe/K/jlS/uYV5LJE58+G5dLePNQK/NLs0j1uLl4fgk/fnY3Gw+1ctXSMtI8+tNVxg9fUyMZefm43G5ySkod66G9sZ7nfnM3+zauo3jG7D5TvSfS0dJMktd7RA6snCEO141ZSJn9xEiSkpPJKSmjsfJQn9uPFY2RKBOCl/ZYgcWdtT62HG4jEI7w5qFWTrNrg1x9apnT913LNLmiMr60NzY48YicklJaaqrZ+OSj3Pe5T3Fo2xbOu+5jfPBbPxhQiQB0tjSTkZt3xMz47OISWutqBz3Kqr3eitlkFRb126egfApNVaOjSPS1Thl3GjsC7Khp56ZzZvCbVywXVlcgTHcowll23GNqfjpv/tfFbKpq5ZzZGgtRxhdfYwMls+YAkORJIdjdxfP33cO0Jcu46GO3ODGJox6nqYGMvPwj2hNHWaVlHX00YkvNYbzp6UdMRkwkf/IUKta9TjgUIsnOMjxSqEWijDk1bd0Ew1Fnfc1eK+B4+aJSVk3P459banh+Vz3JbuH0mfE/stx0D+fPLdLa6cq4YqJRfE0NpOfm8erDv2fD438DYPU1H+Bd/+/rg1YiAG11tWQXHtk/u9jKTN1SU33Etr5oqTlMbumkAf828sunYEyUluqqfvsMF1UkyphS1+7ngh+8yB2PxWcDr6loJDMliUWTsrl29VQONXfxq5f3s3xqHuleNZqViUVXexuRcJgdLz/P64885AzlzS0tG9JLTjgYpKOl2Rnum0h+uVUvsKnq4KCO1VJbfdQU8QXlU0jJzKKrrW3AfsNBFYkyptz9wl66QxEeeuMQu+usWiGvVDRy+ox83C7hkoUlLCjNwpPk4qtXzB9naRWlJ/6ODp799c8Ba3TWNf/v61z5n7eDSI+RW4OhvdGKa/SlSLILi0jyemkaRHA8FAzga2wgt6RswH75k6dyy6/+wNTFS4ck52DQ1z1lzAhFovx5fSUXzS/ilYpG7l9zgE+cM5Oqlm5uOscKSrpcwoM3rQYgO3Vk/biKMlyMMex85QVe+N1v6Gq33uiv/sJ/UTZnHmANu+1rLslAxCYcZvWhSMTlIn/SZBoHERxvs8+bWzqwIhlNl7AqEmXM2FLVSmcwwjXLysnwJvHY5mpy0ixlcfbs+LBFVSDKRKK5uornfvNzDm3dQsmsOcw761w2Pv4P8ibFRw/mJgwBHiwxRdKXRQJQMHkqB7a8edTjNB22Yh6jVf1wMKhrSxk1dta28/q+eOK5NRXW8uoZ+bxrWTnt/jB3Pb+XC+cVaX0QZUzo9rWz/831g+obCgZ49eHf88AXbqVu314u+tgtfOCb34eowZOaijct/pvNKS4bhkVSizs5mYycvrNT55dPobOl+aj5sRoO7rcsGDuuMh6oIlFGhce31HDpT17m/fe8zoHGTgBe3dvIgtIsctM9nD27gM9cNIfCTC+3XTR7nKVVThZeuP9X/PXOO2i3Z4L3x4FNG3jg87fy+iMPMWf1Wdzw41+w5OLLcbncdpbdwh6uopzSMrp97UNKithaW0N2YTHi6vsxXDRtJgB1+/cOeJyGg/vInzSZJI9n0OceacZUkYjIpSKyS0QqROT2PraLiPzU3r5FRJYdbV8RuUNEDovIJvtz+Vhdj9I/f9lQicdt/bx+//pBGjsCrDvQwvnzLBeWiHDbRbNZ95WLnBoiijKatDc2sHPNSwAc2Lyhzz4dzU388yff5ZHv/DficvHur36Ly//j8z2qDvqaGsjqlRyxcLKVMLTx0IFBy9NUdWhAK6JklvWCVbtn14DHqd+/l8KjTHwcbcYsRiIibuAu4GKgClgnIo8aY7YndLsMmG1/VgF3A6sGse+PjTE/GKNLUY5CRyDMq3ub+PDqqTR0BPjTukrSvUlEooZ3LBk/P65yclOx7nWikQje9HT2v7mhR030SDjMm/96jNf+8kci4TBnvPdDrHjHu/ucuNfe2EDx9Fk92mIP8oZDB45IzNgX4WCQ1toa5p5xdr99vGnp5JWVU7N3d799utpa6WhpPuoM+tFmLIPtK4EKY8w+ABF5CLgKSFQkVwEPGCsvwOsikiMipcC0QeyrjBPBcJRktzim/ku7GwiGo7xtYTEFGV4e21zN/z63h3klmcwtyRxnaZWTlebDlXjT05mz+ix2rXkZE40iLhcHtrzJ87/9Jc3VVUxfehrn3/CJfofSBrq66G5vO2KkVVp2DqlZ2TQcPDA4WaqrMCZK/qTJA/YrnT2X/Zs2YIzpc9RV7b49QNwNNl6MpSKZBCSmnqzCsjqO1mfSIPa9VUSuA9YDnzPGtPQ+uYjcBNwEMGXK+AWlTjT8oQiX/OQlpuSlcc+1y0n1uHl6Wy25acksn5pLktvFFy+dy/oDLXzl7TovRBk/mquryCsrp2zOfN567ikObt3E5qefoGLd6+QUl3L1F7/GzNNWDniMlprDAD1GbIHlqi2cMo3GQ/sHJUuTnYU3f/LANXTK5sxn24vP0VJzmLyyI3PMVW3fisudROnsOYM672gxljGSvgYx985I1l+fgfa9G5gJLAVqgB/2dXJjzD3GmOXGmOWFhX1nyFSGzp/WVXKwqYuX9zTy3X/tJBSJ8u+d9Vw4v5gkO0Zyy3mzuPcjK5hZOPj604oy0liKZDIFdlzib3d+nQNb3uSs91/H9T/8+VGVSOwYAHmlRz7UC6dOp/HQQSLh8FGP01R5CHG5jjpkd8qipQAc7GcYcNX2rZTMmkOyN+Wo5xxNxlKRVAGJdlw50HsqaH99+t3XGFNnjIkYY6LAr7BcaMoYYIzh3lf3s3xqLu8+rZyH1h3igdcO0u4P87YFfY+NV5TxINDVSWdLM+FQkEd/9G3AKvb00R//klXvfO+gkxi2VFchLhc5JUfmxyqdPZdwKEjDwaNbJXX79pBfPuWo580pLiGnuLTP+SRBfzd1+yson79wULKPJmOpSNYBs0Vkuoh4gPcDj/bq8yhwnT16azXQZoypGWhfO4YS453A1tG+EMViR42Pg01dvPu0cm4+dyahiOGb/9zOkvJsLpyvikSZOOx89UUAdq15iZSMTAqmTCU1M6vfQlD90Xy4ipziEtxJRyqA0tnWLPfq3TsHPIYxhtqK3ZTOGpw7auriU6ncuoWQ39+j/cCmDUQjEaYuOnWQ0o8eY6ZIjDFh4FbgKWAH8LAxZpuI3CwiN9vdngD2ARVY1sUtA+1r7/M9EXlLRLYA5wOfGatrOtnY19DBH9YeJBq1vIpPbatFBC6cX8ysogz++LFVXLqwhO+/Zwlul2boVcaf5uoq/v79bzn5sc76wPV8+M6fMOWUpdQf2Ec0Ehna8ewsu32RVVBIRl4+NXsGViSttdX4OzsoGWTJ27lnnE0o4Kdi/es92ne9/ipp2TmULxh/i2RMU6QYY57AUhaJbb9IWDbApwa7r91+7QiLqfTB1sNtvPsXa/CHohgDH1w5hX9sOsyKaXkUZlolRFfNyGfVjCNrKyjKWNPV1sqavzzIlmefJNnrpXz+KRzetZ3lV7wTl8tNyYxZbAwGaDpcSeGUaYM6ZjgUovlwlZPtty/K5synaue2fkdZAdRWWMN5B2uRlM9bSFZhEVtfeJb5Z50HgL+zg30b32DhORfgcrkHdZzRRGe2K4Pit68eIMnlYuX0PO58cif3vrqfA01dXLt64FEnijKW+Ds6eOWh3/HrT3+cLc8+yeKLLuPG//0VKRkZ5JaU4U6y3p2LZ1qT/er27hn0sZsqDxKNhI+YQ5LI1EVL6WhqHLA2euWOrXhS0wad0kRcLhZfeCmH3trE4V07ANj4xD8IBwIsvuiyQcs/mqgiUY6Kzx/iibdquHJJGT967xJcAt96fAeT81K57JTBF/FRlNEi0NXFa488yK//40bW/u1PTD91Odf/4C4uuvGTpGXn0Hy4qleSxTI8qWnUDkGR1O2vAKB4ev9zNqYtsZJx7N/U98x5YwwHt7zJlFOW4HIP3pJYdtk7SM/J5Zl7/o9dr73C+sf+xqwVp4/7RMQYmv1XOSqPba6hOxThfSsmU56bxi+vXc7Lexq49vSpzhBfRRkPQn4/m55+nDcefQS/r52Zy1dzxns+2OMBGwmHaa2rYdaK1U6buFyUzJxFzVHSjyRSt68Cb1o62cX9vzxlFRaRN2ky+99cz/Ir3nnE9paaatob6ll51bsHfV6A5JQULv+Pz/P3732Tf/7kTnJKSrnwozcffccxQhWJ0gNjDDfev556n5+vvn0Bq2fk86f1lcwtzmRJuVU7+vSZ+T1K4CrKWNPd4ePNJx/jzX89hr/Dx7Slp3Hmez7k1FFPpK2+lmgkQl6vWeTl8xex5i9/pLvDR2rG0TMu1O2roGj6zKPW9Zi98gze+Puf6Wxt6ZGjC2DfhrUATF28rK9dB2TKKUu4/gc/o6mqkrK580lJnzjzsvR1UunBY1tq+PfOerYebueWP2zk4XWVbK5s5T3Ly7VWujLu+JobeeGBX/OrW27gtb/8kbK58/nAN7/PNf/v630qEcBJW9I7JjH5lMVgDFXb3jrqeQNdndTv38ekeQuO2nf+WedhTNQZcpzI9pefp2TWHHIGsGoGIruohBnLVkwoJQJqkSgJGGP4qZ0T66cfOJV3/OwVvvjIFuaVZPKhVRpUV8aHjuYmGisPsuu1l9n+0vMYE2Xemeey4h3XDGrEVd3+ClzuJAp69S21Z4Qf3LqZ2avOGPAYh3dux5gokxcsOur58ssnUzJzNpufeYJTL7vSGVVVf2AfDQf3c8EEckmNFKpIFIf1B1uoqO/ge9csZk5xJk/edg5PvFXDVUvLSPWM/xBD5eQiEg6z6al/8sIDvwYgyeNh0YWXsOLKd5JdNPg3+rp9FRRMnnrELHJ3UjKTT1nMvo1vYD5684AWd+X2t3AnJVFql9Y9GiuuejeP/eg77Hr1JeaffT4Ar/3lQTypqcw789xBy368oIrkJCYaNRxs7nKqEz7w2kEyvElcscRKFjC9IJ1Pnd//UEdFGQ06W1vY+vwzbHr6cTqa4xU2L/joJ1l0/sVDOpYxhvr9e5m98vQ+t89ecTr7NrxB/f69FM/o/7d+YNMGyubMJ9njHdR5Z684ncJpM3j+/l8xad5C6vZXULHuNc5474cGFY853lBFcpLSFQzzid9t4OU9jVx3+lTefVo5/9xSzSfOmUmaR38WytgSCYfYt3EdW194lv1vrsdEo0w5ZQmBzk5mrzqT6t3b2f7ic0NWJO0Ndfg7fBT1M/djxmkrEZeL3Wtf7VeRNFcfprHyIOdf//FBn1dcLt7+6S/why9/lns/8wki4TCls+f2OZLrRECfGCcpv331AC/vaeSShcU88NpBfv/6QbJTk/nkueNb10A5uWg8dICtLzzD9pdfoLu9jfTcPJZf+S5OOe8iouEw93/hViYvXEROcQlr/vJHfE2NQ8qPVWkH0vsLkqdlZTNt8alsf+nfnPneD/c5t6Ni3WsAzOrHqumP/EmTufa7/8vGJx4lLTubUy+9ctyz9I4WqkhOQjoDYX798j7On1vIL69dzj82Heb5nfX8x4WzyU4bXBZURRkuzdWH2bP2VXa//ir1B/bicicxc/lKTjn/YqYtXuY8zDc9bWVEKp+3EGOirPnzH9i15iWWX/muQZ+rctsWUjOznNTxfbHowkt49IffZt+b65m1vGeJJGMM2154ltJZc8kqKBryteaWlE2o+R6jhSqSk5Dfv36Qlq4Q/3GhlSbiqqWTuGqplsBVRgdjDE1Vh9j9+qvsWfsqjZUHASvt+vnXf5x5Z51HWlb2Efsd3rmN9Nw8sotLEBGKZ8xm5xAUiTGGQ9vfYvKCRYir/5kOM5atJCO/gPWPPcLM01b2CLof2rqZ5uoqLr1Fc8EOhCqSk4DWriC7an0sKMsiEjX86uV9nD27gGVTco++s6IMA2MM9Qf2WZbH2jW0VFeBCOXzFnL+R25i9sozBnRRGWOo2rmNSfMWOg/2eWeew4u/+w0tA2TgTaSp6hAdTY1Meef7BuznTkpi1VXv4bl77+bApg1OUkZjDK8/8hCpWdnMPb3/2uqKKpITnqaOAFf+3ytUt/kpyvRSnJVCe3eYL14yuGGMijJYjDHU7t1tWR5vrKGtrhZxuZi8YBHLLnsHs1eefsRM7/5ob6ino6mRSXPjsY25Z5zNi7+/l+0vP8+Z7/3wUY+xZ+0aEOmRGqU/TrngbWx88lGe/tXPuO67PyU1M4ttLz5H1Y6tXPSxT5Hk8QxK7pMVVSQnOF/9+1YaO4N895pF/HHtIZo6g3zv3YtZVH6kK0FRhoqJRjm8ewd71q5hz9o1+JoacLmTmLJoCauufi8zl6/q0211NA7vtMoNJVb/y8wrYMapy9ny7L9Y/a739VlcKpE9a19l0tz5g1JeScnJXP4fn+ehr32BB//rC0xbsozNzzxB+YJTWHTh24Ys/8mGKpITmA0HW3hyay2fvXgO71sxhfetGFzaakUZiGgkQtWObexe+yoV616js6UZd3Iy05Ys48z3fZiZp60iJePYUngc3PKmU8kwkVMvuYJHvvPf7Hz1JRaee2G/+9ftq6Dh0AHO/8gnBn3OkpmzefdXvsXT9/wfm556nFkrVnPJJ2+bEPU+JjqqSE5QIlHDHY9uozDTy8fOnj7e4ijHOZFwmMqtm9n9xhoq3niNbl87SR4v0089jTmrzmTGshV4UtNG5FzRaIT9dqyi90N86uJTKZw6nbV/+xPzzzqv31Tsm599kiSPlwXnnD+kc5cvOIWP/uSXRMJhp3aJcnT0Tp1A7K7z8a+ttSyZnMPLuxt463AbP/3AqTrBUBkW4VCIg1veZM/aNexd/zr+zg6SU1KZedpKZq86g+lLTiM5ZeTnRdRW7Kbb186MZSuO2CYuF2e850P84wff4q1/P82Si48s7NTR0syOl55n3lnnDTu5oSqRoaF36wRhTUUj1977BhG7njrAB1dN4crFpeMolXK8EQr4ObB5I7tff5V9G9cR7O7Cm5bOzOWrmLP6TKYuOnXUA887XnkRd1KSUySqNzOXr2LygkW88uD9zFqx+ogYyNq//YloNMKqq98zqnIqcVSRnAC0dAa57U+bmF6QzgMfXUlFfQdul3DGzHxN/a4claC/m30b17Fn7Rr2vbmOcCBASmYWc1afxZzVZzLllMVHDWyPFKFggB2vPM/sVWf2a02ICBfeeAu/v/02nvjZD7nmy193XGCHd+1g89NPsviiS8kpOX5foowxGBMkGg0SifiJRv1EowEiUT/RiLUcXw8kbA842yPR+H7RSGw9wKyZXyAra/GIyquK5ATgO0/uoLkzyP03rKQsJ5WynNTxFkmZ4Pg7O9i34Q12r13Dwc0bCYeCpGXnsPCcC5m96gwmL1g0pFKwI8WOl54n0NnJogsuGbBffvlkLvjozTz9y5/y+E9/wNtuupW2+joe+9G3ySwo4OwPfmTEZDIm0uNhHo0G7HXrAR5JeFj3eIBHYtsD9vaEvn0+8IM9jgvmqLL1h4gHt9uLy5WCy2V9W+tejAmP2L2JoYrkOOeZ7XU8vL6KT5w7gwVlWeMtjjKB6WprpWL96+xZu4ZDWzcTjUTIyMtn0UWXMGfVmZTNnT+uI5TCwSCv/fUhSmfPZfLCI+t+GGPiD+Gon5mr53Jm12Vs/NffuO8rz4CESStN44z3vY/mtieJtPT1APf3+cCPRAMJb+8JD/+o/5gevCLuhIe5F7c7/mB3ubwkJ+fgdac4625XCi77ge9OUAI921J6HcuLy52CO+G4ImNbs1CMGb7WO15Zvny5Wb9+/XiLMSzCkSi/ffUAGw62kOZ188RbNcwqyuCRT56BN0mHKSo98TU1sueNNex5Yw2Hd1jFmXKKS5m96gxmrzyDkpmzB0wf0heW2yUcf9t2XCv+Xm/rgYS3db/dP2g/vP09t0cDNFXvx9dUQ/7kMpK8rgR3TLzPsdDXw9rlSok/sN2x7fFla3viw7q/h3vsrT8Fl8tjnysFl6v/d3UTNfia/XS0Bgh2hxGX4PG6Sc/1kpGbgss18dzSIrLBGLO8d7taJMcRxhj+80+b+OeWGqbmp9EZiHDO7EK+dfUpqkROUoyJJDy8/YTD3dTtq+DQlm0cemsnjQeqAcguyWXhxYsoW1RCZnEKxnTRFfknFXv7ehu33Cw9FUO8LRLxA9FhyyziweXy2A9d6yEcCRo6mmtIy8onI3tKP2/nsQe+t4+Hf++3854uHRHPuMULw6EIbfXdtNR20VrXSUttF801nbTWdhEO9X0fXW4hMz+F7IJUMgtSycj12p8UMnK9pGV6SE5xT5gYqCqS44jfvX6Qf26p4fNvm8OtF8web3GUBOJul94P30APH3lfbf27XY50sxzxxh8K09WQQld9Kp11qXRUpxEJJAGGtCI/pSt8ZM/wkZITBNZQ3wH1HTGpXT0e5nF3ie12ScpOeFgf+bbe++087lpJ6fmw7+WGEen50lOzZxePfOdrZOTO5gPf/D7etPQh3XdjrLd7E40vR6OGaMQQiUIwajAmQDRqMFG7r7H6YLDbDZGIIRKJEokaQuEokbAhEjWEIxEiEUM4YohGooQjUYKBKMFAmKA/QjAQIRSMEApECPjDBPwRgoEwIX+EUDBKKBDB2PEOA7g9bpK9bpJykkjyuHC5XSDWtUTChkgoQiRkaOjyE9nXTXR3lJjnSACM2AvgEkAE+8vebn0nqhgBxHY+Lb1yOpdfMmPQ93gwjKkiEZFLgf8F3MCvjTF39tou9vbLgS7gI8aYjQPtKyJ5wJ+AacAB4L3GmJaxuJ6xZHNlK9/65w7On1vILedp1cL+GHC0S48AZyBh9Et/AVH7LbyPttixIxF7n0gIomCM2A8zwUTd9rcLE3WB/R3/xLcJHjBexHhAkhGTDMaDkAImg2jIRSQohAMQDkQJtAfobu8i0N7lPGRSMjPJn1JK/uQZ5E6aTnJKFkISkAyRJHvZ/kRdRI2LSMR6oEYiUcJRQyBiPTwjEfvhGrUenhH74WwihoixvqNR6yEctR/MsQe49e3HRLvtdpztxgCxB74xhANBgt3duLzXE4mm8cuvrgf7AW91Ir6MtSx2W++H5UTCY38serkO/YA/QpQwURIuEUCs3gK4JRZuF4yI1UesD/S8NQbrniYeD7s91jf2HfVHRvhqx1CRiPUachdwMVAFrBORR40x2xO6XQbMtj+rgLuBVUfZ93bgOWPMnSJyu73+pbG6rrGgot7HTb9bT2Gmlx+9d+mwfafRSIRIOEI0HCUSiVjrkSjRcIRoOEIkEsFE7G1ha3s0th6J2p/YflbfaDTeZiLG6huNEAkHiYZDRCIhopEQ0UiYSCRM1P6YSJhINGztFw0TjdrHsL+jJoKJRDBR6xwmGsWYqLOOidoPJvsb60GF/YYaewg5f1Cxdecvyv4Tc/olbDQmtpP9h2jibbjAeLEeE8eWBqSf/yUgYH/6w4O4sxBXGS5vHi53Ca6kUnCl0d4I7Y2w/02AkP3pHsLZrSvu8YATjnjgRTHWQ613XyAqvfrZx+jdNxprT/Za/3/hINDzoYfdh4SHJxLf2HudHusmvqNYCkjEGj4s9iu8W0BcgojgcoHLJbhErG+39Z3ksr7dbiEpyUWy101yshuP1/p4U9x4UpJISU0iPdODNyXJ6ut24U4Skt1uktzgTnKT7HaRZB/HnXDsJJfY6y5ctowjRTRqiISiRMJRohGDN3XkH/tjaZGsBCqMMfsAROQh4CogUZFcBTxgrFes10UkR0RKsayN/va9CjjP3v9+4AVGSZH87EMfIRQJ9mgzPX7BPbcMv+3I9vfa6/fe+PO+9zO923r8uQ5wnolM7N1M4svWEwBx2nt+RBLfU2N9SegT/9fZ4jxvxDH/OaI39ltwrLPpeZa4hko4hrHPGmuzFJI4/Yx9PNNjXZx+xj6uwWUM7qjBRRQhhNAIph6J/f+aqL1fFIha7dbrv32Mvtus5fhvZKK+4R8vdDMUtT0+tBZ4+eBDb47oMcdSkUwCKhPWq7CsjqP1mXSUfYuNMTUAxpgaEemzjJmI3ATcBDBlyvCSF7oJY/AOeb9B/3Ee8RA7tuNLzDA2Cf2chxfOAy32gJSEZUh8kOE80OJtUbs9ah836hwj9mCyHoyW9RBbTnyoOW3RaEKbta/LebhF9eGmKBOcsVQkfT0Per8m99dnMPsOiDHmHuAesIb/DmXfGJ/8w++Hs5uiKMoJzVjOWqkCJieslwPVg+wz0L51tvsL+7t+BGVWFEVRjsJYKpJ1wGwRmS4iHuD9wKO9+jwKXCcWq4E222010L6PAtfby9cD/xjtC1EURVHijJlryxgTFpFbgaewhvDea4zZJiI329t/ATyBNfS3Amv47w0D7Wsf+k7gYRG5ETgEaMpPRVGUMURTpCiKoiiDor8UKWOb2UtRFEU54VBFoiiKohwTqkgURVGUY0IViaIoinJMnJTBdhFpAA4Oc/cCoHEExRktVM6R43iQEVTOkeR4kBHGXs6pxpjC3o0npSI5FkRkfV+jFiYaKufIcTzICCrnSHI8yAgTR051bSmKoijHhCoSRVEU5ZhQRTJ07hlvAQaJyjlyHA8ygso5khwPMsIEkVNjJIqiKMoxoRaJoiiKckyoIlEURVGOCVUkQ0BELhWRXSJSYdeHH09ZDojIWyKySUTW2215IvKMiOyxv3MT+v8/W+5dInLJKMp1r4jUi8jWhLYhyyUip9nXVyEiP5WRLGLdv5x3iMhh+55uEpHLx1NOEZksIs+LyA4R2SYit9ntE+p+DiDnhLmfIpIiIm+IyGZbxq/b7RPtXvYn54S5l31ijNHPID5Y6ev3AjMAD7AZWDCO8hwACnq1fQ+43V6+HfiuvbzAltcLTLevwz1Kcp0DLAO2HotcwBvA6VjVMZ8ELhsDOe8APt9H33GREygFltnLmcBuW5YJdT8HkHPC3E/7eBn2cjKwFlg9Ae9lf3JOmHvZ10ctksGzEqgwxuwzxgSBh4Crxlmm3lwF3G8v3w9cndD+kDEmYIzZj1XvZeVoCGCMeQloPha5xKp0mWWMec1YfxEPJOwzmnL2x7jIaYypMcZstJd9wA5gEhPsfg4gZ3+MuZzGosNeTbY/hol3L/uTsz/G7W8oEVUkg2cSUJmwXsXAfyyjjQGeFpENInKT3VZsrIqS2N9Fdvt4yz5UuSbZy73bx4JbRWSL7fqKuTnGXU4RmQacivWGOmHvZy85YQLdTxFxi8gmrHLczxhjJuS97EdOmED3sjeqSAZPX/7F8Rw7faYxZhlwGfApETlngL4TTfYY/ck1XvLeDcwElgI1wA/t9nGVU0QygEeA/zTGtA/UtR95xkvOCXU/jTERY8xSoBzrrf2UAbqP273sR84JdS97o4pk8FQBkxPWy4HqcZIFY0y1/V0P/A3LVVVnm7TY3/V29/GWfahyVdnLvdtHFWNMnf1HHAV+Rdz9N25yikgy1sP5D8aYv9rNE+5+9iXnRLyftlytwAvApUzAe9mXnBP1XsZQRTJ41gGzRWS6iHiA9wOPjocgIpIuIpmxZeBtwFZbnuvtbtcD/7CXHwXeLyJeEZkOzMYKxI0VQ5LLdjH4RGS1PdLkuoR9Ro3YA8XmnVj3dNzktI/5G2CHMeZHCZsm1P3sT86JdD9FpFBEcuzlVOAiYCcT7172KedEupd9MlpR/BPxA1yONSJlL/CVcZRjBtZIjc3AtpgsQD7wHLDH/s5L2Ocrtty7GMXRG8CDWKZ3COut6MbhyAUsx/pj2Qv8DDsLwyjL+TvgLWAL1h9o6XjKCZyF5Y7YAmyyP5dPtPs5gJwT5n4Ci4E3bVm2Al8b7t/MKN/L/uScMPeyr4+mSFEURVGOCXVtKYqiKMeEKhJFURTlmFBFoiiKohwTqkgURVGUY0IViaIoinJMqCJRlGNARHJE5JaE9TIR+csonetqEflaP9s67O9CEfnXaJxfUfpDFYmiHBs5gKNIjDHVxph3j9K5vgj8fKAOxpgGoEZEzhwlGRTlCFSRKMqxcScw064R8X0RmSZ2jRMR+YiI/F1EHhOR/SJyq4h8VkTeFJHXRSTP7jdTRP5lJ+B8WUTm9T6JiMwBAsaYRnt9uoi8JiLrROSbvbr/HfjQqF61oiSgikRRjo3bgb3GmKXGmC/0sf0U4INYuZH+B+gyxpwKvIaVtgLgHuA/jDGnAZ+nb6vjTGBjwvr/AncbY1YAtb36rgfOHub1KMqQSRpvARTlBOd5Y9Xo8IlIG/CY3f4WsNjOmHsG8OeEAnbePo5TCjQkrJ8JXGMv/w74bsK2eqBsZMRXlKOjikRRRpdAwnI0YT2K9ffnAlqNlTZ8ILqB7F5t/eU3SrH7K8qYoK4tRTk2fFjlZYeFsep27BeR94CVSVdElvTRdQcwK2H9VawM1HBkPGQO8eywijLqqCJRlGPAGNMEvCoiW0Xk+8M8zIeAG0Ukls25rxLOLwGnStz/dRtWQbN1HGmpnA88PkxZFGXIaPZfRTlOEJH/BR4zxjx7lH4vAVcZY1rGRjLlZEctEkU5fvg2kDZQBxEpBH6kSkQZS9QiURRFUY4JtUgURVGUY0IViaIoinJMqCJRFEVRjglVJIqiKMoxoYpEURRFOSb+PwGqSLv9Z3d4AAAAAElFTkSuQmCC\n", "text/plain": [ "
    " ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -221,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -579,146 +579,146 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n",
    -       "       3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n",
    -       "       3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n",
    -       "       3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n",
    -       "       3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n",
    -       "       3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n",
    -       "       3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n",
    -       "       3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n",
    -       "       3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n",
    -       "       3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n",
    -       "       3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n",
    -       "       3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n",
    -       "       3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n",
    -       "       3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n",
    -       "       3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n",
    -       "       3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n",
    -       "       3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n",
    -       "       3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n",
    -       "       3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n",
    -       "       6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n",
    +       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n",
    +       "       6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n",
    +       "       7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n",
    +       "       1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n",
    +       "       1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n",
    +       "       2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n",
    +       "       2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n",
    +       "       2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n",
    +       "       3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n",
    +       "       3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n",
    +       "       3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n",
    +       "       4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n",
            "...\n",
    -       "       1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n",
    -       "       1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n",
    -       "       1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n",
    -       "       1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n",
    -       "       1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n",
    -       "       1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n",
    -       "       1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n",
    -       "       1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n",
    -       "       1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n",
    -       "       1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n",
    -       "       1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n",
    -       "       1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n",
    -       "       1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n",
    -       "       1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n",
    -       "       1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n",
    -       "       1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n",
    -       "       1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n",
    -       "       1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n",
    -       "       1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n",
    -       "       1.25413096e+00])\n",
    +       "       2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n",
    +       "       2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n",
    +       "       2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n",
    +       "       2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n",
    +       "       2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n",
    +       "       2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n",
    +       "       2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n",
    +       "       2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n",
    +       "       2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n",
    +       "       2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n",
    +       "       2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n",
    +       "       2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n",
    +       "       2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n",
    +       "       2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n",
    +       "       2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n",
    +       "       2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n",
    +       "       2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n",
    +       "       2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n",
    +       "       2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n",
    +       "       2.95109669e-02])\n",
            "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      101
      array(101)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", - "array([0.00000000e+00, 2.81661760e-10, 1.96588167e-01, 3.41033868e-01,\n", - " 3.66560841e-01, 3.66301948e-01, 3.66249335e-01, 3.66396298e-01,\n", - " 3.66718394e-01, 3.67175496e-01, 3.67715021e-01, 3.68275152e-01,\n", - " 3.68790522e-01, 3.69199134e-01, 3.69448202e-01, 3.69499736e-01,\n", - " 3.69335058e-01, 3.68957123e-01, 3.68389904e-01, 3.67675715e-01,\n", - " 3.66870691e-01, 3.66038894e-01, 3.65245879e-01, 3.64552504e-01,\n", - " 3.64009490e-01, 3.63653178e-01, 3.63502759e-01, 3.63558964e-01,\n", - " 3.63804172e-01, 3.64203926e-01, 3.64709715e-01, 3.65262866e-01,\n", - " 3.65799451e-01, 3.66256038e-01, 3.66575758e-01, 3.66714174e-01,\n", - " 3.66644175e-01, 3.66359092e-01, 3.65873566e-01, 3.65221944e-01,\n", - " 3.64454472e-01, 3.63631943e-01, 3.62819516e-01, 3.62080376e-01,\n", - " 3.61469889e-01, 3.61030854e-01, 3.60790163e-01, 3.60756788e-01,\n", - " 3.60921178e-01, 3.61256029e-01, 3.61718521e-01, 3.62253903e-01,\n", - " 3.62800136e-01, 3.63293324e-01, 3.63673632e-01, 3.63891182e-01,\n", - " 3.63911357e-01, 3.63718679e-01, 3.63318627e-01, 3.62737123e-01,\n", - " 3.62017697e-01, 3.61216780e-01, 3.60397813e-01, 3.59624972e-01,\n", - " 3.58957128e-01, 3.58442669e-01, 3.58115556e-01, 3.57992626e-01,\n", - " 3.58072312e-01, 3.58335003e-01, 3.58744642e-01, 3.59251395e-01,\n", - " 3.59795862e-01, 3.60314438e-01, 4.12957901e-01, 5.53838132e-01,\n", - " 6.88620712e-01, 8.15487973e-01, 8.20298524e-01, 8.52242029e-01,\n", + "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n", + " 6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n", + " 7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n", + " 1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n", + " 1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n", + " 2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n", + " 2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n", + " 2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n", + " 3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n", + " 3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n", + " 3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n", + " 4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n", "...\n", - " 1.18537517e+00, 1.18611657e+00, 1.18648245e+00, 1.18644060e+00,\n", - " 1.18599627e+00, 1.18519174e+00, 1.18410280e+00, 1.18283210e+00,\n", - " 1.18150005e+00, 1.18023365e+00, 1.17915442e+00, 1.17836658e+00,\n", - " 1.17794674e+00, 1.17793651e+00, 1.17833843e+00, 1.17911578e+00,\n", - " 1.18019630e+00, 1.18147927e+00, 1.18284532e+00, 1.18416783e+00,\n", - " 1.18532462e+00, 1.18620895e+00, 1.18673960e+00, 1.18686887e+00,\n", - " 1.18658701e+00, 1.18592279e+00, 1.18494010e+00, 1.18373170e+00,\n", - " 1.18241136e+00, 1.18110396e+00, 1.25299579e+00, 1.25223986e+00,\n", - " 1.25181471e+00, 1.25176461e+00, 1.25209741e+00, 1.25278376e+00,\n", - " 1.25376011e+00, 1.25493534e+00, 1.25620005e+00, 1.25743745e+00,\n", - " 1.25853473e+00, 1.25939339e+00, 1.25993785e+00, 1.26012176e+00,\n", - " 1.25993167e+00, 1.25938790e+00, 1.25854278e+00, 1.25747625e+00,\n", - " 1.25628915e+00, 1.25509455e+00, 1.25400756e+00, 1.25313436e+00,\n", - " 1.25256181e+00, 1.25234851e+00, 1.25251854e+00, 1.25305873e+00,\n", - " 1.25391995e+00, 1.25502210e+00, 1.25626238e+00, 1.25752571e+00,\n", - " 1.25869602e+00, 1.25966725e+00, 1.26035290e+00, 1.26069342e+00,\n", - " 1.26066111e+00, 1.26026226e+00, 1.25953643e+00, 1.25855297e+00,\n", - " 1.25740517e+00, 1.25620218e+00, 1.25505935e+00, 1.25408756e+00,\n", - " 1.25338232e+00, 1.25301396e+00, 1.25302049e+00, 1.25340406e+00,\n", - " 1.25413096e+00])\n", + " 2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n", + " 2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n", + " 2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n", + " 2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n", + " 2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n", + " 2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n", + " 2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n", + " 2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n", + " 2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n", + " 2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n", + " 2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n", + " 2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n", + " 2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n", + " 2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n", + " 2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n", + " 2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n", + " 2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n", + " 2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n", + " 2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n", + " 2.95109669e-02])\n", "Coordinates:\n", - " id int64 2\n", + " id int64 101\n", " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['rmag'].sel(id=2)" + "swiftdiff['rmag'].sel(id=101)" ] }, { From 361aad54493bbca74760716e800b67e3b9673c25 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 17:41:14 -0400 Subject: [PATCH 105/194] Streamlined encounter check with direct assignment of logical flag from rms_chk_ind result --- .../swiftest_symba_vs_swifter_symba.ipynb | 579 +----------------- src/symba/symba_encounter_check.f90 | 3 +- 2 files changed, 11 insertions(+), 571 deletions(-) diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index d099a32a1..c7d58f38a 100644 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -99,22 +99,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "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['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", @@ -125,22 +112,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['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", @@ -151,29 +125,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", @@ -186,29 +140,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", @@ -221,502 +155,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n",
    -       "       6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n",
    -       "       7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n",
    -       "       1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n",
    -       "       1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n",
    -       "       2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n",
    -       "       2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n",
    -       "       2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n",
    -       "       3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n",
    -       "       3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n",
    -       "       3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n",
    -       "       4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n",
    -       "...\n",
    -       "       2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n",
    -       "       2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n",
    -       "       2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n",
    -       "       2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n",
    -       "       2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n",
    -       "       2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n",
    -       "       2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n",
    -       "       2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n",
    -       "       2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n",
    -       "       2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n",
    -       "       2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n",
    -       "       2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n",
    -       "       2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n",
    -       "       2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n",
    -       "       2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n",
    -       "       2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n",
    -       "       2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n",
    -       "       2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n",
    -       "       2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n",
    -       "       2.95109669e-02])\n",
    -       "Coordinates:\n",
    -       "    id        int64 101\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " - ], - "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n", - " 6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n", - " 7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n", - " 1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n", - " 1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n", - " 2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n", - " 2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n", - " 2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n", - " 3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n", - " 3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n", - " 3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n", - " 4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n", - "...\n", - " 2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n", - " 2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n", - " 2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n", - " 2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n", - " 2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n", - " 2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n", - " 2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n", - " 2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n", - " 2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n", - " 2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n", - " 2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n", - " 2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n", - " 2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n", - " 2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n", - " 2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n", - " 2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n", - " 2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n", - " 2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n", - " 2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n", - " 2.95109669e-02])\n", - "Coordinates:\n", - " id int64 101\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "swiftdiff['rmag'].sel(id=101)" ] diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 1a202ba60..163a107f1 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -186,14 +186,13 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, integer(I4B) :: iflag real(DP) :: r2, v2, rcrit, r2crit, vdotr - lencounter = .false. rcrit = (rhill1 + rhill2)*RHSCALE*(RSHELL**(irec)) r2crit = rcrit**2 r2 = xr**2 + yr**2 + zr**2 v2 = vxr**2 + vyr**2 + vzr**2 vdotr = xr * vxr + yr * vyr + zr * vzr iflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) - if (iflag /= 0) lencounter = .true. + lencounter = (iflag /= 0) lvdotr = (vdotr < 0.0_DP) return From 2c102c212908227e8482fe506b367c2f146b4f52 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 17:47:37 -0400 Subject: [PATCH 106/194] Renamed the symba/swifter example with the correct numbers of bodies --- .../8pl_16tp_encounters/cb.in | 5 + .../8pl_16tp_encounters/cb.swiftest.in | 5 + .../8pl_16tp_encounters/init_cond.py | 134 ++++ .../8pl_16tp_encounters/param.swifter.in | 26 + .../8pl_16tp_encounters/param.swiftest.in | 36 + .../8pl_16tp_encounters/pl.in | 33 + .../8pl_16tp_encounters/pl.swifter.in | 36 + .../8pl_16tp_encounters/pl.swiftest.in | 33 + .../swiftest_symba_vs_swifter_symba.ipynb | 753 ++++++++++++++++++ .../8pl_16tp_encounters/tp.in | 49 ++ 10 files changed, 1110 insertions(+) create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/cb.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in create mode 100755 examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb create mode 100644 examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.in new file mode 100644 index 000000000..81c636655 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.in @@ -0,0 +1,5 @@ +0 +0.00029591220819207774 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in new file mode 100644 index 000000000..81c636655 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in @@ -0,0 +1,5 @@ +0 +0.00029591220819207774 +0.004650467260962157 +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 new file mode 100755 index 000000000..18ef4ce48 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +import numpy as np +import swiftest +import swiftest.io as swio +import astropy.constants as const +import sys +import xarray as xr + +# Both codes use the same tp input file +tpin = "tp.in" + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.dat" +swiftest_enc = "enc.swiftest.dat" + +sim = swiftest.Simulation() + +sim.param['T0'] = 0.0 +sim.param['DT'] = 1.0 +sim.param['TSTOP'] = 365.25e1 +sim.param['ISTEP_OUT'] = 11 +sim.param['ISTEP_DUMP'] = 1 +sim.param['CHK_QMIN_COORD'] = "HELIO" +sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" +sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_RMAX'] = 1000.0 +sim.param['CHK_EJECT'] = 1000.0 +sim.param['OUT_FORM'] = "XV" +sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['GR'] = 'NO' +sim.param['CHK_CLOSE'] = 'YES' +sim.param['RHILL_PRESENT'] = 'YES' +sim.param['MTINY'] = 1.0e-12 + +sim.param['MU2KG'] = swiftest.MSun +sim.param['TU2S'] = swiftest.JD2S +sim.param['DU2M'] = swiftest.AU2M + +bodyid = { + "Sun": 0, + "Mercury": 1, + "Venus": 2, + "Earth": 3, + "Mars": 4, + "Jupiter": 5, + "Saturn": 6, + "Uranus": 7, + "Neptune": 8, +} + +for name, id in bodyid.items(): + sim.add(name, idval=id) + +ds = sim.ds +cb = ds.sel(id=0) +pl = ds.where(ds.id > 0, drop=True) +npl = pl.id.size + +ntp = 16 +dims = ['time', 'id', 'vec'] +tp = [] +t = np.array([0.0]) +clab, plab, tlab = swio.make_swiftest_labels(sim.param) + +# For each planet, we will initialize a pair of test particles. One on its way in, and one on its way out. We will also initialize two additional particles that don't encounter anything +tpnames = np.arange(101, 101 + ntp) +tpxv1 = np.empty((6)) +tpxv2 = np.empty((6)) + +p1 = [] +p2 = [] +p3 = [] +p4 = [] +p5 = [] +p6 = [] + +for i in pl.id: + pli = pl.sel(id=i) + rstart = 2 * np.double(pli['Radius']) # Start the test particles at a multiple of the planet radius away + vstart = 1.5 * np.sqrt(2 * np.double(pli['Mass']) / rstart) # Start the test particle velocities at a multiple of the escape speed + xvstart = np.array([rstart / np.sqrt(2.0), rstart / np.sqrt(2.0), 0.0, vstart, 0.0, 0.0]) + # The positions and velocities of each pair of test particles will be in reference to a planet + plvec = np.array([np.double(pli['px']), + np.double(pli['py']), + np.double(pli['pz']), + np.double(pli['vx']), + np.double(pli['vy']), + np.double(pli['vz'])]) + tpxv1 = plvec + xvstart + tpxv2 = plvec - xvstart + p1.append(tpxv1[0]) + p1.append(tpxv2[0]) + p2.append(tpxv1[1]) + p2.append(tpxv2[1]) + p3.append(tpxv1[2]) + p3.append(tpxv2[2]) + p4.append(tpxv1[3]) + p4.append(tpxv2[3]) + p5.append(tpxv1[4]) + p5.append(tpxv2[4]) + p6.append(tpxv1[5]) + p6.append(tpxv2[5]) + +tvec = np.vstack([p1, p2, p3, p4, p5, p6]) +tpframe = np.expand_dims(tvec.T, axis=0) +tpxr = xr.DataArray(tpframe, dims = dims, coords = {'time' : t, 'id' : tpnames, 'vec' : tlab}) + +tp = [tpxr] +tpda = xr.concat(tp,dim='time') +tpds = tpda.to_dataset(dim = 'vec') + +sim.ds = xr.combine_by_coords([sim.ds, tpds]) +swio.swiftest_xr2infile(sim.ds, sim.param) + +sim.param['PL_IN'] = swiftest_pl +sim.param['TP_IN'] = tpin +sim.param['CB_IN'] = swiftest_cb +sim.param['BIN_OUT'] = swiftest_bin +sim.param['ENC_OUT'] = swiftest_enc +sim.save(swiftest_input) + +sim.param['PL_IN'] = swifter_pl +sim.param['TP_IN'] = tpin +sim.param['BIN_OUT'] = swifter_bin +sim.param['ENC_OUT'] = swifter_enc +sim.save(swifter_input, codename="Swifter") diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in new file mode 100644 index 000000000..d87472e35 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -0,0 +1,26 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 3652.5 +DT 1.0 +ISTEP_OUT 11 +ISTEP_DUMP 1 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swifter.in +TP_IN tp.in +BIN_OUT bin.swifter.dat +ENC_OUT enc.swifter.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +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 new file mode 100644 index 000000000..e9ed6376c --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -0,0 +1,36 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 3652.5 +DT 1.0 +ISTEP_OUT 11 +ISTEP_DUMP 1 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.in +CB_IN cb.swiftest.in +BIN_OUT bin.swiftest.dat +ENC_OUT enc.swiftest.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 86400 +DU2M 149597870700.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +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 new file mode 100644 index 000000000..fea43297f --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751238438755500459 +1.6306381826061645943e-05 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 +4.0453784346544178454e-05 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 +4.25875607065040958e-05 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 +2.265740805092889601e-05 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 +0.00046732617030490929307 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 +0.00038925687730393611812 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 +0.00016953449859497231466 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 +0.000164587904124493665 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-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 new file mode 100644 index 000000000..79614abb4 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 0.00029591220819207775568 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 4.9125474498983623693e-11 0.0014751238438755500459 +1.6306381826061645943e-05 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 +4.0453784346544178454e-05 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 +4.25875607065040958e-05 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 +2.265740805092889601e-05 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 +0.00046732617030490929307 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 +0.00038925687730393611812 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 +0.00016953449859497231466 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 +0.000164587904124493665 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-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 new file mode 100644 index 000000000..fea43297f --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751238438755500459 +1.6306381826061645943e-05 +-0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 +-0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 +2 7.243452483873646905e-10 0.006759080797928606587 +4.0453784346544178454e-05 +-0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 +0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 +3 8.9970113821660187435e-10 0.010044868190633438806 +4.25875607065040958e-05 +0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 +0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 +4 9.549535102761465607e-11 0.0072467082986392815006 +2.265740805092889601e-05 +-1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 +-0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 +5 2.825345908631354893e-07 0.3552707649709459117 +0.00046732617030490929307 +4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 +0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 +6 8.459715183006415395e-08 0.43765596788571493287 +0.00038925687730393611812 +6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 +0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 +7 1.2920249163736673626e-08 0.46957663585116591335 +0.00016953449859497231466 +14.816779495279050138 13.049265812461410263 -0.14351615042000470668 +-0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 +8 1.5243589003230834323e-08 0.7813355837717117843 +0.000164587904124493665 +29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 +0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 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 new file mode 100644 index 000000000..f41a4eb16 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -0,0 +1,753 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import swiftest\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swifter.in'\n", + "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 3.652e+03\n", + "Creating Dataset\n", + "Successfully converted 333 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swiftest.in'\n", + "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestdat - swifterdat" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", + "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", + "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAElCAYAAADOTWQ3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABroElEQVR4nO2dd3wc1bX4v2dX2lXv3XLvNi4YN3oPJRBISE+AEBJCCC+8dH5JXh4pLyE9Ly+EhCQESIGQkAIBQgvdYFywjbvlKlm9r8r2+/tjZmdXsiRLsprt8/181jtz587MmfFqzpxz7j1HjDEoiqIoynBxjbcAiqIoyvGNKhJFURTlmFBFoiiKohwTqkgURVGUY0IViaIoinJMqCJRFEVRjglVJMqIISJ3iMjv7eUpItIhIu7xlmsgRORsEdk13nLA0WUZy3sqIi+IyMfs5Q+JyNMJ284UkT22LFeLSLGIvCQiPhH54WjLpkw8VJEoDiJyQEQu6tX2ERF5ZajHMsYcMsZkGGMiIyfh0BARIyKzBupjjHnZGDN3rGQaiN6y9P7/GK97aoz5gzHmbQlN3wB+Zsvyd+AmoBHIMsZ8bixlUyYGqkiUkxYRSRpvGY5TpgLbeq1vN8OY3az/BycGqkiUISEiZSLyiIg0iMh+Efl0P/2m2RZBUsJ+j4pIs4hUiMjHE/q6ReTLIrLXdo9sEJHJ9rZ5IvKMvd8uEXlvwn73ichdIvK4vd9aEZlpb3vJ7rbZdsG8T0TOE5EqEfmSiNQCv421JRxzsoj81b6+JhH5WT/Xd4eI/EVE/mSfe6OILEnYPt92D7WKyDYReUfCtstFZLu932ER+bzd7sgiIr8DpgCP2fJ/cYj39A4ReVhEHrDPs01Elg/w/3qxiOwUkTb7miVhm2OVisheYEaCXA8C1wNftNcvEhGXiNxu/3822XLk9fpd3Cgih4B/2+0fFZEdItIiIk+JyNSE8xsRudl2p7XY/+eJ8n3c3tdn39dlCfenz9+qiKwUkfUi0i4idSLyo/7ujTIIjDH60Q/GGIADwEW92j4CvGIvu4ANwNcAD9YDZR9wib39DuD39vI0wABJ9vqLwM+BFGAp0ABcaG/7AvAWMBfrAbYEyAfSgUrgBiAJWIblQllo73cf0AystLf/AXgoQXYDzEpYPw8IA98FvECq3VZlb3cDm4Ef2+dOAc7q517dAYSAdwPJwOeB/fZyMlABfNm+TxcAPmCuvW8NcLa9nAssS5Cvqr//jyHe0zsAP3C5fV3fAV7v51oKgPaEa/mMfZ8+1vs30I9c9wHfSlj/T+B1oNy+z78EHux1DQ/Y9zgVuNq+X/Pt/8evAmt6/T/+E8jBUq4NwKX2tvcAh4EVWL+dWVgW0tF+q68B19rLGcDq8f77O54/4y6AfibOx35AdACtCZ8u4opkFXCo1z7/D/itvXwHfSgSYDIQATIT9vsOcJ+9vAu4qg953ge83Kvtl8B/28v3Ab9O2HY5sDNhvS9FEgRSerXFFMnp9kMqaRD36g4SHsz2g6sGONv+1AKuhO0PAnfYy4eAT2DFFOhLloT/jz4VySDu6R3AswnbFgDd/VzLdb2uRYAqhq9IdmArNHu9FEvpJiVcw4yE7U8CN/a6l13A1IT/x7MStj8M3G4vPwXc1sc1He23+hLwdaBgvP/uToSPuraU3lxtjMmJfYBbErZNBcpsd02riLRivXUXH+WYZUCzMcaX0HYQmGQvTwb29rHfVGBVr/N9CChJ6FObsNyF9XY5EA3GGH8/2yYDB40x4aMcI0ZlbMEYE8V6+JbZn0q7LUbi9V6DpfQOisiLInL6IM+XyNHuKRx5b1Kk75hEWa9rMYnrw2Aq8LeE/7MdWEov8XdS2av//yb0b8ZSZgNdS+z/eaDfzkC/1RuBOcBOEVknIlcM+SoVBw10KUOhEthvjJk9xP2qgTwRyUx48E3BcknEjjsT2NrH+V40xlw8XIH7YKCAcCUwRUSSBqlMJscWRMSF5cqpjm0TEVeCMpkC7AYwxqwDrhKRZOBWrDds51iDlPVo93Qo1PS6FulHnsFSCXzUGPNq7w0iMs1eNL36/48x5g/DPNfMftr7/a0aY/YAH7D/394F/EVE8o0xncOQ4aRHLRJlKLwBtNvB6lSxguSniMiKgXYyxlQCa4DviEiKiCzGeiOMPTh+DXxTRGaLxWIRycfyi88RkWtFJNn+rBCR+YOUtw7LNz6U66sB7hSRdFvWMwfof5qIvMt+y/9PIIAVG1gLdGIFoJNF5DzgSuAhEfGINS8j2xgTwopN9Dect1/5B3FPh8LjwMKEa/k0Pa2+ofIL4H9iAXMRKRSRq47S//+JyEK7f7aIvGeQ5/o18HkROc3+7cyyzzvgb1VEPiwihbaib7WPNW5D1Y93VJEog8ZY8xeuxArs7scKfP8ayB7E7h/A8o9XA3/DinM8Y2/7EdZb+dNYD9bfAKn2m/bbgPfb+9USD5QPhjuA+23XxnuP1jnh+mZhxTGqsOI0/fEPe3sLcC3wLmNMyBgTBN4BXIZ1j34OXGeM2Wnvdy1wQETagZuBD/dz/O8AX7Xl/3wf2we6p4PGGNOIFbS+E2gCZgNHWBND4H+BR4GnRcSHpVxXDXD+v2H9vz5k35OtWPduMLL/Gfgf4I9YAxr+DuQN4rd6KbBNRDpsed8/gMtTOQpiB54URRkCInIHViC/PyWgKCcNapEoiqIox4QqEkVRFOWYUNeWoiiKckyoRaIoiqIcE6pIFGUCIb1Stg/Qz0nZPxEQK+/Zt8ZbDmV8UEWiHLdIvD5H7GNEpDNh/exhHPOIVPq9tp8nIlH7+D6xEkneMEz5eyRhhD5TtivKhEdntivHLcaYQySkRBERAywxxlSM8qmrjTHl9gzwq7BmRa81xmwf7AH6SVWiKMclapEoJyQi4hWRH4jIIbHShP9CRFLtbQUi8k97ol+ziLwsVurzI1K3D3QOY/F3rAmJC0Tk7SLyplipySvtuSYxefpKnx5Ldd9qn+906VVITEQWSjyNfp2IfLmf610tImvsa9psz6aPbfuIiOyzLaj9IvKhAe7ZT0Sk2v78RES89rZYCv7PiUi9iNT0Z4mJyFYRuTJhPVlEGkVk6UD3Uzl+UUWinKh8Fysp31KsmeqTsFKKA3wOa9Z6IVYSvy9j6YVrsWa0X2ms6n/fG+gEtvJ5J1Z687ew0qJcZ6+/HfikiFzda7dzsdKlXwKcY7fl2Od7rdfxM4FngX9hJVacBTzXhxyTsNKcfAvIw0pp/4idmiQd+ClwmTEmEzgD2NTPJX0FWI11z5Zgpef/asL2EqyZ4ZOw0rHcJSK5fRznAXrO1r8cqDHG9Hde5ThHFYlywmG7nD4OfMYYE8uQ+22sVCtgpTQvxUpTHjJWiduhjIMvEyubbCPw31h1LXYZY14wxrxljIkaY7ZgpY4/t9e+dxhjOo0x3YM4zxVArTHmh8YYvzHGZ4xZ20e/DwNPGGOesM/9DLAe6wEOEAVOEZFUY0yNMWZbH8cAK7PyN4wx9caYBqw069cmbA/Z20PGmCewSg70Vab498DlIpJlr18L/G4Q16scp6giUU5ECoE0YIPEU4j/y24H+D5WIaWnbZfP7UM8frWdZj/PGLPUGPMQgIisEpHnxarI14aVR6ug175DSc/eX4r03kwF3iM9U6afBZTa2WzfZ8tSI1Y1yXn9HKcMKxV9jIN2W4ymXlmR+0zbb4ypxsrVdY2I5GDlzRpOMknlOEEViXIi0gh0Y1VSjNVWyTbGZADYb/afM8bMwErs91kRudDe91hm6P4RK1nhZGNMNlZWW+nVx/Sz3Bf9pUjvq9/vEuvIGGPSjTF3AhhjnrJT8ZcCO4Ff9XOcaiylFGMK8bT4Q+V+LEvpPcBrxpjhpLdXjhNUkSgnHHZq8F8BPxaRIrDiCCJyib18hVjpxoV4GvdYCvGhpp5PJBOr2JRfRFYCHzxK/wYst1N/5/snUCIi/2kHwjNFpK8sur8HrhSRS8RKl55iB8fLRaRYRN5hx0oCWO6o/tKlP4iVbbhQRAqwYkrDnavyd6zSyLdhxUyUExhVJMqJypew3Fevi5Wa/Fni/vzZ9noHVu3unxtjXrC3HS11+0DcAnxDrNTpX8NKjd8vxpgurBTor9rnW91ruw+4GMtqqgX2AOf3cZxKrGHIX8ZSTpXAF7D+vl1YgwuqsSoPnkvPqpeJfAsrtrIFa/DARrttyNgxoEeA6cBfh3MM5fhBc20pijIqiMjXgDmaav/ERydFKYoy4ohIHtYQ4WuP1lc5/lHXlqIoI4qIfBzLvfakMealo/VXjn/UtaUoiqIcE2qRKIqiKMfESRkjKSgoMNOmTRtvMRRFUY4rNmzY0GiMKezdflIqkmnTprF+/frxFkNRFOW4QkQO9tWuri1FURTlmFBFoiiKohwTY6pIRORSsSrKVfSVKE8sfmpv3yIiy+z2FBF5w66zsE1Evp6wT55dr2GP/d1XWmtFURRllBgzRSIibuAurEygC4APiMiCXt0uw0pfMRu4Cbjbbg8AFxhjlmDVSrg0IZ3E7cBzxpjZWLUahprJVVEURTkGxtIiWQlUGGP2GWOCwENY+YESuQp4wK489zqQIyKl9nqH3SfZ/piEfe63l+8Hrh7Ni1AURVF6MpaKZBI9azFU2W2D6mNnNd0E1APPJBT4KTbG1ADY30V9nVxEbhKR9SKyvqGh4VivRVEURbEZS0XSuy4DHFmPod8+xpiIMWYpUA6sFJFThnJyY8w9xpjlxpjlhYVHDINWFEVRhslYKpIqrIpvMco5smjOUfsYY1qBF4BL7aY6ESkFsL/rR0xiRVGUE4TaNj8/fHoX+xo6jt55iIylIlkHzBaR6SLiwaqf/WivPo8C19mjt1YDbcaYGrvQTg6AiKQCF2FVeovtc729fD3wj1G+DkVRlAnNjfet46Ifvdij7VBzF//37wqqW/0jfr4xm9lujAmLyK3AU4AbuNcYs01Ebra3/wJ4ArgcqyBRF3CDvXspcL898ssFPGyM+ae97U7gYRG5ETiEVdpTURTlpOW5nZZjJhSJkuy27IX27hAAWakj/9gf0xQpxpgnsJRFYtsvEpYN8Kk+9tsCnNrPMZuAC/vapiiKcjKzs8bHovJsAHwBS5FkpiSP+Hl0ZruiKMpxSjRq+NubVYQi0T63bzzU4iy3d4cByEoZeftBFYmiKMpxyl82VvGZP23md6/FcykmKpVNla3Oss+vFomiKIrSi/2NnQC02fEPgJauoLNc2xYPrLf7w6Qku/AkjfxjXxWJoijKcUpMgbgkPgWvpTOuVNr9CcvdIbJGwRoBVSSKoijHLVUt3QA0dQactuZOyyIpzU7pYan4/GEyRyE+AqpIFEVRjltikwsbfHFFEnNtTc1Pc4b8gmWdZKWqRaIoinJS8uf1lXz24U0EwhGnzR+KcLjVskgaO460SKYXpOMLhIlGrUxU7f7wqATaQRWJoijKhOc3r+znrxsP861/7nDaqlu7MXa2wsaOeIC9xVYkU/LSMQZ8AWvYr687NCpDf0EViaIoyoTBGMNDbxyiw374x4i5pNYdaHba2v1Wn+kF6b1cWyEyvEkUZHisfrZ7S11biqIoJwG76zq4/a9v8eimnvls27osZdDa1XMUFsCMgnQ6AmG6g5bbq6UrSE5asqM02hxFosF2RVGUE57qNivmUdXS1aO9tTvY4xviQ3unF6QD8ThJW3eInLRksm1F0t4dwh+KEAxHdfivoijKiU5sAmFsWC9Y7q4W2xLxh6L4Q5blEUt5MqMwA4grkth8kZjSaOsO4fOPXnoUUEWiKIoyYahxFEncIvGHogTDUSbnpQKJrirre0peWo/2NluRZKclO/3anMy/apEoiqKcMPhDESf/VYxax7UVt0hi7qxp+ZYLKxYn8flDJLmEkuwUoKeCyU5NdqyPtu6QM7ckL90zKteiikRRFGUceNuPX+L07/y7R1vMIqn3BRwXVkxxTM1Ps9ctpdDebQXPc9J6BdW7w2SlJpHhTcIl1npsbklumioSRVGUE4I9dT4ONXcdMcy3ts2Py06bFVMqMWvCsUh6DeeNBdVbu0IEw1G6QxGyU5MREbJSky2LJKZI1CJRFEU5MXhk42FnORiOp32vbfMztyQLgMO2eys29DemSGLrsaB6sttFusdNW3fIiZvEYiF5aR6au4I0x1xbapEoiqIcX/hDEabd/jgPvnGoR3tfubE6A2F8gTDzSzMBnId/zAKZVmC7tuyYSbs/7JTNzUnz0NoVD6rHrJSCTC8N7QFau0KkJLtI9bhH5TpVkSiKoowS9e2WwvjK397q0Z6YlTcWv4gpjOkxy8NejymaSTlpJLnEiZkkpoW3XFjBeF12u70o00u9z09zZ3DUrBFQRaIoijJqNNhzO+y8iQ5t3UEnFhJTJDGX1RQ7qN7WFW/3JlnWRE5acs8Yia0wcuxYSHyYr2WpFGWmUO8L0NIZHLX4CKgiURRFGTUSs/LGRmGBFRiPzUh3FImtBAozvKQmu5311q6QMzIrOzXZGbWVWF8kJy2Z1q6Qk38r5toqyvLSFYxQ1dI9akN/QRWJoijKiHDvK/u55u41PdoSYyE7a33Oclt3yJmRHlMkiYHymGIAO3dWqqUEctM8tHSGCEWidAUjTlA927ZIeru2CjO8AOyq843a0F9QRaIoijIifOOf29lwsKXHKKxEi2RPnaVIjDG0doeYlp+GCDT1skiy7SG9MRdWa3fcIinI8NLYEXCUjGOp2C6v3jPYi7K8zvlz00ZnVjuoIlEURTlmjIkHQRLL3jb4AiTZwZDYQz6W8iQv3Ut2arIzx6M9QQnELAywYiQxhZGf4aGpM+hYOjGLIzs1mWA4Sn27H0+Si5Rka3RWUWaKI8sJEyMRkUtFZJeIVIjI7X1sFxH5qb19i4gss9sni8jzIrJDRLaJyG0J+9whIodFZJP9uXwsr0lRFCU2eRDiI7XAskimF6Tjdokz+irR8shL98RdW90hRCDTa81Wb+vDtZWf4aWlK0hdu3W+wkxLkcTcVpsqWynPSXXOX5QZt0gWl2eP7EUnMGaKRETcwF3AZcAC4AMisqBXt8uA2fbnJuBuuz0MfM4YMx9YDXyq174/NsYstT9PjOZ1KIqi9GZLVZuzXO9LVCRBCjO95KTGYx6xeSA5acnkp3scC6atO0SmNwmXS2zXVtBxg+Wkx1xbHoyB3babrMC2SGKB+81VbcwoTHfOH7NkirO8nD+3aFSuHcbWIlkJVBhj9hljgsBDwFW9+lwFPGAsXgdyRKTUGFNjjNkIYIzxATuASWMou6IoCgBv+/GL/OCpXT3aKurjgfTEAHuDL0BBhteJYUA8d1Z2arITPAdLkcQy9uakeWjrDjlusJhFElMcO2ragbhFMq8k0zlnLIgPICL8+3Pn8uIXzkdERuDq+2YsFckkoDJhvYojlcFR+4jINOBUYG1C8622K+xeEcnt6+QicpOIrBeR9Q0NDcO8BEVRTma6gxF213Xws+crnGG4YJW39bitx2m9L+7mauywFElOwrDdRNdWLOYB9kz1lPgoLH8oSq3twnJiJHacY2etjzSPm3RvfGZ7qZ0FeGaCRQKWYonFTEaLsVQkfalDM5Q+IpIBPAL8pzGm3W6+G5gJLAVqgB/2dXJjzD3GmOXGmOWFhYVDFF1RlJMNY0yPIDrE05YAPLo5Xg63tStEQYaHvHSP49ryhyJ0BSPkZ3jItVOYQHziYU6aFSNp6bJcWG3dIWf+R+z7QFMnEB9xlW9bJDtrfY41EmOubZUkWiRjxVgqkipgcsJ6OVA92D4ikoylRP5gjPlrrIMxps4YEzHGRIFfYbnQFEVRjolHNh5m5bef6zGct7kjrkhiAW+IuaU8FGZ4HddWe+Jw3rQjYyQx11YkamjvDvdQJDEL5GBjp93XskRio7Qg7uaKMb/USvY4o6CnRTIWjKUiWQfMFpHpIuIB3g882qvPo8B19uit1UCbMaZGLOfeb4AdxpgfJe4gIqUJq+8Eto7eJSiKcrKw4WALDb4ANW3xIlOJFklzZzxfVlt3kJzUZIqyvI5FEouJ5KQlk5PqcVxbzZ0hkt1ChjeJ/AxLQTR1BnrkzirJstxUO2p8zjHASn0SG05c2EuR3HDGNP7vA6c6VstYMmaKxBgTBm4FnsIKlj9sjNkmIjeLyM12tyeAfUAFlnVxi91+JnAtcEEfw3y/JyJvicgW4HzgM2N0SYqinMAcarasgcRqhc32CKtktzjzPyCexqQww0tjTJHEXFipHnLTkukMRgiGozR3BshL9yAi5KV77eMGewTbY/m2Nle1Wsew20XEKa3be15IUVYKVy4pG7kbMARGpxJ8P9hDc5/o1faLhGUDfKqP/V6h7/gJxphrR1hMRVEUDjZZddMrm+P102NWyMzCjB7WSavtlsrwJjnzRWIWSE5asqMIWruDViZeW4HEMvLua+wkEI468z4KM7ykedxOWpXE9CY///Ay/u/fFVyxONEZM76MqSJRFEU5HgiGo1S3Hlk/vbkzgNslTM1PY78dv3AC5WnJZKUk0xWM4A9FHNdWdmoyObYiaOsK0dQZdEZf5dmura2HrXkok+zJhDHLY2etj5mF6T1GXc0ryeKuDy4bzcsfMpoiRVGUkxpjDP/YdLiH5VHV0uWkfq9s6WmR5KZ5yEv3OtZJ4lyPWIbd5s6gMzorO8EiaekK2RaJrUjSeiqS0oRZ6TEX1oppeSN+zSONKhJFUU5qvvfULm57aBM/f6HCaTtoK5XUZPcRFkl+uhXziA3bTZypHnNBxWIebpeQ6U0i33ZlNfgCNHfEFUmqx01qsput1dZshrKceG6sUMQaLbZsap9T4yYUqkgURTmpiZXB7QzE64XE3FrLp+X2ipEEyU235n9EooZ2f7jHTPWYgmjpCtLaHSQ7NRkRcVxWB5o68QXCjmsLIC/dQzAcJdktFKTHR1wtm5Jrf+eMwlWPLKpIFEU5KTjY1MnX/rHVedMHCEeizkzzxKy9MeUwrySTxo4AUdvP1dwZJD/d61geLZ3BhNFZyT1cW61dIXJS48N20zxux4UVi40ATMq1lExJdgouV3xM0SfPm8mznz2XWUXx9CcTFVUkiqKcFHz9se088NpB1u1vdtraukPEJq83+hJSnnQGSU12U5KdStTEi04lWiRgzStxUp6kJVgkvYbzighlOalsrbYUSaJFcvVSKwtUYtZggCS3i1lFYz9LfTioIlEU5aTAbb/t77fTjgDOUN3MlCSnvjpYw3lz05LJs7PuNncGiUStTLx56V5nDodlkcRiJB7blQXNXaEeFglAWU4qlc2Wyyxx0uA7llpzP8YjtclIocN/FUU5KXDb2W+3V7c7bU12ypM5xZlsPNRCKBIl2e2itStIdpon7sLqsuIdxkBeWrIz2qqpI15kKj/dg9sl5NjFqlq6gj0SKJZlxwPpifXTM7xJPP7ps45IeXI8oRaJoignHPXtfjoD4R5tsUy62xIUScwimVOciTHx+uktXTGLJBbzCDl98zK8Tgnbep+fel+A7NRkZ66HlbjRT22b34l/gGWRAKR73JQntAMsLMumOCuF4xVVJIqinFBEo4aV336Oj92/vkd7rV3FcGdtOxEneG7FN+YWW26lBie9SdDJzmv1CzjWS16ah5RkNzlpydS2+6n3+XtUIsxL97CpspVw1DCjIO6uSvNYiuayRaV4k0Y3rftYo4pEUZQTii32yKjX9jU5beFIlHqfn6yUJPyhqBPXSLRIwKofArHcWZ6+LRK7rTgzhbr2APW+gGOhAEzNT6fODpwnViu8YnEZVy8t46tvnz/yFz3OqCJRFOWE4oVd9UDPmES9L0DUWC4kiLuwmjqCpHvcjguqwReIl7dNTSY12Y03yUVLV9ApQOUokuwU6tv91LcHKMqMn2vFtPgEwsQAekl2Cj95/6lOupQTCVUkiqKcULxa0QhAMBIvSlVju7UWllk1O+KxkCC56R4n0N3YEcQXCBOJGnLTYhl6PTR3Bp1sv7n2SK7iTC81bX4afIEerq1YSpOCDI9TX+RERxWJoijHJfsaOrjqrledWegxqlstpdHUGSBsTz6stwPtC3opkmY7gWK615ow2NgR6JEjCywLpKXTskgyvElOfKM4K4V6X4BgJNqjWuH0gnTy0z1MH4cCU+OFKhJFUY5L/rWtls2Vrfzg6V092lu6gqQkuzAGxx0VS/k+254l3pSgSGKupgK7umEsFhIb+puX7qG5K9gj2SJYrq0YRQkjrkSEb119Cp+5aM6IXu9ERhWJoijHJbEZ6S/uanBGYcXqpM8tsSyP2GzxmFsqFvyOx0gCjlurMNNLY0cgnvIkVic93UN9e8Ce1Z6gSBKskKJe9dMvW1TKGbMKRu5iJziqSBRFmfBsPdzG3oaOHm0xd1VTZ5AqO9V7TEHMs0dh1fv8dnuIDG8S6d4kMlOSaO60Mvc2dgQpyIhZJB4afAGnVG5MwcwozOBwazcHm7ooSFAkC8qyKMjwsGJaruMyO1nRme2Kokx4Pv3gm0zJT+O+G1Y6bbEHPlhB8qn56XFFUprZo48VVI/HPJo6g7T7wwQj0R4WyRv7mzlsp40vtV1Xc0usYx1q7uIdCaVsy3PTWP/Vi0fleo83VJEoijKh6QqG2d/UienVXtduzQtp94dp6ogrDIC5MYvEdm01dwadtCbWKKyAs09BZjxG0tIV4mBTJ4WZXmemeuxYAKceByndxwN1bSmKMqHZXdeBMVbVwlgsBCxrY36p5VJq7IgHz8EKfuemJTuurdgwX7BiHs2dIWefmEUS+95yuM2pHwJWpcKUZOtRuXRyzmhd5nGNKhJFUSY0O2us3FihiHHyZRljeiiSmHXRnDBpsCgzxXFt9WWRxGaxx6oXxobwVtR39FAkLpcwtziTKXlpPbL2KnHUtaUoyoRmZ63PWT7U1MWknFTau8MEw1HKc1PJTElyhvO2dAYRsaoVFmV54zGShBFXxVkpNPgCziTFRNdWjEm9kip++fL5hCK9nWtKDLVIFEWZELT7Q3zqjxu57aE36QrGM/fubehwCkHFyt7GXFZFWSkUZnidWiLNXUFyUpNxu4TCTC8N7X4C4QidwYgzB2RafjpRA5sqWxHBsVSm5KU550y0SABWzcjnrNknz3DeoaKKRFGUCcGbh1p5fEsN/9hUzdbD8VTvDb4Ai8qzcbuEQ7YiiWXpLczwkp/h6eHaiimMoswUGjoCtNgZfmMTDKcVWApjw4Fm8tI8JLmtx2Bhppf3Li8HrLxYyuBR15aiKGOOPxQhagxpnvgjqCFhOG/M4gBLOSwuz6YkK4XDdjqURtuVVZjpIT/d68wxaewIOjGPokwvoYhhn70tVu1wWr41KbG6zd9jRBbA/7xzEefMKeSCeUUjer0nOke1SERkyiA/R52RIyKXisguEakQkdv72C4i8lN7+xYRWWa3TxaR50Vkh4hsE5HbEvbJE5FnRGSP/Z3b+7iKokwsPvfwZm7+/cYebYnKIzZs1xhDS1eQfLuYVCxAHrNA8tK9FGR6nPa6dr+T0j32vamqFYBCO0NvXrrHGYUVmyMSI9nt4orFZSS71VkzFAZjkdwPGEAG6GOA+4AH+usgIm7gLuBioApYJyKPGmO2J3S7DJhtf1YBd9vfYeBzxpiNIpIJbBCRZ+x9bweeM8bcaSun24EvDeK6FEUZJ9463EZjR4BI1Di11Bt8AdI9boKRqBMkb/eHCUUM+XaG3liMpKkjiEsgJzWZ/HRr/kcoEqWu3c/F84sBnNTur+216pLEyt6KCP6QlczxXcsmjd1Fn8AcVZEYY87v3SYiJcaY2iGeayVQYYzZZx/jIeAqIFGRXAU8YIwxwOsikiMipcaYGqDGlscnIjuASfa+VwHn2fvfD7yAKhJFmbCEIlEOt3YTiRoONHUy067ZYRWISiEQiiSkNokP5y3M9PLmoRbAyuybl+7F5RInML6r1oc/FHXiG7H8V2v3NZOf7ulRB2TltDzeONDM2bMLx+aiT3CGa79dN4x9JgGVCetVdtuQ+ojINOBUYK3dVGwrGuzvPp2bInKTiKwXkfUNDQ3DEF9RlJHgcEu3M7EwsX56gy9AYaaXQnt4LlglbsFSJAUZXpo6g4Qj0R45smL1z9cfaAbimXhLslPwJLkIRqI9KhUC3HvDCtZ95SLHGlKOjeEqkqtE5FYRmTuEffr6H+s9MHvAPiKSATwC/Kcxpr2Pvv1ijLnHGLPcGLO8sFDfQhRlLIhGDc9sr+sxI/2g7Z4C2J6gSBptRVKU6XViJLE66fnpXgozvRhjDfFt6giQ7ygSexTWoVYASmxFkpLs5hzb4uhdGyTDm9SjhohybAxXkbwLqADeKSK/HuQ+VcDkhPVyoHqwfUQkGUuJ/MEY89eEPnUiUmr3KQXqB3sRiqKMLne/uJePP7Cep7bFPeGHmjoBK9vu7rr4ZMN6u9JgUab3SNdWhodCW3E0+AI0dcZHZ5XmpOASazgvxBUJwNn23A8ZMMSrHCvDUiTGmDpjzL+MMXcaYz42yN3WAbNFZLqIeID3A4/26vMocJ09ems10GaMqRERAX4D7DDG/KiPfa63l68H/jGca1IUZWQxxnDvK/uBeCEpgANNXaQku1hYlu24sLqCYToCYdsiSaGlK0QwHHX2y7djJGArko6gY5Eku12UZqdS3RabpBi3NK45rZzLTinhpnNnjP4Fn8QMS5GIyF0icp+9/LbB7GOMCQO3Ak8BO4CHjTHbRORmEbnZ7vYEsA/L2vkVcIvdfiZwLXCBiGyyP5fb2+4ELhaRPVgjwu4czjUpijKyHGjqchRBbVu8HO7hlm4m5aT2sDwSJxgW24qg3uenqSNImsdNSrKbwgzL0qhq6aYjEO4zpUlOWrKTtRcsF9bdHz7NCegro8NwJyQGgTp7+QLg6cHsZIx5AktZJLb9ImHZAJ/qY79X6Gf4sTGmCbhwUFIrijIqVNT7qPcFOGNmPI1IbVt8XkhNa3y5qdOOhWR5aewIEo0aR5EklqytafPT1BmPhcRyYu2steIqiWVvM7zWo+ysk6gq4URiuIqkC8i24xZTRlAeRVGOQ678v1fpDkXY+c1LHYsglv8qOzWZ6gSLpLEjyIKyLAozvESi1oTD+gSLxJNkvTNWt3ZT3dpNWbZlbaR5kshP9/D0NusdNtHK+NhZ05mSl8btl80b/YtVjmC4wfZmYC/WBMNXR04cRVGOR7pDEQBe2BUf69JoK4fF5dlOpl2Axo4AhRleZ6Z5Q0cg7trK9FJqK47qVj+Vzd3OqCyAU6fkUu8L4HYJp0yKJ9M4Y1YBd7xjYQ+3ljJ2DEmR2BMEfwtcYzc9ACwfcakURTmuyEyxnBv/3FLjtDV0BEh2C/NLs6hp82OMwR+K4POHKcjwOEHxBp+lSNwuIS/dQ7o3iezUZA40dlLn8zvzRACWT7MyIM0pzuyRp0sZX4akSIwxrVjB7K9jTQicDfx1oH0URTlxCEei3PV8hTMsF6wRVz6/lfZ9V0LtkAZfgIIML2XZKc4IrNh++RleCu1geX17gHqfn/x0jzNBsCwnlfUHmzEGJiekdz9tqqVItFLhxGI4Kv1GYL8x5ilgwwjLoyjKBObZHfV8/6ld1LR1862rFwHWKCywRkzVtfdyYWV6KbVTmNS0+jH2/OKCDG98OK/t2koctjspJ4Vnd1huskSLZHF5Niun53HF4tJRvEplqAxHkbQAN9uz2jcDm4wxb46sWIqiTERiI6YCdtJDwEntvmxKLv/eWU93MEKqx02DL0BxVooTLK9u68ZjZ9XNz7BcWOket22RBJzcWIATJ4GeFok3yc3Dnzh99C5QGRZDDrYbY74DfBy4A9gPnDPCMimKMkFZZ88eT5xgGFckOQA95oYUZngpzbGC6jWt3c5Irphbqzw3jQNNnU6erRhLElxXxZrKZMIzZItERL4BuIFNWNbICyMsk6IoE5BwJMrGg60AHGjsdNoPt3Tbo6iyAahrDzA5N42mziCFmV7y0z14klzUtPmdDLyxuSHzSzN5bV8TjR0BJ+07wDXLJpHhddPeHXYqGCoTlyErEmPM10SkGCsD7zUiMtMY8/GRF01RlPGipq2bbYfbuXB+EVaGIqjzBegOWbXPDzV3EY5ESXK7qG33U5zppcyOhdS1+2nqDBKJGgozvYgIpdkpVLf5CUaipHnczoir+aVZ/H2TlXIvsWa6iHDpKRoHOV4Yrqr/BPCmnWtLlYiinGD86OndfOyB9Xzl71udtno7kL5yWh7hqHFcWg2+AIVZKRTbFkVdu58aewJiqV0bpDQ7hZrWbvY3djqlbsFSJDEumK/lbY9XhqtI7gU+KSLfF5GlIyiPoigTgFgs48m3EuaF2JMGV0zPA6xcWrH2wgwvWalJeJJc1PsCVNspUWJWSll2KjVtfirqO5hVFJ+RPq80Xuo2MXeWcnwxXEXyaSy3WBLw05ETR1GUseaN/c10BcM92mJ5slq6QnQHrVnrsTQmSydn2326nfaiLMuFVZzlpbbtSIukJDuFw63dVLV091AkRZkpfGjVFH5348pRvEJltBmuItkLpAD/MMboqC1FOU6p9/l53z2vcd+aAz3aa9r8pHvc9nLchSUCC0qzEbH6BMNRmjuDztDd8pw0DjV3Ud3ajTfJ5SRWTBzCm6hIAP7nnYu05O1xznAVyTbg38CNIrJuBOVRFGUM2VHjwxjYXNnqtHUFw7R1h1hmzyKP5cmq9wXIT/eQ6nFTkOGlptVPo+0Ci424mlWUwd6GDqrb/JTlpDqB+ssTAuezizSl+4nGcBXJHKwhwPcAN4ycOIqijCU7a6wJhlsPx0vexhTHsimWIqlOCKrH4hil2SnUtPsdd1fMIplVlIHPH2ZLVavj1gLITkvmE+fOIMklTM3vWfZWOf4ZriKZB7wJfB64aeTEURRlLInlxjrc2u3kwYrFR061JxjGFEuDz+/UC4mNwoqN5IqlN4mldq9s7u4xOx3g/102nx3fvBRPks4LOdEY7v9oDvAl4IuAf+CuiqJMBGraunl9X1OPth21PrLszL1vHW4D4hbI9IJ08tM9PWIkhY5FkkptW9wiKUywSGL0joWAVRZXOfEY7v/qN7AC7buA6NE6K4oyvrR1hzj9O//m/fe8jlWIFKJRw976Di5aUAzEZ6vHLJLirBRKc1KobvUTiRoaOuKJFUuyU/AFwuyoaSfZLY7Lqzgh8eJ1p08ds+tTxpdBKRIRcYtIjYh8DMAYU2WMedZevn00BVQU5dj549pDznLMimjuChKMRFk0KRuP2+VUMaxus1K6pyS7Kc9Jo7Kli9p2P6GIYbJdZCoW/3hqWx0LSrMcS0NE+O0NK3jmM+eQ7tV6IScLg1IkxpgIsBWYObriKIoyGhxqjufGOmhPJIylfC/NTqEkO8Wpq17b1u0kWpxWkE5lcxf7Gjqs9XxLkSyfZk1KbOwIHFEb5Py5RcwuzkQ5eRiKaysN+KKIrBeRR+3PP0ZLMEVRhsdX//4Wr1Y09mirafOTaVsIB5sspRJTJMVZKZTlpDixkJo2PyVZVqB8RkE6oYjh1QortjLFViSTclJZUm5NTFxqB+WVk5ehKJLTAQGWAVckfBRFmSC0dAb5/euH+NCv1/Zor2n1c9q0XFwClc0xi8RyccVqhsTSmtS0+SlLsEgAXtzdQLJbeozEumyRNTfktCl5o3tRyoRnKE7M6aMmhaIoI8K+xg5nubkz6Mwsr2nrZtWMPEqzUznY3NO1ZVUxTKG23Y/PH6KtO0RJdkyRWBbIjpp2ZhSkO6VwAT565nRWTMtzrBTl5GXQFokx5mBfn9EUTlGUobG3IR4LeW5HHQCdgTDt/jCl2alMzU9LiJEEKMjwkOx2UZqdSiRqeKvKGgIcq2pYmOElNdlKldJbYXiSXE4NdeXkZkwHdYvIpSKyS0QqROSI0V5i8VN7+xYRWZaw7V4RqReRrb32uUNEDovIJvtz+Vhci6KMN4dbu/nLhqoebfsbO3G7BJG4UolNKCzNTmFqvpULCyyLJJbaJObKWn+wBcCxSESE5dMsZXHWrIJRviLleGXMxueJiBu4C7gYqALWicijxpjtCd0uA2bbn1XA3fY3wH3Az4AH+jj8j40xPxgl0RVlQnL1Xa/S4Atwwbwix4W1r6GDaflphKOGqhZLYSRm4p2Sl05zZxCfP0Rdu99RGHPsUVZP2GnjyxJiIffdsJJwNIo3yT1m16YcXwzZIhGRK4d5rpVAhTFmnzEmCDwEXNWrz1XAA8bidSBHREoBjDEvAc3DPLeinFD4QxGnPkhFfTwusq+hkxmFGUzKSXUKT8WG9cZcW4CTobfYTnlSnpvGpJxUdtb6KMr0Up4bVyRul6gSUQZkOK6t/xnmuSYBlQnrVXbbUPv0xa22K+xeEenTaSsiN9lDl9c3NDQMRW5FmXC8tDv+G95Tb+XLMsZQ2dLF1Lw0ynNTOdxiKZKqli5cAqU5KU45240HW2jpCvXIxLtqhjX66m0Li3ElBNUV5WgMR5EM9xfW135mGH16czfWRMmlQA3ww746GWPuMcYsN8YsLyzU2gfK8c3uOkt5uF3CnjrLImntCuEPRSnNSWVSThr1vgD+UITKFiuBYrLb5QTMn95uBeLnlsQnDp4+Ix+ASxaWjOWlKCcAw4mRHO3B3h9VwOSE9XKgehh9egpjTF1sWUR+BfxzmPIpyoTkcw9vZnZxBjefG08sUd3mJy/dw+TcVMe1FUtxUpadQmeqVdWwps1PZXOX46rKSkkmNy2Zl/dYExbnJMxAv/rUSeSlezSorgyZsRy1tQ6YLSLTRcQDvB94tFefR4Hr7NFbq4E2Y0xN7wMlEouh2LwTK5WLopwQhCNRHtlYxZ1P7uTpbbVOe3VrN2U5KcwqynRcW04sJCfVURyHW7qpbOnqUaFwil0PJMObREGGx2lPdru4cH6xU4xKUQbLmCkSY0wYuBV4CtgBPGyM2SYiN4vIzXa3J4B9QAXwK+CW2P4i8iDwGjBXRKpE5EZ70/dE5C0R2QKcD3xmbK5IUUaf2NBdgOd31cfbW/2UZqcyozCduvYAXcGwMzqrLDuFabay2F7TRl17oEfw/Ho7K29OWrIqDWVEGI5rq+7oXfrGGPMElrJIbPtFwrIBPtXPvh/op/3a4cqjKBOJUCTK7jofC8uynbbY5EHAmf8BlkVy+sx8ZxTWwaYuqtv8Tkp3Eatq4eNvWVZMLGsvwLuWlZPhTXJqiCjKsTJki8QYc/FoCKIoJzsPvnGIK/7vFScXFsSVx4ppuY5SafeH8AXC1gTDPMvyONjUSY09nNflEkSEJZNznFrsia4tgLctLOHUKTorXRkZtFyZokwQXq1oxBjYYM8uBzjY3EmyW1g1PZ/q1m6C4WiPWMiUXhZJ4kTCWHZeb5KLxeXZKMpooYpEUSYAxhje2G/Nt914KK5IKpu7mJybxrSCdKLGSosSK4Vblp1CdmoyeekeDjR1sqfO5yRZBFhi1wm55bxZpCTrhEJl9BiWIhGRzyYszx05cRTl5KSivoOWrhAu6alIDjVbI67isZBO9tslcafaAfWp+Wm8sKuBlq4QyxLcVWfNKuCRT57Bpy+cNYZXopyMDEmRiEiOiPwWeI+I3CIiZwFaaldRhkh1azddwbCzvrXayrp78YJidtT4CIQjGGM42NTFlLw0ptoxjgONnexr7CArJT50d25xpjO6KzEbr4hw2tRcHZmljDpDUiTGmFZjzA3At4C1wNnAX0dDMEU5UfnBU7s4485/871/7XLaqpotd9X5c4uIRA2VzV20dYfw+cNMzU+jMNNLbloyO2t97K3vZGZRhqMgrj9jmnOcmYUZKMpYM9zsv+cCPwVWA6XAYyMmkaKc4Dy07hAAm+wRVQBVLd0UZHidlCX7G7voDFiz0yfnpSEiLCzLZmt1Gw2+AGfNiqf5mV+axUfOmIYImiNLGReGq0hygC8BXwRuHLiroigxfP4QjR1BAA40dWKMQUQ43NpNeW4q0+3StgcaO/GHLEUSi48sLMvily/tA2BmUXqP497xjoVjdQmKcgTDHbX1DeAfxphdQHQE5VGUE4baNj9f+PNmOgLxWMiBRmsuyMrpebR2hWjqtJRKVYuVDysnzUNOWjL7mzqdOSSxyYQLyrKc46gLSxmITU89zpo//2HMzjcsRWKMqTLGPGsva7BdUfrg1y/v488bqvjD6/GK1PubrBFXF88vBmBvfQfRqOFwazeT7DQm0/LTOdDYyaGmLgoyvKR7LcdBbETWimm5nDdXM1gr/fPcvXfz2l8epHL7W2NyvuEO/71LRO6zl982ohIpyglCY4dVeOrFhNohB+yhuxfMLwKgoqGDel+AUMRQblse0wvS2dfQyc46H9MT5oVMzktj83+/jYc/cboWmlIGJC07B4ANj/9jTM43XNdWECu5IsAFIySLopxQvHXYGtL72r4mWmwX1oHGTkqzU5hRkE66x83uWp/jwoolVlwxLY/adj+bK1s5Z3ZPyyM7VRMtKgNjjCHYZf2mOpobx+Scw1UkXUC2iCQDU0ZQHkU5LmnuDPaIhXQEwuxr7OS0qbkYA3vsmiH7mzqZXpCOiDCvNIsdNT521rYD1nwQgLcvKsXjtv4036ZFppQhEuzuIhyyXlw6W1uO0ntkGK4iaQb2AncBr46cOIpy/OEPRVj2zWe48b51TtvOmnaMgauWlgGwt8FSJAcaO5lmj8yaX5rJjpp2th5uIzctmdJsq356dloyly8qYW5xJnOKNaiuDI2Y8sgqLKarrRUTHf3xUMOd2X6N3fQAsHzEpVKU44j71hwAYK2dKwtw0picNasAb5KLvfUdtHWFaOkKMd1ObbKgNBtfIMxT2+pYWJbdw2X13Xcv5q+3nKFuLGXIxBRJ0bTpRCMRujt8o37OIc9sB+4Evo41s302OrNdOcl58q14Ec9mOxZyqLkLt0uYnJdmBc8bO50RW4kWCUBbd4iFCUN7AbxJbme0lqIMhc4W64WmcOoMALrGwL01HNfWjcAMY8wGY8xvjTE6q105aTHGsK+xkxmFlnLYZufMOtDUxaScVJLdLmYWZbC3ocMZsRUbiTW/NIviLKu41IppeeMgvXIi0tnaCkDRtBk91keT4SiSFuBmEfmJiNwgIqeOtFCKMhGpbfPz7rvXOMoCLAvE5w9zxaJSALZVW4HzQ02dzoz0WYUZVDZ3saWqDZfEi0ylJLt57fYLeePLF3KhPRxYUY6VzrYWXO4k8iZNdtZHm+FUSPwO8HHgDmA/cM4Iy6QoE5KX9zSw/mALb//pK076kgO2u2rplBwm5aQ6iuRgs5W1F+Ds2QVEDfx5QyWTclN7zAFxuYSirBSNhSgjRldrC2k5OWTkWhNYx2Lk1pAViYh8A7gKuBg4bIz53xGXSlEmIDtr40HLWM2Q/XbKk+kFGSwoy2JbdRttXSFau0KORXLqlFzy0z34/GHeeWr52AuunFR0+9pJy8wmOSWVJK93YioSY8zXgIC97zUi8qsRl0pRJiDbq9uZlGNNGtxlK5X9jR24XUJ5biqnlGWzv7GTDYesYGcsH5bbJbxtYTHpHjcfSUj5riijQbevnZTMTESE9JzcCRtsB7gXmA/kAz8fOXEUZWLw3X/t5DtP7HDWjTFsr2nnnDmF5KYlO4pkX0MnU/LSSHa7WFiWhTFw35qDiMDyqfEA+pcvn88Tt51NXrpnzK9FObno9rWTmmGNCEzPzp2YFonNp7FS0CcB6tpSTih8/hD3vrKfP6w9RChiTeaqbvPT1h1iQVkWc0syHTfXrlqfMyN94SRrCO9LuxuYV5JFdlqyc8zMlGSnNK6ijCZ+n4/ULOu3mJ7TU5E0V1eNyjmHq0j2AilYqeQ12K6cUPxray2BcJSOQJjNdvGpPXWW4phbnMm8kix21/noDITZ39TJPHs+SElWCsvtUrenTskZD9GV45j9mzbgO8bcWNFoBH9XJykZliJJsxVJKODnhQd+xW8/+0kq1q8dCXF7MFxFsg34N3CjiKw7WmdFOZ54bkc9hZleROCVCusPe2+DNTprVlEGC0qz6ApGeOKtGoyBeSXWH62IcO8NK/jIGdP42FnTx01+5fgjEg7x1+/8N7+//T+P6Tj+jg4whtRM27WVk4O/w8f9X/gPNjz+D5ZcdBlTFi4aAYl7MlxFMhPLrXUPcMNgdxKRS0Vkl4hUiMgRdUzE4qf29i0isixh270iUi8iW3vtkyciz4jIHvs7d5jXpCgA7Kn3cerkHBaWZfGGnfakor6D3LRk8tI9nDErH4B77GqFsRnqAFkpydzxjoXM0MJTyhBoq68HsHJjGTPs4/jtdCipGZkE/d1UbtsCQDQS5j3/9W0u+tgteFLTBjrEsBiuIqk0xjwKVAA7jtYZQETcWEkeLwMWAB8QkQW9ul2GlXZlNnATcHfCtvuAS/s49O3Ac8aY2cBz9rqiHJW27hBv/+nLXPl/r3C4tRuAUCTKwaYuZhZlsGhSDtuq2zHGsLehwxmFVZ6bxrT8NPbUd5CZkuRUMFSU4dJaV+0sNx46MOzjdPssRdLe1Mj9n7+Vym1WYavLP/VZppyy+JhkHIjhKpJLRaQc+AXw40HusxKoMMbsM8YEgYew5qMkchXwgLF4HcgRkVIAY8xLWFmHe3MVcL+9fD9w9ZCuRDlp2XiwhW3V7bx1uI0Xd1nFpw42dRGOGmYVZrBoUjZt3SGqWrrZl6BIAE6fWQDAf12xAJdLJxMqx0Zrba2zHLMihkN7o/U7fuXB+3Enubn447cCEOjuOjYBj8Jws8LlAF8Cvgh8bJD7TAIqE9argFWD6DMJqKF/io0xNQDGmBoR6TPXhIjchGXlMGWKllBRYHuNNQvd7RK2VLXywVVTnHTvM4syiOmH53bU0dgRZFZRXJH81xXzedeySZojSxkR2upqSPJ6wcSVwVA5sGkD/77Xmo2x6MJLOP8jN9Hdbv3GR3sI8HAVyTeAecaYXSISGeQ+fb229XYGDqbPsDDG3IMV02H58uUjckzl+KGtO0QgFKEoK8Vp217TzuS8VKblp7O5ysqfVWEXoJpZmI4nyUWSS/jOkzsBODehTnqaJ0mViDJitNbVkFtcSjgUxNfcNKR9/Z0dvPDAr9n2wrNOid1zP3wjyR4vYq+PtiIZlGtLRNwiUiMiHwMwxlQZY561lwcbk6gCJieslwPVw+jTm7qY+8v+rh+kPMpJxO2PbOHqu14lHIkX+dlR086C0iyWlOewu85HdzDCjpp2yrJTyExJxpvk5uIFxQTCUTxuF7OLNICujA6ttTVkF5eSkVdAxxAUyd4Nb3D/525h+0v/ZuXV72HB2efjcrvxpFoZGJKSk0nJyBz1DMCDUiTGmAiwFWu01nBZB8wWkeki4gHeDzzaq8+jwHX26K3VQFvMbTUAjwLX28vXA2NT7V45bvCHIrywq4HqNj/P7bRHxwTD7G/sZH5pFksn5xCJGt6sbOHNQ62cOiU+8O+/r1yICNx20WxNrKiMGh0tTWQWFJCZlz+oOuvdvnae+NkP+fv3vkFKZhYf+p8fcfYHrsff2UFqVs8iaWORJmUorq004IsicjFxK8EYY3oHzPvEGBMWkVuBpwA3cK8xZpuI3Gxv/wXwBHA51miwLhKGFovIg8B5QIGIVAH/bYz5DVahrYdF5EbgEPCeIVyTchLw+r4mukMRklzCw+squWRhCTtrfRgDC0qzWDUjD7dLeGTDYQ63dnPDmdOcfUuyU9j+9UvxJg13XIqiDEwoGCDY3U16di7JHi8dzU2YaBRx9f2b2732VZ77zd34O3ysvuYDrH7Xe3EnWVkUutpaHfdWjPScnAkVIznd/l5mf2CI8QtjzBNYyiKx7RcJywb4VD/7fqCf9ibgwqHIoZxcvLynEW+Si7cvLuWZ7XVEo4YddqB9QVkWmSnJnDo5h0c2Wukjlk3tORUp1eM+4piKMlJ0t1nxubTsHDxpaUQjEbra20jP6fk77Gxt4bl772bP2jUUTZvJNV/+hlO8KkZXWyvpvRRJWnYuNRW7RvUahqJIdKquMuHpDIR58I1DvHfFZLJSrLe07dXtzC/NYvWMfP668TD7GjvYXt1OVkqSk8337NmFrD/YQlGm94iyt4oymsQKT6Vl5xCNWmOXOpqbHEVijGHHKy/w/H33EAr4Oev917H8ynfhTjry8d3Z1uoUtIoRy7dljBk19+xRFYmIxMbK9ml9JGxvNca0j5RgijJUIlHDB3+9ls2VrQQjUW45bxbGGHbWtnPpKSUss/NfvXmole01lnKJ/WHdcNY0JuWmcsG8oh6FpxRltOlqawWwLAn79+hrbqJ4xizaGxt49td3sf/N9ZTOmcclN99Gfi9FEcMY049rK5dwIEDI3z0qs9phcBbJ/VhKZCBVZrBmnj8wAjIpyrDYXedzkiyuqWjilvNm0eAL0NIVYm5xJjMKMshMSeLlPY3srPHxvhXxP8islGTefZoWnVLGntiIqrTsHNzJlhXta2xgy7P/4sXf/4ZoNMr513+cpZdegcvV/0tOsLuLSCjUpyKxztMyforEGHP+qJxZUUaYmBK5aH4xL+1psIbz2une55Vm4XIJF88v5q9vHgbgisWl4yWqojjELJK07BzcSUmIy8W6xx7B19jAlFMWc/FNnyanuOSox4kppCNiJAmKJLd00kiK7qBDUZTjkqaOAFsPt/Vo21zVSnZqMh9aPYVgOMobB5qdoPq8Eiux4m0XzSbJJZw2NZflOqFQmQB0tbfiSU3DleRm45OPYaJROluaufimW3n3V/9nUEokdhxgAIukdQSl7slwZ7YryrjypUfe4tkddTzyydM5za5EuKmyjSWTc1g9PR+P28UrexrYWetjdlEGOWlWZcKp+enc+5EVTM7TRIvKsVNbsZvimcc2x6irtZWU9HQe+u8vUbN7J970dPLLJ7P4wr5y1A5wnATLJpG4IukrVeHIoBaJctwRjRpe2mPlI/ryX62qAl3BMLvrfCwtzybV42bF9Fye3l7H2v3NnDunsMf+58wpZHqBVitUjo2q7Vv5w1c+y76Nwy/JFAmHqa3YTXtTIy3Vh7n81s8x5ZSldPs6hnysrphrq9ew4dTMLJKSPbQ3jF7SD1UkynHHzlofwXCUOcUZ7KrzUd/uZ1t1O5GoYcnkHMAaznuwqYtgONojR5aijBSV260U7ZXbNg9r//oD+/jjVz5HW0MdGbl5fOSHP2f+2eeTVVBAR1PjkOuSdLY2I+IiNbPn8HURIbu4hLb62n72PHbUtaVMeCJRgzshVfsrFZY18oVL5vHxB9bz2r4mGnwBABaX5wDwzlMn8dbhNqJRw8rpGgtRRp7Du7YDULVj25D2C4dCvP7IQ6x79C+kZGSS5PEye9UZjiWRkZtPKOAn0NVJSvrg87v5mhpJz8vD5T5yZFd2UTFtdaOnSNQiUSY0lc1dnPqNp/mrPescrHkgk/OsOR+ZKUm8vq+JTZWtTMpJpTDTC0BxVgp3fXAZd3/4NJ0Xoow40UiE6t07cbnd1O/fR3CQ9T5q9uzi97ffxtq//Yl5Z57Lh7/9Y8LBABm5+U6fjHyr1s1QkjeClX4+0963N9nFJbTW1x1T9cWBUEWiTGi+/th22v1h/rj2kNO2paqNJeU5uF3CObMLeeKtWt7Y38ySydnjKKlyMtFSW03I383sVWdiTJT6A/sG7B8K+HnhgV/z4H99gWB3N++6/Q4u+9RnCYdDAGTkxq3mzDxLGfiajp68MRFfUwNZ+X27cXOKSgj5u+n2jc6ccVUkyoSlqSPAszvqKMlKYf3BFg41ddHYEeBwazdLbBfWTefMoK07RL0vwIdWTR1fgZWTBp8duJ6+9DQAWgdwGx3aupkHvvAfbHj87yy+6BKu/8FdTD91OQCdzdZIqvQERZJdVAxAW33doOUxxtDR1ERmQd+KJNseQjxacRKNkSgTlk32BMMvXTaXz/xpM09srWFOseUzXlxuWR9LJudw41nTKcjwcuasvs16RRlp2pusON2kuQsQl4vW2iOrXXR3+Hjxd79h2wvPklNcynu/9m0mL+xZN72jxXJfJbq20nNySUr20Fp3tAoaCefytRMOBft3bRVZiqS1tobSWXMHfdzBoopEmRC0+0O8eaiVVdPzSEm2YhobD7WQ5BIuXVjKbybt5+lttVQ2Z5GS7GJRedyN9V9XLBgvsZWTFF9jAyIusgqLyC4sprU2Xn/PGMOu117m+fvuodvXzsqr3s3qd3+AZI/3iON0tFgWSUZe3CIRl4usIQbHfXZ53v4USU5JGeJy0Xy4ss/tx4oqEmVCcNe/K/jlS/uYV5LJE58+G5dLePNQK/NLs0j1uLl4fgk/fnY3Gw+1ctXSMtI8+tNVxg9fUyMZefm43G5ySkod66G9sZ7nfnM3+zauo3jG7D5TvSfS0dJMktd7RA6snCEO141ZSJn9xEiSkpPJKSmjsfJQn9uPFY2RKBOCl/ZYgcWdtT62HG4jEI7w5qFWTrNrg1x9apnT913LNLmiMr60NzY48YicklJaaqrZ+OSj3Pe5T3Fo2xbOu+5jfPBbPxhQiQB0tjSTkZt3xMz47OISWutqBz3Kqr3eitlkFRb126egfApNVaOjSPS1Thl3GjsC7Khp56ZzZvCbVywXVlcgTHcowll23GNqfjpv/tfFbKpq5ZzZGgtRxhdfYwMls+YAkORJIdjdxfP33cO0Jcu46GO3ODGJox6nqYGMvPwj2hNHWaVlHX00YkvNYbzp6UdMRkwkf/IUKta9TjgUIsnOMjxSqEWijDk1bd0Ew1Fnfc1eK+B4+aJSVk3P459banh+Vz3JbuH0mfE/stx0D+fPLdLa6cq4YqJRfE0NpOfm8erDv2fD438DYPU1H+Bd/+/rg1YiAG11tWQXHtk/u9jKTN1SU33Etr5oqTlMbumkAf828sunYEyUluqqfvsMF1UkyphS1+7ngh+8yB2PxWcDr6loJDMliUWTsrl29VQONXfxq5f3s3xqHuleNZqViUVXexuRcJgdLz/P64885AzlzS0tG9JLTjgYpKOl2Rnum0h+uVUvsKnq4KCO1VJbfdQU8QXlU0jJzKKrrW3AfsNBFYkyptz9wl66QxEeeuMQu+usWiGvVDRy+ox83C7hkoUlLCjNwpPk4qtXzB9naRWlJ/6ODp799c8Ba3TWNf/v61z5n7eDSI+RW4OhvdGKa/SlSLILi0jyemkaRHA8FAzga2wgt6RswH75k6dyy6/+wNTFS4ck52DQ1z1lzAhFovx5fSUXzS/ilYpG7l9zgE+cM5Oqlm5uOscKSrpcwoM3rQYgO3Vk/biKMlyMMex85QVe+N1v6Gq33uiv/sJ/UTZnHmANu+1rLslAxCYcZvWhSMTlIn/SZBoHERxvs8+bWzqwIhlNl7AqEmXM2FLVSmcwwjXLysnwJvHY5mpy0ixlcfbs+LBFVSDKRKK5uornfvNzDm3dQsmsOcw761w2Pv4P8ibFRw/mJgwBHiwxRdKXRQJQMHkqB7a8edTjNB22Yh6jVf1wMKhrSxk1dta28/q+eOK5NRXW8uoZ+bxrWTnt/jB3Pb+XC+cVaX0QZUzo9rWz/831g+obCgZ49eHf88AXbqVu314u+tgtfOCb34eowZOaijct/pvNKS4bhkVSizs5mYycvrNT55dPobOl+aj5sRoO7rcsGDuuMh6oIlFGhce31HDpT17m/fe8zoHGTgBe3dvIgtIsctM9nD27gM9cNIfCTC+3XTR7nKVVThZeuP9X/PXOO2i3Z4L3x4FNG3jg87fy+iMPMWf1Wdzw41+w5OLLcbncdpbdwh6uopzSMrp97UNKithaW0N2YTHi6vsxXDRtJgB1+/cOeJyGg/vInzSZJI9n0OceacZUkYjIpSKyS0QqROT2PraLiPzU3r5FRJYdbV8RuUNEDovIJvtz+Vhdj9I/f9lQicdt/bx+//pBGjsCrDvQwvnzLBeWiHDbRbNZ95WLnBoiijKatDc2sHPNSwAc2Lyhzz4dzU388yff5ZHv/DficvHur36Ly//j8z2qDvqaGsjqlRyxcLKVMLTx0IFBy9NUdWhAK6JklvWCVbtn14DHqd+/l8KjTHwcbcYsRiIibuAu4GKgClgnIo8aY7YndLsMmG1/VgF3A6sGse+PjTE/GKNLUY5CRyDMq3ub+PDqqTR0BPjTukrSvUlEooZ3LBk/P65yclOx7nWikQje9HT2v7mhR030SDjMm/96jNf+8kci4TBnvPdDrHjHu/ucuNfe2EDx9Fk92mIP8oZDB45IzNgX4WCQ1toa5p5xdr99vGnp5JWVU7N3d799utpa6WhpPuoM+tFmLIPtK4EKY8w+ABF5CLgKSFQkVwEPGCsvwOsikiMipcC0QeyrjBPBcJRktzim/ku7GwiGo7xtYTEFGV4e21zN/z63h3klmcwtyRxnaZWTlebDlXjT05mz+ix2rXkZE40iLhcHtrzJ87/9Jc3VVUxfehrn3/CJfofSBrq66G5vO2KkVVp2DqlZ2TQcPDA4WaqrMCZK/qTJA/YrnT2X/Zs2YIzpc9RV7b49QNwNNl6MpSKZBCSmnqzCsjqO1mfSIPa9VUSuA9YDnzPGtPQ+uYjcBNwEMGXK+AWlTjT8oQiX/OQlpuSlcc+1y0n1uHl6Wy25acksn5pLktvFFy+dy/oDLXzl7TovRBk/mquryCsrp2zOfN567ikObt3E5qefoGLd6+QUl3L1F7/GzNNWDniMlprDAD1GbIHlqi2cMo3GQ/sHJUuTnYU3f/LANXTK5sxn24vP0VJzmLyyI3PMVW3fisudROnsOYM672gxljGSvgYx985I1l+fgfa9G5gJLAVqgB/2dXJjzD3GmOXGmOWFhX1nyFSGzp/WVXKwqYuX9zTy3X/tJBSJ8u+d9Vw4v5gkO0Zyy3mzuPcjK5hZOPj604oy0liKZDIFdlzib3d+nQNb3uSs91/H9T/8+VGVSOwYAHmlRz7UC6dOp/HQQSLh8FGP01R5CHG5jjpkd8qipQAc7GcYcNX2rZTMmkOyN+Wo5xxNxlKRVAGJdlw50HsqaH99+t3XGFNnjIkYY6LAr7BcaMoYYIzh3lf3s3xqLu8+rZyH1h3igdcO0u4P87YFfY+NV5TxINDVSWdLM+FQkEd/9G3AKvb00R//klXvfO+gkxi2VFchLhc5JUfmxyqdPZdwKEjDwaNbJXX79pBfPuWo580pLiGnuLTP+SRBfzd1+yson79wULKPJmOpSNYBs0Vkuoh4gPcDj/bq8yhwnT16azXQZoypGWhfO4YS453A1tG+EMViR42Pg01dvPu0cm4+dyahiOGb/9zOkvJsLpyvikSZOOx89UUAdq15iZSMTAqmTCU1M6vfQlD90Xy4ipziEtxJRyqA0tnWLPfq3TsHPIYxhtqK3ZTOGpw7auriU6ncuoWQ39+j/cCmDUQjEaYuOnWQ0o8eY6ZIjDFh4FbgKWAH8LAxZpuI3CwiN9vdngD2ARVY1sUtA+1r7/M9EXlLRLYA5wOfGatrOtnY19DBH9YeJBq1vIpPbatFBC6cX8ysogz++LFVXLqwhO+/Zwlul2boVcaf5uoq/v79bzn5sc76wPV8+M6fMOWUpdQf2Ec0Ehna8ewsu32RVVBIRl4+NXsGViSttdX4OzsoGWTJ27lnnE0o4Kdi/es92ne9/ipp2TmULxh/i2RMU6QYY57AUhaJbb9IWDbApwa7r91+7QiLqfTB1sNtvPsXa/CHohgDH1w5hX9sOsyKaXkUZlolRFfNyGfVjCNrKyjKWNPV1sqavzzIlmefJNnrpXz+KRzetZ3lV7wTl8tNyYxZbAwGaDpcSeGUaYM6ZjgUovlwlZPtty/K5synaue2fkdZAdRWWMN5B2uRlM9bSFZhEVtfeJb5Z50HgL+zg30b32DhORfgcrkHdZzRRGe2K4Pit68eIMnlYuX0PO58cif3vrqfA01dXLt64FEnijKW+Ds6eOWh3/HrT3+cLc8+yeKLLuPG//0VKRkZ5JaU4U6y3p2LZ1qT/er27hn0sZsqDxKNhI+YQ5LI1EVL6WhqHLA2euWOrXhS0wad0kRcLhZfeCmH3trE4V07ANj4xD8IBwIsvuiyQcs/mqgiUY6Kzx/iibdquHJJGT967xJcAt96fAeT81K57JTBF/FRlNEi0NXFa488yK//40bW/u1PTD91Odf/4C4uuvGTpGXn0Hy4qleSxTI8qWnUDkGR1O2vAKB4ev9zNqYtsZJx7N/U98x5YwwHt7zJlFOW4HIP3pJYdtk7SM/J5Zl7/o9dr73C+sf+xqwVp4/7RMQYmv1XOSqPba6hOxThfSsmU56bxi+vXc7Lexq49vSpzhBfRRkPQn4/m55+nDcefQS/r52Zy1dzxns+2OMBGwmHaa2rYdaK1U6buFyUzJxFzVHSjyRSt68Cb1o62cX9vzxlFRaRN2ky+99cz/Ir3nnE9paaatob6ll51bsHfV6A5JQULv+Pz/P3732Tf/7kTnJKSrnwozcffccxQhWJ0gNjDDfev556n5+vvn0Bq2fk86f1lcwtzmRJuVU7+vSZ+T1K4CrKWNPd4ePNJx/jzX89hr/Dx7Slp3Hmez7k1FFPpK2+lmgkQl6vWeTl8xex5i9/pLvDR2rG0TMu1O2roGj6zKPW9Zi98gze+Puf6Wxt6ZGjC2DfhrUATF28rK9dB2TKKUu4/gc/o6mqkrK580lJnzjzsvR1UunBY1tq+PfOerYebueWP2zk4XWVbK5s5T3Ly7VWujLu+JobeeGBX/OrW27gtb/8kbK58/nAN7/PNf/v630qEcBJW9I7JjH5lMVgDFXb3jrqeQNdndTv38ekeQuO2nf+WedhTNQZcpzI9pefp2TWHHIGsGoGIruohBnLVkwoJQJqkSgJGGP4qZ0T66cfOJV3/OwVvvjIFuaVZPKhVRpUV8aHjuYmGisPsuu1l9n+0vMYE2Xemeey4h3XDGrEVd3+ClzuJAp69S21Z4Qf3LqZ2avOGPAYh3dux5gokxcsOur58ssnUzJzNpufeYJTL7vSGVVVf2AfDQf3c8EEckmNFKpIFIf1B1uoqO/ge9csZk5xJk/edg5PvFXDVUvLSPWM/xBD5eQiEg6z6al/8sIDvwYgyeNh0YWXsOLKd5JdNPg3+rp9FRRMnnrELHJ3UjKTT1nMvo1vYD5684AWd+X2t3AnJVFql9Y9GiuuejeP/eg77Hr1JeaffT4Ar/3lQTypqcw789xBy368oIrkJCYaNRxs7nKqEz7w2kEyvElcscRKFjC9IJ1Pnd//UEdFGQ06W1vY+vwzbHr6cTqa4xU2L/joJ1l0/sVDOpYxhvr9e5m98vQ+t89ecTr7NrxB/f69FM/o/7d+YNMGyubMJ9njHdR5Z684ncJpM3j+/l8xad5C6vZXULHuNc5474cGFY853lBFcpLSFQzzid9t4OU9jVx3+lTefVo5/9xSzSfOmUmaR38WytgSCYfYt3EdW194lv1vrsdEo0w5ZQmBzk5mrzqT6t3b2f7ic0NWJO0Ndfg7fBT1M/djxmkrEZeL3Wtf7VeRNFcfprHyIOdf//FBn1dcLt7+6S/why9/lns/8wki4TCls+f2OZLrRECfGCcpv331AC/vaeSShcU88NpBfv/6QbJTk/nkueNb10A5uWg8dICtLzzD9pdfoLu9jfTcPJZf+S5OOe8iouEw93/hViYvXEROcQlr/vJHfE2NQ8qPVWkH0vsLkqdlZTNt8alsf+nfnPneD/c5t6Ni3WsAzOrHqumP/EmTufa7/8vGJx4lLTubUy+9ctyz9I4WqkhOQjoDYX798j7On1vIL69dzj82Heb5nfX8x4WzyU4bXBZURRkuzdWH2bP2VXa//ir1B/bicicxc/lKTjn/YqYtXuY8zDc9bWVEKp+3EGOirPnzH9i15iWWX/muQZ+rctsWUjOznNTxfbHowkt49IffZt+b65m1vGeJJGMM2154ltJZc8kqKBryteaWlE2o+R6jhSqSk5Dfv36Qlq4Q/3GhlSbiqqWTuGqplsBVRgdjDE1Vh9j9+qvsWfsqjZUHASvt+vnXf5x5Z51HWlb2Efsd3rmN9Nw8sotLEBGKZ8xm5xAUiTGGQ9vfYvKCRYir/5kOM5atJCO/gPWPPcLM01b2CLof2rqZ5uoqLr1Fc8EOhCqSk4DWriC7an0sKMsiEjX86uV9nD27gGVTco++s6IMA2MM9Qf2WZbH2jW0VFeBCOXzFnL+R25i9sozBnRRGWOo2rmNSfMWOg/2eWeew4u/+w0tA2TgTaSp6hAdTY1Meef7BuznTkpi1VXv4bl77+bApg1OUkZjDK8/8hCpWdnMPb3/2uqKKpITnqaOAFf+3ytUt/kpyvRSnJVCe3eYL14yuGGMijJYjDHU7t1tWR5vrKGtrhZxuZi8YBHLLnsHs1eefsRM7/5ob6ino6mRSXPjsY25Z5zNi7+/l+0vP8+Z7/3wUY+xZ+0aEOmRGqU/TrngbWx88lGe/tXPuO67PyU1M4ttLz5H1Y6tXPSxT5Hk8QxK7pMVVSQnOF/9+1YaO4N895pF/HHtIZo6g3zv3YtZVH6kK0FRhoqJRjm8ewd71q5hz9o1+JoacLmTmLJoCauufi8zl6/q0211NA7vtMoNJVb/y8wrYMapy9ny7L9Y/a739VlcKpE9a19l0tz5g1JeScnJXP4fn+ehr32BB//rC0xbsozNzzxB+YJTWHTh24Ys/8mGKpITmA0HW3hyay2fvXgO71sxhfetGFzaakUZiGgkQtWObexe+yoV616js6UZd3Iy05Ys48z3fZiZp60iJePYUngc3PKmU8kwkVMvuYJHvvPf7Hz1JRaee2G/+9ftq6Dh0AHO/8gnBn3OkpmzefdXvsXT9/wfm556nFkrVnPJJ2+bEPU+JjqqSE5QIlHDHY9uozDTy8fOnj7e4ijHOZFwmMqtm9n9xhoq3niNbl87SR4v0089jTmrzmTGshV4UtNG5FzRaIT9dqyi90N86uJTKZw6nbV/+xPzzzqv31Tsm599kiSPlwXnnD+kc5cvOIWP/uSXRMJhp3aJcnT0Tp1A7K7z8a+ttSyZnMPLuxt463AbP/3AqTrBUBkW4VCIg1veZM/aNexd/zr+zg6SU1KZedpKZq86g+lLTiM5ZeTnRdRW7Kbb186MZSuO2CYuF2e850P84wff4q1/P82Si48s7NTR0syOl55n3lnnDTu5oSqRoaF36wRhTUUj1977BhG7njrAB1dN4crFpeMolXK8EQr4ObB5I7tff5V9G9cR7O7Cm5bOzOWrmLP6TKYuOnXUA887XnkRd1KSUySqNzOXr2LygkW88uD9zFqx+ogYyNq//YloNMKqq98zqnIqcVSRnAC0dAa57U+bmF6QzgMfXUlFfQdul3DGzHxN/a4claC/m30b17Fn7Rr2vbmOcCBASmYWc1afxZzVZzLllMVHDWyPFKFggB2vPM/sVWf2a02ICBfeeAu/v/02nvjZD7nmy193XGCHd+1g89NPsviiS8kpOX5foowxGBMkGg0SifiJRv1EowEiUT/RiLUcXw8kbA842yPR+H7RSGw9wKyZXyAra/GIyquK5ATgO0/uoLkzyP03rKQsJ5WynNTxFkmZ4Pg7O9i34Q12r13Dwc0bCYeCpGXnsPCcC5m96gwmL1g0pFKwI8WOl54n0NnJogsuGbBffvlkLvjozTz9y5/y+E9/wNtuupW2+joe+9G3ySwo4OwPfmTEZDIm0uNhHo0G7HXrAR5JeFj3eIBHYtsD9vaEvn0+8IM9jgvmqLL1h4gHt9uLy5WCy2V9W+tejAmP2L2JoYrkOOeZ7XU8vL6KT5w7gwVlWeMtjjKB6WprpWL96+xZu4ZDWzcTjUTIyMtn0UWXMGfVmZTNnT+uI5TCwSCv/fUhSmfPZfLCI+t+GGPiD+Gon5mr53Jm12Vs/NffuO8rz4CESStN44z3vY/mtieJtPT1APf3+cCPRAMJb+8JD/+o/5gevCLuhIe5F7c7/mB3ubwkJ+fgdac4625XCi77ge9OUAI921J6HcuLy52CO+G4ImNbs1CMGb7WO15Zvny5Wb9+/XiLMSzCkSi/ffUAGw62kOZ188RbNcwqyuCRT56BN0mHKSo98TU1sueNNex5Yw2Hd1jFmXKKS5m96gxmrzyDkpmzB0wf0heW2yUcf9t2XCv+Xm/rgYS3db/dP2g/vP09t0cDNFXvx9dUQ/7kMpK8rgR3TLzPsdDXw9rlSok/sN2x7fFla3viw7q/h3vsrT8Fl8tjnysFl6v/d3UTNfia/XS0Bgh2hxGX4PG6Sc/1kpGbgss18dzSIrLBGLO8d7taJMcRxhj+80+b+OeWGqbmp9EZiHDO7EK+dfUpqkROUoyJJDy8/YTD3dTtq+DQlm0cemsnjQeqAcguyWXhxYsoW1RCZnEKxnTRFfknFXv7ehu33Cw9FUO8LRLxA9FhyyziweXy2A9d6yEcCRo6mmtIy8onI3tKP2/nsQe+t4+Hf++3854uHRHPuMULw6EIbfXdtNR20VrXSUttF801nbTWdhEO9X0fXW4hMz+F7IJUMgtSycj12p8UMnK9pGV6SE5xT5gYqCqS44jfvX6Qf26p4fNvm8OtF8web3GUBOJul94P30APH3lfbf27XY50sxzxxh8K09WQQld9Kp11qXRUpxEJJAGGtCI/pSt8ZM/wkZITBNZQ3wH1HTGpXT0e5nF3ie12ScpOeFgf+bbe++087lpJ6fmw7+WGEen50lOzZxePfOdrZOTO5gPf/D7etPQh3XdjrLd7E40vR6OGaMQQiUIwajAmQDRqMFG7r7H6YLDbDZGIIRKJEokaQuEokbAhEjWEIxEiEUM4YohGooQjUYKBKMFAmKA/QjAQIRSMEApECPjDBPwRgoEwIX+EUDBKKBDB2PEOA7g9bpK9bpJykkjyuHC5XSDWtUTChkgoQiRkaOjyE9nXTXR3lJjnSACM2AvgEkAE+8vebn0nqhgBxHY+Lb1yOpdfMmPQ93gwjKkiEZFLgf8F3MCvjTF39tou9vbLgS7gI8aYjQPtKyJ5wJ+AacAB4L3GmJaxuJ6xZHNlK9/65w7On1vILedp1cL+GHC0S48AZyBh9Et/AVH7LbyPttixIxF7n0gIomCM2A8zwUTd9rcLE3WB/R3/xLcJHjBexHhAkhGTDMaDkAImg2jIRSQohAMQDkQJtAfobu8i0N7lPGRSMjPJn1JK/uQZ5E6aTnJKFkISkAyRJHvZ/kRdRI2LSMR6oEYiUcJRQyBiPTwjEfvhGrUenhH74WwihoixvqNR6yEctR/MsQe49e3HRLvtdpztxgCxB74xhANBgt3duLzXE4mm8cuvrgf7AW91Ir6MtSx2W++H5UTCY38serkO/YA/QpQwURIuEUCs3gK4JRZuF4yI1UesD/S8NQbrniYeD7s91jf2HfVHRvhqx1CRiPUachdwMVAFrBORR40x2xO6XQbMtj+rgLuBVUfZ93bgOWPMnSJyu73+pbG6rrGgot7HTb9bT2Gmlx+9d+mwfafRSIRIOEI0HCUSiVjrkSjRcIRoOEIkEsFE7G1ha3s0th6J2p/YflbfaDTeZiLG6huNEAkHiYZDRCIhopEQ0UiYSCRM1P6YSJhINGztFw0TjdrHsL+jJoKJRDBR6xwmGsWYqLOOidoPJvsb60GF/YYaewg5f1Cxdecvyv4Tc/olbDQmtpP9h2jibbjAeLEeE8eWBqSf/yUgYH/6w4O4sxBXGS5vHi53Ca6kUnCl0d4I7Y2w/02AkP3pHsLZrSvu8YATjnjgRTHWQ613XyAqvfrZx+jdNxprT/Za/3/hINDzoYfdh4SHJxLf2HudHusmvqNYCkjEGj4s9iu8W0BcgojgcoHLJbhErG+39Z3ksr7dbiEpyUWy101yshuP1/p4U9x4UpJISU0iPdODNyXJ6ut24U4Skt1uktzgTnKT7HaRZB/HnXDsJJfY6y5ctowjRTRqiISiRMJRohGDN3XkH/tjaZGsBCqMMfsAROQh4CogUZFcBTxgrFes10UkR0RKsayN/va9CjjP3v9+4AVGSZH87EMfIRQJ9mgzPX7BPbcMv+3I9vfa6/fe+PO+9zO923r8uQ5wnolM7N1M4svWEwBx2nt+RBLfU2N9SegT/9fZ4jxvxDH/OaI39ltwrLPpeZa4hko4hrHPGmuzFJI4/Yx9PNNjXZx+xj6uwWUM7qjBRRQhhNAIph6J/f+aqL1fFIha7dbrv32Mvtus5fhvZKK+4R8vdDMUtT0+tBZ4+eBDb47oMcdSkUwCKhPWq7CsjqP1mXSUfYuNMTUAxpgaEemzjJmI3ATcBDBlyvCSF7oJY/AOeb9B/3Ee8RA7tuNLzDA2Cf2chxfOAy32gJSEZUh8kOE80OJtUbs9ah836hwj9mCyHoyW9RBbTnyoOW3RaEKbta/LebhF9eGmKBOcsVQkfT0Per8m99dnMPsOiDHmHuAesIb/DmXfGJ/8w++Hs5uiKMoJzVjOWqkCJieslwPVg+wz0L51tvsL+7t+BGVWFEVRjsJYKpJ1wGwRmS4iHuD9wKO9+jwKXCcWq4E222010L6PAtfby9cD/xjtC1EURVHijJlryxgTFpFbgaewhvDea4zZJiI329t/ATyBNfS3Amv47w0D7Wsf+k7gYRG5ETgEaMpPRVGUMURTpCiKoiiDor8UKWOb2UtRFEU54VBFoiiKohwTqkgURVGUY0IViaIoinJMnJTBdhFpAA4Oc/cCoHEExRktVM6R43iQEVTOkeR4kBHGXs6pxpjC3o0npSI5FkRkfV+jFiYaKufIcTzICCrnSHI8yAgTR051bSmKoijHhCoSRVEU5ZhQRTJ07hlvAQaJyjlyHA8ygso5khwPMsIEkVNjJIqiKMoxoRaJoiiKckyoIlEURVGOCVUkQ0BELhWRXSJSYdeHH09ZDojIWyKySUTW2215IvKMiOyxv3MT+v8/W+5dInLJKMp1r4jUi8jWhLYhyyUip9nXVyEiP5WRLGLdv5x3iMhh+55uEpHLx1NOEZksIs+LyA4R2SYit9ntE+p+DiDnhLmfIpIiIm+IyGZbxq/b7RPtXvYn54S5l31ijNHPID5Y6ev3AjMAD7AZWDCO8hwACnq1fQ+43V6+HfiuvbzAltcLTLevwz1Kcp0DLAO2HotcwBvA6VjVMZ8ELhsDOe8APt9H33GREygFltnLmcBuW5YJdT8HkHPC3E/7eBn2cjKwFlg9Ae9lf3JOmHvZ10ctksGzEqgwxuwzxgSBh4Crxlmm3lwF3G8v3w9cndD+kDEmYIzZj1XvZeVoCGCMeQloPha5xKp0mWWMec1YfxEPJOwzmnL2x7jIaYypMcZstJd9wA5gEhPsfg4gZ3+MuZzGosNeTbY/hol3L/uTsz/G7W8oEVUkg2cSUJmwXsXAfyyjjQGeFpENInKT3VZsrIqS2N9Fdvt4yz5UuSbZy73bx4JbRWSL7fqKuTnGXU4RmQacivWGOmHvZy85YQLdTxFxi8gmrHLczxhjJuS97EdOmED3sjeqSAZPX/7F8Rw7faYxZhlwGfApETlngL4TTfYY/ck1XvLeDcwElgI1wA/t9nGVU0QygEeA/zTGtA/UtR95xkvOCXU/jTERY8xSoBzrrf2UAbqP273sR84JdS97o4pk8FQBkxPWy4HqcZIFY0y1/V0P/A3LVVVnm7TY3/V29/GWfahyVdnLvdtHFWNMnf1HHAV+Rdz9N25yikgy1sP5D8aYv9rNE+5+9iXnRLyftlytwAvApUzAe9mXnBP1XsZQRTJ41gGzRWS6iHiA9wOPjocgIpIuIpmxZeBtwFZbnuvtbtcD/7CXHwXeLyJeEZkOzMYKxI0VQ5LLdjH4RGS1PdLkuoR9Ro3YA8XmnVj3dNzktI/5G2CHMeZHCZsm1P3sT86JdD9FpFBEcuzlVOAiYCcT7172KedEupd9MlpR/BPxA1yONSJlL/CVcZRjBtZIjc3AtpgsQD7wHLDH/s5L2Ocrtty7GMXRG8CDWKZ3COut6MbhyAUsx/pj2Qv8DDsLwyjL+TvgLWAL1h9o6XjKCZyF5Y7YAmyyP5dPtPs5gJwT5n4Ci4E3bVm2Al8b7t/MKN/L/uScMPeyr4+mSFEURVGOCXVtKYqiKMeEKhJFURTlmFBFoiiKohwTqkgURVGUY0IViaIoinJMqCJRlGNARHJE5JaE9TIR+csonetqEflaP9s67O9CEfnXaJxfUfpDFYmiHBs5gKNIjDHVxph3j9K5vgj8fKAOxpgGoEZEzhwlGRTlCFSRKMqxcScw064R8X0RmSZ2jRMR+YiI/F1EHhOR/SJyq4h8VkTeFJHXRSTP7jdTRP5lJ+B8WUTm9T6JiMwBAsaYRnt9uoi8JiLrROSbvbr/HfjQqF61oiSgikRRjo3bgb3GmKXGmC/0sf0U4INYuZH+B+gyxpwKvIaVtgLgHuA/jDGnAZ+nb6vjTGBjwvr/AncbY1YAtb36rgfOHub1KMqQSRpvARTlBOd5Y9Xo8IlIG/CY3f4WsNjOmHsG8OeEAnbePo5TCjQkrJ8JXGMv/w74bsK2eqBsZMRXlKOjikRRRpdAwnI0YT2K9ffnAlqNlTZ8ILqB7F5t/eU3SrH7K8qYoK4tRTk2fFjlZYeFsep27BeR94CVSVdElvTRdQcwK2H9VawM1HBkPGQO8eywijLqqCJRlGPAGNMEvCoiW0Xk+8M8zIeAG0Ukls25rxLOLwGnStz/dRtWQbN1HGmpnA88PkxZFGXIaPZfRTlOEJH/BR4zxjx7lH4vAVcZY1rGRjLlZEctEkU5fvg2kDZQBxEpBH6kSkQZS9QiURRFUY4JtUgURVGUY0IViaIoinJMqCJRFEVRjglVJIqiKMoxoYpEURRFOSb+PwGqSLv9Z3d4AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    +       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    +       "       2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n",
    +       "       6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n",
    +       "       7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n",
    +       "       1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n",
    +       "       1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n",
    +       "       2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n",
    +       "       2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n",
    +       "       2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n",
    +       "       3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n",
    +       "       3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n",
    +       "       3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n",
    +       "       4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n",
    +       "...\n",
    +       "       2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n",
    +       "       2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n",
    +       "       2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n",
    +       "       2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n",
    +       "       2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n",
    +       "       2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n",
    +       "       2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n",
    +       "       2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n",
    +       "       2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n",
    +       "       2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n",
    +       "       2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n",
    +       "       2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n",
    +       "       2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n",
    +       "       2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n",
    +       "       2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n",
    +       "       2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n",
    +       "       2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n",
    +       "       2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n",
    +       "       2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n",
    +       "       2.95109669e-02])\n",
    +       "Coordinates:\n",
    +       "    id        int64 101\n",
    +       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + ], + "text/plain": [ + "\n", + "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n", + " 6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n", + " 7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n", + " 1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n", + " 1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n", + " 2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n", + " 2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n", + " 2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n", + " 3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n", + " 3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n", + " 3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n", + " 4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n", + "...\n", + " 2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n", + " 2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n", + " 2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n", + " 2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n", + " 2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n", + " 2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n", + " 2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n", + " 2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n", + " 2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n", + " 2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n", + " 2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n", + " 2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n", + " 2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n", + " 2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n", + " 2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n", + " 2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n", + " 2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n", + " 2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n", + " 2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n", + " 2.95109669e-02])\n", + "Coordinates:\n", + " id int64 101\n", + " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff['rmag'].sel(id=101)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in new file mode 100644 index 000000000..7c1b15bd6 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in @@ -0,0 +1,49 @@ +16 +101 +-0.0658187108448175795 0.30391138014159824188 0.030872485461978960153 +-0.030537616761930286291 -0.0049297226604189817514 0.0026371811668407158825 +102 +-0.065864832257480881994 0.3038652587289349949 0.030872485461978960153 +-0.035744715705948587603 -0.0049297226604189817514 0.0026371811668407158825 +103 +-0.6526399503364792576 -0.30651935535365792962 0.033456491497379246824 +0.014807065041004032965 -0.0184014319837384685 -0.0007407193515014080928 +104 +-0.65275437091742372075 -0.30663377593460228177 0.033456491497379246824 +0.0021125976303132450868 -0.0184014319837384685 -0.0007407193515014080928 +105 +0.58052308875528702004 -0.8331397763444912119 3.7646553415201541957e-05 +0.020730998066553867065 0.009770187318278569788 -5.1179589633921335467e-07 +106 +0.58040263294340799227 -0.83326023215637023966 3.7646553415201541957e-05 +0.0069421175980061153657 0.009770187318278569788 -5.1179589633921335467e-07 +107 +-1.5891096979602641337 0.49388011604967890777 0.049330990309104823244 +-0.00055132825635455804184 -0.012168467501132099878 -0.00016594932370266260858 +108 +-1.5891737827877718825 0.49381603122217127 0.049330990309104823244 +-0.0067102864528023435653 -0.012168467501132099878 -0.00016594932370266260858 +109 +4.1155004823659924185 -2.893171407164709663 -0.080043092204059404504 +0.0411371945893665783 0.006534697671907701254 -0.00012233719535540690457 +110 +4.114178684349798054 -2.8944932051809040274 -0.080043092204059404504 +-0.032627239813928281265 0.006534697671907701254 -0.00012233719535540690457 +111 +6.3594761400945154506 -7.652737529060036792 -0.12000977499446359442 +0.02609853948273724994 0.0035590677039893160206 -0.00022043610541731448703 +112 +6.3583751553842544624 -7.65383851377029778 -0.12000977499446359442 +-0.01812779828432992818 0.0035590677039893160206 -0.00022043610541731448703 +113 +14.817019253266252576 13.049505570448612701 -0.14351615042000470668 +0.010470241012353788054 0.002774730265364384104 4.416262654344997005e-05 +114 +14.8165397372918477 13.049026054474207825 -0.14351615042000470668 +-0.015719286064969997113 0.002774730265364384104 4.416262654344997005e-05 +115 +29.564692754289236376 -4.5822270889269072214 -0.5870359532621901577 +0.014900470225798949711 0.0031282868879460171488 -7.5042704502708602616e-05 +116 +29.564227229396802699 -4.582692613819337346 -0.5870359532621901577 +-0.013970801400757312458 0.0031282868879460171488 -7.5042704502708602616e-05 From 79ea6ac4ba91d75a49f0fff51e5182e806001614 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 28 Jul 2021 22:33:53 -0400 Subject: [PATCH 107/194] Reset the first flags after an interpolation step --- .../.idea/.gitignore | 0 .../swiftest_symba_vs_swifter_symba.ipynb | 4 +- .../9pl_18tp_encounters/cb.in | 5 - .../9pl_18tp_encounters/cb.swiftest.in | 5 - .../9pl_18tp_encounters/init_cond.py | 134 ------------ .../9pl_18tp_encounters/param.swifter.in | 26 --- .../9pl_18tp_encounters/param.swiftest.in | 36 ---- .../9pl_18tp_encounters/pl.in | 33 --- .../9pl_18tp_encounters/pl.swifter.in | 36 ---- .../9pl_18tp_encounters/pl.swiftest.in | 33 --- .../swiftest_symba_vs_swifter_symba.ipynb | 194 ------------------ .../9pl_18tp_encounters/tp.in | 49 ----- src/symba/symba_step.f90 | 3 + 13 files changed, 5 insertions(+), 553 deletions(-) rename examples/symba_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/.idea/.gitignore (100%) delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in delete mode 100755 examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb delete mode 100644 examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore b/examples/symba_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore similarity index 100% rename from examples/symba_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore rename to examples/symba_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore 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 f41a4eb16..c7a3b052b 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 @@ -622,7 +622,7 @@ " 2.95109669e-02])\n", "Coordinates:\n", " id int64 101\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    • id
      ()
      int64
      101
      array(101)
    • time (d)
      (time (d))
      float64
      0.0 11.0 ... 3.641e+03 3.652e+03
      array([   0.,   11.,   22., ..., 3630., 3641., 3652.])
  • " ], "text/plain": [ "\n", diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in deleted file mode 100644 index 81c636655..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.in +++ /dev/null @@ -1,5 +0,0 @@ -0 -0.00029591220819207774 -0.004650467260962157 -4.7535806948127355e-12 --2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in deleted file mode 100644 index 81c636655..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in +++ /dev/null @@ -1,5 +0,0 @@ -0 -0.00029591220819207774 -0.004650467260962157 -4.7535806948127355e-12 --2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py deleted file mode 100755 index 18ef4ce48..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/init_cond.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python3 -import numpy as np -import swiftest -import swiftest.io as swio -import astropy.constants as const -import sys -import xarray as xr - -# Both codes use the same tp input file -tpin = "tp.in" - -swifter_input = "param.swifter.in" -swifter_pl = "pl.swifter.in" -swifter_bin = "bin.swifter.dat" -swifter_enc = "enc.swifter.dat" - -swiftest_input = "param.swiftest.in" -swiftest_pl = "pl.swiftest.in" -swiftest_cb = "cb.swiftest.in" -swiftest_bin = "bin.swiftest.dat" -swiftest_enc = "enc.swiftest.dat" - -sim = swiftest.Simulation() - -sim.param['T0'] = 0.0 -sim.param['DT'] = 1.0 -sim.param['TSTOP'] = 365.25e1 -sim.param['ISTEP_OUT'] = 11 -sim.param['ISTEP_DUMP'] = 1 -sim.param['CHK_QMIN_COORD'] = "HELIO" -sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M -sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" -sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M -sim.param['CHK_RMAX'] = 1000.0 -sim.param['CHK_EJECT'] = 1000.0 -sim.param['OUT_FORM'] = "XV" -sim.param['OUT_STAT'] = "UNKNOWN" -sim.param['GR'] = 'NO' -sim.param['CHK_CLOSE'] = 'YES' -sim.param['RHILL_PRESENT'] = 'YES' -sim.param['MTINY'] = 1.0e-12 - -sim.param['MU2KG'] = swiftest.MSun -sim.param['TU2S'] = swiftest.JD2S -sim.param['DU2M'] = swiftest.AU2M - -bodyid = { - "Sun": 0, - "Mercury": 1, - "Venus": 2, - "Earth": 3, - "Mars": 4, - "Jupiter": 5, - "Saturn": 6, - "Uranus": 7, - "Neptune": 8, -} - -for name, id in bodyid.items(): - sim.add(name, idval=id) - -ds = sim.ds -cb = ds.sel(id=0) -pl = ds.where(ds.id > 0, drop=True) -npl = pl.id.size - -ntp = 16 -dims = ['time', 'id', 'vec'] -tp = [] -t = np.array([0.0]) -clab, plab, tlab = swio.make_swiftest_labels(sim.param) - -# For each planet, we will initialize a pair of test particles. One on its way in, and one on its way out. We will also initialize two additional particles that don't encounter anything -tpnames = np.arange(101, 101 + ntp) -tpxv1 = np.empty((6)) -tpxv2 = np.empty((6)) - -p1 = [] -p2 = [] -p3 = [] -p4 = [] -p5 = [] -p6 = [] - -for i in pl.id: - pli = pl.sel(id=i) - rstart = 2 * np.double(pli['Radius']) # Start the test particles at a multiple of the planet radius away - vstart = 1.5 * np.sqrt(2 * np.double(pli['Mass']) / rstart) # Start the test particle velocities at a multiple of the escape speed - xvstart = np.array([rstart / np.sqrt(2.0), rstart / np.sqrt(2.0), 0.0, vstart, 0.0, 0.0]) - # The positions and velocities of each pair of test particles will be in reference to a planet - plvec = np.array([np.double(pli['px']), - np.double(pli['py']), - np.double(pli['pz']), - np.double(pli['vx']), - np.double(pli['vy']), - np.double(pli['vz'])]) - tpxv1 = plvec + xvstart - tpxv2 = plvec - xvstart - p1.append(tpxv1[0]) - p1.append(tpxv2[0]) - p2.append(tpxv1[1]) - p2.append(tpxv2[1]) - p3.append(tpxv1[2]) - p3.append(tpxv2[2]) - p4.append(tpxv1[3]) - p4.append(tpxv2[3]) - p5.append(tpxv1[4]) - p5.append(tpxv2[4]) - p6.append(tpxv1[5]) - p6.append(tpxv2[5]) - -tvec = np.vstack([p1, p2, p3, p4, p5, p6]) -tpframe = np.expand_dims(tvec.T, axis=0) -tpxr = xr.DataArray(tpframe, dims = dims, coords = {'time' : t, 'id' : tpnames, 'vec' : tlab}) - -tp = [tpxr] -tpda = xr.concat(tp,dim='time') -tpds = tpda.to_dataset(dim = 'vec') - -sim.ds = xr.combine_by_coords([sim.ds, tpds]) -swio.swiftest_xr2infile(sim.ds, sim.param) - -sim.param['PL_IN'] = swiftest_pl -sim.param['TP_IN'] = tpin -sim.param['CB_IN'] = swiftest_cb -sim.param['BIN_OUT'] = swiftest_bin -sim.param['ENC_OUT'] = swiftest_enc -sim.save(swiftest_input) - -sim.param['PL_IN'] = swifter_pl -sim.param['TP_IN'] = tpin -sim.param['BIN_OUT'] = swifter_bin -sim.param['ENC_OUT'] = swifter_enc -sim.save(swifter_input, codename="Swifter") diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in deleted file mode 100644 index d87472e35..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swifter.in +++ /dev/null @@ -1,26 +0,0 @@ -! VERSION Swifter parameter file converted from Swiftest -T0 0.0 -TSTOP 3652.5 -DT 1.0 -ISTEP_OUT 11 -ISTEP_DUMP 1 -OUT_FORM XV -OUT_TYPE REAL8 -OUT_STAT UNKNOWN -IN_TYPE ASCII -PL_IN pl.swifter.in -TP_IN tp.in -BIN_OUT bin.swifter.dat -ENC_OUT enc.swifter.dat -CHK_QMIN 0.004650467260962157 -CHK_RMIN 0.004650467260962157 -CHK_RMAX 1000.0 -CHK_EJECT 1000.0 -CHK_QMIN_COORD HELIO -CHK_QMIN_RANGE 0.004650467260962157 1000.0 -EXTRA_FORCE NO -BIG_DISCARD NO -CHK_CLOSE YES -RHILL_PRESENT YES -J2 4.7535806948127355e-12 -J4 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in deleted file mode 100644 index e9ed6376c..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ /dev/null @@ -1,36 +0,0 @@ -! VERSION Swiftest parameter input -T0 0.0 -TSTOP 3652.5 -DT 1.0 -ISTEP_OUT 11 -ISTEP_DUMP 1 -OUT_FORM XV -OUT_TYPE REAL8 -OUT_STAT UNKNOWN -IN_TYPE ASCII -PL_IN pl.swiftest.in -TP_IN tp.in -CB_IN cb.swiftest.in -BIN_OUT bin.swiftest.dat -ENC_OUT enc.swiftest.dat -CHK_QMIN 0.004650467260962157 -CHK_RMIN 0.004650467260962157 -CHK_RMAX 1000.0 -CHK_EJECT 1000.0 -CHK_QMIN_COORD HELIO -CHK_QMIN_RANGE 0.004650467260962157 1000.0 -MU2KG 1.988409870698051e+30 -TU2S 86400 -DU2M 149597870700.0 -EXTRA_FORCE NO -BIG_DISCARD NO -CHK_CLOSE YES -RHILL_PRESENT YES -FRAGMENTATION NO -ROTATION NO -TIDES NO -ENERGY NO -GR NO -YARKOVSKY NO -YORP NO -MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in deleted file mode 100644 index fea43297f..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 0.0014751238438755500459 -1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 -4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 -4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 -2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 -0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 -0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 -0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 -0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in deleted file mode 100644 index 79614abb4..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ /dev/null @@ -1,36 +0,0 @@ -9 -0 0.00029591220819207775568 -0.0 0.0 0.0 -0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751238438755500459 -1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 -4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 -4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 -2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 -0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 -0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 -0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 -0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in deleted file mode 100644 index fea43297f..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 0.0014751238438755500459 -1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 -4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 -4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 -2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 -0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 -0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 -0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 -0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb deleted file mode 100644 index c7d58f38a..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import swiftest\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swifter file param.swifter.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swifter simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swifter.in'\n", - "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", - "swiftersim.bin2xr()\n", - "swifterdat = swiftersim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading Swiftest file param.swiftest.in\n", - "Reading in time 3.652e+03\n", - "Creating Dataset\n", - "Successfully converted 333 output frames.\n", - "Swiftest simulation data stored as xarray DataSet .ds\n" - ] - } - ], - "source": [ - "inparfile = 'param.swiftest.in'\n", - "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", - "swiftestsim.bin2xr()\n", - "swiftestdat = swiftestsim.ds" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftestdat - swifterdat" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff = swiftdiff.rename({'time' : 'time (d)'})" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff['rmag'] = np.sqrt(swiftdiff['px']**2 + swiftdiff['py']**2 + swiftdiff['pz']**2)\n", - "swiftdiff['vmag'] = np.sqrt(swiftdiff['vx']**2 + swiftdiff['vy']**2 + swiftdiff['vz']**2)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "plidx = swiftdiff.id.values[swiftdiff.id.values < 10]\n", - "tpidx = swiftdiff.id.values[swiftdiff.id.values > 10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", - "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", - "fig.savefig(\"symba_swifter_comparison-9pl-18tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time (d)\")\n", - "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", - "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", - "legend = ax.legend()\n", - "legend.remove()\n", - "fig.savefig(\"symba_swifter_comparison-9pl-18tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "swiftdiff['rmag'].sel(id=101)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "swiftestOOF", - "language": "python", - "name": "swiftestoof" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in deleted file mode 100644 index 7c1b15bd6..000000000 --- a/examples/symba_swifter_comparison/9pl_18tp_encounters/tp.in +++ /dev/null @@ -1,49 +0,0 @@ -16 -101 --0.0658187108448175795 0.30391138014159824188 0.030872485461978960153 --0.030537616761930286291 -0.0049297226604189817514 0.0026371811668407158825 -102 --0.065864832257480881994 0.3038652587289349949 0.030872485461978960153 --0.035744715705948587603 -0.0049297226604189817514 0.0026371811668407158825 -103 --0.6526399503364792576 -0.30651935535365792962 0.033456491497379246824 -0.014807065041004032965 -0.0184014319837384685 -0.0007407193515014080928 -104 --0.65275437091742372075 -0.30663377593460228177 0.033456491497379246824 -0.0021125976303132450868 -0.0184014319837384685 -0.0007407193515014080928 -105 -0.58052308875528702004 -0.8331397763444912119 3.7646553415201541957e-05 -0.020730998066553867065 0.009770187318278569788 -5.1179589633921335467e-07 -106 -0.58040263294340799227 -0.83326023215637023966 3.7646553415201541957e-05 -0.0069421175980061153657 0.009770187318278569788 -5.1179589633921335467e-07 -107 --1.5891096979602641337 0.49388011604967890777 0.049330990309104823244 --0.00055132825635455804184 -0.012168467501132099878 -0.00016594932370266260858 -108 --1.5891737827877718825 0.49381603122217127 0.049330990309104823244 --0.0067102864528023435653 -0.012168467501132099878 -0.00016594932370266260858 -109 -4.1155004823659924185 -2.893171407164709663 -0.080043092204059404504 -0.0411371945893665783 0.006534697671907701254 -0.00012233719535540690457 -110 -4.114178684349798054 -2.8944932051809040274 -0.080043092204059404504 --0.032627239813928281265 0.006534697671907701254 -0.00012233719535540690457 -111 -6.3594761400945154506 -7.652737529060036792 -0.12000977499446359442 -0.02609853948273724994 0.0035590677039893160206 -0.00022043610541731448703 -112 -6.3583751553842544624 -7.65383851377029778 -0.12000977499446359442 --0.01812779828432992818 0.0035590677039893160206 -0.00022043610541731448703 -113 -14.817019253266252576 13.049505570448612701 -0.14351615042000470668 -0.010470241012353788054 0.002774730265364384104 4.416262654344997005e-05 -114 -14.8165397372918477 13.049026054474207825 -0.14351615042000470668 --0.015719286064969997113 0.002774730265364384104 4.416262654344997005e-05 -115 -29.564692754289236376 -4.5822270889269072214 -0.5870359532621901577 -0.014900470225798949711 0.0031282868879460171488 -7.5042704502708602616e-05 -116 -29.564227229396802699 -4.582692613819337346 -0.5870359532621901577 --0.013970801400757312458 0.0031282868879460171488 -7.5042704502708602616e-05 diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 876149edb..46065d269 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -25,7 +25,10 @@ module subroutine symba_step_system(self, param, t, dt) class is (symba_tp) lencounter = pl%encounter_check(self, dt, 0) .or. tp%encounter_check(self, dt, 0) if (lencounter) then + tp%lfirst = pl%lfirst call self%interp(param, t, dt) + pl%lfirst = .true. + tp%lfirst = .true. else call helio_step_system(self, param, t, dt) end if From e32e3d6fcc2cb7ef422e08529eba96d9ed25eb95 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 02:11:04 -0400 Subject: [PATCH 108/194] Fixed index bugs and re-ordered accel calcs for better consistency with old code. Runs match, except for small differences with test particles with oblateness enabled --- .../8pl_16tp_encounters/pl.in | 48 +++--- .../8pl_16tp_encounters/pl.swifter.in | 48 +++--- .../8pl_16tp_encounters/pl.swiftest.in | 48 +++--- .../swiftest_symba_vs_swifter_symba.ipynb | 157 +++--------------- .../8pl_16tp_encounters/tp.in | 64 +++---- src/symba/symba_encounter_check.f90 | 16 +- src/symba/symba_kick.f90 | 6 +- 7 files changed, 138 insertions(+), 249 deletions(-) diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/pl.in index fea43297f..86a616119 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.0014751238438755500459 +1 4.9125474498983623693e-11 0.0014751239400086721089 1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-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 79614abb4..595cdc169 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.0014751238438755500459 +1 4.9125474498983623693e-11 0.0014751239400086721089 1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-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 fea43297f..86a616119 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.0014751238438755500459 +1 4.9125474498983623693e-11 0.0014751239400086721089 1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --0.033141166233939436947 -0.0049297226604189817514 0.0026371811668407158825 -2 7.243452483873646905e-10 0.006759080797928606587 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -0.008459831335658639026 -0.0184014319837384685 -0.0007407193515014080928 -3 8.9970113821660187435e-10 0.010044868190633438806 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -0.013836557832279990782 0.009770187318278569788 -5.1179589633921335467e-07 -4 9.549535102761465607e-11 0.0072467082986392815006 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --0.0036308073545784510204 -0.012168467501132099878 -0.00016594932370266260858 -5 2.825345908631354893e-07 0.3552707649709459117 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -0.0042549773877191511204 0.006534697671907701254 -0.00012233719535540690457 -6 8.459715183006415395e-08 0.43765596788571493287 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -0.003985370599203661747 0.0035590677039893160206 -0.00022043610541731448703 -7 1.2920249163736673626e-08 0.46957663585116591335 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.0026245225263081049631 0.002774730265364384104 4.416262654344997005e-05 -8 1.5243589003230834323e-08 0.7813355837717117843 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.0004648344125208179762 0.0031282868879460171488 -7.5042704502708602616e-05 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 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 c7a3b052b..9f2d0d0d5 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": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -223,6 +223,15 @@ "cell_type": "code", "execution_count": 12, "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time (d)' : 'time'})" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -578,147 +587,27 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n",
    -       "       6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n",
    -       "       7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n",
    -       "       1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n",
    -       "       1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n",
    -       "       2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n",
    -       "       2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n",
    -       "       2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n",
    -       "       3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n",
    -       "       3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n",
    -       "       3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n",
    -       "       4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n",
    -       "...\n",
    -       "       2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n",
    -       "       2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n",
    -       "       2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n",
    -       "       2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n",
    -       "       2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n",
    -       "       2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n",
    -       "       2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n",
    -       "       2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n",
    -       "       2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n",
    -       "       2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n",
    -       "       2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n",
    -       "       2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n",
    -       "       2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n",
    -       "       2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n",
    -       "       2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n",
    -       "       2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n",
    -       "       2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n",
    -       "       2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n",
    -       "       2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n",
    -       "       2.95109669e-02])\n",
    +       "
    <xarray.DataArray 'px' ()>\n",
    +       "array(9.70681868e-14)\n",
            "Coordinates:\n",
    -       "    id        int64 101\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + " id int64 101\n", + " time float64 352.0
    " ], "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 2.31299453e-05, 1.10256458e-04, 2.75094986e-04, 4.69124720e-04,\n", - " 6.37819916e-04, 7.27318191e-04, 7.18330839e-04, 7.05788012e-04,\n", - " 7.97070205e-04, 9.82447303e-04, 1.20167017e-03, 1.38568730e-03,\n", - " 1.45290098e-03, 1.40294485e-03, 1.38935207e-03, 1.50610105e-03,\n", - " 1.72636743e-03, 1.97891692e-03, 2.15521444e-03, 2.14661851e-03,\n", - " 2.04956741e-03, 2.06272718e-03, 2.23569416e-03, 2.51534860e-03,\n", - " 2.79363959e-03, 2.89613835e-03, 2.77700315e-03, 2.67482627e-03,\n", - " 2.75622597e-03, 3.01487525e-03, 3.35945752e-03, 3.60350706e-03,\n", - " 3.55128396e-03, 3.35402969e-03, 3.30174593e-03, 3.47779871e-03,\n", - " 3.82651300e-03, 4.18801472e-03, 4.28414157e-03, 4.06893950e-03,\n", - " 3.88578189e-03, 3.94894190e-03, 4.25789004e-03, 4.69085774e-03,\n", - " 4.96754228e-03, 4.83413401e-03, 4.54497227e-03, 4.46337913e-03,\n", - "...\n", - " 2.27552238e-02, 2.14336750e-02, 1.99536744e-02, 1.95375781e-02,\n", - " 2.04244088e-02, 2.21837929e-02, 2.34223481e-02, 2.27021040e-02,\n", - " 2.10235992e-02, 2.00677152e-02, 2.04357446e-02, 2.19768363e-02,\n", - " 2.37069871e-02, 2.38363613e-02, 2.22656122e-02, 2.08398594e-02,\n", - " 2.06361170e-02, 2.17797283e-02, 2.36717320e-02, 2.46713026e-02,\n", - " 2.35870574e-02, 2.18518073e-02, 2.10654197e-02, 2.16919542e-02,\n", - " 2.34510849e-02, 2.51073368e-02, 2.48399705e-02, 2.30713464e-02,\n", - " 2.17469301e-02, 2.17840155e-02, 2.31897238e-02, 2.51636545e-02,\n", - " 2.58443413e-02, 2.44211632e-02, 2.26850711e-02, 2.21027725e-02,\n", - " 2.30035080e-02, 2.49559537e-02, 2.64520803e-02, 2.57657096e-02,\n", - " 2.38584911e-02, 2.26793113e-02, 2.29810558e-02, 2.46443582e-02,\n", - " 2.66327359e-02, 2.69250458e-02, 2.52077666e-02, 2.35270452e-02,\n", - " 2.31818105e-02, 2.43687433e-02, 2.64772190e-02, 2.77223877e-02,\n", - " 2.66190162e-02, 2.46370466e-02, 2.36453830e-02, 2.42344674e-02,\n", - " 2.61438944e-02, 2.80669485e-02, 2.79190320e-02, 2.59650741e-02,\n", - " 2.43925884e-02, 2.43144014e-02, 2.57928520e-02, 2.80043257e-02,\n", - " 2.89095241e-02, 2.74149807e-02, 2.54220912e-02, 2.46556068e-02,\n", - " 2.55482541e-02, 2.76783912e-02, 2.94435958e-02, 2.88268702e-02,\n", - " 2.67028523e-02, 2.52872339e-02, 2.55012432e-02, 2.72669007e-02,\n", - " 2.95109669e-02])\n", + "\n", + "array(9.70681868e-14)\n", "Coordinates:\n", - " id int64 101\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + " id int64 101\n", + " time float64 352.0" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['rmag'].sel(id=101)" + "swiftdiff['px'].sel(id=101).isel(time=32)" ] }, { diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/tp.in index 7c1b15bd6..ae7796698 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.0658187108448175795 0.30391138014159824188 0.030872485461978960153 --0.030537616761930286291 -0.0049297226604189817514 0.0026371811668407158825 +-0.09859055695785905182 0.2975290300646933339 0.03335708456145129036 +-0.029750083068855306956 -0.0078122718370876240157 0.0023293874953380202045 102 --0.065864832257480881994 0.3038652587289349949 0.030872485461978960153 --0.035744715705948587603 -0.0049297226604189817514 0.0026371811668407158825 +-0.09863667837052235432 0.29748290865203008693 0.03335708456145129036 +-0.034957182012873608268 -0.0078122718370876240157 0.0023293874953380202045 103 --0.6526399503364792576 -0.30651935535365792962 0.033456491497379246824 -0.014807065041004032965 -0.0184014319837384685 -0.0007407193515014080928 +-0.6439245854659476631 -0.32479782779646521051 0.032702713983447248558 +0.0153169432007213678765 -0.018153139924556138673 -0.0007667345025597138231 104 --0.65275437091742372075 -0.30663377593460228177 0.033456491497379246824 -0.0021125976303132450868 -0.0184014319837384685 -0.0007407193515014080928 +-0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 +0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 105 -0.58052308875528702004 -0.8331397763444912119 3.7646553415201541957e-05 -0.020730998066553867065 0.009770187318278569788 -5.1179589633921335467e-07 +0.59427697124197276235 -0.8232523083817967491 3.7129329104855261984e-05 +0.020564990514662154913 0.010004295439859960809 -5.226292361234363611e-07 106 -0.58040263294340799227 -0.83326023215637023966 3.7646553415201541957e-05 -0.0069421175980061153657 0.009770187318278569788 -5.1179589633921335467e-07 +0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 +0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 107 --1.5891096979602641337 0.49388011604967890777 0.049330990309104823244 --0.00055132825635455804184 -0.012168467501132099878 -0.00016594932370266260858 +-1.5926895092930311026 0.48169594448240382611 0.049163460846716633412 +-0.00044929323243133797994 -0.01219974682608557931 -0.00016910795626524249315 108 --1.5891737827877718825 0.49381603122217127 0.049330990309104823244 --0.0067102864528023435653 -0.012168467501132099878 -0.00016594932370266260858 +-1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 +-0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 109 -4.1155004823659924185 -2.893171407164709663 -0.080043092204059404504 -0.0411371945893665783 0.006534697671907701254 -0.00012233719535540690457 +4.119750673485228276 -2.8866333472175926822 -0.080165336328135106125 +0.041127620144391897894 0.0065414198811065849687 -0.00012215100047356211078 110 -4.114178684349798054 -2.8944932051809040274 -0.080043092204059404504 --0.032627239813928281265 0.006534697671907701254 -0.00012233719535540690457 +4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 +-0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 111 -6.3594761400945154506 -7.652737529060036792 -0.12000977499446359442 -0.02609853948273724994 0.0035590677039893160206 -0.00022043610541731448703 +6.3634605491076454697 -7.64917730379279881 -0.12023019299387090186 +0.026096616095614821179 0.0035613826786502411278 -0.00022039988214595340028 112 -6.3583751553842544624 -7.65383851377029778 -0.12000977499446359442 --0.01812779828432992818 0.0035590677039893160206 -0.00022043610541731448703 +6.3623595643973844815 -7.650278288503059798 -0.12023019299387090186 +-0.01812972167145235694 0.0035613826786502411278 -0.00022039988214595340028 113 -14.817019253266252576 13.049505570448612701 -0.14351615042000470668 -0.010470241012353788054 0.002774730265364384104 4.416262654344997005e-05 +14.814394441298382787 13.052280053388562564 -0.14347198499748289868 +0.010469662145386185101 0.0027742356008832688187 4.416821810149910185e-05 114 -14.8165397372918477 13.049026054474207825 -0.14351615042000470668 --0.015719286064969997113 0.002774730265364384104 4.416262654344997005e-05 +14.813914925323977911 13.051800537414157688 -0.14347198499748289868 +-0.015719864931937603536 0.0027742356008832688187 4.416821810149910185e-05 115 -29.564692754289236376 -4.5822270889269072214 -0.5870359532621901577 -0.014900470225798949711 0.0031282868879460171488 -7.5042704502708602616e-05 +29.565157420731857485 -4.579098772788029237 -0.5871109926822926095 +0.014900134286357700347 0.003128345390031967918 -7.5036135696161668576e-05 116 -29.564227229396802699 -4.582692613819337346 -0.5870359532621901577 --0.013970801400757312458 0.0031282868879460171488 -7.5042704502708602616e-05 +29.564691895839423808 -4.5795642976804593616 -0.5871109926822926095 +-0.0139711373401985618214 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 163a107f1..df94d42b0 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -138,14 +138,14 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr associate(tp => self, ntp => self%nbody, pl => system%pl, npl => system%pl%nbody) - allocate(lencounter(npl, ntp), loc_lvdotr(npl, ntp)) + allocate(lencounter(ntp, npl), loc_lvdotr(ntp, npl)) lencounter(:,:) = .false. - do j = 1, ntp - do i = 1, npl - xr(:) = tp%xh(:, j) - pl%xh(:, i) - vr(:) = tp%vh(:, j) - pl%vh(:, i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(i), 0.0_DP, dt, irec, lencounter(i,j), loc_lvdotr(i,j)) + do j = 1, npl + do i = 1, ntp + xr(:) = tp%xh(:, i) - pl%xh(:, j) + vr(:) = tp%vh(:, i) - pl%vh(:, j) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(j), 0.0_DP, dt, irec, lencounter(i,j), loc_lvdotr(i,j)) end do end do @@ -156,8 +156,8 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc pltpenc_list%status(1:nenc) = ACTIVE pltpenc_list%level(1:nenc) = irec pltpenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) - pltpenc_list%index1(1:nenc) = pack(spread([(i, i = 1, npl)], dim=2, ncopies=ntp), lencounter(:,:)) - pltpenc_list%index2(1:nenc) = pack(spread([(j, j = 1, ntp)], dim=1, ncopies=npl), lencounter(:,:)) + pltpenc_list%index1(1:nenc) = pack(spread([(i, i = 1, npl)], dim=1, ncopies=ntp), lencounter(:,:)) + pltpenc_list%index2(1:nenc) = pack(spread([(i, i = 1, ntp)], dim=2, ncopies=npl), lencounter(:,:)) select type(pl) class is (symba_pl) pl%lencounter(:) = .false. diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 140eb0072..e5ba7550e 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -24,6 +24,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) select type(system) class is (symba_nbody_system) associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + call helio_kick_getacch_pl(pl, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, nplplenc associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) @@ -39,7 +40,6 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) !end if end associate end do - call helio_kick_getacch_pl(pl, system, param, t, lbeg) end associate end select @@ -68,6 +68,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) select type(system) class is (symba_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) + call helio_kick_getacch_tp(tp, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) @@ -86,7 +87,6 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) end IF end associate end do - call helio_kick_getacch_tp(tp, system, param, t, lbeg) end associate end select return @@ -142,7 +142,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) else lgoodlevel = (pl%levelg(i) >= irm1) .and. (tp%levelg(j) >= irm1) end if - if ((self%status(i) == ACTIVE) .and. lgoodlevel) then + if ((self%status(k) == ACTIVE) .and. lgoodlevel) then if (isplpl) then ri = ((pl%rhill(i) + pl%rhill(j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) From 0d8ad93f9cd665773641da1c0d6d4bd3efda6096 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 10:46:22 -0400 Subject: [PATCH 109/194] Cleaned up formatting and restyled for consistency. --- .../swiftest_symba_vs_swifter_symba.ipynb | 14 +- src/discard/discard.f90 | 15 +- src/drift/drift.f90 | 12 + src/eucl/eucl.f90 | 3 +- src/gr/gr.f90 | 12 +- src/helio/helio_coord.f90 | 5 + src/helio/helio_drift.f90 | 7 + src/helio/helio_kick.f90 | 72 ++--- src/helio/helio_step.f90 | 6 +- src/io/io.f90 | 33 ++- src/kick/kick.f90 | 3 + src/main/swiftest_driver.f90 | 1 - src/obl/obl.f90 | 2 + src/orbel/orbel.f90 | 14 + src/rmvs/rmvs_encounter_check.f90 | 4 +- src/rmvs/rmvs_kick.f90 | 3 +- src/rmvs/rmvs_setup.f90 | 5 +- src/rmvs/rmvs_step.f90 | 13 +- src/rmvs/rmvs_util.f90 | 8 + src/setup/setup.f90 | 5 + src/symba/symba_collision.f90 | 6 +- src/symba/symba_encounter_check.f90 | 10 +- src/symba/symba_io.f90 | 7 +- src/symba/symba_kick.f90 | 77 +++-- src/symba/symba_setup.f90 | 6 + src/symba/symba_step.f90 | 11 +- src/symba/symba_util.f90 | 15 +- src/tides/tides_spin_step.f90 | 7 + src/util/util_coord.f90 | 5 + src/util/util_exit.f90 | 2 + src/util/util_peri.f90 | 4 +- src/util/util_reverse_status.f90 | 4 + src/util/util_set.f90 | 8 +- src/util/util_solve.f90 | 1 + src/util/util_sort.f90 | 22 ++ src/util/util_spill_and_fill.f90 | 78 +++--- src/util/util_valid.f90 | 3 +- src/util/util_version.f90 | 1 + src/whm/whm_coord.f90 | 4 + src/whm/whm_drift.f90 | 2 +- src/whm/whm_gr.f90 | 5 + src/whm/whm_kick.f90 | 12 +- src/whm/whm_setup.f90 | 6 + src/whm/whm_step.f90 | 4 + src/whm/whm_util.f90 | 262 +++++++++--------- 45 files changed, 519 insertions(+), 280 deletions(-) diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index 9f2d0d0d5..c76e792f3 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -198,7 +198,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -588,17 +588,17 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'px' ()>\n",
    -       "array(9.70681868e-14)\n",
    +       "array(0.)\n",
            "Coordinates:\n",
            "    id       int64 101\n",
    -       "    time     float64 352.0
    " + " time float64 22.0" ], "text/plain": [ "\n", - "array(9.70681868e-14)\n", + "array(0.)\n", "Coordinates:\n", " id int64 101\n", - " time float64 352.0" + " time float64 22.0" ] }, "execution_count": 13, @@ -607,7 +607,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=101).isel(time=32)" + "swiftdiff['px'].sel(id=101).isel(time=2)" ] }, { diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index f82826fac..e35d6cad7 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_discard use swiftest contains + module subroutine discard_system(self, param) !! author: David A. Minton !! @@ -15,9 +16,11 @@ module subroutine discard_system(self, param) call pl%discard(system, param) if (any(tp%ldiscard(:) .or. any(pl%ldiscard(:)))) call system%write_discard(param) end associate + return end subroutine discard_system + module subroutine discard_pl(self, system, param) !! author: David A. Minton !! @@ -29,9 +32,11 @@ module subroutine discard_pl(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter self%ldiscard(:) = .false. + return end subroutine discard_pl + module subroutine discard_tp(self, system, param) !! author: David A. Minton !! @@ -59,9 +64,11 @@ module subroutine discard_tp(self, system, param) if (param%lclose .and. ntp > 0) call discard_pl_tp(tp, system, param) if (any(tp%ldiscard)) call tp%spill(system%tp_discards, tp%ldiscard) end associate + return end subroutine discard_tp + subroutine discard_sun_tp(tp, system, param) !! author: David A. Minton !! @@ -111,6 +118,7 @@ subroutine discard_sun_tp(tp, system, param) return end subroutine discard_sun_tp + subroutine discard_peri_tp(tp, system, param) !! author: David A. Minton !! @@ -153,10 +161,11 @@ subroutine discard_peri_tp(tp, system, param) end if end do end associate + return - end subroutine discard_peri_tp + subroutine discard_pl_tp(tp, system, param) !! author: David A. Minton !! @@ -192,11 +201,11 @@ subroutine discard_pl_tp(tp, system, param) end do end if end do - end associate + return - end subroutine discard_pl_tp + subroutine discard_pl_close(dx, dv, dt, r2crit, iflag, r2min) !! author: David A. Minton diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 4d9988f93..638ee9da4 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -43,6 +43,7 @@ module subroutine drift_body(self, system, param, dt, mask) return end subroutine drift_body + module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) !! author: David A. Minton !! @@ -84,6 +85,7 @@ module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) return end subroutine drift_all + module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -119,6 +121,7 @@ module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag return end subroutine drift_one + pure subroutine drift_dan(mu, x0, v0, dt0, iflag) !! author: David A. Minton !! @@ -185,9 +188,11 @@ pure subroutine drift_dan(mu, x0, v0, dt0, iflag) x0(:) = x(:) v0(:) = v(:) end if + return end subroutine drift_dan + pure subroutine drift_kepmd(dm, es, ec, x, s, c) !! author: David A. Minton !! @@ -226,6 +231,7 @@ pure subroutine drift_kepmd(dm, es, ec, x, s, c) return end subroutine drift_kepmd + pure subroutine drift_kepu(dt,r0,mu,alpha,u,fp,c1,c2,c3,iflag) !! author: David A. Minton !! @@ -253,6 +259,7 @@ pure subroutine drift_kepu(dt,r0,mu,alpha,u,fp,c1,c2,c3,iflag) return end subroutine drift_kepu + pure subroutine drift_kepu_fchk(dt, r0, mu, alpha, u, s, f) !! author: David A. Minton !! @@ -275,6 +282,7 @@ pure subroutine drift_kepu_fchk(dt, r0, mu, alpha, u, s, f) return end subroutine drift_kepu_fchk + pure subroutine drift_kepu_guess(dt, r0, mu, alpha, u, s) !! author: David A. Minton !! @@ -312,6 +320,7 @@ pure subroutine drift_kepu_guess(dt, r0, mu, alpha, u, s) return end subroutine drift_kepu_guess + pure subroutine drift_kepu_lag(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) !! author: David A. Minton !! @@ -356,6 +365,7 @@ pure subroutine drift_kepu_lag(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) return end subroutine drift_kepu_lag + pure subroutine drift_kepu_new(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) !! author: David A. Minton !! @@ -397,6 +407,7 @@ pure subroutine drift_kepu_new(s, dt, r0, mu, alpha, u, fp, c1, c2, c3, iflag) return end subroutine drift_kepu_new + pure subroutine drift_kepu_p3solve(dt, r0, mu, alpha, u, s, iflag) !! author: David A. Minton !! @@ -439,6 +450,7 @@ pure subroutine drift_kepu_p3solve(dt, r0, mu, alpha, u, s, iflag) return end subroutine drift_kepu_p3solve + pure subroutine drift_kepu_stumpff(x, c0, c1, c2, c3) !! author: David A. Minton diff --git a/src/eucl/eucl.f90 b/src/eucl/eucl.f90 index 24af7fd6e..af1646e4c 100644 --- a/src/eucl/eucl.f90 +++ b/src/eucl/eucl.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_eucl use swiftest contains + module subroutine eucl_dist_index_plpl(self) !! author: Jacob R. Elliott and David A. Minton !! @@ -30,8 +31,8 @@ module subroutine eucl_dist_index_plpl(self) end do end do end associate - return + return end subroutine eucl_dist_index_plpl end submodule s_eucl diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index cf13d90d2..cd8bc2a23 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_gr use swiftest contains + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) !! author: David A. Minton !! @@ -36,13 +37,12 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) cb%agr(i) = -sum(self%Gmass(1:n) * self%agr(1:n, i) / cb%Gmass) end do end select - end associate return - end subroutine gr_kick_getaccb_ns_body + module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton !! @@ -71,6 +71,7 @@ module pure subroutine gr_p4_pos_kick(param, x, v, dt) return end subroutine gr_p4_pos_kick + module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) !! author: David A. Minton !! @@ -98,9 +99,11 @@ module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) grterm = 1.0_DP - inv_c2 * (0.5_DP * vmag2 + 3 * mu / rmag) vh(:) = pv(:) * grterm end associate + return end subroutine gr_pseudovel2vel + module pure subroutine gr_pv2vh_body(self, param) !! author: David A. Minton !! @@ -121,9 +124,11 @@ module pure subroutine gr_pv2vh_body(self, param) end do call move_alloc(vh, self%vh) end associate + return end subroutine gr_pv2vh_body + module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) !! author: David A. Minton !! @@ -200,6 +205,7 @@ module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) return end subroutine gr_vel2pseudovel + module pure subroutine gr_vh2pv_body(self, param) !! author: David A. Minton !! @@ -220,8 +226,8 @@ module pure subroutine gr_vh2pv_body(self, param) end do call move_alloc(pv, self%vh) end associate + return end subroutine gr_vh2pv_body - end submodule s_gr \ No newline at end of file diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index e14ea4612..c5b86ee26 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -1,6 +1,7 @@ submodule (helio_classes) s_helio_coord use swiftest contains + module subroutine helio_coord_vb2vh_pl(self, cb) !! author: David A. Minton !! @@ -26,6 +27,7 @@ module subroutine helio_coord_vb2vh_pl(self, cb) return end subroutine helio_coord_vb2vh_pl + module subroutine helio_coord_vb2vh_tp(self, vbcb) !! author: David A. Minton !! @@ -49,6 +51,7 @@ module subroutine helio_coord_vb2vh_tp(self, vbcb) return end subroutine helio_coord_vb2vh_tp + module subroutine helio_coord_vh2vb_pl(self, cb) !! author: David A. Minton !! @@ -76,6 +79,7 @@ module subroutine helio_coord_vh2vb_pl(self, cb) return end subroutine helio_coord_vh2vb_pl + module subroutine helio_coord_vh2vb_tp(self, vbcb) !! author: David A. Minton !! @@ -98,5 +102,6 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) return end subroutine helio_coord_vh2vb_tp + end submodule s_helio_coord diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index b1fb311ce..30e17849e 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -1,6 +1,7 @@ submodule (helio_classes) s_helio_drift use swiftest contains + module subroutine helio_drift_body(self, system, param, dt, mask) !! author: David A. Minton @@ -39,6 +40,7 @@ module subroutine helio_drift_body(self, system, param, dt, mask) return end subroutine helio_drift_body + module subroutine helio_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! @@ -52,9 +54,11 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. call helio_drift_body(self, system, param, dt, mask) + return end subroutine helio_drift_pl + module subroutine helio_drift_tp(self, system, param, dt, mask) !! author: David A. Minton !! @@ -68,8 +72,10 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. call helio_drift_body(self, system, param, dt, mask) + return end subroutine helio_drift_tp + module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) !! author: David A. Minton @@ -108,6 +114,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) return end subroutine helio_drift_linear_pl + module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) !! author: David A. Minton diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index fa601b7f7..2325c23ba 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -1,46 +1,48 @@ submodule(helio_classes) s_helio_kick use swiftest contains -module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 - !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f - implicit none - ! Arguments - class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - associate(cb => system%cb, pl => self, npl => self%nbody) - call pl%accel_int() - if (param%loblatecb) then - call pl%accel_obl(system) - if (lbeg) then - cb%aoblbeg = cb%aobl - else - cb%aoblend = cb%aobl - end if - if (param%ltides) then - call pl%accel_tides(system) + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine helio_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine helio_kick_getacch.f + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + + associate(cb => system%cb, pl => self, npl => self%nbody) + call pl%accel_int() + if (param%loblatecb) then + call pl%accel_obl(system) if (lbeg) then - cb%atidebeg = cb%atide + cb%aoblbeg = cb%aobl else - cb%atideend = cb%atide + cb%aoblend = cb%aobl + end if + if (param%ltides) then + call pl%accel_tides(system) + if (lbeg) then + cb%atidebeg = cb%atide + else + cb%atideend = cb%atide + end if end if end if - end if - if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) - !if (param%lgr) call pl%gr_accel(param) - end associate + if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) + !if (param%lgr) call pl%gr_accel(param) + end associate - return + return end subroutine helio_kick_getacch_pl + module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -67,9 +69,11 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) !if (param%lgr) call tp%gr_accel(param) end associate + return end subroutine helio_kick_getacch_tp + module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -104,9 +108,9 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) end associate return - end subroutine helio_kick_vb_pl + module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -136,6 +140,6 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) end associate return - end subroutine helio_kick_vb_tp + end submodule s_helio_kick \ No newline at end of file diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index d0c4dde83..c6031b272 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -18,10 +18,13 @@ module subroutine helio_step_system(self, param, t, dt) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize + call whm_step_system(self, param, t, dt) + return end subroutine helio_step_system + module subroutine helio_step_pl(self, system, param, t, dt) !! author: David A. Minton !! @@ -58,9 +61,9 @@ module subroutine helio_step_pl(self, system, param, t, dt) end associate return - end subroutine helio_step_pl + module subroutine helio_step_tp(self, system, param, t, dt) !! author: David A. Minton @@ -99,7 +102,6 @@ module subroutine helio_step_tp(self, system, param, t, dt) end associate return - end subroutine helio_step_tp end submodule s_helio_step diff --git a/src/io/io.f90 b/src/io/io.f90 index 7c50242cb..8bd47c9a7 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_io use swiftest contains + module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -271,6 +272,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) return end subroutine io_param_reader + module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! @@ -347,6 +349,7 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) return end subroutine io_param_writer + module subroutine io_dump_param(self, param_file_name) !! author: David A. Minton !! @@ -383,6 +386,7 @@ module subroutine io_dump_param(self, param_file_name) return end subroutine io_dump_param + module subroutine io_dump_swiftest(self, param, msg) !! author: David A. Minton !! @@ -421,6 +425,7 @@ module subroutine io_dump_swiftest(self, param, msg) return end subroutine io_dump_swiftest + module subroutine io_dump_system(self, param, msg) !! author: David A. Minton !! @@ -464,6 +469,7 @@ module subroutine io_dump_system(self, param, msg) return end subroutine io_dump_system + module function io_get_args(integrator, param_file_name) result(ierr) !! author: David A. Minton !! @@ -522,8 +528,11 @@ module function io_get_args(integrator, param_file_name) result(ierr) end if end if if (ierr /= 0) call util_exit(USAGE) + + return end function io_get_args + module function io_get_token(buffer, ifirst, ilast, ierr) result(token) !! author: David A. Minton !! @@ -568,9 +577,11 @@ module function io_get_token(buffer, ifirst, ilast, ierr) result(token) ierr = 0 token = buffer(ifirst:ilast) + return end function io_get_token + module subroutine io_read_body_in(self, param) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -658,6 +669,7 @@ module subroutine io_read_body_in(self, param) return end subroutine io_read_body_in + module subroutine io_read_cb_in(self, param) !! author: David A. Minton !! @@ -702,6 +714,7 @@ module subroutine io_read_cb_in(self, param) return end subroutine io_read_cb_in + module subroutine io_read_param_in(self, param_file_name) !! author: David A. Minton !! @@ -743,6 +756,7 @@ module subroutine io_read_param_in(self, param_file_name) return end subroutine io_read_param_in + function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & xh1, xh2, vh1, vh2, encounter_file, out_type) result(ierr) !! author: David A. Minton @@ -793,6 +807,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & return end function io_read_encounter + module subroutine io_read_frame_body(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -856,6 +871,7 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) return end subroutine io_read_frame_body + module subroutine io_read_frame_cb(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -893,6 +909,7 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) return end subroutine io_read_frame_cb + module subroutine io_read_frame_system(self, iu, param, form, ierr) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott @@ -929,9 +946,11 @@ module subroutine io_read_frame_system(self, iu, param, form, ierr) call self%pl%read_frame(iu, param, form, ierr) if (ierr /= 0) return call self%tp%read_frame(iu, param, form, ierr) + return end subroutine io_read_frame_system + function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) !! author: David A. Minton !! @@ -969,6 +988,7 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr + module subroutine io_toupper(string) !! author: David A. Minton !! @@ -991,9 +1011,9 @@ module subroutine io_toupper(string) end do return - end subroutine io_toupper + module subroutine io_write_discard(self, param) !! author: David A. Minton !! @@ -1062,10 +1082,11 @@ module subroutine io_write_discard(self, param) end if close(LUN) end associate + return - end subroutine io_write_discard + module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & xh1, xh2, vh1, vh2, encounter_file, out_type) !! author: David A. Minton @@ -1113,9 +1134,9 @@ module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, rad end if return - end subroutine io_write_encounter + module subroutine io_write_frame_body(self, iu, param) !! author: David A. Minton !! @@ -1173,6 +1194,7 @@ module subroutine io_write_frame_body(self, iu, param) return end subroutine io_write_frame_body + module subroutine io_write_frame_cb(self, iu, param) !! author: David A. Minton !! @@ -1206,9 +1228,11 @@ module subroutine io_write_frame_cb(self, iu, param) write(iu) cb%Q end if end associate + return end subroutine io_write_frame_cb + module subroutine io_write_frame_system(self, iu, param) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1284,6 +1308,7 @@ module subroutine io_write_frame_system(self, iu, param) return end subroutine io_write_frame_system + subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1323,8 +1348,6 @@ subroutine io_write_hdr(iu, t, npl, ntp, out_form, out_type) write(iu, iostat = ierr) out_form return - end subroutine io_write_hdr - end submodule s_io diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index c10d47dbc..d686a4665 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_kick use swiftest contains + module pure subroutine kick_getacch_int_pl(self) !! author: David A. Minton !! @@ -33,6 +34,7 @@ module pure subroutine kick_getacch_int_pl(self) return end subroutine kick_getacch_int_pl + module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) !! author: David A. Minton !! @@ -61,6 +63,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) end do end do end associate + return end subroutine kick_getacch_int_tp diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 4c6bccc72..78d6c7d46 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -96,5 +96,4 @@ program swiftest_driver call util_exit(SUCCESS) stop - end program swiftest_driver diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index f027908f9..26b527680 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -37,6 +37,7 @@ module subroutine obl_acc_body(self, system) end subroutine obl_acc_body + module subroutine obl_acc_pl(self, system) !! author: David A. Minton !! @@ -66,6 +67,7 @@ module subroutine obl_acc_pl(self, system) end subroutine obl_acc_pl + module subroutine obl_acc_tp(self, system) !! author: David A. Minton !! diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index 850b643f1..aaf94a233 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_orbel use swiftest contains + module subroutine orbel_el2xv_vec(self, cb) !! author: David A. Minton !! @@ -21,6 +22,7 @@ module subroutine orbel_el2xv_vec(self, cb) end do end subroutine orbel_el2xv_vec + pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) !! author: David A. Minton !! @@ -122,6 +124,7 @@ pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) return end subroutine orbel_el2xv + module pure subroutine orbel_scget(angle, sx, cx) !! author: David A. Minton !! @@ -149,6 +152,7 @@ module pure subroutine orbel_scget(angle, sx, cx) end subroutine orbel_scget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -184,6 +188,7 @@ pure subroutine orbel_schget(angle,shx,chx) return end subroutine orbel_schget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -285,6 +290,7 @@ real(DP) pure function orbel_flon(e,icapn) return end function orbel_flon + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -354,6 +360,7 @@ real(DP) pure function orbel_fget(e,capn) return end function orbel_fget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -406,6 +413,7 @@ real(DP) pure function orbel_zget(iq) return end function orbel_zget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -459,6 +467,7 @@ real(DP) pure function orbel_esolmd(e,m) return end function orbel_esolmd + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -531,6 +540,7 @@ real(DP) pure function orbel_ehie(e,im) return end function orbel_ehie + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -608,6 +618,7 @@ real(DP) pure function orbel_eget(e,m) return end function orbel_eget + !********************************************************************** ! Code converted to Modern Fortran by David A. Minton ! Date: 2020-06-29 @@ -685,6 +696,7 @@ real(DP) pure function orbel_fhybrid(e,n) return end function orbel_fhybrid + module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) !! author: David A. Minton @@ -744,6 +756,7 @@ module pure subroutine orbel_xv2aeq(mu, x, v, a, e, q) end subroutine orbel_xv2aeq + module pure subroutine orbel_xv2aqt(mu, x, v, a, q, capm, tperi) !! author: David A. Minton !! @@ -993,4 +1006,5 @@ pure subroutine orbel_xv2el(mu, x, v, a, e, inc, capom, omega, capm) return end subroutine orbel_xv2el + end submodule s_orbel diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 64b5b59d9..1e26107bb 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -1,6 +1,7 @@ submodule (rmvs_classes) s_rmvs_chk use swiftest contains + module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) !! author: David A. Minton !! @@ -46,6 +47,7 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) return end function rmvs_encounter_check_tp + module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) !! author: David A. Minton !! @@ -77,6 +79,6 @@ module elemental function rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) result(lflag) end if return - end function rmvs_chk_ind + end submodule s_rmvs_chk diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 6cba4caef..545258ddb 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_kick use swiftest contains + module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton @@ -77,11 +78,9 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) call whm_kick_getacch_tp(tp, system, param, t, lbeg) end if end select - end associate return - end subroutine rmvs_kick_getacch_tp end submodule s_rmvs_kick \ No newline at end of file diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 58002401e..916109e39 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_setup use swiftest contains + module subroutine rmvs_setup_pl(self,n) !! author: David A. Minton !! @@ -46,6 +47,7 @@ module subroutine rmvs_setup_pl(self,n) return end subroutine rmvs_setup_pl + module subroutine rmvs_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -115,9 +117,10 @@ module subroutine rmvs_setup_initialize_system(self, param) end select end select end select - + return end subroutine rmvs_setup_initialize_system + module subroutine rmvs_setup_tp(self,n) !! author: David A. Minton !! diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index fce9a2927..be8ca0c2a 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_step use swiftest contains + module subroutine rmvs_step_system(self, param, t, dt) !! author: David A. Minton !! @@ -59,9 +60,9 @@ module subroutine rmvs_step_system(self, param, t, dt) end select end select return - end subroutine rmvs_step_system + subroutine rmvs_interp_out(cb, pl, dt) !! author: David A. Minton !! @@ -138,9 +139,9 @@ subroutine rmvs_interp_out(cb, pl, dt) end associate return - end subroutine rmvs_interp_out + subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) !! author: David A. Minton !! @@ -195,10 +196,11 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) end do end do end associate - return + return end subroutine rmvs_step_out + subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) !! author: David A. Minton !! @@ -322,6 +324,7 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) end subroutine rmvs_interp_in + subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) !! author: David A. Minton !! @@ -395,6 +398,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) return end subroutine rmvs_step_in + subroutine rmvs_make_planetocentric(cb, pl, tp) !! author: David A. Minton !! @@ -470,9 +474,11 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) end select end do end associate + return end subroutine rmvs_make_planetocentric + subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) !! author: David A. Minton !! @@ -556,6 +562,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) end subroutine rmvs_peri_tp + subroutine rmvs_end_planetocentric(pl, tp) !! author: David A. Minton !! diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 745888a64..65122881c 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_util use swiftest contains + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -31,6 +32,7 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) return end subroutine rmvs_util_fill_pl + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! @@ -106,6 +108,7 @@ module subroutine rmvs_util_sort_pl(self, sortby, ascending) return end subroutine rmvs_util_sort_pl + module subroutine rmvs_util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -168,9 +171,11 @@ module subroutine rmvs_util_sort_rearrange_pl(self, ind) pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) deallocate(pl_sorted) end associate + return end subroutine rmvs_util_sort_rearrange_pl + module subroutine rmvs_util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -192,8 +197,10 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) tp%xheliocentric(:,1:ntp) = tp_sorted%xheliocentric(:,ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine rmvs_util_sort_rearrange_tp + module subroutine rmvs_util_spill_pl(self, discards, lspill_list) !! author: David A. Minton @@ -226,6 +233,7 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) return end subroutine rmvs_util_spill_pl + module subroutine rmvs_util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index cbd7aabfe..5e6933c6e 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_setup use swiftest contains + module subroutine setup_construct_system(system, param) !! author: David A. Minton !! @@ -69,6 +70,7 @@ module subroutine setup_construct_system(system, param) return end subroutine setup_construct_system + module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! @@ -91,6 +93,7 @@ module subroutine setup_initialize_system(self, param) return end subroutine setup_initialize_system + module subroutine setup_body(self,n) !! author: David A. Minton !! @@ -148,6 +151,7 @@ module subroutine setup_body(self,n) return end subroutine setup_body + module subroutine setup_pl(self,n) !! author: David A. Minton !! @@ -186,6 +190,7 @@ module subroutine setup_pl(self,n) self%nplpl = 0 return end subroutine setup_pl + module subroutine setup_tp(self, n) !! author: David A. Minton diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index b8060829c..d307fa7a2 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_collision use swiftest contains + module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! @@ -20,6 +21,7 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_plplenc + module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) !! author: David A. Minton !! @@ -71,9 +73,11 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec end associate end select end select + return end subroutine symba_collision_check_pltpenc + pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmtot, rlim, dt, lvdotr) result(lcollision) !! author: David A. Minton !! @@ -112,8 +116,8 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt end if end if end if + return end function symba_collision_check_one - end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index df94d42b0..282ed2276 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_encounter_check use swiftest contains + module function symba_encounter_check_pl(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -48,6 +49,7 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc return end function symba_encounter_check_pl + module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -114,10 +116,13 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan end if end associate end do + end select end select - end select + + return end function symba_encounter_check_pltpenc + module function symba_encounter_check_tp(self, system, dt, irec) result(lany_encounter) !! author: David A. Minton !! @@ -166,9 +171,11 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc end associate end if end associate + return end function symba_encounter_check_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) !! author: David A. Minton !! @@ -198,5 +205,4 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, return end subroutine symba_encounter_check_one - end submodule s_symba_encounter_check \ No newline at end of file diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index acc3aabf9..403204017 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_io use swiftest contains + module subroutine symba_io_dump_particle_info(self, param, msg) !! author: David A. Minton !! @@ -11,6 +12,7 @@ module subroutine symba_io_dump_particle_info(self, param, msg) character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine symba_io_dump_particle_info + module subroutine symba_io_initialize_particle_info(self, param) !! author: David A. Minton !! @@ -21,6 +23,7 @@ module subroutine symba_io_initialize_particle_info(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_io_initialize_particle_info + module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -128,6 +131,7 @@ module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, ioms return end subroutine symba_io_param_reader + module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! @@ -187,9 +191,9 @@ module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, ioms end associate return - end subroutine symba_io_param_writer + module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) !! author: David A. Minton !! @@ -203,6 +207,7 @@ module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) ierr = 0 end subroutine symba_io_read_frame_info + module subroutine symba_io_write_frame_info(self, iu, param) implicit none diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index e5ba7550e..70f3fa54d 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -2,50 +2,48 @@ use swiftest contains -module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) - !! author: David A. Minton - !! - !! Compute heliocentric accelerations of massive bodies - !! - !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 - !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f - implicit none - ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - ! Internals - integer(I4B) :: k - real(DP) :: irij3, rji2, rlim2, faci, facj - real(DP), dimension(NDIM) :: dx + module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + !! author: David A. Minton + !! + !! Compute heliocentric accelerations of massive bodies + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_kick_getacch.f90 + !! Adapted from Hal Levison's Swift routine symba5_kick_getacch.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + ! Internals + integer(I4B) :: k + real(DP) :: irij3, rji2, rlim2, faci, facj + real(DP), dimension(NDIM) :: dx - select type(system) - class is (symba_nbody_system) - associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) - call helio_kick_getacch_pl(pl, system, param, t, lbeg) - ! Remove accelerations from encountering pairs - do k = 1, nplplenc - associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - !rlim2 = (pl%radius(i) + pl%radius(j))**2 - !if (rji2 > rlim2) then + select type(system) + class is (symba_nbody_system) + associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) + call helio_kick_getacch_pl(pl, system, param, t, lbeg) + ! Remove accelerations from encountering pairs + do k = 1, nplplenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) irij3 = 1.0_DP / (rji2 * sqrt(rji2)) faci = pl%Gmass(i) * irij3 facj = pl%Gmass(j) * irij3 pl%ah(:, i) = pl%ah(:, i) - facj * dx(:) pl%ah(:, j) = pl%ah(:, j) + faci * dx(:) - !end if - end associate - end do - end associate - end select + end associate + end do + end associate + end select - return + return end subroutine symba_kick_getacch_pl + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -79,11 +77,8 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) dx(:) = tp%xh(:,j) - pl%xend(:,i) end if rji2 = dot_product(dx(:), dx(:)) - !rlim2 = (pl%radius(i))**2 - !if (rji2 > rlim2) then - fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) - tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) - !end if + fac = pl%Gmass(i) / (rji2 * sqrt(rji2)) + tp%ah(:,j) = tp%ah(:,j) + fac * dx(:) end IF end associate end do @@ -92,6 +87,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) return end subroutine symba_kick_getacch_tp + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) !! author: David A. Minton !! @@ -194,6 +190,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) end if end select end select + return end subroutine symba_kick_pltpenc diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 8ae223228..4ddc23ebd 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -1,6 +1,7 @@ submodule(symba_classes) s_symba_setup use swiftest contains + module subroutine symba_setup_pl(self, n) !! author: David A. Minton !! @@ -43,6 +44,7 @@ module subroutine symba_setup_pl(self, n) return end subroutine symba_setup_pl + module subroutine symba_setup_pltpenc(self, n) !! author: David A. Minton !! @@ -73,6 +75,7 @@ module subroutine symba_setup_pltpenc(self, n) return end subroutine symba_setup_pltpenc + module subroutine symba_setup_plplenc(self,n) !! author: David A. Minton !! @@ -100,6 +103,7 @@ module subroutine symba_setup_plplenc(self,n) return end subroutine symba_setup_plplenc + module subroutine symba_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -133,6 +137,7 @@ module subroutine symba_setup_initialize_system(self, param) return end subroutine symba_setup_initialize_system + module subroutine symba_setup_tp(self,n) !! author: David A. Minton !! @@ -153,6 +158,7 @@ module subroutine symba_setup_tp(self,n) self%nplenc(:) = 0 self%levelg(:) = -1 self%levelm(:) = -1 + return end subroutine symba_setup_tp diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 46065d269..d976e8b8f 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -1,6 +1,7 @@ submodule (symba_classes) s_symba_step use swiftest contains + module subroutine symba_step_system(self, param, t, dt) !! author: David A. Minton !! @@ -36,9 +37,9 @@ module subroutine symba_step_system(self, param, t, dt) end select return - end subroutine symba_step_system + module subroutine symba_step_interp_system(self, param, t, dt) !! author: David A. Minton !! @@ -87,9 +88,11 @@ module subroutine symba_step_interp_system(self, param, t, dt) end select end select end associate + return end subroutine symba_step_interp_system + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! @@ -172,8 +175,10 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) end select end associate + return end subroutine symba_step_recur_system + module subroutine symba_step_reset_system(self) !! author: David A. Minton !! @@ -216,9 +221,7 @@ module subroutine symba_step_reset_system(self) end select end associate - + return end subroutine symba_step_reset_system - - end submodule s_symba_step diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index a19886853..c97913e05 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -1,6 +1,7 @@ submodule(symba_classes) s_symba_util use swiftest contains + module subroutine symba_util_copy_pltpenc(self, source) !! author: David A. Minton !! @@ -18,8 +19,11 @@ module subroutine symba_util_copy_pltpenc(self, source) self%index1(1:n) = source%index1(1:n) self%index2(1:n) = source%index2(1:n) end associate + + return end subroutine symba_util_copy_pltpenc + module subroutine symba_util_copy_plplenc(self, source) !! author: David A. Minton !! @@ -39,6 +43,8 @@ module subroutine symba_util_copy_plplenc(self, source) self%vb2(:,1:n) = source%vb2(:,1:n) end select end associate + + return end subroutine symba_util_copy_plplenc module subroutine symba_util_resize_pltpenc(self, nrequested) @@ -64,9 +70,11 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) self%status(nrequested+1:nold) = INACTIVE end if self%nenc = nrequested + return end subroutine symba_util_resize_pltpenc + module subroutine symba_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! @@ -114,6 +122,7 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) return end subroutine symba_util_sort_pl + module subroutine symba_util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -148,11 +157,12 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) end select call tp%rearrange(ind) - end associate + return end subroutine symba_util_sort_tp + module subroutine symba_util_sort_rearrange_pl(self, ind) !! author: David A. Minton !! @@ -187,9 +197,11 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) end do deallocate(pl_sorted) end associate + return end subroutine symba_util_sort_rearrange_pl + module subroutine symba_util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -210,6 +222,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine symba_util_sort_rearrange_tp diff --git a/src/tides/tides_spin_step.f90 b/src/tides/tides_spin_step.f90 index d6029a7e4..576aff8d7 100644 --- a/src/tides/tides_spin_step.f90 +++ b/src/tides/tides_spin_step.f90 @@ -29,6 +29,7 @@ function tidederiv(x, t, dt, xbeg, xend) result(y) end interface contains + module subroutine tides_step_spin_system(self, param, t, dt) !! author: Jennifer L.L. Pouplin and David A. Minton !! @@ -59,6 +60,7 @@ module subroutine tides_step_spin_system(self, param, t, dt) return end subroutine tides_step_spin_system + function tides_spin_derivs(rot_pl_cb, t, dt, xbeg, xend) result(drot) !! Need to add more arguments so we can pull in mass, radius, Ip, J2, etc... !! author: Jennifer L.L. Pouplin and David A. Minton !! @@ -90,6 +92,7 @@ function tides_spin_derivs(rot_pl_cb, t, dt, xbeg, xend) result(drot) !! Need to ! end do + return end function tides_spin_derivs function tides_derivs_eval(self, x, t) result(y) @@ -105,6 +108,8 @@ function tides_derivs_eval(self, x, t) result(y) else error stop "Lambda function was not initialized" end if + + return end function tides_derivs_eval function tides_derivs_init(lambda, dt, xbeg, xend) result(f) @@ -120,6 +125,8 @@ function tides_derivs_init(lambda, dt, xbeg, xend) result(f) f%dt = dt allocate(f%xbeg, source = xbeg) allocate(f%xend, source = xend) + return end function tides_derivs_init + end submodule s_tides_step_spin \ No newline at end of file diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index 387fc8f6b..bdc772d21 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_util_coord use swiftest contains + module subroutine util_coord_h2b_pl(self, cb) !! author: David A. Minton !! @@ -37,6 +38,7 @@ module subroutine util_coord_h2b_pl(self, cb) return end subroutine util_coord_h2b_pl + module subroutine util_coord_h2b_tp(self, cb) !! author: David A. Minton !! @@ -66,6 +68,7 @@ module subroutine util_coord_h2b_tp(self, cb) return end subroutine util_coord_h2b_tp + module subroutine util_coord_b2h_pl(self, cb) !! author: David A. Minton !! @@ -91,6 +94,7 @@ module subroutine util_coord_b2h_pl(self, cb) return end subroutine util_coord_b2h_pl + module subroutine util_coord_b2h_tp(self, cb) !! author: David A. Minton !! @@ -118,4 +122,5 @@ module subroutine util_coord_b2h_tp(self, cb) return end subroutine util_coord_b2h_tp + end submodule s_util_coord \ No newline at end of file diff --git a/src/util/util_exit.f90 b/src/util/util_exit.f90 index 4413bd9b3..6814b0029 100644 --- a/src/util/util_exit.f90 +++ b/src/util/util_exit.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_exit use swiftest contains + module subroutine util_exit(code) !! author: David A. Minton !! @@ -30,4 +31,5 @@ module subroutine util_exit(code) stop end subroutine util_exit + end submodule s_util_exit diff --git a/src/util/util_peri.f90 b/src/util/util_peri.f90 index 1884728da..407ee5097 100644 --- a/src/util/util_peri.f90 +++ b/src/util/util_peri.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_peri use swiftest contains + module subroutine util_peri_tp(self, system, param) !! author: David A. Minton !! @@ -56,7 +57,8 @@ module subroutine util_peri_tp(self, system, param) end do end if end associate - return + return end subroutine util_peri_tp + end submodule s_util_peri diff --git a/src/util/util_reverse_status.f90 b/src/util/util_reverse_status.f90 index 5fc0d0f22..c416e60e1 100644 --- a/src/util/util_reverse_status.f90 +++ b/src/util/util_reverse_status.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_reverse_status use swiftest contains + module subroutine util_reverse_status(self) !! author: David A. Minton !! @@ -14,5 +15,8 @@ module subroutine util_reverse_status(self) elsewhere (self%status(:) == INACTIVE) self%status(:) = ACTIVE end where + + return end subroutine util_reverse_status + end submodule s_util_reverse_status \ No newline at end of file diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index 2c52c86df..c401cb0ce 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -27,9 +27,9 @@ module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) end if return - end subroutine util_set_beg_end_pl + module subroutine util_set_ir3h(self) !! author: David A. Minton !! @@ -53,6 +53,7 @@ module subroutine util_set_ir3h(self) return end subroutine util_set_ir3h + module subroutine util_set_msys(self) !! author: David A. Minton !! @@ -66,6 +67,7 @@ module subroutine util_set_msys(self) return end subroutine util_set_msys + module subroutine util_set_mu_pl(self, cb) !! author: David A. Minton !! @@ -76,9 +78,11 @@ module subroutine util_set_mu_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object if (self%nbody > 0) self%mu(:) = cb%Gmass + self%Gmass(:) + return end subroutine util_set_mu_pl + module subroutine util_set_mu_tp(self, cb) !! author: David A. Minton !! @@ -93,6 +97,7 @@ module subroutine util_set_mu_tp(self, cb) return end subroutine util_set_mu_tp + module subroutine util_set_rhill(self,cb) !! author: David A. Minton !! @@ -110,6 +115,7 @@ module subroutine util_set_rhill(self,cb) return end subroutine util_set_rhill + module subroutine util_set_rhill_approximate(self,cb) !! author: David A. Minton !! diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 255137f3d..92d785773 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_util_solve use swiftest contains + function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) !! author: David A. Minton !! diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index c08343cee..6c9e51665 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_sort use swiftest contains + module subroutine util_sort_body(self, sortby, ascending) !! author: David A. Minton !! @@ -53,6 +54,7 @@ module subroutine util_sort_body(self, sortby, ascending) return end subroutine util_sort_body + module subroutine util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! @@ -103,6 +105,7 @@ module subroutine util_sort_pl(self, sortby, ascending) return end subroutine util_sort_pl + module subroutine util_sort_tp(self, sortby, ascending) !! author: David A. Minton !! @@ -143,6 +146,7 @@ module subroutine util_sort_tp(self, sortby, ascending) return end subroutine util_sort_tp + module subroutine util_sort_rearrange_body(self, ind) !! author: David A. Minton !! @@ -179,9 +183,11 @@ module subroutine util_sort_rearrange_body(self, ind) self%mu(1:n) = body_sorted%mu(ind(1:n)) deallocate(body_sorted) end associate + return end subroutine util_sort_rearrange_body + module subroutine util_sort_rearrange_pl(self, ind) !! author: David A. Minton !! @@ -211,9 +217,11 @@ module subroutine util_sort_rearrange_pl(self, ind) pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) deallocate(pl_sorted) end associate + return end subroutine util_sort_rearrange_pl + module subroutine util_sort_rearrange_tp(self, ind) !! author: David A. Minton !! @@ -234,9 +242,11 @@ module subroutine util_sort_rearrange_tp(self, ind) tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) deallocate(tp_sorted) end associate + return end subroutine util_sort_rearrange_tp + module subroutine util_sort_dp(arr) !! author: David A. Minton !! @@ -259,9 +269,11 @@ module subroutine util_sort_dp(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_dp + module subroutine util_sort_index_dp(arr, ind) !! author: David A. Minton !! @@ -286,9 +298,11 @@ module subroutine util_sort_index_dp(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_dp + module subroutine util_sort_i4b(arr) !! author: David A. Minton !! @@ -311,9 +325,11 @@ module subroutine util_sort_i4b(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_i4b + module subroutine util_sort_index_i4b(arr, ind) !! author: David A. Minton !! @@ -338,9 +354,11 @@ module subroutine util_sort_index_i4b(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_i4b + module subroutine util_sort_sp(arr) !! author: David A. Minton !! @@ -363,9 +381,11 @@ module subroutine util_sort_sp(arr) end do arr(j + 1) = tmp end do + return end subroutine util_sort_sp + module subroutine util_sort_index_sp(arr, ind) !! author: David A. Minton !! @@ -390,6 +410,8 @@ module subroutine util_sort_index_sp(arr, ind) end do ind(j + 1) = i end do + return end subroutine util_sort_index_sp + end submodule s_util_sort diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 7cd4b6c7d..0d90cd573 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_spill_and_fill use swiftest contains + module subroutine util_spill_body(self, discards, lspill_list) !! author: David A. Minton !! @@ -70,9 +71,11 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%ldiscard = .true. end associate - + + return end subroutine util_spill_body + module subroutine util_fill_body(self, inserts, lfill_list) !! author: David A. Minton !! @@ -152,9 +155,11 @@ module subroutine util_fill_body(self, inserts, lfill_list) ! This is the base class, so will be the last to be called in the cascade. keeps%nbody = size(keeps%id(:)) end associate - + + return end subroutine util_fill_body + module subroutine util_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! @@ -198,9 +203,11 @@ module subroutine util_spill_pl(self, discards, lspill_list) write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' end select end associate + return end subroutine util_spill_pl + module subroutine util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -257,9 +264,11 @@ module subroutine util_fill_pl(self, inserts, lfill_list) write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' end select end associate + return end subroutine util_fill_pl + module subroutine util_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! @@ -272,25 +281,27 @@ module subroutine util_spill_tp(self, discards, lspill_list) logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse associate(keeps => self, ntp => self%nbody) - select type(discards) - class is (swiftest_tp) - !> Spill components specific to the test particle class - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - end if - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' - end select + select type(discards) + class is (swiftest_tp) + !> Spill components specific to the test particle class + discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) + discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) + discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + if (count(.not.lspill_list(:)) > 0) then + keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) + keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) + keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) + end if + call util_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' + end select end associate + return end subroutine util_spill_tp + module subroutine util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! @@ -303,23 +314,24 @@ module subroutine util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps associate(keeps => self) - select type(inserts) - class is (swiftest_tp) - !> Spill components specific to the test particle class - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' - end select + select type(inserts) + class is (swiftest_tp) + !> Spill components specific to the test particle class + keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) + keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) + + keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) + keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) + + keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) + keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + + call util_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' + end select end associate + return end subroutine util_fill_tp diff --git a/src/util/util_valid.f90 b/src/util/util_valid.f90 index ac9cc2fad..c5923b38e 100644 --- a/src/util/util_valid.f90 +++ b/src/util/util_valid.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_valid use swiftest contains + module subroutine util_valid(pl, tp) !! author: David A. Minton !! @@ -35,6 +36,6 @@ module subroutine util_valid(pl, tp) end associate return - end subroutine util_valid + end submodule s_util_valid diff --git a/src/util/util_version.f90 b/src/util/util_version.f90 index 2b2c351be..54ef0e14a 100644 --- a/src/util/util_version.f90 +++ b/src/util/util_version.f90 @@ -1,6 +1,7 @@ submodule (swiftest_classes) s_util_version use swiftest contains + module subroutine util_version() !! author: David A. Minton !! diff --git a/src/whm/whm_coord.f90 b/src/whm/whm_coord.f90 index af5368aa8..23f1c11d7 100644 --- a/src/whm/whm_coord.f90 +++ b/src/whm/whm_coord.f90 @@ -1,6 +1,7 @@ submodule (whm_classes) s_whm_coord use swiftest contains + module subroutine whm_coord_h2j_pl(self, cb) !! author: David A. Minton !! @@ -39,6 +40,7 @@ module subroutine whm_coord_h2j_pl(self, cb) return end subroutine whm_coord_h2j_pl + module subroutine whm_coord_j2h_pl(self, cb) !! author: David A. Minton !! @@ -76,6 +78,7 @@ module subroutine whm_coord_j2h_pl(self, cb) return end subroutine whm_coord_j2h_pl + module subroutine whm_coord_vh2vj_pl(self, cb) !! author: David A. Minton !! @@ -107,5 +110,6 @@ module subroutine whm_coord_vh2vj_pl(self, cb) return end subroutine whm_coord_vh2vj_pl + end submodule s_whm_coord diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index 454e1bc53..b205f0828 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) whm_drift use swiftest contains + module subroutine whm_drift_pl(self, system, param, dt, mask) !! author: David A. Minton !! @@ -41,7 +42,6 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) end associate return - end subroutine whm_drift_pl end submodule whm_drift diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index c6d0b1723..e4d92e53c 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_gr use swiftest contains + module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies @@ -32,9 +33,11 @@ module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton pl%ah(:, i) = pl%ah(:, i) + aj(:, i) + suma(:) end do end associate + return end subroutine whm_gr_kick_getacch_pl + module subroutine whm_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! @@ -58,8 +61,10 @@ module subroutine whm_gr_kick_getacch_tp(self, param) tp%ah(:, i) = tp%ah(:, i) + beta * tp%xh(:, i) / rjmag4 end do end associate + return end subroutine whm_gr_kick_getacch_tp + module pure subroutine whm_gr_p4_pl(self, param, dt) !! author: David A. Minton diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 4a8b68330..7678a5602 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_kick use swiftest contains + module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -50,9 +51,11 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) end associate + return end subroutine whm_kick_getacch_pl + module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) !! author: David A. Minton !! @@ -93,9 +96,11 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) end associate + return end subroutine whm_kick_getacch_tp + function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) !! author: David A. Minton !! @@ -123,6 +128,7 @@ function whm_kick_getacch_ah0(mu, xhp, n) result(ah0) return end function whm_kick_getacch_ah0 + pure subroutine whm_kick_getacch_ah1(cb, pl) !! author: David A. Minton !! @@ -147,9 +153,9 @@ pure subroutine whm_kick_getacch_ah1(cb, pl) end associate return - end subroutine whm_kick_getacch_ah1 + pure subroutine whm_kick_getacch_ah2(cb, pl) !! author: David A. Minton !! @@ -182,6 +188,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) return end subroutine whm_kick_getacch_ah2 + module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -224,6 +231,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) return end subroutine whm_kick_vh_pl + module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) !! author: David A. Minton !! @@ -262,6 +270,4 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) return end subroutine whm_kick_vh_tp - - end submodule s_whm_kick diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 40dcd4f75..4cdcbc63e 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -1,6 +1,7 @@ submodule(whm_classes) s_whm_setup use swiftest contains + module subroutine whm_setup_pl(self,n) !! author: David A. Minton !! @@ -30,6 +31,7 @@ module subroutine whm_setup_pl(self,n) return end subroutine whm_setup_pl + module subroutine whm_setup_tp(self,n) !! author: David A. Minton !! @@ -47,6 +49,7 @@ module subroutine whm_setup_tp(self,n) return end subroutine whm_setup_tp + module subroutine whm_util_set_mu_eta_pl(self, cb) !! author: David A. Minton !! @@ -69,8 +72,10 @@ module subroutine whm_util_set_mu_eta_pl(self, cb) end do end associate + return end subroutine whm_util_set_mu_eta_pl + module subroutine whm_setup_initialize_system(self, param) !! author: David A. Minton !! @@ -95,6 +100,7 @@ module subroutine whm_setup_initialize_system(self, param) call self%tp%v2pv(param) end if + return end subroutine whm_setup_initialize_system end submodule s_whm_setup \ No newline at end of file diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ebcb94e27..ee1a0c780 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -25,6 +25,7 @@ module subroutine whm_step_system(self, param, t, dt) return end subroutine whm_step_system + module subroutine whm_step_pl(self, system, param, t, dt) !! author: David A. Minton !! @@ -55,9 +56,11 @@ module subroutine whm_step_pl(self, system, param, t, dt) call pl%j2h(cb) call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) end associate + return end subroutine whm_step_pl + module subroutine whm_step_tp(self, system, param, t, dt) !! author: David A. Minton !! @@ -88,6 +91,7 @@ module subroutine whm_step_tp(self, system, param, t, dt) call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) end associate end select + return end subroutine whm_step_tp diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 7e1b02f50..e8815a8ea 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -1,49 +1,50 @@ submodule(whm_classes) s_whm_util use swiftest contains - module subroutine whm_util_spill_pl(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) WHM test particle structure from active list to discard list - !! - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - associate(keeps => self) - select type(discards) - class is (whm_pl) - discards%eta(:) = pack(keeps%eta(:), lspill_list(:)) - discards%muj(:) = pack(keeps%muj(:), lspill_list(:)) - discards%ir3j(:) = pack(keeps%ir3j(:), lspill_list(:)) - do i = 1, NDIM - discards%xj(i, :) = pack(keeps%xj(i, :), lspill_list(:)) - discards%vj(i, :) = pack(keeps%vj(i, :), lspill_list(:)) - end do - if (count(.not.lspill_list(:)) > 0) then - keeps%eta(:) = pack(keeps%eta(:), .not. lspill_list(:)) - keeps%muj(:) = pack(keeps%muj(:), .not. lspill_list(:)) - keeps%ir3j(:) = pack(keeps%ir3j(:), .not. lspill_list(:)) + module subroutine whm_util_spill_pl(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) WHM test particle structure from active list to discard list + !! + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + associate(keeps => self) + select type(discards) + class is (whm_pl) + discards%eta(:) = pack(keeps%eta(:), lspill_list(:)) + discards%muj(:) = pack(keeps%muj(:), lspill_list(:)) + discards%ir3j(:) = pack(keeps%ir3j(:), lspill_list(:)) do i = 1, NDIM - keeps%xj(i, :) = pack(keeps%xj(i, :), .not. lspill_list(:)) - keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) + discards%xj(i, :) = pack(keeps%xj(i, :), lspill_list(:)) + discards%vj(i, :) = pack(keeps%vj(i, :), lspill_list(:)) end do - end if - call util_spill_pl(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on whm_pl' - end select - end associate - return + if (count(.not.lspill_list(:)) > 0) then + keeps%eta(:) = pack(keeps%eta(:), .not. lspill_list(:)) + keeps%muj(:) = pack(keeps%muj(:), .not. lspill_list(:)) + keeps%ir3j(:) = pack(keeps%ir3j(:), .not. lspill_list(:)) + do i = 1, NDIM + keeps%xj(i, :) = pack(keeps%xj(i, :), .not. lspill_list(:)) + keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) + end do + end if + call util_spill_pl(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on whm_pl' + end select + end associate + return end subroutine whm_util_spill_pl + module subroutine whm_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -86,97 +87,102 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end associate return - - end subroutine whm_util_fill_pl - - module subroutine whm_util_set_ir3j(self) - !! author: David A. Minton - !! - !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - ! Internals - integer(I4B) :: i - real(DP) :: r2, ir - - if (self%nbody > 0) then - do i = 1, self%nbody - r2 = dot_product(self%xh(:, i), self%xh(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3h(i) = ir / r2 - r2 = dot_product(self%xj(:, i), self%xj(:, i)) - ir = 1.0_DP / sqrt(r2) - self%ir3j(i) = ir / r2 - end do - end if - end subroutine whm_util_set_ir3j - - module subroutine whm_util_sort_pl(self, sortby, ascending) - !! author: David A. Minton - !! - !! Sort a WHM massive body object in-place. - !! sortby is a string indicating which array component to sort. - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order - ! Internals - integer(I4B), dimension(self%nbody) :: ind - integer(I4B) :: direction - - if (ascending) then - direction = 1 - else - direction = -1 - end if - - associate(pl => self, npl => self%nbody) - select case(sortby) - case("eta") - call util_sort(direction * pl%eta(1:npl), ind(1:npl)) - case("muj") - call util_sort(direction * pl%muj(1:npl), ind(1:npl)) - case("ir3j") - call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) - case("xj", "vj") - write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' - case default - call util_sort_pl(pl, sortby, ascending) - return - end select - - call pl%rearrange(ind) - - end associate - return - end subroutine whm_util_sort_pl - - module subroutine whm_util_sort_rearrange_pl(self, ind) - !! author: David A. Minton - !! - !! Rearrange WHM massive body structure in-place from an index list. - !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. - implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) - ! Internals - class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body - integer(I4B) :: i - - associate(pl => self, npl => self%nbody) - call util_sort_rearrange_pl(pl,ind) - allocate(pl_sorted, source=self) - pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) - pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) - pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) - pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) - pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) - deallocate(pl_sorted) - end associate - return - end subroutine whm_util_sort_rearrange_pl + end subroutine whm_util_fill_pl + + + module subroutine whm_util_set_ir3j(self) + !! author: David A. Minton + !! + !! Sets the inverse Jacobi and heliocentric radii cubed (1/rj**3 and 1/rh**3) + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + ! Internals + integer(I4B) :: i + real(DP) :: r2, ir + + if (self%nbody > 0) then + do i = 1, self%nbody + r2 = dot_product(self%xh(:, i), self%xh(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3h(i) = ir / r2 + r2 = dot_product(self%xj(:, i), self%xj(:, i)) + ir = 1.0_DP / sqrt(r2) + self%ir3j(i) = ir / r2 + end do + end if + + return + end subroutine whm_util_set_ir3j + + + module subroutine whm_util_sort_pl(self, sortby, ascending) + !! author: David A. Minton + !! + !! Sort a WHM massive body object in-place. + !! sortby is a string indicating which array component to sort. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + ! Internals + integer(I4B), dimension(self%nbody) :: ind + integer(I4B) :: direction + + if (ascending) then + direction = 1 + else + direction = -1 + end if + + associate(pl => self, npl => self%nbody) + select case(sortby) + case("eta") + call util_sort(direction * pl%eta(1:npl), ind(1:npl)) + case("muj") + call util_sort(direction * pl%muj(1:npl), ind(1:npl)) + case("ir3j") + call util_sort(direction * pl%ir3j(1:npl), ind(1:npl)) + case("xj", "vj") + write(*,*) 'Cannot sort by ' // trim(adjustl(sortby)) // '. Component not sortable!' + case default + call util_sort_pl(pl, sortby, ascending) + return + end select + + call pl%rearrange(ind) + end associate + + return + end subroutine whm_util_sort_pl + + + module subroutine whm_util_sort_rearrange_pl(self, ind) + !! author: David A. Minton + !! + !! Rearrange WHM massive body structure in-place from an index list. + !! This is a helper utility used to make polymorphic sorting work on Swiftest structures. + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + ! Internals + class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body + integer(I4B) :: i + + associate(pl => self, npl => self%nbody) + call util_sort_rearrange_pl(pl,ind) + allocate(pl_sorted, source=self) + pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) + pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) + pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) + pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) + pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + deallocate(pl_sorted) + end associate + + return + end subroutine whm_util_sort_rearrange_pl end submodule s_whm_util From 67ceaf17f889a20e0803a63624fd5be4f9e3efa9 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 10:47:43 -0400 Subject: [PATCH 110/194] Cleaned up formatting and restyled for consistency. --- src/modules/helio_classes.f90 | 1 + src/modules/symba_classes.f90 | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index d03466676..22c39961c 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -208,4 +208,5 @@ module subroutine helio_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsizee end subroutine helio_step_tp end interface + end module helio_classes diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 01fb7bbf4..4bd154126 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -413,7 +413,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) class(symba_tp), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine symba_util_sort_rearrange_tp - end interface + end module symba_classes \ No newline at end of file From 04feaa9ec3bfd6cc27dcc1f1b08f07fcd914fe64 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 10:48:01 -0400 Subject: [PATCH 111/194] Cleaned up formatting and restyled for consistency. --- src/modules/swiftest.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 10578c5b6..58074a2fe 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -16,5 +16,4 @@ module swiftest implicit none public - end module swiftest From 665bf78d21438880a2855c84c2a753cfa140147d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 10:50:29 -0400 Subject: [PATCH 112/194] Added a better description of the purpose of the swiftest module --- src/modules/swiftest.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 58074a2fe..61d45163c 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -2,7 +2,7 @@ module swiftest !! author: David A. Minton !! graph: false !! - !! Basic parameters, definitions, and global type definitions used throughout the Swiftest project + !! This module serves to combine all of the Swiftest project modules under a single umbrella so that they can be accessed from individual submodule implementations with a simple "use swiftest" line. use swiftest_globals use swiftest_operators use swiftest_classes From d28f0ff7f43dc8c4bd814bc16c74174359fd1a0d Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 11:08:23 -0400 Subject: [PATCH 113/194] Added new SymBA example --- .../1pl_1pl_encounter/cb.swiftest.in | Bin 0 -> 80 bytes .../1pl_1pl_encounter/init_cond.py | 186 ++++++++++++++++++ .../1pl_1pl_encounter/param.swifter.in | 26 +++ .../1pl_1pl_encounter/param.swiftest.in | 31 +++ .../1pl_1pl_encounter/pl.swifter.in | 12 ++ .../1pl_1pl_encounter/pl.swiftest.in | Bin 0 -> 248 bytes .../swiftest_vs_swifter.ipynb | 139 +++++++++++++ .../1pl_1pl_encounter/tp.swifter.in | 1 + .../1pl_1pl_encounter/tp.swiftest.in | Bin 0 -> 16 bytes src/rmvs/rmvs_discard.f90 | 2 + src/tides/tides_getacch_pl.f90 | 3 +- 11 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in create mode 100755 examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in create mode 100644 examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..d0ae0ed15fe3ea8dd15557055a926fce3c60b59c GIT binary patch literal 80 ncmd;JKmZOP6NHU2HoW29>+AsI-}OJ>6US3*597mhVB-S-U7iOf literal 0 HcmV?d00001 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py new file mode 100755 index 000000000..eeb2791d0 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +""" +For testing RMVS, the code generates clones of test particles based on one that is fated to impact Mercury. +To use the script, modify the variables just after the "if __name__ == '__main__':" line +""" +import numpy as np +import swiftest +from scipy.io import FortranFile +import sys + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_tp = "tp.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_tp = "tp.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.dat" +swiftest_enc = "enc.swiftest.dat" + +MU2KG = swiftest.MSun +TU2S = swiftest.YR2S +DU2M = swiftest.AU2M + +GMSun = swiftest.GMSunSI * TU2S**2 / DU2M**3 + +# Simple initial conditions of a circular planet with one smaller massive body in a close encounter state +# Simulation start, stop, and output cadence times +t_0 = 0 # simulation start time +deltaT = 0.25 * swiftest.JD2S / TU2S # simulation step size +end_sim = deltaT #0.15 +t_print = deltaT #output interval to print results + +iout = int(np.ceil(t_print / deltaT)) +rmin = swiftest.RSun / swiftest.AU2M +rmax = 1000.0 + +npl = 2 +ntp = 0 +plid1 = 2 +plid2 = 100 + +radius1 = np.double(4.25875607065041e-05) +mass1 = np.double(0.00012002693582795244940133) +mass2 = mass1 / 100.0 +radius2 = radius1 * (mass2 / mass1)**(1.0/3.0) + +apl1 = np.longdouble(1.0) +apl2 = np.longdouble(1.01) +vpl1 = np.longdouble(2 * np.pi) +vpl2 = np.longdouble(2 * np.pi / np.sqrt(apl2)) + +p_pl1 = np.array([apl1, 0.0, 0.0], dtype=np.double) +v_pl1 = np.array([0.0, vpl1, 0.0], dtype=np.double) + +p_pl2 = np.array([apl2, 0.0, 0.0], dtype=np.double) +v_pl2 = np.array([0.0, vpl2, 0.0], dtype=np.double) + +Rhill1 = np.double(apl1 * 0.0100447248332378922085) +Rhill2 = Rhill1 * (mass2 / mass1)**(1.0 / 3.0) + +#Make Swifter files +plfile = open(swifter_pl, 'w') +print(npl+1, f'! Planet input file generated using init_cond.py',file=plfile) + +print(1,GMSun,file=plfile) +print('0.0 0.0 0.0',file=plfile) +print('0.0 0.0 0.0',file=plfile) + +print(plid1,"{:.23g}".format(mass1),Rhill1, file=plfile) +print(radius1, file=plfile) +print(*p_pl1, file=plfile) +print(*v_pl1, file=plfile) + +print(plid2,"{:.23g}".format(mass2),Rhill2, file=plfile) +print(radius2, file=plfile) +print(*p_pl2, file=plfile) +print(*v_pl2, file=plfile) + +plfile.close() + +tpfile = open(swifter_tp, 'w') +print(0,file=tpfile) +tpfile.close() + +sys.stdout = open(swifter_input, "w") +print(f'! Swifter input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'PL_IN {swifter_pl}') +print(f'TP_IN {swifter_tp}') +print(f'IN_TYPE ASCII') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swifter_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT UNKNOWN') +#print(f'J2 {swiftest.J2Sun}') +#print(f'J4 {swiftest.J4Sun}') +print(f'J2 0.0') +print(f'J4 0.0') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swifter_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'RHILL_PRESENT yes') +sys.stdout = sys.__stdout__ + +#Now make Swiftest files +cbfile = FortranFile(swiftest_cb, 'w') +Msun = np.double(1.0) +cbfile.write_record(0) +cbfile.write_record(np.double(GMSun)) +cbfile.write_record(np.double(rmin)) +#cbfile.write_record(np.double(swiftest.J2Sun)) +#cbfile.write_record(np.double(swiftest.J4Sun)) +cbfile.write_record(np.double(0.0)) +cbfile.write_record(np.double(0.0)) +cbfile.close() + +plfile = FortranFile(swiftest_pl, 'w') +plfile.write_record(npl) + +plfile.write_record(plid1) +plfile.write_record(np.vstack([p_pl1[0],p_pl2[0]])) +plfile.write_record(np.vstack([p_pl1[1],p_pl2[1]])) +plfile.write_record(np.vstack([p_pl1[2],p_pl2[2]])) +plfile.write_record(np.vstack([v_pl1[0],v_pl2[0]])) +plfile.write_record(np.vstack([v_pl1[1],v_pl2[1]])) +plfile.write_record(np.vstack([v_pl1[2],v_pl2[2]])) +plfile.write_record(np.array([mass1,mass2])) +plfile.write_record(np.array([Rhill1,Rhill2])) +plfile.write_record(np.array([radius1,radius2])) +plfile.close() +tpfile = FortranFile(swiftest_tp, 'w') +tpfile.write_record(ntp) + +tpfile.close() + +sys.stdout = open(swiftest_input, "w") +print(f'! Swiftest input file generated using init_cond.py') +print(f'T0 {t_0} ') +print(f'TSTOP {end_sim}') +print(f'DT {deltaT}') +print(f'CB_IN {swiftest_cb}') +print(f'PL_IN {swiftest_pl}') +print(f'TP_IN {swiftest_tp}') +print(f'IN_TYPE REAL8') +print(f'ISTEP_OUT {iout:d}') +print(f'ISTEP_DUMP {iout:d}') +print(f'BIN_OUT {swiftest_bin}') +print(f'OUT_TYPE REAL8') +print(f'OUT_FORM XV') +print(f'OUT_STAT REPLACE') +print(f'CHK_CLOSE yes') +print(f'CHK_RMIN {rmin}') +print(f'CHK_RMAX {rmax}') +print(f'CHK_EJECT {rmax}') +print(f'CHK_QMIN {rmin}') +print(f'CHK_QMIN_COORD HELIO') +print(f'CHK_QMIN_RANGE {rmin} {rmax}') +print(f'ENC_OUT {swiftest_enc}') +print(f'EXTRA_FORCE no') +print(f'BIG_DISCARD no') +print(f'ROTATION no') +print(f'GR no') +print(f'MU2KG {MU2KG}') +print(f'DU2M {DU2M}') +print(f'TU2S {TU2S}') +print(f'RHILL_PRESENT yes') +print(f'MTINY 1e-12') + + + + diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in new file mode 100644 index 000000000..037d91c09 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in @@ -0,0 +1,26 @@ +! Swifter input file generated using init_cond.py +T0 0 +TSTOP 0.0006844626967830253 +DT 0.0006844626967830253 +PL_IN pl.swifter.in +TP_IN tp.swifter.in +IN_TYPE ASCII +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swifter.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT UNKNOWN +J2 0.0 +J4 0.0 +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swifter.dat +EXTRA_FORCE no +BIG_DISCARD no +RHILL_PRESENT yes diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in new file mode 100644 index 000000000..3e8f808ce --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -0,0 +1,31 @@ +! Swiftest input file generated using init_cond.py +T0 0 +TSTOP 0.0006844626967830253 +DT 0.0006844626967830253 +CB_IN cb.swiftest.in +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +IN_TYPE REAL8 +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swiftest.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT REPLACE +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swiftest.dat +EXTRA_FORCE no +BIG_DISCARD no +ROTATION no +GR no +MU2KG 1.988409870698051e+30 +DU2M 149597870700.0 +TU2S 31557600.0 +RHILL_PRESENT yes +MTINY 1e-12 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in new file mode 100644 index 000000000..9f0548fc1 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in @@ -0,0 +1,12 @@ +3 ! Planet input file generated using init_cond.py +1 39.476926408897625196 +0.0 0.0 0.0 +0.0 0.0 0.0 +2 0.00012002693582795244940133 0.010044724833237892 +4.25875607065041e-05 +1.0 0.0 0.0 +0.0 6.283185307179586 0.0 +100 1.2002693582795244601319e-06 0.002164070363255244 +9.17521181499312e-06 +1.01 0.0 0.0 +0.0 6.252003053624663 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..51f9195316f75ec269d86d78c9046aaa2d16dab0 GIT binary patch literal 248 zcmd;JU|?VZVi4efVr0GmSO!FVu-A;~KlD}OgFQ$LAr4mn79&SoLf0kax1yv&qwR7r zUM5KgLgq{PMDyJ*lehmPxLQ_Dd5axP{puz5sv(nF?6>HD&rRBu2zRHD`Gi8o5H|Z` N5_L__Z6AZx0{}Ng9lHPk literal 0 HcmV?d00001 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb new file mode 100644 index 000000000..9796e3374 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import swiftest\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 6.845e-04\n", + "Creating Dataset\n", + "Successfully converted 2 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftersim = swiftest.Simulation(param_file=\"param.swifter.in\", codename=\"Swifter\")\n", + "swiftersim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.369e-03\n", + "Creating Dataset\n" + ] + }, + { + "ename": "MergeError", + "evalue": "conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mMergeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mswiftestsim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswiftest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSimulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam_file\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"param.swiftest.in\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mswiftestsim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/simulation_class.py\u001b[0m in \u001b[0;36mbin2xr\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swiftest\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 137\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswiftest2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 138\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Swiftest simulation data stored as xarray DataSet .ds'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swifter\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/io.py\u001b[0m in \u001b[0;36mswiftest2xr\u001b[0;34m(param)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mtpds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtpda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'vec'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\nCreating Dataset'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombine_by_coords\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcbds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpds\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Successfully converted {ds.sizes['time']} output frames.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/combine.py\u001b[0m in \u001b[0;36mcombine_by_coords\u001b[0;34m(datasets, compat, data_vars, coords, fill_value, join, combine_attrs)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m )\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge\u001b[0;34m(objects, compat, join, fill_value, combine_attrs)\u001b[0m\n\u001b[1;32m 893\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 895\u001b[0;31m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 896\u001b[0m )\n\u001b[1;32m 897\u001b[0m \u001b[0mmerged\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_construct_direct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mmerge_result\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_asdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_core\u001b[0;34m(objects, compat, join, combine_attrs, priority_arg, explicit_coords, indexes, fill_value)\u001b[0m\n\u001b[1;32m 625\u001b[0m \u001b[0mprioritized\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_priority_vars_and_indexes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maligned\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 626\u001b[0m variables, out_indexes = merge_collected(\n\u001b[0;32m--> 627\u001b[0;31m \u001b[0mcollected\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprioritized\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 628\u001b[0m )\n\u001b[1;32m 629\u001b[0m \u001b[0massert_unique_multiindex_level_names\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariables\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_collected\u001b[0;34m(grouped, prioritized, compat, combine_attrs)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0mvariables\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mvariable\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvariable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0melements_list\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 234\u001b[0;31m \u001b[0mmerged_vars\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munique_variable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvariables\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 235\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mMergeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcompat\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"minimal\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36munique_variable\u001b[0;34m(name, variables, compat, equals)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mequals\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m raise MergeError(\n\u001b[0;32m--> 142\u001b[0;31m \u001b[0;34mf\"conflicting values for variable {name!r} on objects to be combined. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 143\u001b[0m \u001b[0;34m\"You can skip this check by specifying compat='override'.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 144\u001b[0m )\n", + "\u001b[0;31mMergeError\u001b[0m: conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'." + ] + } + ], + "source": [ + "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", + "swiftestsim.bin2xr()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestsim.ds - swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time' : 'time (y)'})\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['vx'].plot.line(x=\"time (y)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['vx'].sel(id=100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swifter.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in new file mode 100644 index 0000000000000000000000000000000000000000..64bf92f74a457d2f4bc42798493db15cc3ab1008 GIT binary patch literal 16 Ncmd;JKmZOP6953P01*HH literal 0 HcmV?d00001 diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 14613724e..1f1927e7a 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -1,6 +1,7 @@ submodule(rmvs_classes) s_rmvs_discard use swiftest contains + module subroutine rmvs_discard_tp(self, system, param) !! author: David A. Minton !! @@ -33,4 +34,5 @@ module subroutine rmvs_discard_tp(self, system, param) end associate end subroutine rmvs_discard_tp + end submodule s_rmvs_discard \ No newline at end of file diff --git a/src/tides/tides_getacch_pl.f90 b/src/tides/tides_getacch_pl.f90 index ae503e082..f0bf64cc7 100644 --- a/src/tides/tides_getacch_pl.f90 +++ b/src/tides/tides_getacch_pl.f90 @@ -1,6 +1,7 @@ submodule(swiftest_classes) s_tides_kick_getacch use swiftest contains + module subroutine tides_kick_getacch_pl(self, system) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! @@ -59,6 +60,6 @@ module subroutine tides_kick_getacch_pl(self, system) end associate return - end subroutine tides_kick_getacch_pl + end submodule s_tides_kick_getacch \ No newline at end of file From 9c1800ef80f36e0e71817c0ad87caa7ae7a0a530 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 11:18:55 -0400 Subject: [PATCH 114/194] Added missing use statements to interfaces --- src/modules/symba_classes.f90 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 4bd154126..f0450e021 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -164,6 +164,7 @@ module symba_classes interface module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) + use swiftest_classes, only : swiftest_parameters implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object @@ -174,6 +175,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec end subroutine symba_collision_check_pltpenc module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) + use swiftest_classes, only : swiftest_parameters implicit none class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object @@ -227,6 +229,7 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc end function symba_encounter_check_tp module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object @@ -236,6 +239,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) end subroutine symba_kick_getacch_pl module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object @@ -358,6 +362,7 @@ module subroutine symba_step_interp_system(self, param, t, dt) end subroutine symba_step_interp_system module recursive subroutine symba_step_recur_system(self, param, t, ireci) + use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters From e2985c2661011e35646ce646182fc99be093ab80 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 11:22:07 -0400 Subject: [PATCH 115/194] Removed obsolete iflag variable since rmvs_chk_ind returns logical --- src/symba/symba_encounter_check.f90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 282ed2276..8e3105a2e 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -190,7 +190,6 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, integer(I4B), intent(in) :: irec logical, intent(out) :: lencounter, lvdotr ! Internals - integer(I4B) :: iflag real(DP) :: r2, v2, rcrit, r2crit, vdotr rcrit = (rhill1 + rhill2)*RHSCALE*(RSHELL**(irec)) @@ -198,8 +197,7 @@ module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, r2 = xr**2 + yr**2 + zr**2 v2 = vxr**2 + vyr**2 + vzr**2 vdotr = xr * vxr + yr * vyr + zr * vzr - iflag = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) - lencounter = (iflag /= 0) + lencounter = rmvs_chk_ind(r2, v2, vdotr, dt, r2crit) lvdotr = (vdotr < 0.0_DP) return From 370954fb672a869cb25b786dd378edad1e555c75 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 11:59:19 -0400 Subject: [PATCH 116/194] Added param argument to setup methods for bodies. Cleaned up interfaces and types that were not correct and did some more formatting and restyling as needed --- Makefile.Defines | 8 +-- src/io/io.f90 | 4 +- src/main/swiftest_driver.f90 | 8 ++- src/modules/rmvs_classes.f90 | 16 +++-- src/modules/swiftest_classes.f90 | 27 ++++---- src/modules/symba_classes.f90 | 20 +++--- src/modules/whm_classes.f90 | 18 ++---- src/rmvs/rmvs_kick.f90 | 5 +- src/rmvs/rmvs_setup.f90 | 24 +++---- src/rmvs/rmvs_step.f90 | 35 ++++++----- src/setup/setup.f90 | 34 ++++++---- src/symba/symba_setup.f90 | 105 +++++++++++++++++-------------- src/whm/whm_setup.f90 | 30 +++------ 13 files changed, 172 insertions(+), 162 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 07126f842..70069bb71 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -FORTRAN = ifort +#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/io/io.f90 b/src/io/io.f90 index 8bd47c9a7..337c73bef 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -618,7 +618,7 @@ module subroutine io_read_body_in(self, param) case(ASCII_TYPE) open(unit = iu, file = infile, status = 'old', form = 'FORMATTED', iostat = ierr) read(iu, *, iostat = ierr) nbody - call self%setup(nbody) + call self%setup(nbody, param) if (nbody > 0) then do i = 1, nbody select type(self) @@ -650,7 +650,7 @@ module subroutine io_read_body_in(self, param) case (REAL4_TYPE, REAL8_TYPE) !, SWIFTER_REAL4_TYPE, SWIFTER_REAL8_TYPE) open(unit=iu, file=infile, status='old', form='UNFORMATTED', iostat=ierr) read(iu, iostat=ierr, err=100) nbody - call self%setup(nbody) + call self%setup(nbody, param) if (nbody > 0) then call self%read_frame(iu, param, XV, ierr) self%status(:) = ACTIVE diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 78d6c7d46..805264c2c 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -17,7 +17,8 @@ program swiftest_driver integer(I8B) :: iloop !! Loop counter integer(I8B) :: idump !! Dump cadence counter integer(I8B) :: iout !! Output cadence counter - integer(I8B), parameter :: LOOPMAX = huge(iloop) !! Maximum loop value before resetting + !integer(I8B), parameter :: LOOPMAX = huge(iloop) !! Maximum loop value before resetting + integer(I8B) :: nloops !! Number of steps to take in the simulation real(DP) :: start_wall_time !! Wall clock time at start of execution real(DP) :: finish_wall_time !! Wall clock time when execution has finished integer(I4B) :: iu !! Unit number of binary file @@ -51,6 +52,7 @@ program swiftest_driver iloop = 0 iout = istep_out idump = istep_dump + nloops = ceiling(tstop / dt) if (istep_out > 0) call nbody_system%write_frame(iu, param) !> Define the maximum number of threads nthreads = 1 ! In the *serial* case @@ -59,7 +61,7 @@ program swiftest_driver !$ write(*,'(a)') ' ------------------' !$ write(*,'(a,i3,/)') ' Number of threads = ', nthreads write(*, *) " *************** Main Loop *************** " - do iloop = 1, LOOPMAX + do iloop = 1, nloops !> Step the system forward in time call nbody_system%step(param, t, dt) @@ -85,7 +87,7 @@ program swiftest_driver idump = istep_dump end if end if - if (t > tstop) exit + !if (t >= tstop) exit end do !> Dump the final state of the system to file diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index de4cdec4c..7422c4835 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -131,10 +131,12 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine rmvs_kick_getacch_tp - module subroutine rmvs_setup_pl(self,n) + module subroutine rmvs_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine rmvs_setup_pl module subroutine rmvs_setup_initialize_system(self, param) @@ -144,10 +146,12 @@ module subroutine rmvs_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine rmvs_setup_initialize_system - module subroutine rmvs_setup_tp(self,n) + module subroutine rmvs_setup_tp(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parametere end subroutine rmvs_setup_tp module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index eff9f4077..ec7e2ec7d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -669,34 +669,37 @@ module subroutine orbel_xv2el_vec(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine orbel_xv2el_vec - module subroutine setup_body(self,n) + module subroutine setup_body(self, n, param) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - integer, intent(in) :: n !! Number of particles to allocate space for + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_body module subroutine setup_construct_system(system, param) implicit none class(swiftest_nbody_system), allocatable, intent(inout) :: system !! Swiftest system object - type(swiftest_parameters), intent(in) :: param !! Swiftest parameters + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_construct_system module subroutine setup_initialize_system(self, param) implicit none - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine setup_initialize_system - module subroutine setup_pl(self,n) + module subroutine setup_pl(self, n, param) implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - integer, intent(in) :: n !! Number of massive bodies to allocate space for + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_pl - module subroutine setup_tp(self, n) + module subroutine setup_tp(self, n, param) implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - integer, intent(in) :: n !! Number of bodies to allocate space for + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parametersr end subroutine setup_tp module subroutine tides_kick_getacch_pl(self, system) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index f0450e021..e4a2c8938 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -312,22 +312,24 @@ module subroutine symba_io_write_frame_info(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_frame_info - module subroutine symba_setup_pl(self,n) + module subroutine symba_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_pl), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_setup_pl module subroutine symba_setup_pltpenc(self,n) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_pltpenc module subroutine symba_setup_plplenc(self,n) implicit none class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_plplenc module subroutine symba_setup_initialize_system(self, param) @@ -337,10 +339,12 @@ module subroutine symba_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_setup_initialize_system - module subroutine symba_setup_tp(self,n) + module subroutine symba_setup_tp(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter end subroutine symba_setup_tp module subroutine symba_step_system(self, param, t, dt) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index c242d2521..9e15c8d86 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -55,13 +55,12 @@ module whm_classes !! WHM test particle class type, extends(swiftest_tp) :: whm_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_setup_tp and whm_util_spill_tp + !! component list, such as whm_util_spill_tp contains procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles procedure :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction procedure :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction - procedure :: setup => whm_setup_tp !! Allocates new components of the whm class and recursively calls parent allocations procedure :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp @@ -193,10 +192,12 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) end subroutine whm_gr_p4_tp !> Reads WHM massive body object in from file - module subroutine whm_setup_pl(self,n) + module subroutine whm_setup_pl(self, n, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body objectobject - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(whm_pl), intent(inout) :: self !! WHM massive body objectobject + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_setup_pl module subroutine whm_util_set_ir3j(self) @@ -231,13 +232,6 @@ module subroutine whm_setup_initialize_system(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine whm_setup_initialize_system - !> Reads WHM test particle object in from file - module subroutine whm_setup_tp(self,n) - implicit none - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - integer, intent(in) :: n !! Number of test particles to allocate - end subroutine whm_setup_tp - module subroutine whm_step_pl(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 545258ddb..53ba9439e 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -18,7 +18,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals - type(swiftest_parameters) :: param_planetocen + class(swiftest_parameters), allocatable :: param_planetocen real(DP), dimension(:, :), allocatable :: xh_original real(DP) :: GMcb_original integer(I4B) :: i @@ -34,7 +34,6 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) select type (cb => system%cb) class is (rmvs_cb) associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) - system_planetocen%lbeg = lbeg if (system_planetocen%lbeg) then @@ -44,7 +43,7 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) end if allocate(xh_original, source=tp%xh) - param_planetocen = param + allocate(param_planetocen, source=param) ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter param_planetocen%loblatecb = .false. param_planetocen%lextra_force = .false. diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 916109e39..0f34d529a 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine rmvs_setup_pl(self,n) + module subroutine rmvs_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate RMVS test particle structure @@ -10,14 +10,15 @@ module subroutine rmvs_setup_pl(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine rmvs_setup.f90 implicit none ! Arguments - class(rmvs_pl), intent(inout) :: self !! RMVS test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(rmvs_pl), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals - integer(I4B) :: i,j + integer(I4B) :: i,j !> Call allocation method for parent class associate(pl => self) - call whm_setup_pl(pl, n) + call whm_setup_pl(pl, n, param) if (n <= 0) return allocate(pl%outer(0:NTENC)) @@ -92,7 +93,7 @@ module subroutine rmvs_setup_initialize_system(self, param) class is (rmvs_pl) cbenci%lplanetocentric = .true. plenci%lplanetocentric = .true. - call plenci%setup(npl) + call plenci%setup(npl, param) plenci%status(:) = ACTIVE ! plind stores the heliocentric index value of a planetocentric planet ! e.g. Consider an encounter with planet 3. @@ -121,7 +122,7 @@ module subroutine rmvs_setup_initialize_system(self, param) end subroutine rmvs_setup_initialize_system - module subroutine rmvs_setup_tp(self,n) + module subroutine rmvs_setup_tp(self, n, param) !! author: David A. Minton !! !! Allocate WHM test particle structure @@ -129,11 +130,12 @@ module subroutine rmvs_setup_tp(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter - !> Call allocation method for parent class - call whm_setup_tp(self, n) + !> Call allocation method for parent class. In this case, whm does not have its own setup method, so we use the base method for swiftest_tp + call setup_tp(self, n, param) if (n <= 0) return allocate(self%lperi(n)) diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index be8ca0c2a..f6d5d1e73 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -347,7 +347,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) associate(npl => pl%nbody) dti = dto / NTPHENC - call rmvs_make_planetocentric(cb, pl, tp) + call rmvs_make_planetocentric(param, cb, pl, tp) do i = 1, npl if (pl%nenc(i) == 0) cycle select type(planetocen_system => pl%planetocentric(i)) @@ -399,7 +399,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) end subroutine rmvs_step_in - subroutine rmvs_make_planetocentric(cb, pl, tp) + subroutine rmvs_make_planetocentric(param, cb, pl, tp) !! author: David A. Minton !! !! When encounters are detected, this method will call the interpolation methods for the planets and @@ -408,13 +408,14 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) !! implicit none ! Arguments + class(swiftest_parameters), intent(in) :: param !! Current run configuration paramete class(rmvs_cb), intent(inout) :: cb !! RMVS central body object class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object ! Internals - integer(I4B) :: i, j, inner_index, ipc2hc - logical, dimension(:), allocatable :: encmask + integer(I4B) :: i, j, inner_index, ipc2hc + logical, dimension(:), allocatable :: encmask associate (npl => pl%nbody, ntp => tp%nbody) do i = 1, npl @@ -432,7 +433,7 @@ subroutine rmvs_make_planetocentric(cb, pl, tp) select type(tpenci => pl%planetocentric(i)%tp) class is (rmvs_tp) tpenci%lplanetocentric = .true. - call tpenci%setup(pl%nenc(i)) + call tpenci%setup(pl%nenc(i), param) tpenci%cb_heliocentric = cb tpenci%ipleP = i tpenci%status(:) = ACTIVE @@ -488,18 +489,18 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) !! Adapted from David E. Kaufmann's Swifter routine rmvs_peri.f90 implicit none ! Arguments - class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object (planetocentric) - class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object (heliocentric) - real(DP), intent(in) :: t !! current time - real(DP), intent(in) :: dt !! step size - logical, intent(in) :: lfirst !! Logical flag indicating whether current invocation is the first - integer(I4B), intent(in) :: inner_index !! Outer substep number within current set - integer(I4B), intent(in) :: ipleP !! index of RMVS planet being closely encountered + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle object (planetocentric) + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object (heliocentric) + real(DP), intent(in) :: t !! current time + real(DP), intent(in) :: dt !! step size + logical, intent(in) :: lfirst !! Logical flag indicating whether current invocation is the first + integer(I4B), intent(in) :: inner_index !! Outer substep number within current set + integer(I4B), intent(in) :: ipleP !! index of RMVS planet being closely encountered class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, id1, id2 - real(DP) :: r2, mu, rhill2, vdotr, a, peri, capm, tperi, rpl - real(DP), dimension(NDIM) :: xh1, xh2, vh1, vh2 + integer(I4B) :: i, id1, id2 + real(DP) :: r2, mu, rhill2, vdotr, a, peri, capm, tperi, rpl + real(DP), dimension(NDIM) :: xh1, xh2, vh1, vh2 rhill2 = pl%rhill(ipleP)**2 mu = pl%Gmass(ipleP) @@ -570,8 +571,8 @@ subroutine rmvs_end_planetocentric(pl, tp) !! implicit none ! Arguments - class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object - class(rmvs_tp), intent(inout) :: tp !! RMVS test particle objec + class(rmvs_pl), intent(inout) :: pl !! RMVS massive body object + class(rmvs_tp), intent(inout) :: tp !! RMVS test particle objec ! Internals integer(I4B) :: i, j, inner_index integer(I4B), dimension(:), allocatable :: tpind diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 5e6933c6e..faaf0eef9 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -10,7 +10,7 @@ module subroutine setup_construct_system(system, param) implicit none ! Arguments class(swiftest_nbody_system), allocatable, intent(inout) :: system !! Swiftest system object - type(swiftest_parameters), intent(in) :: param !! Swiftest parameters + class(swiftest_parameters), intent(in) :: param !! Swiftest parameters select case(param%integrator) case (BS) @@ -78,7 +78,7 @@ module subroutine setup_initialize_system(self, param) !! implicit none ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters call self%cb%initialize(param) @@ -94,15 +94,17 @@ module subroutine setup_initialize_system(self, param) end subroutine setup_initialize_system - module subroutine setup_body(self,n) + module subroutine setup_body(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest particle class. Allocates space for all particles and !! initializes all components with a value. !! Note: Timing tests indicate that (NDIM, n) is more efficient than (NDIM, n) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - integer, intent(in) :: n !! Number of particles to allocate space for + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter self%nbody = n if (n <= 0) return @@ -119,6 +121,7 @@ module subroutine setup_body(self,n) allocate(self%ah(NDIM, n)) allocate(self%aobl(NDIM, n)) allocate(self%agr(NDIM, n)) + allocate(self%atide(NDIM, n)) allocate(self%ir3h(n)) allocate(self%a(n)) allocate(self%e(n)) @@ -152,18 +155,20 @@ module subroutine setup_body(self,n) end subroutine setup_body - module subroutine setup_pl(self,n) + module subroutine setup_pl(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest massive body class. Allocates space for all particles and !! initializes all components with a value. implicit none - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - integer, intent(in) :: n !! Number of massive bodies to allocate space for + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter !> Call allocation method for parent class !> The parent class here is the abstract swiftest_body class, so we can't use the type-bound procedure - call setup_body(self, n) + call setup_body(self, n, param) if (n <= 0) return allocate(self%mass(n)) @@ -188,22 +193,25 @@ module subroutine setup_pl(self,n) self%Q(:) = 0.0_DP self%tlag(:) = 0.0_DP self%nplpl = 0 + return end subroutine setup_pl - module subroutine setup_tp(self, n) + module subroutine setup_tp(self, n, param) !! author: David A. Minton !! !! Constructor for base Swiftest test particle particle class. Allocates space for !! all particles and initializes all components with a value. implicit none - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - integer, intent(in) :: n !! Number of bodies to allocate space for + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter !> Call allocation method for parent class !> The parent class here is the abstract swiftest_body class, so we can't use the type-bound procedure - call setup_body(self, n) + call setup_body(self, n, param) if (n <= 0) return allocate(self%isperi(n)) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 4ddc23ebd..b147293dd 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -2,7 +2,42 @@ use swiftest contains - module subroutine symba_setup_pl(self, n) + module subroutine symba_setup_initialize_system(self, param) + !! author: David A. Minton + !! + !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. + !! This subroutine will also sort the massive bodies in descending order by mass + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j + + ! Call parent method + associate(system => self) + call whm_setup_initialize_system(system, param) + call system%mergeadd_list%setup(1, param) + call system%mergesub_list%setup(1, param) + call system%pltpenc_list%setup(1) + call system%plplenc_list%setup(1) + select type(pl => system%pl) + class is (symba_pl) + call pl%sort("mass", ascending=.false.) + select type(param) + class is (symba_parameters) + pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%nplm = count(pl%lmtiny(:)) + end select + end select + end associate + + return + end subroutine symba_setup_initialize_system + + + module subroutine symba_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate SyMBA test particle structure @@ -10,14 +45,16 @@ module subroutine symba_setup_pl(self, n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine symba_setup.f90 implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA test particle object - integer(I4B), intent(in) :: n !! Number of massive bodies to allocate + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals - integer(I4B) :: i + integer(I4B) :: i - !> Call allocation method for parent class - call setup_pl(self, n) + !> Call allocation method for parent class. In this case, helio_pl does not have its own setup method so we use the base method for swiftest_pl + call setup_pl(self, n, param) if (n <= 0) return + allocate(self%lcollision(n)) allocate(self%lencounter(n)) allocate(self%nplenc(n)) @@ -53,10 +90,11 @@ module subroutine symba_setup_pltpenc(self, n) implicit none ! Arguments class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for self%nenc = n if (n == 0) return + if (allocated(self%lvdotr)) deallocate(self%lvdotr) if (allocated(self%status)) deallocate(self%status) if (allocated(self%level)) deallocate(self%level) @@ -72,11 +110,12 @@ module subroutine symba_setup_pltpenc(self, n) self%level(:) = -1 self%index1(:) = 0 self%index2(:) = 0 + return end subroutine symba_setup_pltpenc - module subroutine symba_setup_plplenc(self,n) + module subroutine symba_setup_plplenc(self, n) !! author: David A. Minton !! !! A constructor that sets the number of encounters and allocates and initializes all arrays @@ -84,10 +123,11 @@ module subroutine symba_setup_plplenc(self,n) implicit none ! Arguments class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer, intent(in) :: n !! Number of encounters to allocate space for + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for call symba_setup_pltpenc(self, n) if (n == 0) return + if (allocated(self%xh1)) deallocate(self%xh1) if (allocated(self%xh2)) deallocate(self%xh2) if (allocated(self%vb1)) deallocate(self%vb1) @@ -100,45 +140,12 @@ module subroutine symba_setup_plplenc(self,n) self%xh2(:,:) = 0.0_DP self%vb1(:,:) = 0.0_DP self%vb2(:,:) = 0.0_DP - return - end subroutine symba_setup_plplenc - - - module subroutine symba_setup_initialize_system(self, param) - !! author: David A. Minton - !! - !! Initialize an SyMBA nbody system from files and sets up the planetocentric structures. - !! This subroutine will also sort the massive bodies in descending order by mass - !! - implicit none - ! Arguments - class(symba_nbody_system), intent(inout) :: self !! SyMBA system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i, j - ! Call parent method - associate(system => self) - call whm_setup_initialize_system(system, param) - call system%mergeadd_list%setup(1) - call system%mergesub_list%setup(1) - call system%pltpenc_list%setup(1) - call system%plplenc_list%setup(1) - select type(pl => system%pl) - class is (symba_pl) - call pl%sort("mass", ascending=.false.) - select type(param) - class is (symba_parameters) - pl%lmtiny(:) = pl%Gmass(:) > param%MTINY - pl%nplm = count(pl%lmtiny(:)) - end select - end select - end associate return - end subroutine symba_setup_initialize_system + end subroutine symba_setup_plplenc - module subroutine symba_setup_tp(self,n) + module subroutine symba_setup_tp(self, n, param) !! author: David A. Minton !! !! Allocate WHM test particle structure @@ -146,12 +153,14 @@ module subroutine symba_setup_tp(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - integer, intent(in) :: n !! Number of test particles to allocate + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter - !> Call allocation method for parent class - call setup_tp(self, n) + !> Call allocation method for parent class. In this case, helio_tp does not have its own setup method so we use the base method for swiftest_tp + call setup_tp(self, n, param) if (n <= 0) return + allocate(self%nplenc(n)) allocate(self%levelg(n)) allocate(self%levelm(n)) diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 4cdcbc63e..0de03ec2c 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_setup_pl(self,n) + module subroutine whm_setup_pl(self, n, param) !! author: David A. Minton !! !! Allocate WHM planet structure @@ -10,10 +10,12 @@ module subroutine whm_setup_pl(self,n) !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 implicit none ! Arguments - class(whm_pl), intent(inout) :: self !! Swiftest test particle object - integer(I4B), intent(in) :: n !! Number of test particles to allocate + class(whm_pl), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + !> Call allocation method for parent class - call setup_pl(self, n) + call setup_pl(self, n, param) if (n <= 0) return allocate(self%eta(n)) @@ -32,24 +34,6 @@ module subroutine whm_setup_pl(self,n) end subroutine whm_setup_pl - module subroutine whm_setup_tp(self,n) - !! author: David A. Minton - !! - !! Allocate WHM test particle structure - !! - !! Equivalent in functionality to David E. Kaufmann's Swifter routine whm_setup.f90 - implicit none - ! Arguments - class(whm_tp), intent(inout) :: self !! WHM test particle data structure - integer, intent(in) :: n !! Number of test particles to allocate - !> Call allocation method for parent class - call setup_tp(self, n) - if (n <= 0) return - - return - end subroutine whm_setup_tp - - module subroutine whm_util_set_mu_eta_pl(self, cb) !! author: David A. Minton !! @@ -92,7 +76,7 @@ module subroutine whm_setup_initialize_system(self, param) call self%pl%sort("ir3h", ascending=.false.) ! Make sure that the discard list gets allocated initially - call self%tp_discards%setup(self%tp%nbody) + call self%tp_discards%setup(self%tp%nbody, param) call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) if (param%lgr) then From d8b274f176271624918d6772d25ff34f151d1bf0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 12:53:08 -0400 Subject: [PATCH 117/194] Added allocation checks for optional arrays. Broke something in RMVS in the process... --- Makefile.Defines | 8 +- .../.idea/.gitignore | 0 .../cb.in | 0 .../cb.swiftest.in | 0 .../init_cond.py | 0 .../param.swifter.in | 2 +- .../param.swiftest.in | 1 + .../8pl_16tp_encounters/pl.in | 33 ++++ .../8pl_16tp_encounters/pl.swifter.in | 36 ++++ .../8pl_16tp_encounters/pl.swiftest.in | 33 ++++ .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 8 +- .../8pl_16tp_encounters/tp.in | 49 +++++ .../9pl_18tp_encounters/pl.in | 33 ---- .../9pl_18tp_encounters/pl.swifter.in | 36 ---- .../9pl_18tp_encounters/pl.swiftest.in | 33 ---- .../9pl_18tp_encounters/tp.in | 49 ----- src/modules/rmvs_classes.f90 | 4 +- src/rmvs/rmvs_setup.f90 | 16 +- src/rmvs/rmvs_step.f90 | 66 ++++--- src/setup/setup.f90 | 55 ++++-- src/util/util_sort.f90 | 21 ++- src/util/util_spill_and_fill.f90 | 172 +++++++++++++----- 22 files changed, 389 insertions(+), 266 deletions(-) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/.idea/.gitignore (100%) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/cb.in (100%) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/cb.swiftest.in (100%) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/init_cond.py (100%) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/param.swifter.in (100%) rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/param.swiftest.in (97%) create mode 100644 examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in create mode 100644 examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in create mode 100644 examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in rename examples/rmvs_swifter_comparison/{9pl_18tp_encounters => 8pl_16tp_encounters}/swiftest_rmvs_vs_swifter_rmvs.ipynb (99%) create mode 100644 examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in delete mode 100644 examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in delete mode 100644 examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in delete mode 100644 examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in delete mode 100644 examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in diff --git a/Makefile.Defines b/Makefile.Defines index 70069bb71..291f2c604 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -#FORTRAN = ifort +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/examples/rmvs_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/.idea/.gitignore rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/.idea/.gitignore diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.in similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.in diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/cb.swiftest.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/init_cond.py b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/init_cond.py rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in similarity index 100% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in index aa33eeaa4..d87472e35 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swifter.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -21,6 +21,6 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES J2 4.7535806948127355e-12 J4 -2.2473967953572827e-18 -RHILL_PRESENT YES diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in similarity index 97% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index 6504c9637..06edc324b 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -25,6 +25,7 @@ DU2M 149597870700.0 EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES +RHILL_PRESENT YES FRAGMENTATION NO ROTATION NO TIDES NO diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in new file mode 100644 index 000000000..86a616119 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in new file mode 100644 index 000000000..595cdc169 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 0.00029591220819207775568 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in new file mode 100644 index 000000000..86a616119 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 4.9125474498983623693e-11 0.0014751239400086721089 +1.6306381826061645943e-05 +-0.09861361766419070307 0.29750596935836171042 0.03335708456145129036 +-0.032353632540864457612 -0.0078122718370876240157 0.0023293874953380202045 +2 7.243452483873646905e-10 0.0067590794275223005208 +4.0453784346544178454e-05 +-0.6439817957564198947 -0.3248550380869373866 0.032702713983447248558 +0.008969709495375973937 -0.018153139924556138673 -0.0007667345025597138231 +3 8.9970113821660187435e-10 0.010044873080337524463 +4.25875607065040958e-05 +0.59421674333603324847 -0.82331253628773626296 3.7129329104855261984e-05 +0.013670550280388280365 0.010004295439859960809 -5.226292361234363611e-07 +4 9.549535102761465607e-11 0.0072467054748629370034 +2.265740805092889601e-05 +-1.592721551706784977 0.48166390206865000723 0.049163460846716633412 +-0.0035287723306552309585 -0.01219974682608557931 -0.00016910795626524249315 +5 2.825345908631354893e-07 0.35527074967975702942 +0.00046732617030490929307 +4.119089774477131094 -2.8872942462256898644 -0.080165336328135106125 +0.004245402942744468111 0.0065414198811065849687 -0.00012215100047356211078 +6 8.459715183006415395e-08 0.4376562090257202473 +0.00038925687730393611812 +6.3629100567525149756 -7.649727796147929304 -0.12023019299387090186 +0.0039834472120812329868 0.0035613826786502411278 -0.00022039988214595340028 +7 1.2920249163736673626e-08 0.4695793205674148502 +0.00016953449859497231466 +14.814154683311180349 13.052040295401360126 -0.14347198499748289868 +-0.002625101393275708784 0.0027742356008832688187 4.416821810149910185e-05 +8 1.5243589003230834323e-08 0.7813388398513013378 +0.000164587904124493665 +29.564924658285640646 -4.579331535234244299 -0.5871109926822926095 +0.00046449847307956888343 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb similarity index 99% rename from examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb rename to examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb index cd1a5aab8..64d928091 100644 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/swiftest_rmvs_vs_swifter_rmvs.ipynb @@ -120,7 +120,7 @@ "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + "fig.savefig(\"rmvs_swifter_comparison-8pl_16tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" ] }, { @@ -146,7 +146,7 @@ "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time (d)\")\n", "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + "fig.savefig(\"rmvs_swifter_comparison-8pl_16tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" ] }, { @@ -181,7 +181,7 @@ "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", "legend = ax.legend()\n", "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + "fig.savefig(\"rmvs_swifter_comparison-8pl_16tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" ] }, { @@ -216,7 +216,7 @@ "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", "legend = ax.legend()\n", "legend.remove()\n", - "fig.savefig(\"rmvs_swifter_comparison-mars_ejecta-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + "fig.savefig(\"rmvs_swifter_comparison-8pl_16tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" ] }, { diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in new file mode 100644 index 000000000..ae7796698 --- /dev/null +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in @@ -0,0 +1,49 @@ +16 +101 +-0.09859055695785905182 0.2975290300646933339 0.03335708456145129036 +-0.029750083068855306956 -0.0078122718370876240157 0.0023293874953380202045 +102 +-0.09863667837052235432 0.29748290865203008693 0.03335708456145129036 +-0.034957182012873608268 -0.0078122718370876240157 0.0023293874953380202045 +103 +-0.6439245854659476631 -0.32479782779646521051 0.032702713983447248558 +0.0153169432007213678765 -0.018153139924556138673 -0.0007667345025597138231 +104 +-0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 +0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 +105 +0.59427697124197276235 -0.8232523083817967491 3.7129329104855261984e-05 +0.020564990514662154913 0.010004295439859960809 -5.226292361234363611e-07 +106 +0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 +0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 +107 +-1.5926895092930311026 0.48169594448240382611 0.049163460846716633412 +-0.00044929323243133797994 -0.01219974682608557931 -0.00016910795626524249315 +108 +-1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 +-0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 +109 +4.119750673485228276 -2.8866333472175926822 -0.080165336328135106125 +0.041127620144391897894 0.0065414198811065849687 -0.00012215100047356211078 +110 +4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 +-0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 +111 +6.3634605491076454697 -7.64917730379279881 -0.12023019299387090186 +0.026096616095614821179 0.0035613826786502411278 -0.00022039988214595340028 +112 +6.3623595643973844815 -7.650278288503059798 -0.12023019299387090186 +-0.01812972167145235694 0.0035613826786502411278 -0.00022039988214595340028 +113 +14.814394441298382787 13.052280053388562564 -0.14347198499748289868 +0.010469662145386185101 0.0027742356008832688187 4.416821810149910185e-05 +114 +14.813914925323977911 13.051800537414157688 -0.14347198499748289868 +-0.015719864931937603536 0.0027742356008832688187 4.416821810149910185e-05 +115 +29.565157420731857485 -4.579098772788029237 -0.5871109926822926095 +0.014900134286357700347 0.003128345390031967918 -7.5036135696161668576e-05 +116 +29.564691895839423808 -4.5795642976804593616 -0.5871109926822926095 +-0.0139711373401985618214 0.003128345390031967918 -7.5036135696161668576e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in deleted file mode 100644 index bd980fc4b..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in deleted file mode 100644 index 701e9a14f..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swifter.in +++ /dev/null @@ -1,36 +0,0 @@ -9 -0 0.00029591220819207775568 -0.0 0.0 0.0 -0.0 0.0 0.0 -1 4.9125474498983623693e-11 0.0014751243077781048702 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 0.006759104275397271956 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 0.010044787321379672528 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 0.007246743835971885302 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 0.35527126534549128905 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 0.4376527512949726007 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 0.4695362423191493196 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 0.7812870996943599397 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in deleted file mode 100644 index bd980fc4b..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/pl.swiftest.in +++ /dev/null @@ -1,33 +0,0 @@ -8 -1 4.9125474498983623693e-11 -1.6306381826061645943e-05 -0.33206272695596028566 0.07436707001147663254 -0.02438290851908785084 --0.0115920916602103591525 0.028710618792657981169 0.0034094833969203438596 -2 7.243452483873646905e-10 -4.0453784346544178454e-05 --0.7188115337296047125 -0.0118554711069603201795 0.041316403191083782287 -0.00021427347881133320621 -0.020313576971905909774 -0.00029114855617710840843 -3 8.9970113821660187435e-10 -4.25875607065040958e-05 -0.35677088372527121507 -0.95189300879814897627 4.4027442504036787155e-05 -0.015830039028334789986 0.0059737936889703449964 -3.3484113013969089573e-07 -4 9.549535102761465607e-11 -2.265740805092889601e-05 --1.5233712071242269115 0.6723825347339112968 0.051459143378398922164 --0.0051275613251079554117 -0.011607719813367209372 -0.000117479966462153095864 -5 2.825345908631354893e-07 -0.00046732617030490929307 -4.049944927347420176 -2.9910878677758190314 -0.078187280837353656526 -0.0043972077687938898594 0.006432188574295680597 -0.00012509257442073270106 -6 8.459715183006415395e-08 -0.00038925687730393611812 -6.298929503477405767 -7.706413024510769816 -0.11669919842191249504 -0.0040140666547768266703 0.0035242303011843410798 -0.00022097170940726839814 -7 1.2920249163736673626e-08 -0.00016953449859497231466 -14.856082147529010129 13.007589275314199284 -0.14417795763685259391 --0.0026158276515510360365 0.0027821364817078499815 4.40781085949555924e-05 -8 1.5243589003230834323e-08 -0.000164587904124493665 -29.55744967800954015 -4.629377558152945049 -0.58590957207831262377 -0.00046987400245862169295 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in b/examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in deleted file mode 100644 index c7cf002d6..000000000 --- a/examples/rmvs_swifter_comparison/9pl_18tp_encounters/tp.in +++ /dev/null @@ -1,49 +0,0 @@ -16 -101 -0.33208578766229190915 0.07439013071780828379 -0.02438290851908785084 --0.008988542188201206762 0.028710618792657981169 0.0034094833969203438596 -102 -0.33203966624962866216 0.07434400930514498129 -0.02438290851908785084 --0.014195641132219511543 0.028710618792657981169 0.0034094833969203438596 -103 --0.7187543234391324809 -0.011798260816488121555 0.041316403191083782287 -0.0065615071841567274707 -0.020313576971905909774 -0.00029114855617710840843 -104 --0.71886874402007694407 -0.011912681397432518804 0.041316403191083782287 --0.006132960226534060408 -0.020313576971905909774 -0.00029114855617710840843 -105 -0.35683111163121072895 -0.9518327808922094624 4.4027442504036787155e-05 -0.022724479262608666269 0.0059737936889703449964 -3.3484113013969089573e-07 -106 -0.3567106558193317012 -0.95195323670408849015 4.4027442504036787155e-05 -0.008935598794060913702 0.0059737936889703449964 -3.3484113013969089573e-07 -107 --1.5233391647104730371 0.6724145771476651712 0.051459143378398922164 --0.0020480822268840624331 -0.011607719813367209372 -0.000117479966462153095864 -108 --1.5234032495379807859 0.6723504923201574224 0.051459143378398922164 --0.008207040423331847523 -0.011607719813367209372 -0.000117479966462153095864 -109 -4.050605826355517358 -2.9904269687677218492 -0.078187280837353656526 -0.041279424970441319642 0.006432188574295680597 -0.00012509257442073270106 -110 -4.049284028339322994 -2.9917487667839162135 -0.078187280837353656526 --0.032485009432853539924 0.006432188574295680597 -0.00012509257442073270106 -111 -6.299479995832536261 -7.7058625321556393217 -0.11669919842191249504 -0.02612723553831041573 0.0035242303011843410798 -0.00022097170940726839814 -112 -6.2983790111222752728 -7.70696351686590031 -0.11669919842191249504 --0.01809910222875676239 0.0035242303011843410798 -0.00022097170940726839814 -113 -14.856321905516212567 13.007829033301401722 -0.14417795763685259391 -0.010478935887110856981 0.0027821364817078499815 4.40781085949555924e-05 -114 -14.855842389541807691 13.007349517326996846 -0.14417795763685259391 --0.015710591190212928187 0.0027821364817078499815 4.40781085949555924e-05 -115 -29.55768244045575699 -4.6291447957067299868 -0.58590957207831262377 -0.014905509815736753265 0.0031274056019462009859 -7.51415892482447254e-05 -116 -29.557216915563323312 -4.6296103205991601115 -0.58590957207831262377 --0.0139657618108195089035 0.0031274056019462009859 -7.51415892482447254e-05 diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 7422c4835..88e3ee217 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -134,8 +134,8 @@ end subroutine rmvs_kick_getacch_tp module subroutine rmvs_setup_pl(self, n, param) use swiftest_classes, only : swiftest_parameters implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine rmvs_setup_pl diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 0f34d529a..9ca6e7d1c 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -36,13 +36,21 @@ module subroutine rmvs_setup_pl(self, n, param) do i = 0, NTPHENC allocate(pl%inner(i)%x(NDIM, n)) allocate(pl%inner(i)%v(NDIM, n)) - allocate(pl%inner(i)%aobl(NDIM, n)) - allocate(pl%inner(i)%atide(NDIM, n)) pl%inner(i)%x(:,:) = 0.0_DP pl%inner(i)%v(:,:) = 0.0_DP - pl%inner(i)%aobl(:,:) = 0.0_DP - pl%inner(i)%atide(:,:) = 0.0_DP end do + if (param%loblatecb) then + do i = 0, NTPHENC + allocate(pl%inner(i)%aobl(NDIM, n)) + pl%inner(i)%aobl(:,:) = 0.0_DP + end do + end if + if (param%ltides) then + do i = 0, NTPHENC + allocate(pl%inner(i)%atide(NDIM, n)) + pl%inner(i)%atide(:,:) = 0.0_DP + end do + end if end if end associate return diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index f6d5d1e73..d4791aefd 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -242,15 +242,18 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) GMcb(:) = cb%Gmass xtmp(:, :) = pl%inner(0)%x(:, :) vtmp(:, :) = pl%inner(0)%v(:, :) - if (param%loblatecb) then - allocate(xh_original,source=pl%xh) + + if ((param%loblatecb) .or. (param%ltides)) then + allocate(xh_original, source=pl%xh) pl%xh(:, :) = xtmp(:, :) ! Temporarily replace heliocentric position with inner substep values to calculate the oblateness terms + end if + if (param%loblatecb) then call pl%accel_obl(system) pl%inner(0)%aobl(:, :) = pl%aobl(:, :) ! Save the oblateness acceleration on the planet for this substep - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(0)%atide(:, :) = pl%atide(:, :) ! Save the oblateness acceleration on the planet for this substep - end if + end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(0)%atide(:, :) = pl%atide(:, :) ! Save the oblateness acceleration on the planet for this substep end if do inner_index = 1, NTPHENC - 1 @@ -301,10 +304,10 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(inner_index)%x(:, :) call pl%accel_obl(system) pl%inner(inner_index)%aobl(:, :) = pl%aobl(:, :) - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(inner_index)%atide(:, :) = pl%atide(:, :) - end if + end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(inner_index)%atide(:, :) = pl%atide(:, :) end if end do if (param%loblatecb) then @@ -312,13 +315,13 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) pl%xh(:,:) = pl%inner(NTPHENC)%x(:, :) call pl%accel_obl(system) pl%inner(NTPHENC)%aobl(:, :) = pl%aobl(:, :) - if (param%ltides) then - call pl%accel_tides(system) - pl%inner(NTPHENC)%atide(:, :) = pl%atide(:, :) - end if - ! Put the planet positions back into place - call move_alloc(xh_original, pl%xh) end if + if (param%ltides) then + call pl%accel_tides(system) + pl%inner(NTPHENC)%atide(:, :) = pl%atide(:, :) + end if + ! Put the planet positions back into place + if (allocated(xh_original)) call move_alloc(xh_original, pl%xh) end associate return @@ -373,10 +376,10 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) if (param%loblatecb) then cbenci%aoblbeg = cbenci%inner(inner_index - 1)%aobl(:, 1) cbenci%aoblend = cbenci%inner(inner_index )%aobl(:, 1) - if (param%ltides) then - cbenci%atidebeg = cbenci%inner(inner_index - 1)%atide(:, 1) - cbenci%atideend = cbenci%inner(inner_index )%atide(:, 1) - end if + end if + if (param%ltides) then + cbenci%atidebeg = cbenci%inner(inner_index - 1)%atide(:, 1) + cbenci%atideend = cbenci%inner(inner_index )%atide(:, 1) end if call tpenci%step(planetocen_system, param, inner_time, dti) @@ -451,18 +454,25 @@ subroutine rmvs_make_planetocentric(param, cb, pl, tp) do inner_index = 0, NTPHENC allocate(plenci%inner(inner_index)%x, mold=pl%inner(inner_index)%x) allocate(plenci%inner(inner_index)%v, mold=pl%inner(inner_index)%x) - allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) - allocate(plenci%inner(inner_index)%atide, mold=pl%inner(inner_index)%atide) allocate(cbenci%inner(inner_index)%x(NDIM,1)) allocate(cbenci%inner(inner_index)%v(NDIM,1)) - allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) - allocate(cbenci%inner(inner_index)%atide(NDIM,1)) cbenci%inner(inner_index)%x(:,1) = pl%inner(inner_index)%x(:, i) cbenci%inner(inner_index)%v(:,1) = pl%inner(inner_index)%v(:, i) - cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) - cbenci%inner(inner_index)%atide(:,1) = pl%inner(inner_index)%atide(:, i) plenci%inner(inner_index)%x(:,1) = -cbenci%inner(inner_index)%x(:,1) plenci%inner(inner_index)%v(:,1) = -cbenci%inner(inner_index)%v(:,1) + + if (param%loblatecb) then + allocate(plenci%inner(inner_index)%aobl, mold=pl%inner(inner_index)%aobl) + allocate(cbenci%inner(inner_index)%aobl(NDIM,1)) + cbenci%inner(inner_index)%aobl(:,1) = pl%inner(inner_index)%aobl(:, i) + end if + + if (param%ltides) then + allocate(plenci%inner(inner_index)%atide, mold=pl%inner(inner_index)%atide) + allocate(cbenci%inner(inner_index)%atide(NDIM,1)) + cbenci%inner(inner_index)%atide(:,1) = pl%inner(inner_index)%atide(:, i) + end if + do j = 2, npl ipc2hc = plenci%plind(j) plenci%inner(inner_index)%x(:,j) = pl%inner(inner_index)%x(:, ipc2hc) - cbenci%inner(inner_index)%x(:,1) @@ -608,8 +618,8 @@ subroutine rmvs_end_planetocentric(pl, tp) do inner_index = 0, NTPHENC deallocate(plenci%inner(inner_index)%x) deallocate(plenci%inner(inner_index)%v) - deallocate(plenci%inner(inner_index)%aobl) - deallocate(plenci%inner(inner_index)%atide) + if (allocated(plenci%inner(inner_index)%aobl)) deallocate(plenci%inner(inner_index)%aobl) + if (allocated(plenci%inner(inner_index)%atide)) deallocate(plenci%inner(inner_index)%atide) end do end select end select diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index faaf0eef9..c063e09a7 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -119,9 +119,6 @@ module subroutine setup_body(self, n, param) allocate(self%xb(NDIM, n)) allocate(self%vb(NDIM, n)) allocate(self%ah(NDIM, n)) - allocate(self%aobl(NDIM, n)) - allocate(self%agr(NDIM, n)) - allocate(self%atide(NDIM, n)) allocate(self%ir3h(n)) allocate(self%a(n)) allocate(self%e(n)) @@ -140,7 +137,6 @@ module subroutine setup_body(self, n, param) self%xb(:,:) = 0.0_DP self%vb(:,:) = 0.0_DP self%ah(:,:) = 0.0_DP - self%aobl(:,:) = 0.0_DP self%ir3h(:) = 0.0_DP self%a(:) = 0.0_DP self%e(:) = 0.0_DP @@ -151,6 +147,19 @@ module subroutine setup_body(self, n, param) self%a(:) = 0.0_DP self%mu(:) = 0.0_DP + if (param%loblatecb) then + allocate(self%aobl(NDIM, n)) + self%aobl(:,:) = 0.0_DP + end if + if (param%ltides) then + allocate(self%atide(NDIM, n)) + self%atide(:,:) = 0.0_DP + end if + if (param%lgr) then + allocate(self%agr(NDIM, n)) + self%agr(:,:) = 0.0_DP + end if + return end subroutine setup_body @@ -174,25 +183,35 @@ module subroutine setup_pl(self, n, param) allocate(self%mass(n)) allocate(self%Gmass(n)) allocate(self%rhill(n)) - allocate(self%radius(n)) - allocate(self%density(n)) - allocate(self%rot(NDIM, n)) - allocate(self%Ip(NDIM, n)) - allocate(self%k2(n)) - allocate(self%Q(n)) - allocate(self%tlag(n)) self%mass(:) = 0.0_DP self%Gmass(:) = 0.0_DP self%rhill(:) = 0.0_DP - self%radius(:) = 0.0_DP - self%density(:) = 1.0_DP - self%rot(:,:) = 0.0_DP - self%Ip(:,:) = 0.0_DP - self%k2(:) = 0.0_DP - self%Q(:) = 0.0_DP - self%tlag(:) = 0.0_DP + self%nplpl = 0 + + if (param%lclose) then + allocate(self%radius(n)) + allocate(self%density(n)) + self%radius(:) = 0.0_DP + self%density(:) = 1.0_DP + end if + + if (param%lrotation) then + allocate(self%rot(NDIM, n)) + allocate(self%Ip(NDIM, n)) + self%rot(:,:) = 0.0_DP + self%Ip(:,:) = 0.0_DP + end if + + if (param%ltides) then + allocate(self%k2(n)) + allocate(self%Q(n)) + allocate(self%tlag(n)) + self%k2(:) = 0.0_DP + self%Q(:) = 0.0_DP + self%tlag(:) = 0.0_DP + end if return end subroutine setup_pl diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 6c9e51665..759582b98 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -170,9 +170,6 @@ module subroutine util_sort_rearrange_body(self, ind) self%xb(:,1:n) = body_sorted%xb(:,ind(1:n)) self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) - self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) - self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) - self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) self%a(1:n) = body_sorted%a(ind(1:n)) self%e(1:n) = body_sorted%e(ind(1:n)) @@ -181,6 +178,9 @@ module subroutine util_sort_rearrange_body(self, ind) self%omega(1:n) = body_sorted%omega(ind(1:n)) self%capm(1:n) = body_sorted%capm(ind(1:n)) self%mu(1:n) = body_sorted%mu(ind(1:n)) + if (allocated(self%aobl)) self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) + if (allocated(self%atide)) self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) + if (allocated(self%agr)) self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) deallocate(body_sorted) end associate @@ -205,16 +205,17 @@ module subroutine util_sort_rearrange_pl(self, ind) pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) - pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) - pl%density(1:npl) = pl_sorted%density(ind(1:npl)) - pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) - pl%rot(:,1:npl) = pl_sorted%rot(:,ind(1:npl)) - pl%k2(1:npl) = pl_sorted%k2(ind(1:npl)) - pl%Q(1:npl) = pl_sorted%Q(ind(1:npl)) - pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) + if (allocated(pl%radius)) pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) + if (allocated(pl%density)) pl%density(1:npl) = pl_sorted%density(ind(1:npl)) + if (allocated(pl%Ip)) pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) + if (allocated(pl%rot)) pl%rot(:,1:npl) = pl_sorted%rot(:,ind(1:npl)) + if (allocated(pl%k2)) pl%k2(1:npl) = pl_sorted%k2(ind(1:npl)) + if (allocated(pl%Q)) pl%Q(1:npl) = pl_sorted%Q(ind(1:npl)) + if (allocated(pl%tlag)) pl%tlag(1:npl) = pl_sorted%tlag(ind(1:npl)) + deallocate(pl_sorted) end associate diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 0d90cd573..7bd2c39a7 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -33,11 +33,24 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%xb(i, :) = pack(keeps%xb(i, :), lspill_list(:)) discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) - discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) - discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) - discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) end do - if (count(.not.lspill_list(:)) > 0) then + if (allocated(keeps%aobl)) then + do i = 1, NDIM + discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%agr)) then + do i = 1, NDIM + discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%atide)) then + do i = 1, NDIM + discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) + end do + end if + + if (count(.not.lspill_list(:)) > 0) then keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) @@ -54,10 +67,26 @@ module subroutine util_spill_body(self, discards, lspill_list) keeps%xb(i, :) = pack(keeps%xb(i, :), .not. lspill_list(:)) keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) - keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) - keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) - keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) end do + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) + end do + end if + end if ! This is the base class, so will be the last to be called in the cascade. ! Therefore we need to set the nbody values for both the keeps and discareds @@ -119,16 +148,28 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%ah(i, :) = unpack(keeps%ah(i, :), .not.lfill_list(:), keeps%ah(i, :)) keeps%ah(i, :) = unpack(inserts%ah(i, :), lfill_list(:), keeps%ah(i, :)) - - keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) - keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + end do - keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) - keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) + keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + end do + end if - keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) - keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) - end do + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) + keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) + end do + end if + + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) + keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + end do + end if keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) @@ -181,21 +222,47 @@ module subroutine util_spill_pl(self, discards, lspill_list) discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) - discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) - discards%density(:) = pack(keeps%density(:), lspill_list(:)) - discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) - discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) - discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) - do i = 1, NDIM - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - end do + + if (allocated(keeps%radius)) discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) + if (allocated(keeps%density)) discards%density(:) = pack(keeps%density(:), lspill_list(:)) + if (allocated(keeps%k2)) discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) + if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) + if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + discards%rot(i, :) = pack(keeps%rot(i, :), lspill_list(:)) + end do + end if + if (count(.not.lspill_list(:)) > 0) then keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) - keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) - keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + if (allocated(keeps%radius)) keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) + if (allocated(keeps%density)) keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + if (allocated(keeps%k2)) keeps%k2(:) = pack(keeps%k2(:), .not. lspill_list(:)) + if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) + if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + keeps%rot(i,:) = pack(keeps%rot(i,:), .not. lspill_list(:)) + end do + end if + end if call util_spill_body(keeps, discards, lspill_list) @@ -234,29 +301,46 @@ module subroutine util_fill_pl(self, inserts, lfill_list) keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - - keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) - keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) - - keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) - keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + + if (allocated(keeps%radius)) then + keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) + keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) + end if + + if (allocated(keeps%density)) then + keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) + keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + end if + + if (allocated(keeps%k2)) then + keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) + keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + end if - keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) - keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + if (allocated(keeps%Q)) then + keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) + keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + end if - keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) - keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + if (allocated(keeps%tlag)) then + keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) + keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + end if - keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) - keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + if (allocated(keeps%Ip)) then + do i = 1, NDIM + keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) + keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + end do + end if - do i = 1, NDIM - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + if (allocated(keeps%rot)) then + do i = 1, NDIM + keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) + keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) + end do + end if - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) - end do keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) call util_fill_body(keeps, inserts, lfill_list) From 6eeb65c1501b4e6682c0e9ae435f9eb715dff120 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 29 Jul 2021 15:00:23 -0400 Subject: [PATCH 118/194] Replaced mask arguments with internal mask variable. --- .../8pl_16tp_encounters/init_cond.py | 2 +- .../8pl_16tp_encounters/param.swifter.in | 2 +- .../8pl_16tp_encounters/param.swiftest.in | 2 +- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 165 +++--------------- .../8pl_16tp_encounters/tp.in | 6 +- src/drift/drift.f90 | 5 +- src/helio/helio_drift.f90 | 32 ++-- src/helio/helio_kick.f90 | 10 +- src/helio/helio_step.f90 | 22 +-- src/io/io.f90 | 6 + src/kick/kick.f90 | 18 +- src/modules/helio_classes.f90 | 21 +-- src/modules/swiftest_classes.f90 | 7 +- src/modules/whm_classes.f90 | 9 +- src/obl/obl.f90 | 8 +- src/orbel/orbel.f90 | 8 +- src/rmvs/rmvs_kick.f90 | 4 +- src/setup/setup.f90 | 15 +- src/symba/symba_kick.f90 | 4 +- src/symba/symba_step.f90 | 32 ++-- src/util/util_reverse_status.f90 | 1 + src/util/util_solve.f90 | 4 +- src/util/util_sort.f90 | 14 +- src/util/util_spill_and_fill.f90 | 87 +++++---- src/whm/whm_drift.f90 | 5 +- src/whm/whm_gr.f90 | 6 +- src/whm/whm_kick.f90 | 10 +- src/whm/whm_step.f90 | 14 +- 28 files changed, 211 insertions(+), 308 deletions(-) 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 321c79932..97a60cf88 100755 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -25,7 +25,7 @@ sim.param['T0'] = 0.0 sim.param['DT'] = 1.0 sim.param['TSTOP'] = 365.25e1 -sim.param['ISTEP_OUT'] = 11 +sim.param['ISTEP_OUT'] = 1 sim.param['ISTEP_DUMP'] = 1 sim.param['CHK_QMIN_COORD'] = "HELIO" sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M 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 d87472e35..5cfc49851 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -2,7 +2,7 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 11 +ISTEP_OUT 1 ISTEP_DUMP 1 OUT_FORM XV OUT_TYPE REAL8 diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index 06edc324b..3d4f881e7 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -2,7 +2,7 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 11 +ISTEP_OUT 1 ISTEP_DUMP 1 OUT_FORM XV OUT_TYPE REAL8 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 64d928091..65036cb16 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 @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 3.652e+03\n", + "Reading in time 7.940e+02\n", "Creating Dataset\n", - "Successfully converted 333 output frames.\n", + "Successfully converted 795 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -45,9 +45,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 3.652e+03\n", + "Reading in time 7.940e+02\n", "Creating Dataset\n", - "Successfully converted 333 output frames.\n", + "Successfully converted 795 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": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAElCAYAAADDUxRwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAl/UlEQVR4nO3deZhU5Zn38e9PFlFBUQEFGgQVBURFIOAW4hIYMEYUlxE1UWNCzGiiYxyDcd4EkzfRmDduo4ljTFwzEMeJERVX0NGgRlExgtgRlUgLKKIEEAmL9/vHOa1lW91dXXW6q9r+fa7rXHWW5zznrqXr7uc5dZ6jiMDMzKxUW5Q7ADMz+2xwQjEzs0w4oZiZWSacUMzMLBNOKGZmlgknFDMzy4QTimVO0lRJt6XzfSWtldSu3HE1RNLnJVWXOw5oPJaWfE0lPSrp6+n8yZIezNl2kKRX0liOlrSTpMckrZH0i+aOzSqPE4p9iqTFkr5YZ91pkv7U1Loi4o2I6BwRm7OLsGkkhaTdGyoTEY9HxJ4tFVND6sZS9/0o12saEb+LiLE5q34EXJPG8kdgMvAOsG1EfLclY7PK4IRibZ6k9uWOoZXaBVhQZ/mlKOJqab8Hnw1OKFYUSb0k/Y+kFZJel/Sdesr1S1sI7XP2myHpXUmLJH0jp2w7Sd+X9GrabfKspD7ptoGSHkr3q5Z0Qs5+N0m6VtK96X5/lrRbuu2xtNgLadfMP0s6RFKNpO9JWg7cWLsup84+kv6QPr+Vkq6p5/lNlXSHpN+nx35O0r452wel3UarJC2QdFTOtiMkvZTu96ak89P1H8Ui6VagL3B3Gv8FTXxNp0q6XdIt6XEWSBrRwPs6RtLLkv6ePmflbPuolSrpVWDXnLimAacCF6TLX5S0haQp6fu5Mo1jhzqfizMkvQHMTtd/TdJCSe9JekDSLjnHD0lnpt1s76XveW5830j3XZO+rsNyXp+8n1VJIyXNlbRa0luSLq/vtbECRIQnT5+YgMXAF+usOw34Uzq/BfAs8AOgI8kXy2vAP6XbpwK3pfP9gADap8v/C/wS6AQMBVYAh6fb/g14EdiT5ItsX2BHYBtgCXA60B4YRtK1sle6303Au8DIdPvvgOk5sQewe87yIcAm4GfAlsBW6bqadHs74AXgivTYnYCD63mtpgIbgeOADsD5wOvpfAdgEfD99HU6DFgD7Jnuuwz4fDq/PTAsJ76a+t6PJr6mU4H1wBHp87oEeKqe59INWJ3zXP41fZ2+XvczUE9cNwH/N2f5XOApoCp9nf8TmFbnOdySvsZbAUenr9eg9H38d+CJOu/jPUBXkiS7AhiXbjseeBP4HMlnZ3eSFlNjn9Unga+k852B/cv999eap7IH4KnypvSLYi2wKmdax8cJZRTwRp19LgRuTOenkiehAH2AzUCXnP0uAW5K56uBCXni+Wfg8Trr/hP4YTp/E3BDzrYjgJdzlvMllA1ApzrrahPKAemXVfsCXqup5HxBp19gy4DPp9NyYIuc7dOAqen8G8A3Sc45kC+WnPcjb0Ip4DWdCjycs20w8EE9z+WrdZ6LgBqKTygLSRNbutyTJPm2z3kOu+Zsvw84o85ruQ7YJed9PDhn++3AlHT+AeCcPM+psc/qY8DFQLdy/919FiZ3eVl9jo6IrrUT8C8523YBeqXdOKskrSL5L3ynRursBbwbEWty1v0N6J3O9wFezbPfLsCoOsc7Gdg5p8zynPl1JP9tNmRFRKyvZ1sf4G8RsamROmotqZ2JiA9JvoR7pdOSdF2t3Od7LEny+5uk/5V0QIHHy9XYawqffm06Kf85i151nkvkLhdhF+DOnPdsIUnyy/2cLKlT/qqc8u+SJLWGnkvt+9zQZ6ehz+oZwB7Ay5KekXRkk5+lfcQnwqwYS4DXI2JAE/dbCuwgqUvOF2Bfkq6K2np3A+bnOd7/RsSYYgPOo6ETx0uAvpLaF5hU+tTOSNqCpItnae02SVvkJJW+wF8BIuIZYIKkDsDZJP9xf1RXgbE29po2xbI6z0X1xFOoJcDXImJO3Q2S+qWzUaf8TyLid0Uea7d61tf7WY2IV4BJ6fs2EbhD0o4R8X4RMbR5bqFYMZ4GVqcntbdScjJ9iKTPNbRTRCwBngAukdRJ0j4k/yHWfoHcAPxY0gAl9pG0I0m/+R6SviKpQzp9TtKgAuN9i6TvvCnPbxlwqaRt0lgPaqD8cEkT0//6zwX+QXLu4M/A+yQnqjtIOgT4MjBdUkcl13VsFxEbSc5d1Pcz4HrjL+A1bYp7gb1ynst3+GQrsKmuA35Se2JdUndJExopf6GkvdLy20k6vsBj3QCcL2l4+tnZPT1ug59VSadI6p4m/FVpXWX7iXtr54RiTRbJ9Q9fJjkB/DrJCfIbgO0K2H0SSf/5UuBOkvMgD6XbLif5L/1Bki/Y3wBbpf95jwVOTPdbzscn1AsxFbg57fI4obHCOc9vd5LzHDUk53Hqc1e6/T3gK8DEiNgYERuAo4DxJK/RL4GvRsTL6X5fARZLWg2cCZxST/2XAP+exn9+nu0NvaYFi4h3SE5uXwqsBAYAn2pdNMFVwAzgQUlrSJLsqAaOfyfJ+zo9fU3mk7x2hcT+38BPgP8i+eHDH4EdCvisjgMWSFqbxntiA12h1gilJ6bMrAiSppKc8K8vGZi1GW6hmJlZJpxQzMwsE+7yMjOzTLiFYmZmmXBCMWsC5RmJ+bNCdcYIM2sqJxSzOtIv1feVDHL4pqTL1cL3c1EBQ+6bVRonFLP89o2IzsDhwEnANxopb9bmOaGYNSC9CPFxYEjdbenQ50+mFxwuk3SNpI452xsbbj3vUO3KP+R+N0n3pMd6V9Lj6XAhnyLpwHRcqr+njwfmbHtU0o8lzVEyzPuDkrrlqeN4Sc/WWfddSX9s2itobYkTilkDJA0mGTX4+TybN5MM8d6NZITiw/nkIJoAR5IMqb4vcALwT2m9R5MMUjgR6E6StKYBRMTodN99I7kb4u+B75Jcsd+dZGDD75NnjC8l9xu5F7iaZOj/y4F70yFsap1EciuAHiRDuue7+n4G0L/O8DanALfmKWsGOKGY1ec5Se8Bd5MM1XFj3QIR8WxEPBURmyJiMcmQ+l+oU+zSiFgVEW8Aj5AMAQLJsPWXRMTCdADKnwJDlXNDqTo2kgz/vks6rMvjkf83/18CXomIW9O4pgEvkww/UuvGiPhrRHxAMtTN0LqVRMQ/gN+TDgeTjq/Vj2RcNbO8nFDM8hsWEdtHxG4R8e91hqAHQNIeaTfU8nTsqZ+StFZy1TfceiFDtef6OcnNpx6U9JqkKfWU60UyfH2uxoazr2+o/5uBk9Juuq8At6eJxiwvJxSz4v2K5L//ARGxLUk3lBre5SNLgG/m3nMmIraKiCfyFY6INRHx3YjYlaS1cZ6kw/MUXUqSrHIVNZx9RDxFciOyz5N0k7m7yxrkhGJWvC4koyKvlTQQ+FYT9m1sqPZPDFkv6ch0SHbx8VD3+YZZn0ky1P9JktpL+meSuzQW21V1C3ANsCki/lRkHdZGOKGYFe98kv/c1wC/JjnnUJAChmqfyieH3B8APExya+YngV9GxKN56l1J8kOA75IMQX8BcGQ6NH0xbiX5hZtbJ9Yoj+VlZvWStBXwNsk5pVfKHY9VNrdQzKwh3wKecTKxQnjMHjPLS9Jikh8ZHF3eSKy1cJeXmZllwl1eZmaWiTbd5dWtW7fo169fucMwM2tVnn322Xcionvd9W06ofTr14+5c+eWOwwzs1ZFUt3RGAB3eZmZWUacUMzMLBNOKGZmlok2fQ7FzKwcNm7cSE1NDevXry93KA3q1KkTVVVVdOjQoaDyTihmZi2spqaGLl260K9fP3Ju4llRIoKVK1dSU1ND//79C9rHXV5mZi1s/fr17LjjjhWbTAAkseOOOzapFeWEYmZWBpWcTGo1NUYnFDMzy4QTiplZK3XggQfmXX/aaadxxx13tHA0TihmZq3WE0/kvWN02fhXXmZmrVTnzp1Zu3YtEcG3v/1tZs+eTf/+/SnXKPJuoZiZtXJ33nkn1dXVvPjii/z6178uW8vFCcXMrJV77LHHmDRpEu3ataNXr14cdthhZYnDCcXM7DOgEn6G7IRiZtbKjR49munTp7N582aWLVvGI488UpY4fFLezKyVO+aYY5g9ezZ77703e+yxB1/4whfKEocTiplZK7V27Vog6e665ppryhyNu7zMzCwjTihmZpYJJxQzM8uEE4qZmWXCCcXMzDLhhGJmZplwQjEza6O+9rWv0aNHD4YMGZJJfU4oZmZt1Gmnncb999+fWX0VlVAkjZNULWmRpCl5tkvS1en2v0gaVmd7O0nPS7qn5aI2M2udRo8ezQ477JBZfRVzpbykdsC1wBigBnhG0oyIeCmn2HhgQDqNAn6VPtY6B1gIbNsiQZuZlejiuxfw0tLVmdY5uNe2/PDLe2VaZyEqqYUyElgUEa9FxAZgOjChTpkJwC2ReAroKqkngKQq4EvADS0ZtJmZJSqmhQL0BpbkLNfwydZHfWV6A8uAK4ELgC4NHUTSZGAyQN++fUsK2MysVOVoSTSXSmqh5BvMv+59LPOWkXQk8HZEPNvYQSLi+ogYEREjunfvXkycZmaWRyUllBqgT85yFbC0wDIHAUdJWkzSVXaYpNuaL1Qzs9Zv0qRJHHDAAVRXV1NVVcVvfvObkuqrpC6vZ4ABkvoDbwInAifVKTMDOFvSdJLusL9HxDLgwnRC0iHA+RFxSgvFbWbWKk2bNi3T+iomoUTEJklnAw8A7YDfRsQCSWem268DZgJHAIuAdcDp5YrXzMw+qWISCkBEzCRJGrnrrsuZD+CsRup4FHi0GcIzM7MGVNI5FDMza8WcUMzMLBNOKGZmlgknFDMzy4QTiplZG7RkyRIOPfRQBg0axF577cVVV11Vcp0V9SsvMzNrGe3bt+cXv/gFw4YNY82aNQwfPpwxY8YwePDgout0C8XMrA3q2bMnw4YldwDp0qULgwYN4s033yypTrdQzMzK6b4psPzFbOvceW8Yf2nBxRcvXszzzz/PqFF1x+NtGrdQzMzasLVr13Lsscdy5ZVXsu22pd1Kyi0UM7NyakJLImsbN27k2GOP5eSTT2bixIkl1+cWiplZGxQRnHHGGQwaNIjzzjsvkzqdUMzM2qA5c+Zw6623Mnv2bIYOHcrQoUOZOXNm4zs2wF1eZmZt0MEHH0wy3m523EIxM7NMOKGYmVkmnFDMzCwTTihmZpYJJxQzM8uEE4qZmWXCCcXMrA1av349I0eOZN9992Wvvfbihz/8Ycl1+joUM7M2aMstt2T27Nl07tyZjRs3cvDBBzN+/Hj233//out0C8XMrA2SROfOnYFkTK+NGzciqaQ63UIxMyujnz39M15+9+VM6xy4w0C+N/J7jZbbvHkzw4cPZ9GiRZx11lkevt7MzIrTrl075s2bR01NDU8//TTz588vqT63UMzMyqiQlkRz69q1K4cccgj3338/Q4YMKboet1DMzNqgFStWsGrVKgA++OADHn74YQYOHFhSnW6hmJm1QcuWLePUU09l8+bNfPjhh5xwwgkceeSRJdXphGJm1gbts88+PP/885nW6S4vMzPLhBOKmZlloqISiqRxkqolLZI0Jc92Sbo63f4XScPS9X0kPSJpoaQFks5p+ejNzNq2ikkoktoB1wLjgcHAJEmD6xQbDwxIp8nAr9L1m4DvRsQgYH/grDz7mplZM6qYhAKMBBZFxGsRsQGYDkyoU2YCcEskngK6SuoZEcsi4jmAiFgDLAR6t2TwZmZtXSUllN7AkpzlGj6dFBotI6kfsB/w5+xDNDOz+lRSQsk3Klk0pYykzsD/AOdGxOq8B5EmS5orae6KFSuKDtbM7LNg8+bN7LfffiVfgwIFXIciqW+Bda2q70u8QDVAn5zlKmBpoWUkdSBJJr+LiD/Ud5CIuB64HmDEiBF1E5aZWZty1VVXMWjQIFavLuXrO1HIhY03k7QCGhrXOICbgFtKiOUZYICk/sCbwInASXXKzADOljQdGAX8PSKWKRlz+TfAwoi4vIQYzMzajJqaGu69914uuugiLr+89K/ORhNKRBxad52knSNieclH/+RxNkk6G3gAaAf8NiIWSDoz3X4dMBM4AlgErANOT3c/CPgK8KKkeem670fEzCxjNDPL2vKf/pR/LMx2+PotBw1k5+9/v9Fy5557Lpdddhlr1qzJ5LjFDr3yVeCyTCLIkSaAmXXWXZczH8BZefb7Ew23oMzMLMc999xDjx49GD58OI8++mgmdRabUCZIWgc8FBHVmURiZtYGFdKSaA5z5sxhxowZzJw5k/Xr17N69WpOOeUUbrvttqLrLPZXXhNJup2OkXRD0Uc3M7OyuOSSS6ipqWHx4sVMnz6dww47rKRkAkW2UCLiLeD+dDIzMyuuhSLpWkk3pfNjM43IzMxa1CGHHMI999xTcj3FdnltAF5L5w8rOQozM2v1ik0o64Dt0osJC73w0czMPsOK/ZXXu8AHJKMDz8kuHDMza62a1EKR1FXSjcCx6apbgBGZR2VmZq1Ok1ooEbFK0qVAP+AdYB+g3nGzzMys7Simy+sM4PWIeAB4NuN4zMyslSomobwHnClpT+AFYF5EPJ9tWGZm1tz69etHly5daNeuHe3bt2fu3Lkl1dfkhBIRl0iaBfwVGAqMBpxQzMxaoUceeYRu3bplUleTE4qkH5GMBjyPpHXyaCaRmJlZq1ZMC+UHknYiuc3usZJ2i4hvZB+amdln3+O3/5V3lqzNtM5ufTrz+RP2aLScJMaOHYskvvnNbzJ58uSSjlvsdSjfBP4zIjyWl5lZKzVnzhx69erF22+/zZgxYxg4cCCjR48uur5iE8pvgW9J2obklrvzio7AzKwNK6Ql0Vx69eoFQI8ePTjmmGN4+umnS0ooxQ698h2SZNQeuLroo5uZWVm8//77H92p8f333+fBBx9kyJAhJdVZbAvlVWAAcFdE/GtJEZiZWYt76623OOaYYwDYtGkTJ510EuPGjSupzmITygJgCXCGpJ9HxOdKisLMzFrUrrvuygsvvJBpncUmlD2AFcD1JBc6mplZG1fsOZSBJBczng+U9jszMzP7TCg2oXQFvgdcAKzPLBozM2u1iu3y+hEwMCKqJX2YZUBmZtY6FdRCkdRO0jJJXweIiJqIeDidn9KcAZqZWetQUEKJiM3AfGC35g3HzMxaq6acQ9kauEDSXEkz0umu5grMzMya16pVqzjuuOMYOHAggwYN4sknnyypvqacQzkgfRyWTgBR0tHNzKxszjnnHMaNG8cdd9zBhg0bWLduXUn1NSWh9C/pSGZmVjFWr17NY489xk033QRAx44d6dixY0l1FpxQIuJvJR3JzMw+5ZGbruftv72WaZ09dtmVQ09r+BLB1157je7du3P66afzwgsvMHz4cK666iq22Waboo9b7HUoZmbWim3atInnnnuOb33rWzz//PNss802XHrppSXVWex1KGZmloHGWhLNpaqqiqqqKkaNGgXAcccdV3JCaXILRdKXSzpiw3WPk1QtaZGkT13fosTV6fa/SBpW6L5mZvaxnXfemT59+lBdXQ3ArFmzGDx4cEl1FtNC+Qlwd0lHzUNSO+BaYAxQAzwjaUZEvJRTbDzJsPkDgFHAr4BRBe5rZmY5/uM//oOTTz6ZDRs2sOuuu3LjjTeWVF8xCUUlHbF+I4FFEfEagKTpwAQgNylMAG6JiACektRVUk+gXwH7ZuaGCy7jg9J+DGFmbdjIL43mrTeXlzWGLQKGDh3K3Llzs6uziH2a69qT3iT3WKlVk64rpEwh+wIgaXJ6cebcFStWlBy0mZklKumkfL6WT93kVV+ZQvZNVkZcT3IfF0aMGFFUcvz6ZRcUs5uZGQALFy5kp947lzuMzFVSQqkB+uQsVwFLCyzTsYB9zcysGRXT5fVW5lEkngEGSOovqSNwIjCjTpkZwFfTX3vtD/w9IpYVuK+ZmTWjJrdQImJMcwQSEZsknQ08ALQDfhsRCySdmW6/DpgJHAEsAtYBpze0b3PEaWZm+VVSlxcRMZMkaeSuuy5nPoCzCt3XzMxajodeMTNrg6qrqxk6dOhH07bbbsuVV15ZUp1FtVAknRcRl6fze0ZEdUlRmJlZi9pzzz2ZN28eAJs3b6Z3794cc8wxJdXZpIQiqStwBTBQ0nrgL8AZpOcyzMys9Zk1axa77bYbu+yyS0n1NCmhRMQq4HRJXwKWA2OBP5QUgZlZG7bq7lfZsPT9TOvs2Gsbun658Du2T58+nUmTJpV83GLPoXyB5OfD+5OMn2VmZq3Qhg0bmDFjBscff3zJdRX7K6+uwPeAC0i6vMzMrAhNaUk0h/vuu49hw4ax0047lVxXsQnlR8DAiKiW9GHJUZiZWVlMmzYtk+4uKLLLKyJqIuLhdN73HjEza4XWrVvHQw89xMSJEzOpr6iEIulaSTel82MzicTMzFrU1ltvzcqVK9luu+0yqa/Yk/IbgNfS+cMyicTMzFq1YhPKOmA7SR2AvhnGY2ZmrVSxJ+XfBT4gue3unOzCMTOz1qpJLZT0lrs3Asemq24BRmQelZmZtTpNvlJe0qUk93B/B9gHXylvZmYU1+V1BvB6RDwAPJtxPGZm1koVc1L+PeBMSVdKOl3SflkHZWZmze+KK65gr732YsiQIUyaNIn169eXVF+TE0pEXAJ8A5gKvA6MLikCMzNrcW+++SZXX301c+fOZf78+WzevJnp06eXVGeTu7wk/YjkNrvzgHkR8WhJEZiZWVls2rSJDz74gA4dOrBu3Tp69epVUn3F3FP+B5J+QNK6OVbSbhHxjZKiMDNro+677z6WL1+eaZ0777wz48ePb7BM7969Of/88+nbty9bbbUVY8eOZezY0gY+KfbCxt8Cg4AdgV+WFIGZmbW49957j7vuuovXX3+dpUuX8v7773PbbbeVVGexFzZ+h2T4lfbAVfg8iplZURprSTSXhx9+mP79+9O9e3cAJk6cyBNPPMEpp5xSdJ3FtlBeBToBd0WEk4mZWSvTt29fnnrqKdatW0dEMGvWLAYNGlRSncUmlAXAbOAMSc+UFIGZmbW4UaNGcdxxxzFs2DD23ntvPvzwQyZPnlxSncV2ee1Gcj3K9emjmZm1MhdffDEXX3xxZvUVm1CWRMRsST2BtzOLxszMWq1iu7zGSaoCrgOuyDAeMzNrpYpNKF2B7wEXAP/ILBozszYiIsodQqOaGmOxCeVHJL/wqgY2F1mHmVmb1KlTJ1auXFnRSSUiWLlyJZ06dSp4n4LOoUhqB9QA/yciboiImnSZiJhSTLBmZm1VVVUVNTU1rFixotyhNKhTp05UVVUVXL6ghBIRmyXNJ/l1l5mZlaBDhw7079+/3GFkrildXlsDF0iaK2lGOt2VRRCSdpD0kKRX0sft6yk3TlK1pEWSpuSs/7mklyX9RdKdkrpmEZeZmRWuKQnlAEDAMODInCkLU4BZETEAmJUuf0La7XYtMB4YDEySNDjd/BAwJCL2Af4KXJhRXGZmVqCmXIfSnO2zCcAh6fzNwKMkvyLLNRJYFBGvAUianu73UkQ8mFPuKeC4ZozVzMzyaDShSOqbzub9OULO9lURsbrIOHaKiGUAEbFMUo88ZXoDS3KWa4BRecp9Dfh9kXGYmVmRCmmh3EySTNRAmQBuAm6pr4Ckh4Gd82y6qIAYqOf4n0hyki4CNgG/ayCOycBkSAZHMzOzbDSaUCLi0CwOFBFfrG+bpLck9UxbJ/UN51ID9MlZrgKW5tRxKsk5ncOjgR93R8T1JGOQMWLEiMr9EbiZWStT7IWNWZsBnJrOnwrk+/XYM8AASf0ldQROTPdD0jiScy5HRcS6FojXzMzqqJSEcikwRtIrwJh0GUm9JM0EiIhNwNnAA8BC4PaIWJDufw3QBXhI0jxJ17X0EzAza+uKHW04UxGxEjg8z/qlwBE5yzOBmXnK7d6sAZqZWaMqpYViZmatnBOKmZllwgnFzMwy4YRiZmaZcEIxM7NMOKGYmVkmnFDMzCwTTihmZpYJJxQzM8uEE4qZmWXCCcXMzDLhhGJmZplwQjEzs0w4oZiZWSacUMzMLBNOKGZmlgknFDMzy4QTipmZZcIJxczMMuGEYmZmmXBCMTOzTDihmJlZJpxQzMwsE04oZmaWCScUMzPLhBOKmZllwgnFzMwy4YRiZmaZcEIxM7NMOKGYmVkmnFDMzCwTFZFQJO0g6SFJr6SP29dTbpykakmLJE3Js/18SSGpW/NHbWZmuSoioQBTgFkRMQCYlS5/gqR2wLXAeGAwMEnS4JztfYAxwBstErGZmX1CpSSUCcDN6fzNwNF5yowEFkXEaxGxAZie7lfrCuACIJoxTjMzq0elJJSdImIZQPrYI0+Z3sCSnOWadB2SjgLejIgXGjuQpMmS5kqau2LFitIjNzMzANq31IEkPQzsnGfTRYVWkWddSNo6rWNsIZVExPXA9QAjRoxwa8bMLCMtllAi4ov1bZP0lqSeEbFMUk/g7TzFaoA+OctVwFJgN6A/8IKk2vXPSRoZEcszewJmZtagSunymgGcms6fCtyVp8wzwABJ/SV1BE4EZkTEixHRIyL6RUQ/ksQzzMnEzKxlVUpCuRQYI+kVkl9qXQogqZekmQARsQk4G3gAWAjcHhELyhSvmZnV0WJdXg2JiJXA4XnWLwWOyFmeCcxspK5+WcdnZmaNq5QWipmZtXJOKGZmlgknFDMzy4QTipmZZcIJxczMMuGEYmZmmXBCMTOzTDihmJlZJpxQzMwsE04oZmaWCScUMzPLhBOKmZllwgnFzMwy4YRiZmaZcEIxM7NMOKGYmVkmnFDMzCwTTihmZpYJJxQzM8uEE4qZmWXCCcXMzDLhhGJmZplwQjEzs0w4oZiZWSYUEeWOoWwkrQD+VuTu3YB3MgwnS5Uam+NqmkqNCyo3NsfVdMXEtktEdK+7sk0nlFJImhsRI8odRz6VGpvjappKjQsqNzbH1XRZxuYuLzMzy4QTipmZZcIJpXjXlzuABlRqbI6raSo1Lqjc2BxX02UWm8+hmJlZJtxCMTOzTDihmJlZJpxQiiBpnKRqSYskTWnhY/9W0tuS5ues20HSQ5JeSR+3z9l2YRpntaR/asa4+kh6RNJCSQsknVMJsUnqJOlpSS+kcV1cCXHlHKudpOcl3VNhcS2W9KKkeZLmVkpskrpKukPSy+ln7YAKiWvP9LWqnVZLOrdCYvvX9LM/X9K09G+ieeKKCE9NmIB2wKvArkBH4AVgcAsefzQwDJifs+4yYEo6PwX4WTo/OI1vS6B/Gne7ZoqrJzAsne8C/DU9flljAwR0Tuc7AH8G9i93XDnxnQf8F3BPpbyX6fEWA93qrCt7bMDNwNfT+Y5A10qIq06M7YDlwC7ljg3oDbwObJUu3w6c1lxxNesL+1mcgAOAB3KWLwQubOEY+vHJhFIN9EznewLV+WIDHgAOaKEY7wLGVFJswNbAc8CoSogLqAJmAYfxcUIpe1xp/Yv5dEIpa2zAtumXoyoprjxxjgXmVEJsJAllCbAD0B64J42vWeJyl1fT1b5BtWrSdeW0U0QsA0gfe6TryxKrpH7AfiStgbLHlnYrzQPeBh6KiIqIC7gSuAD4MGddJcQFEMCDkp6VNLlCYtsVWAHcmHYT3iBpmwqIq64TgWnpfFlji4g3gf8HvAEsA/4eEQ82V1xOKE2nPOsq9bfXLR6rpM7A/wDnRsTqhormWdcssUXE5ogYStIiGClpSLnjknQk8HZEPFvoLnnWNed7eVBEDAPGA2dJGt1A2ZaKrT1Jd++vImI/4H2S7ppyx/XxAaWOwFHAfzdWNM+65vicbQ9MIOm+6gVsI+mU5orLCaXpaoA+OctVwNIyxVLrLUk9AdLHt9P1LRqrpA4kyeR3EfGHSooNICJWAY8C4yogroOAoyQtBqYDh0m6rQLiAiAilqaPbwN3AiMrILYaoCZtYQLcQZJgyh1XrvHAcxHxVrpc7ti+CLweESsiYiPwB+DA5orLCaXpngEGSOqf/jdyIjCjzDHNAE5N508lOX9Ru/5ESVtK6g8MAJ5ujgAkCfgNsDAiLq+U2CR1l9Q1nd+K5A/s5XLHFREXRkRVRPQj+QzNjohTyh0XgKRtJHWpnSfpc59f7tgiYjmwRNKe6arDgZfKHVcdk/i4u6s2hnLG9gawv6St07/Rw4GFzRZXc5+g+ixOwBEkv2J6FbiohY89jaQvdCPJfxNnADuSnNx9JX3cIaf8RWmc1cD4ZozrYJKm8V+Aeel0RLljA/YBnk/jmg/8IF1f9tcs53iH8PFJ+bLHRXKu4oV0WlD7Ga+Q2IYCc9P384/A9pUQV3qsrYGVwHY568oeG3AxyT9R84FbSX7B1SxxeegVMzPLhLu8zMwsE04oZmaWCScUMzPLhBOKmZllwgnFzMwy4YRiloF0FNx/yVnuJemOZjrW0ZJ+UM+2teljd0n3N8fxzerjhGKWja7ARwklIpZGxHHNdKwLgF82VCAiVgDLJB3UTDGYfYoTilk2LgV2S++F8XNJ/ZTes0bSaZL+KOluSa9LOlvSeekAh09J2iEtt5uk+9MBGR+XNLDuQSTtAfwjIt5Jl/tLelLSM5J+XKf4H4GTm/VZm+VwQjHLxhTg1YgYGhH/lmf7EOAkkjGxfgKsi2SAwyeBr6Zlrge+HRHDgfPJ3wo5iGQI/lpXkQyW+DmSe3Dkmgt8vsjnY9Zk7csdgFkb8UhErAHWSPo7cHe6/kVgn3SU5gOB/06GXAKSITLq6kkyhHutg4Bj0/lbgZ/lbHubZIRZsxbhhGLWMv6RM/9hzvKHJH+HWwCrIhlmvyEfANvVWVff+Emd0vJmLcJdXmbZWENy6+OiRHLvmNclHQ/J6M2S9s1TdCGwe87yHJLRiuHT50v2IBkQ0KxFOKGYZSAiVgJzJM2X9PMiqzkZOENS7Si/E/KUeQzYTx/3i51DcgOsZ/h0y+VQ4N4iYzFrMo82bNbKSLoKuDsiHm6k3GPAhIh4r2Uis7bOLRSz1uenJPfeqJek7sDlTibWktxCMTOzTLiFYmZmmXBCMTOzTDihmJlZJpxQzMwsE04oZmaWif8PimMF1I154p8AAAAASUVORK5CYII=\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": "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\n", "text/plain": [ "
    " ] @@ -223,6 +223,15 @@ "cell_type": "code", "execution_count": 12, "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftdiff.rename({'time (d)' :'time'})" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { @@ -578,147 +587,27 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'rmag' (time (d): 333)>\n",
    -       "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "...\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
    -       "       0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n",
    -       "       6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n",
    -       "       3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n",
    -       "       4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n",
    -       "       3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n",
    -       "       1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n",
    -       "       4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n",
    -       "       2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n",
    -       "       4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n",
    -       "       3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n",
    -       "       1.17040422e-11])\n",
    +       "
    <xarray.DataArray 'pz' ()>\n",
    +       "array(0.)\n",
            "Coordinates:\n",
    -       "    id        int64 2\n",
    -       "  * time (d)  (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03
    " + " id int64 109\n", + " time float64 794.0
    " ], "text/plain": [ - "\n", - "array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - "...\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.13180114e-12,\n", - " 6.30252092e-12, 1.12657932e-11, 1.70947866e-11, 2.35410127e-11,\n", - " 3.01486367e-11, 3.63634702e-11, 4.16224366e-11, 4.54289913e-11,\n", - " 4.74142910e-11, 4.73824194e-11, 4.53327404e-11, 4.14594589e-11,\n", - " 3.61300773e-11, 2.98446324e-11, 2.31845539e-11, 1.67548923e-11,\n", - " 1.11262399e-11, 6.78147816e-12, 4.07218435e-12, 3.25977426e-12,\n", - " 4.52137637e-12, 7.66342713e-12, 1.23344633e-11, 1.81013732e-11,\n", - " 2.44264806e-11, 3.07065663e-11, 3.63320360e-11, 4.07478190e-11,\n", - " 4.35128453e-11, 4.43475549e-11, 4.31649567e-11, 4.00801554e-11,\n", - " 3.53984592e-11, 2.95862328e-11, 2.32329074e-11, 1.70175537e-11,\n", - " 1.17040422e-11])\n", + "\n", + "array(0.)\n", "Coordinates:\n", - " id int64 2\n", - " * time (d) (time (d)) float64 0.0 11.0 22.0 ... 3.63e+03 3.641e+03 3.652e+03" + " id int64 109\n", + " time float64 794.0" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['rmag'].sel(id=2)" + "swiftdiff['pz'].sel(id=109).isel(time=794)" ] }, { diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in index ae7796698..2dfbf4777 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in @@ -1,4 +1,7 @@ 16 +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 @@ -23,9 +26,6 @@ 108 -1.5927535941205388514 0.48163185965489618834 0.049163460846716633412 -0.006608251428879123937 -0.01219974682608557931 -0.00016910795626524249315 -109 -4.119750673485228276 -2.8866333472175926822 -0.080165336328135106125 -0.041127620144391897894 0.0065414198811065849687 -0.00012215100047356211078 110 4.118428875469033912 -2.8879551452337870465 -0.080165336328135106125 -0.032636814258902961672 0.0065414198811065849687 -0.00012215100047356211078 diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index 638ee9da4..79744c0f3 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -10,7 +10,7 @@ contains - module subroutine drift_body(self, system, param, dt, mask) + module subroutine drift_body(self, system, param, dt) !! author: David A. Minton !! !! Loop bodies and call Danby drift routine on the heliocentric position and velocities. @@ -23,7 +23,6 @@ module subroutine drift_body(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i integer(I4B), dimension(:), allocatable :: iflag @@ -31,7 +30,7 @@ module subroutine drift_body(self, system, param, dt, mask) associate(n => self%nbody) allocate(iflag(n)) iflag(:) = 0 - call drift_all(self%mu, self%xh, self%vh, self%nbody, param, dt, mask, iflag) + call drift_all(self%mu, self%xh, self%vh, self%nbody, param, dt, self%lmask, iflag) if (any(iflag(1:n) /= 0)) then where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR do i = 1, n diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index 30e17849e..afbf08ace 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -2,8 +2,7 @@ use swiftest contains - module subroutine helio_drift_body(self, system, param, dt, mask) - + module subroutine helio_drift_body(self, system, param, dt) !! author: David A. Minton !! !! Loop through bodies and call Danby drift routine on democratic heliocentric coordinates @@ -16,7 +15,6 @@ module subroutine helio_drift_body(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. ! Internals integer(I4B) :: i !! Loop counter real(DP) :: rmag, vmag2, energy @@ -28,7 +26,7 @@ module subroutine helio_drift_body(self, system, param, dt, mask) iflag(:) = 0 allocate(mu(n)) mu(:) = system%cb%Gmass - call drift_all(mu, self%xh, self%vb, self%nbody, param, dt, mask, iflag) + call drift_all(mu, self%xh, self%vb, self%nbody, param, dt, self%lmask, iflag) if (any(iflag(1:n) /= 0)) then where(iflag(1:n) /= 0) self%status(1:n) = DISCARDED_DRIFTERR do i = 1, n @@ -41,7 +39,7 @@ module subroutine helio_drift_body(self, system, param, dt, mask) end subroutine helio_drift_body - module subroutine helio_drift_pl(self, system, param, dt, mask) + module subroutine helio_drift_pl(self, system, param, dt) !! author: David A. Minton !! !! Wrapper function used to call the body drift routine from a helio_pl structure @@ -51,15 +49,14 @@ module subroutine helio_drift_pl(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. - call helio_drift_body(self, system, param, dt, mask) + call helio_drift_body(self, system, param, dt) return end subroutine helio_drift_pl - module subroutine helio_drift_tp(self, system, param, dt, mask) + module subroutine helio_drift_tp(self, system, param, dt) !! author: David A. Minton !! !! Wrapper function used to call the body drift routine from a helio_pl structure @@ -69,15 +66,14 @@ module subroutine helio_drift_tp(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift. - call helio_drift_body(self, system, param, dt, mask) + call helio_drift_body(self, system, param, dt) return end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) !! author: David A. Minton !! !! Perform linear drift of massive bodies due to barycentric momentum of Sun @@ -89,7 +85,6 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) class(helio_pl), intent(inout) :: self !! Helio massive body object class(helio_cb), intent(inout) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body @@ -97,11 +92,11 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) associate(pl => self, npl => self%nbody) if (npl == 0) return - pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), mask) - pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), mask) - pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), mask) + pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), self%lmask(1:npl)) + pt(2) = sum(pl%Gmass(1:npl) * pl%vb(2,1:npl), self%lmask(1:npl)) + pt(3) = sum(pl%Gmass(1:npl) * pl%vb(3,1:npl), self%lmask(1:npl)) pt(:) = pt(:) / cb%Gmass - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, self%lmask(i)) pl%xh(:,i) = pl%xh(:,i) + pt(:) * dt end do @@ -116,7 +111,7 @@ module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) !! author: David A. Minton !! !! Perform linear drift of test particles due to barycentric momentum of Sun @@ -129,7 +124,6 @@ module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) class(helio_tp), intent(inout) :: self !! Helio test particleb object class(helio_cb), intent(in) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body @@ -141,7 +135,7 @@ module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) else pt(:) = cb%ptend end if - where (mask(1:ntp)) + where (self%lmask(1:ntp)) tp%xh(1, 1:ntp) = tp%xh(1, 1:ntp) + pt(1) * dt tp%xh(2, 1:ntp) = tp%xh(2, 1:ntp) + pt(2) * dt tp%xh(3, 1:ntp) = tp%xh(3, 1:ntp) + pt(3) * dt diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 2325c23ba..c0d14a9ab 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -74,7 +74,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -88,7 +88,6 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i @@ -102,7 +101,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) else call pl%set_beg_end(xend = pl%xh) end if - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, pl%lmask(i)) pl%vb(:, i) = pl%vb(:, i) + pl%ah(:, i) * dt end do end associate @@ -111,7 +110,7 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick barycentric velocities of bodies @@ -125,7 +124,6 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i @@ -134,7 +132,7 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) if (ntp ==0) return tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg) - do concurrent(i = 1:ntp, mask(i)) + do concurrent(i = 1:ntp, tp%lmask(i)) tp%vb(:, i) = tp%vb(:, i) + tp%ah(:, i) * dt end do end associate diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index c6031b272..b3304926a 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -51,11 +51,12 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%vh2vb(cb) pl%lfirst = .false. end if - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE)) - call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + pl%lmask(:) = pl%status(:) == ACTIVE + call pl%lindrift(cb, dth, lbeg=.true.) + call pl%kick(system, param, t, dth, lbeg=.true.) + call pl%drift(system, param, dt) + call pl%kick(system, param, t + dt, dth, lbeg=.false.) + call pl%lindrift(cb, dth, lbeg=.false.) call pl%vb2vh(cb) end select end associate @@ -92,11 +93,12 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%vh2vb(vbcb = -cb%ptbeg) tp%lfirst = .false. end if - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%drift(system, param, dt, tp%status(:) == ACTIVE) - call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + tp%lmask(:) = tp%status(:) == ACTIVE + call tp%lindrift(cb, dth, lbeg=.true.) + call tp%kick(system, param, t, dth, lbeg=.true.) + call tp%drift(system, param, dt) + call tp%kick(system, param, t + dt, dth, lbeg=.false.) + call tp%lindrift(cb, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) end select end associate diff --git a/src/io/io.f90 b/src/io/io.f90 index 337c73bef..addacafce 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -828,6 +828,12 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) !read(iu, iostat=ierr, err=100) self%name(1:n) select case (form) case (EL) + if (.not.allocated(self%a)) allocate(self%a(n)) + if (.not.allocated(self%e)) allocate(self%e(n)) + if (.not.allocated(self%inc)) allocate(self%inc(n)) + if (.not.allocated(self%capom)) allocate(self%capom(n)) + if (.not.allocated(self%omega)) allocate(self%omega(n)) + if (.not.allocated(self%capm)) allocate(self%capm(n)) read(iu, iostat=ierr, err=100) self%a(1:n) read(iu, iostat=ierr, err=100) self%e(1:n) read(iu, iostat=ierr, err=100) self%inc(1:n) diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index d686a4665..3945a91d0 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -20,13 +20,15 @@ module pure subroutine kick_getacch_int_pl(self) associate(pl => self, npl => self%nbody, nplpl => self%nplpl) do k = 1, nplpl associate(i => pl%k_plpl(1, k), j => pl%k_plpl(2, k)) - dx(:) = pl%xh(:, j) - pl%xh(:, i) - rji2 = dot_product(dx(:), dx(:)) - irij3 = 1.0_DP / (rji2 * sqrt(rji2)) - faci = pl%Gmass(i) * irij3 - facj = pl%Gmass(j) * irij3 - pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) - pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + if (pl%lmask(i) .and. pl%lmask(j)) then + dx(:) = pl%xh(:, j) - pl%xh(:, i) + rji2 = dot_product(dx(:), dx(:)) + irij3 = 1.0_DP / (rji2 * sqrt(rji2)) + faci = pl%Gmass(i) * irij3 + facj = pl%Gmass(j) * irij3 + pl%ah(:, i) = pl%ah(:, i) + facj * dx(:) + pl%ah(:, j) = pl%ah(:, j) - faci * dx(:) + end if end associate end do end associate @@ -54,7 +56,7 @@ module pure subroutine kick_getacch_int_tp(self, GMpl, xhp, npl) real(DP), dimension(NDIM) :: dx associate(tp => self, ntp => self%nbody) - do concurrent(i = 1:ntp, tp%status(i) == ACTIVE) + do concurrent(i = 1:ntp, tp%lmask(i)) do j = 1, npl dx(:) = tp%xh(:,i) - xhp(:, j) r2 = dot_product(dx(:), dx(:)) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 22c39961c..84417ea6b 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -87,51 +87,46 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body end subroutine helio_coord_vh2vb_tp - module subroutine helio_drift_body(self, system, param, dt, mask) + module subroutine helio_drift_body(self, system, param, dt) use swiftest_classes, only : swiftest_body, swiftest_nbody_system, swiftest_parameters implicit none class(swiftest_body), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_body - module subroutine helio_drift_pl(self, system, param, dt, mask) + module subroutine helio_drift_pl(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_pl - module subroutine helio_drift_tp(self, system, param, dt, mask) + module subroutine helio_drift_tp(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine helio_drift_tp - module subroutine helio_drift_linear_pl(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object class(helio_cb), intent(inout) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_pl - module subroutine helio_drift_linear_tp(self, cb, dt, mask, lbeg) + module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object class(helio_cb), intent(in) :: cb !! Helio central body real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp @@ -155,7 +150,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine helio_kick_getacch_tp - module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_pl(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body object @@ -163,11 +158,10 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_pl - module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) + module subroutine helio_kick_vb_tp(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio test particle object @@ -175,7 +169,6 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine helio_kick_vb_tp diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index ec7e2ec7d..cd6106253 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -143,6 +143,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: omega !! Argument of pericenter real(DP), dimension(:), allocatable :: capm !! Mean anomaly real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) + logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains @@ -302,7 +303,7 @@ subroutine abstract_initialize(self, param) class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine abstract_initialize - subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) + subroutine abstract_kick_body(self, system, param, t, dt, lbeg) import swiftest_body, swiftest_nbody_system, swiftest_parameters, DP implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object @@ -310,7 +311,6 @@ subroutine abstract_kick_body(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine abstract_kick_body @@ -388,13 +388,12 @@ module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) integer(I4B), dimension(:), intent(out) :: iflag !! Vector of error flags. 0 means no problem end subroutine drift_all - module subroutine drift_body(self, system, param, dt, mask) + module subroutine drift_body(self, system, param, dt) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle data structure class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine drift_body module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 9e15c8d86..5509a3afe 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -97,14 +97,13 @@ module subroutine whm_coord_vh2vj_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body particle data structuree end subroutine whm_coord_vh2vj_pl - module subroutine whm_drift_pl(self, system, param, dt, mask) + module subroutine whm_drift_pl(self, system, param, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift end subroutine whm_drift_pl module subroutine whm_util_fill_pl(self, inserts, lfill_list) @@ -137,7 +136,7 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step end subroutine whm_kick_getacch_tp - module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_pl(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object @@ -145,11 +144,10 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine whm_kick_vh_pl - module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle object @@ -157,7 +155,6 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine whm_kick_vh_tp diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 26b527680..01d108373 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -19,7 +19,7 @@ module subroutine obl_acc_body(self, system) associate(n => self%nbody, cb => system%cb) self%aobl(:,:) = 0.0_DP - do i = 1, n + do concurrent(i = 1:n, self%lmask(i)) r2 = dot_product(self%xh(:, i), self%xh(:, i)) irh = 1.0_DP / sqrt(r2) rinv2 = irh**2 @@ -55,10 +55,10 @@ module subroutine obl_acc_pl(self, system) associate(pl => self, npl => self%nbody, cb => system%cb) call obl_acc_body(pl, system) do i = 1, NDIM - cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl)) / cb%Gmass + cb%aobl(i) = -sum(pl%Gmass(1:npl) * pl%aobl(i, 1:npl), pl%lmask(1:npl)) / cb%Gmass end do - do i = 1, npl + do concurrent(i = 1:npl, pl%lmask(i)) pl%ah(:, i) = pl%ah(:, i) + pl%aobl(:, i) - cb%aobl(:) end do end associate @@ -91,7 +91,7 @@ module subroutine obl_acc_tp(self, system) aoblcb = cb%aoblend end if - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + tp%aobl(:, i) - aoblcb(:) end do diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index aaf94a233..ab6596e5a 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -15,7 +15,6 @@ module subroutine orbel_el2xv_vec(self, cb) if (self%nbody == 0) return call self%set_mu(cb) - !do concurrent (i = 1:self%nbody) do i = 1, self%nbody call orbel_el2xv(self%mu(i), self%a(i), self%e(i), self%inc(i), self%capom(i), & self%omega(i), self%capm(i), self%xh(:, i), self%vh(:, i)) @@ -877,7 +876,12 @@ module subroutine orbel_xv2el_vec(self, cb) if (self%nbody == 0) return call self%set_mu(cb) - !do concurrent (i = 1:self%nbody) + if (.not.allocated(self%a)) allocate(self%a(self%nbody)) + if (.not.allocated(self%e)) allocate(self%e(self%nbody)) + if (.not.allocated(self%inc)) allocate(self%inc(self%nbody)) + if (.not.allocated(self%capom)) allocate(self%capom(self%nbody)) + if (.not.allocated(self%omega)) allocate(self%omega(self%nbody)) + if (.not.allocated(self%capm)) allocate(self%capm(self%nbody)) do i = 1, self%nbody call orbel_xv2el(self%mu(i), self%xh(:, i), self%vh(:, i), self%a(i), self%e(i), self%inc(i), & self%capom(i), self%omega(i), self%capm(i)) diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 53ba9439e..342fdb650 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -53,11 +53,11 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) ! Now compute any heliocentric values of acceleration if (tp%lfirst) then - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index - 1)%x(:,1) end do else - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index )%x(:,1) end do end if diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index c063e09a7..8d276c897 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -120,13 +120,8 @@ module subroutine setup_body(self, n, param) allocate(self%vb(NDIM, n)) allocate(self%ah(NDIM, n)) allocate(self%ir3h(n)) - allocate(self%a(n)) - allocate(self%e(n)) - allocate(self%inc(n)) - allocate(self%capom(n)) - allocate(self%omega(n)) - allocate(self%capm(n)) allocate(self%mu(n)) + allocate(self%lmask(n)) self%id(:) = 0 self%name(:) = "UNNAMED" @@ -138,14 +133,8 @@ module subroutine setup_body(self, n, param) self%vb(:,:) = 0.0_DP self%ah(:,:) = 0.0_DP self%ir3h(:) = 0.0_DP - self%a(:) = 0.0_DP - self%e(:) = 0.0_DP - self%inc(:) = 0.0_DP - self%capom(:) = 0.0_DP - self%omega(:) = 0.0_DP - self%capm(:) = 0.0_DP - self%a(:) = 0.0_DP self%mu(:) = 0.0_DP + self%lmask(:) = .false. if (param%loblatecb) then allocate(self%aobl(NDIM, n)) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 70f3fa54d..d3e2cba89 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -70,7 +70,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) ! Remove accelerations from encountering pairs do k = 1, npltpenc associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) - if (tp%status(j) == ACTIVE) THEN + if (tp%lmask(j)) THEN if (lbeg) then dx(:) = tp%xh(:,j) - pl%xbeg(:,i) else @@ -181,7 +181,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) end associate end do else - where(tp%status(self%index2(1:self%nenc)) == ACTIVE) + where(tp%lmask(self%index2(1:self%nenc))) tp%vb(1,self%index2(:)) = tp%vb(1,self%index2(:)) + sgn * dt * tp%ah(1,self%index2(:)) tp%vb(2,self%index2(:)) = tp%vb(2,self%index2(:)) + sgn * dt * tp%ah(2,self%index2(:)) tp%vb(3,self%index2(:)) = tp%vb(3,self%index2(:)) + sgn * dt * tp%ah(3,self%index2(:)) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index d976e8b8f..a44fba3b3 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -66,24 +66,30 @@ module subroutine symba_step_interp_system(self, param, t, dt) select type(cb => system%cb) class is (symba_cb) call pl%vh2vb(cb) - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) - call pl%drift(system, param, dt, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == -1)) + pl%lmask(:) = pl%status(:) == ACTIVE + call pl%lindrift(cb, dth, lbeg=.true.) + call pl%kick(system, param, t, dth, lbeg=.true.) + pl%lmask(:) = pl%status(:) == ACTIVE .and. pl%levelg(:) == -1 + call pl%drift(system, param, dt) call tp%vh2vb(vbcb = -cb%ptbeg) - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) - call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == -1)) + tp%lmask(:) = tp%status(:) == ACTIVE + call tp%lindrift(cb, dth, lbeg=.true.) + call tp%kick(system, param, t, dth, lbeg=.true.) + tp%lmask(:) = tp%status(:) == ACTIVE .and. tp%levelg(:) == -1 + call tp%drift(system, param, dt) call system%recursive_step(param, t, 0) - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + pl%lmask(:) = pl%status(:) == ACTIVE + call pl%kick(system, param, t, dth, lbeg=.false.) call pl%vb2vh(cb) - call pl%lindrift(cb, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%lindrift(cb, dth, lbeg=.false.) - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + tp%lmask(:) = tp%status(:) == ACTIVE + call tp%kick(system, param, t, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) - call tp%lindrift(cb, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%lindrift(cb, dth, lbeg=.false.) end select end select end select @@ -141,8 +147,10 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call pltpenc_list%kick(system, dth, irecp, -1) end if - call pl%drift(system, param, dtl, mask=(pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci)) - call tp%drift(system, param, dtl, mask=(tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci)) + pl%lmask(:) = pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci + tp%lmask(:) = tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci + call pl%drift(system, param, dtl) + call tp%drift(system, param, dtl) if (lencounter) call system%recursive_step(param, t+dth,irecp) call plplenc_list%kick(system, dth, irecp, 1) diff --git a/src/util/util_reverse_status.f90 b/src/util/util_reverse_status.f90 index c416e60e1..5dfc5fe6c 100644 --- a/src/util/util_reverse_status.f90 +++ b/src/util/util_reverse_status.f90 @@ -15,6 +15,7 @@ module subroutine util_reverse_status(self) elsewhere (self%status(:) == INACTIVE) self%status(:) = ACTIVE end where + self%lmask(:) = self%status(:) == ACTIVE return end subroutine util_reverse_status diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 92d785773..0c3161ae2 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -21,9 +21,9 @@ function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) real(DP), parameter :: DTFAC = 0.95_DP !! Step size reduction safety factor (Value just under 1.0 to prevent adaptive step size control from discarding steps too aggressively) integer(I4B), parameter :: RKS = 6 !! Number of RK stages real(DP), dimension(RKS, RKS - 1), parameter :: rkf45_btab = reshape( & !! Butcher tableau for Runge-Kutta-Fehlberg method - (/ 1./4., 1./4., 0., 0., 0., 0.,& + (/ 1./4., 1./4., 0., 0., 0., 0.,& 3./8., 3./32., 9./32., 0., 0., 0.,& - 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& + 12./13., 1932./2197., -7200./2197., 7296./2197., 0., 0.,& 1., 439./216., -8., 3680./513., -845./4104., 0.,& 1./2., -8./27., 2., -3544./2565., 1859./4104., -11./40./), shape(rkf45_btab)) real(DP), dimension(RKS), parameter :: rkf4_coeff = (/ 25./216., 0., 1408./2565. , 2197./4104. , -1./5., 0. /) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 759582b98..79227d2f0 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -171,13 +171,15 @@ module subroutine util_sort_rearrange_body(self, ind) self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) - self%a(1:n) = body_sorted%a(ind(1:n)) - self%e(1:n) = body_sorted%e(ind(1:n)) - self%inc(1:n) = body_sorted%inc(ind(1:n)) - self%capom(1:n) = body_sorted%capom(ind(1:n)) - self%omega(1:n) = body_sorted%omega(ind(1:n)) - self%capm(1:n) = body_sorted%capm(ind(1:n)) self%mu(1:n) = body_sorted%mu(ind(1:n)) + self%lmask(1:n) = body_sorted%lmask(ind(1:n)) + + if (allocated(self%a)) self%a(1:n) = body_sorted%a(ind(1:n)) + if (allocated(self%e)) self%e(1:n) = body_sorted%e(ind(1:n)) + if (allocated(self%inc)) self%inc(1:n) = body_sorted%inc(ind(1:n)) + if (allocated(self%capom)) self%capom(1:n) = body_sorted%capom(ind(1:n)) + if (allocated(self%omega)) self%omega(1:n) = body_sorted%omega(ind(1:n)) + if (allocated(self%capm)) self%capm(1:n) = body_sorted%capm(ind(1:n)) if (allocated(self%aobl)) self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) if (allocated(self%atide)) self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) if (allocated(self%agr)) self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 7bd2c39a7..9f0e65df4 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -21,12 +21,8 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%id(:) = pack(keeps%id(:), lspill_list(:)) discards%name(:) = pack(keeps%name(:), lspill_list(:)) discards%status(:) = pack(keeps%status(:), lspill_list(:)) - discards%a(:) = pack(keeps%a(:), lspill_list(:)) - discards%e(:) = pack(keeps%e(:), lspill_list(:)) - discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) - discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) - discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) discards%mu(:) = pack(keeps%mu(:), lspill_list(:)) + discards%lmask(:) = pack(keeps%lmask(:), lspill_list(:)) do i = 1, NDIM discards%xh(i, :) = pack(keeps%xh(i, :), lspill_list(:)) discards%vh(i, :) = pack(keeps%vh(i, :), lspill_list(:)) @@ -34,6 +30,14 @@ module subroutine util_spill_body(self, discards, lspill_list) discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) end do + + if (allocated(keeps%a)) discards%a(:) = pack(keeps%a(:), lspill_list(:)) + if (allocated(keeps%e)) discards%e(:) = pack(keeps%e(:), lspill_list(:)) + if (allocated(keeps%capom)) discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) + if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) + if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) + + if (allocated(keeps%aobl)) then do i = 1, NDIM discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) @@ -54,13 +58,9 @@ module subroutine util_spill_body(self, discards, lspill_list) keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) - keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) - keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) - keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) - keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) - keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) - keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) keeps%mu(:) = pack(keeps%mu(:), .not. lspill_list(:)) + keeps%lmask(:) = pack(keeps%lmask(:), .not. lspill_list(:)) + do i = 1, NDIM keeps%xh(i, :) = pack(keeps%xh(i, :), .not. lspill_list(:)) keeps%vh(i, :) = pack(keeps%vh(i, :), .not. lspill_list(:)) @@ -69,6 +69,13 @@ module subroutine util_spill_body(self, discards, lspill_list) keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) end do + if (allocated(keeps%a)) keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) + if (allocated(keeps%e)) keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) + if (allocated(keeps%inc)) keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) + if (allocated(keeps%capom)) keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) + if (allocated(keeps%omega)) keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) + if (allocated(keeps%capm)) keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) + if (allocated(keeps%aobl)) then do i = 1, NDIM keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) @@ -133,6 +140,12 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%ldiscard(:) = unpack(keeps%ldiscard(:), .not.lfill_list(:), keeps%ldiscard(:)) keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) + keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) + keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) + + keeps%lmask(:) = unpack(keeps%lmask(:), .not.lfill_list(:), keeps%ldiscard(:)) + keeps%lmask(:) = unpack(inserts%lmask(:), lfill_list(:), keeps%ldiscard(:)) + do i = 1, NDIM keeps%xh(i, :) = unpack(keeps%xh(i, :), .not.lfill_list(:), keeps%xh(i, :)) keeps%xh(i, :) = unpack(inserts%xh(i, :), lfill_list(:), keeps%xh(i, :)) @@ -170,29 +183,37 @@ module subroutine util_fill_body(self, inserts, lfill_list) keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) end do end if - - keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) - keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) - - keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) - keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) - - keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) - keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) - - keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) - keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) - - keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) - keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) - - keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) - keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) - - keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) - keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) + + if (allocated(keeps%a)) then + keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) + keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) + end if + + if (allocated(keeps%e)) then + keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) + keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) + end if + + if (allocated(keeps%inc)) then + keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) + keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) + end if + + if (allocated(keeps%capom)) then + keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) + keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) + end if + + if (allocated(keeps%omega)) then + keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) + keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) + end if + + if (allocated(keeps%capm)) then + keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) + keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) + end if - ! This is the base class, so will be the last to be called in the cascade. keeps%nbody = size(keeps%id(:)) end associate diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index b205f0828..fae625369 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_drift_pl(self, system, param, dt, mask) + module subroutine whm_drift_pl(self, system, param, dt) !! author: David A. Minton !! !! Loop through planets and call Danby drift routine @@ -15,7 +15,6 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) class(swiftest_nbody_system), intent(inout) :: system !! WHM nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Logical mask of size self%nbody that determines which bodies to drift ! Internals integer(I4B) :: i integer(I4B), dimension(:), allocatable :: iflag @@ -25,7 +24,7 @@ module subroutine whm_drift_pl(self, system, param, dt, mask) allocate(iflag(npl)) iflag(:) = 0 - call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, mask, iflag) + call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, pl%lmask, iflag) if (any(iflag(1:npl) /= 0)) then where(iflag(1:npl) /= 0) pl%status(1:npl) = DISCARDED_DRIFTERR do i = 1, npl diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index e4d92e53c..4badcd2b1 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -55,7 +55,7 @@ module subroutine whm_gr_kick_getacch_tp(self, param) associate(tp => self, ntp => self%nbody, inv_c2 => param%inv_c2) if (ntp == 0) return - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) rjmag4 = (dot_product(tp%xh(:, i), tp%xh(:, i)))**2 beta = - tp%mu(i)**2 * inv_c2 tp%ah(:, i) = tp%ah(:, i) + beta * tp%xh(:, i) / rjmag4 @@ -83,7 +83,7 @@ module pure subroutine whm_gr_p4_pl(self, param, dt) associate(pl => self, npl => self%nbody) if (npl == 0) return - do i = 1, npl + do concurrent(i = 1:npl, pl%lmask(i)) call gr_p4_pos_kick(param, pl%xj(:, i), pl%vj(:, i), dt) end do end associate @@ -108,7 +108,7 @@ module pure subroutine whm_gr_p4_tp(self, param, dt) associate(tp => self, ntp => self%nbody) if (ntp == 0) return - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) call gr_p4_pos_kick(param, tp%xh(:, i), tp%vh(:, i), dt) end do end associate diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 7678a5602..bb40a6416 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -189,7 +189,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) end subroutine whm_kick_getacch_ah2 - module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_pl(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick heliocentric velocities of massive bodies @@ -203,7 +203,6 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i @@ -223,7 +222,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) call pl%accel(system, param, t, lbeg) call pl%set_beg_end(xend = pl%xh) end if - do concurrent(i = 1:npl, mask(i)) + do concurrent(i = 1:npl, pl%lmask(i)) pl%vh(:, i) = pl%vh(:, i) + pl%ah(:, i) * dt end do end associate @@ -232,7 +231,7 @@ module subroutine whm_kick_vh_pl(self, system, param, t, dt, mask, lbeg) end subroutine whm_kick_vh_pl - module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) + module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) !! author: David A. Minton !! !! Kick heliocentric velocities of test particles @@ -246,7 +245,6 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: t !! Current time real(DP), intent(in) :: dt !! Stepsize - logical, dimension(:), intent(in) :: mask !! Mask that determines which bodies to kick logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. ! Internals integer(I4B) :: i @@ -262,7 +260,7 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, mask, lbeg) tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg) end if - do concurrent(i = 1:ntp, mask(i)) + do concurrent(i = 1:ntp, tp%lmask(i)) tp%vh(:, i) = tp%vh(:, i) + tp%ah(:, i) * dt end do end associate diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index ee1a0c780..40135dc30 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -48,13 +48,14 @@ module subroutine whm_step_pl(self, system, param, t, dt) associate(pl => self, cb => system%cb) dth = 0.5_DP * dt - call pl%kick(system, param, t, dth, mask=(pl%status(:) == ACTIVE), lbeg=.true.) + pl%lmask(:) = pl%status(:) == ACTIVE + call pl%kick(system, param, t, dth,lbeg=.true.) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) - call pl%drift(system, param, dt, pl%status(:) == ACTIVE) + call pl%drift(system, param, dt) if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%j2h(cb) - call pl%kick(system, param, t + dt, dth, mask=(pl%status(:) == ACTIVE), lbeg=.false.) + call pl%kick(system, param, t + dt, dth, lbeg=.false.) end associate return @@ -84,11 +85,12 @@ module subroutine whm_step_tp(self, system, param, t, dt) class is (whm_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl) dth = 0.5_DP * dt - call tp%kick(system, param, t, dth, mask=(tp%status(:) == ACTIVE), lbeg=.true.) + tp%lmask(:) = tp%status(:) == ACTIVE + call tp%kick(system, param, t, dth, lbeg=.true.) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%drift(system, param, dt, mask=(tp%status(:) == ACTIVE)) + call tp%drift(system, param, dt) if (param%lgr) call tp%gr_pos_kick(param, dth) - call tp%kick(system, param, t + dt, dth, mask=(tp%status(:) == ACTIVE), lbeg=.false.) + call tp%kick(system, param, t + dt, dth, lbeg=.false.) end associate end select From b6e3a2ac0e9aa0c4d59b859966710dd33d70f68c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 08:38:36 -0400 Subject: [PATCH 119/194] Added masked loops to major operations and fixed a bug in RMVS in which the wrong step size was passed to the encounter check function --- .../8pl_16tp_encounters/init_cond.py | 4 +-- .../8pl_16tp_encounters/param.swifter.in | 4 +-- .../8pl_16tp_encounters/param.swiftest.in | 4 +-- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 34 +++++++++--------- .../8pl_16tp_encounters/tp.in | 6 ++-- src/discard/discard.f90 | 4 +++ src/helio/helio_coord.f90 | 36 +++++++++---------- src/helio/helio_step.f90 | 2 -- src/io/io.f90 | 2 ++ src/rmvs/rmvs_discard.f90 | 1 + src/rmvs/rmvs_encounter_check.f90 | 2 +- src/rmvs/rmvs_setup.f90 | 1 + src/rmvs/rmvs_step.f90 | 28 ++++++++++----- src/setup/setup.f90 | 2 +- src/whm/whm_drift.f90 | 5 ++- src/whm/whm_kick.f90 | 20 +++++++---- src/whm/whm_step.f90 | 2 -- 17 files changed, 91 insertions(+), 66 deletions(-) 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 97a60cf88..094b261f0 100755 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/init_cond.py @@ -25,8 +25,8 @@ sim.param['T0'] = 0.0 sim.param['DT'] = 1.0 sim.param['TSTOP'] = 365.25e1 -sim.param['ISTEP_OUT'] = 1 -sim.param['ISTEP_DUMP'] = 1 +sim.param['ISTEP_OUT'] = 10 +sim.param['ISTEP_DUMP'] = 10 sim.param['CHK_QMIN_COORD'] = "HELIO" sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in index 5cfc49851..36dd2060f 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -2,8 +2,8 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 10 +ISTEP_DUMP 10 OUT_FORM XV OUT_TYPE REAL8 OUT_STAT UNKNOWN diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in index 3d4f881e7..b08b66850 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/param.swiftest.in @@ -2,8 +2,8 @@ T0 0.0 TSTOP 3652.5 DT 1.0 -ISTEP_OUT 1 -ISTEP_DUMP 1 +ISTEP_OUT 10 +ISTEP_DUMP 10 OUT_FORM XV OUT_TYPE REAL8 OUT_STAT UNKNOWN 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 65036cb16..8e8bf2f60 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 @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 7.940e+02\n", + "Reading in time 3.650e+03\n", "Creating Dataset\n", - "Successfully converted 795 output frames.\n", + "Successfully converted 366 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -45,9 +45,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 7.940e+02\n", + "Reading in time 3.650e+03\n", "Creating Dataset\n", - "Successfully converted 795 output frames.\n", + "Successfully converted 366 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": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAElCAYAAADgCEWlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACAgklEQVR4nO2deZxlVXXvv+uONfbc0DQNNKMgqAgtiCKicQA0TxE0TjEqihpj9EWNxuQ5JC9qYozDw0hwjEMkkwMqGFEwKKLQzCAiMzR00013V3eNdzr7/bHPPmefffa5VV3U1NX79/nUp++9+wzrnupaa6/pt0QpRUBAQEBAgEFpvgUICAgICFhYCIYhICAgICCDYBgCAgICAjIIhiEgICAgIINgGAICAgICMgiGISAgICAgg2AYArwQkQ+LyDfi1weLyIiIlOdbrm4QkWeJyJ1zfE8lIkc8zmvcLiKnz4xEuWsX/h5FZH8RuUpEhkXkk6LxFRHZKSLXzoY8AXsHgmFYpBCR+0Xkec5nrxeRX+zptZRSDyqlBpRSnZmTcM8wFQWslPq5UuoJcyXTTEEpdaxS6meQVeSzcB/393g+8BiwRCn1buBU4PnAOqXUSbMhQ8DegWAYAhYFRKQy3zLshTgE+I1Ku1wPAe5XSo3u6YXC819cCIZhH4aIrBWR/xKRbSJyn4j8acFx6+Mde8U67xIR2SEid4vIm61jyyLyARG5Jw5RXC8iB8VrR4vI5fF5d4rIK6zzvioinxORH8bn/VpEDo/XrooPuzkOhfyBiJwuIptE5H0isgX4ivnMuuZBIvLt+PttF5ELCp7BuIissD57qog8JiLV+P0bReSOOMTy3yJySMFzWioiX4vv94CI/JWIlKz1N8fXGRaR34jICfHn94vI80TkDOADwB/E3/NmEXm5iFzv3OfdIvLdAhkOFZH/ie9xObDK93sUka8CfwT8eXyvtwBfBE6J338kPufFInKTiAyJyC9F5MnW9e6Pn/8twGh83afHxw3F8p9uHf8zEfkbEbk6lu/HImLLd6p17kMi8vr487qI/IOIPCgij4rIhSLSG6+tEpEfxOfsEJGf2888YJpQSoWfRfgD3A88z/ns9cAv4tcl4Hrgg0ANOAy4F3hhvP5h4Bvx6/WAAirx+/8B/gnoAY4HtgG/F6+9F7gVeAIgwFOAlUA/8BDwBqACnIAOYxwbn/dVYAdwUrz+TeBiS3YFHGG9Px1oA38H1IHe+LNN8XoZuBn4VHzvHuDUgmd1BfBm6/0ngAvj1y8F7gaOieX6K+CXPrmArwHfAwbjZ/Y74Lx47eXAw8DT4udyBHCI+7uyn3v8vh4/l2Osz24Ezin4LtcA/xifdxow3OX3+FXg//r+f8TvTwC2AifHz/OPYlnrltw3AQfFz/9AYDtwFvr/1/Pj96vj438G3AMcFR//M+Dj8drBsayvAqro/zPHx2ufBi4BVsTP9vvAx+K1jwEXxudUgWcBMt9/f3v7z7wLEH5m6Rer/2hHgCHrZ4zUMJwMPOic8xfAV+LXiYKyFUqsBDrAoHXex4Cvxq/vBF7ikecPgJ87n/0z8KH49VeBL1prZwG/td77DEMT6HE+M4bhFLTBqkzhWb0JuCJ+LWgDdlr8/jJi5R6/L8XP8RBbLrTibABPtI59C/Cz+PV/A+/s8rvyGob4s88Dfxu/PhbYSaycneMORhvLfuuzf/X9Hq1n3s0wfB74G+cedwLPtuR+o7X2PuDrzvH/DfxR/PpnwF9Za38M/Mj6v/cdz3cSYBQ43PrsFOC++PVfo43xEe654Wf6P8HlWtx4qVJqmflB/yEaHAKsjV3wIREZQocx9p/kmmuBHUqpYeuzB9C7RdCG4x7PeYcAJzv3ew2wxjpmi/V6DBiYRJZtSqmJgrWDgAeUUu1JrgHwn+gQylr0LlsBP7fk/owl8w60sjrQucYqtOf1gPXZVJ7LVPAvwKtFRIA/BP5dKdXwHLcW2KmyOYIHPMdNFYcA73Z+ZwfF9zF4yDn+5c7xpwIHWMcU/Y6Lns9qoA+43rrmj+LPQXt3dwM/FpF7ReT9e/41A1yEhNG+i4fQu64j9/C8R4AVIjJoGYeD0WESc93Dgds89/sfpdTzpyuwB92ogR8CDhaRymTGQSk1JCI/Bl6BDhl9S8Xb0fg6f6uU+uYksjwGtIgTuvFnvucyGXLfSSn1KxFposMkr45/fNgMLBeRfss4HOy75hRhvvvfTlHeh9Aew5uLDp7kXr5KqMeAcXTI8WF3Mf4/+G60ATsWuFJErlNK/XQaMgTECB7Dvotrgd1x8rBXdNL4OBF5WreTlFIPAb8EPiYiPXEy8jx0TgB0AvNvRORI0XiyiKwEfgAcJSJ/KCLV+OdpInLMFOV9FJ0H2ZPvtxn4uIj0x7I+s8vx/wq8Djgnfm1wIfAXsdIxCeaXuycrXQL678Dfisig6AT1nwGm9PSLwHtE5MT4uRwh/iT2o8B6TwL1a8AFQFsp5S05Vko9AGwEPiIiNRE5Ffj9Lt95MnwBeKuInBzL3C8iLxKRwYLjvwH8voi8MP7/1CO6IGDdFO71TeB5IvKKOIm9UkSOV0pFsRyfEpH9AETkQBF5Yfz6xfGzFGA3Osw5b2XViwXBMOyjiBXZ76OTx/ehd2ZfBJZO4fRXoePVjwDfQecJLo/X/hGtIH+M/kP9EtAb7+xeALwyPm8LaeJ4Kvgw8C9xOOEVkx1sfb8jgAeBTeg8RxEuAY4EHlVK3Wxd5zuxnBeLyG60J3RmwTXegY6H3wv8Am1gvhxf5z+Av40/Gwa+i06muviP+N/tInKD9fnXgePif7vh1ej80Q7gQ2iDMi0opTYCb0YbpJ3okM3ruxz/EPASdEhyG9oLeC9T0DNKqQfReaV3x7LfhC5cAJ27uBv4Vfw7+Am6uAH07+wn6HzaNcA/qbgnJGD6kNRjDggIWKiIyzO3Aicope6ab3kCFjeCxxAQsHfgbcB1wSgEzAVC8jkgYIFDRO5HV0K9dH4lCdhXEEJJAQEBAQEZhFBSQEBAQEAGwTAE7HMQD/PsYoE4vFYBAdNBMAwBixKxchwVTQj3sIj8o8zxPAmZgVkNAQHzgWAYAhYznqKUGgB+D13fP52O3ICAfQ7BMAQseiilfovmPjrOXRORk0TkmrhxbrOIXCAiNWtdichbReQu0bTbn4u7bM26l5Jb/FThU6aIFpFniMh1IrIr/vcZ1lpX+mrruD2i7A4IMAiGIWDRQ0SeiOYZutGz3AH+N5oE7xS0d/HHzjEvRtNlPwXNp2ToGF6K7vJ9GZrU7efAtwCUUqfF5z5F6alp/4bu6t0UH7t/fG6uLFD0bIgfAp9F00//I/DDmFrE4NVoCvP90OR97/F8t0uAQx3akdcyefd0wD6ORWEYROTLIrJVRFzitule70fxru4Hzud/InowjfLt0AIWHG4QkZ1o/v4vAl9xD1BKXa+U+pVSqq2Uuh9NBf5s57CPK6WGYtqGK9E0IqBptT+mlLojJur7KHB8AQcSaJK9A9CU3S2lR5H66sVfBNyllPp6LNe3gN+S5T36ilLqd0qpcTQFyfHuRWIG1n9DGwNivqf1aN6qgIBCLArDgOaVP2MGr/cJNL2xi6uB5/H4qIwD5g4nKKWWK6UOV0r9VUzIloGIHBWHd7bEPDwfxZp6FqOIKnqqlNwGU6WIXkv+/5hN4d1NJhdTpewOCEiwKAyDUuoq9B9lAhE5PN75Xx/Hco/eg+v9FE105n5+Y7yrDFg8+Dx6N36kUmoJOrwj3U9J8BDwFnvmhVKqVyn1S9/BSqlhpdS7lVKHoXf/fyYiv+c59BG00bFhU3hPGUqpX6EHGhnK7hBGCpgUi8IwFOAi4B1KqRPR8dd/mmd5AhYmBtEssCPx5uFte3DuZJTcGarwPaCIvhRNUf7qmIL6D4AnMv0Q0KSU3QEBNhZlE4yIDADPAP7DKiCpx2svQ48DdPGwUuqFcyNhwALCe9CbiD9HJ6f/DXjuVE5USn0n/r92cZxX2AVcTkqd/WE0VXgvcD46FHQBOvm8kwKKaKXUdhF5MfAZtEdzN/BipdRj0/yOXwf+Jv4JCJgUi4YrSUTWAz9QSh0nIkuAO5VSB0xyWrfrnQ68Ryn1Ys/a/cCGx/GHGhAwZwiU3QF7ikUZSlJK7QbuM269aDxlktMCAhYrAmV3wB5hURgGEfkWenrTE0Rkk4ichx40f56I3Azcjp4sNdXr/RwdDvi9+Hqmbv1PRWQTsA64RUS+ONPfJSBgJhF7t+9E91AEBEwJiyaUFBAQEBAwM1gUHkNAQEBAwMxhr69KWrVqlVq/fv18ixEQEBCwV+H6669/TCm12re21xuG9evXs3HjxvkWIyAgIGCvgogUMjiEUFJAQEBAQAbBMAQEBAQEZBAMQ0BAQEBABnt9jsGHVqvFpk2bmJiYmG9RuqKnp4d169ZRrVbnW5SAgICABIvSMGzatInBwUHWr1+PxZW0oKCUYvv27WzatIlDDz10vsUJCAgISDDnoSQRKYvIje4QnHhNROSz8TCcW0TkhOncY2JigpUrVy5YowAgIqxcuXLBezUBAQH7HuYjx/BO4I6CtTOBI+Of89HMktPCQjYKBnuDjAEBAfse5tQwiMg69NjCIo6hlwBfUxq/ApaJyLQZUgMCAgIWA5RSfPuGTYw123Nyv7n2GD6N5r3PjViMcSB6KpbBJjxjEkXkfBHZKCIbt23bNuNCGjzjGc/wfv7617+e//zP/5y1+wYEBATYuOHBIf7s32/mg9+7fU7uN2eGIR48slUpdX23wzyf5Vj+lFIXKaU2KKU2rF7t7eieEfzyl94JjQEBAQFziomWHvT3yND4nNxvLquSngn8LxE5C+gBlojIN5RSr7WO2QQcZL1fh55/Oy8YGBhgZGQEpRTveMc7uOKKKzj00EMJjLQBAQFziVKcj2xHc6N75sxjUEr9hVJqnVJqPfBK4ArHKABcArwurk56OrBLKbV5rmQswne+8x3uvPNObr31Vr7whS8ETyIgIGBOUS5pwxDNkWGY9z4GEXkrgFLqQvQQ9LPQM27HgDfMo2gJrrrqKl71qldRLpdZu3Ytz33ulEYCBwQEBMwIyvEWvjNH0Yp5MQzxAPSfxa8vtD5XwNvnQ6bJEEpLAwIC5gvGHsyVxxC4kqaA0047jYsvvphOp8PmzZu58sor51ukgICAfQitjjYIi9pj2Ntw9tlnc8UVV/CkJz2Jo446imc/+9nzLVJAQMA+hE7sKXSKCv1nGMEwdMHIyAigw0gXXHDBPEsTEBCwmPHg9jF2jDU5/qBlubVWpC3CPpN8DggICAiA0z6hQ9T3f/xFubXOHIeSQo4hICAgYIGjPcceQzAMAQEBAQsILU8iwTS2BY8hICAgYB/ErvFW7rN2HEoy/842gmEICAgImEF87LI7+No190/7/KExj2GIPYYolKsGBAQELEwMT7QY7PGP5P3n/7kXgNedsn5a1x4aa+Y+a8fhpU7IMezdeOMb38h+++3HcccdN9+iBAQEzCCuu38HT/3ry9mya8+nL967bYTXfPFXjDTycxUG6nqfvhA8hmAYZgmvf/3r+dGPfjTfYgQEBMwwHhkapx0pHhtp7PG5H7rkdq6+ezu/vnd7bi0xDN4cQ/AYFgVOO+00VqxYMd9iBAQEzDCaba2km9NoQ35g+xgAK/prubWBHuMxeEJJSedzyDHMCD7y/dv5zSO7Z/SaT1y7hA/9/rEzes2AgIC9A60uFUKT9Rk8uEMbBl9IqLdaBiYLJe2ZrNNF8BgCAgIC9gCmz8DXbzDR7kzpGj6jYryBofG8x9AJHsPMIuzsAwIC9hT/vvEhVg/Wec4T9sutdQsljTeLDcOolXD2KXjz2U6Px9Ca4xzDojcMAQEBAXuKP//PWwA/b5ExCK22xzC0ig3Dlt1pFZNvRKehvZjwGBdjEFpRhFJq1ufDzFkoSUR6RORaEblZRG4XkY94jjldRHaJyE3xzwfnSr6Zxqte9SpOOeUU7rzzTtatW8eXvvSl+RYpICBgBmB27z7lPtHFMNjho24eg4/2wuQ1lEpfzybm0mNoAM9VSo2ISBX4hYhcppT6lXPcz5VSL55DuWYF3/rWt+ZbhICAgFmACSX5cgzjzeJKJeMR6Nc+j6E4j9Cxzm20O9Qqs7unnzPDEI/tHInfVuOfOcqxBwQEBMwMjEFo7mEoyVb4tqJ3132JadtL8N13pjGnVUkiUhaRm4CtwOVKqV97DjslDjddJiLezLGInC8iG0Vk47Zt22ZT5ICAgIAMknJVz85+qoZhzz2G9LPGYjMMSqmOUup4YB1wkoi4fBE3AIcopZ4C/D/guwXXuUgptUEptWH16tWzKXJAQEBABs0u5arjzTzVhUHWY/AYhiR34aPdTj9bdB6DgVJqCPgZcIbz+W6l1Ej8+lKgKiKr5lzAgICAgAIk5ap7GEqyvQRfuKibx2Afv6g8BhFZLSLL4te9wPOA3zrHrJG4DktETorly5OKBAQEBMwTulUldUs+T+YxJDmGLmEmWHwewwHAlSJyC3AdOsfwAxF5q4i8NT7mXOA2EbkZ+CzwyjhpHRAQEDBjuHfbCC/93NXeoTiTqZzWNPsY2o8jx2AfPxdT3OayKukW4Kmezy+0Xl8AXDBXMs0mHnroIV73utexZcsWSqUS559/Pu985zvnW6yAgADggivu5qaHhvjx7Vt4+YaDMmu2YvY1k3UrV+3Wx2BXInWrSuqWfyg6d6YROp9nCZVKhU9+8pOccMIJDA8Pc+KJJ/L85z+fJz7xifMtWkDAPo+lfXrIjneMpqWYWx1FreIYhjje3/TkCWxKDNeo2HkC12NQSnU3DJPkJ2YagURvlnDAAQdwwgknADA4OMgxxxzDww8/PM9SBQQEACzr1bTX3ZhMwU+KZ0JIbV9VkuUxuAq+W45h0lLWjMewiEJJ84bL3g9bbp3Za655Epz58Skffv/993PjjTdy8sknz6wcAQH7OB4eGuemB4d40ZMP2KPzlvaaoTjFYzRBh4aWOCM8u7GrjlkeQztSVMpk3vteu+8n9RjmwDAEj2GWMTIywjnnnMOnP/1plixZMt/iBAQsKrz0c1fz9n+9oTBhfNejwxlWU4NSSYd4do3n1+wu40Yrr/xNH4MvlGTnGFzD0c1jyCp+Tx9DR1Erl7znzgYWv8ewBzv7mUar1eKcc87hNa95DS972cvmTY6AgL0Zt2wa4tBV/Qw6O3eAbcN6vGY7UlTL2VzARKvD8z91FWcet4bPv/bEzJqJ0/unpWV5iVw0u4SS7FLSrsrfMSqdKRDs1aslmp0oeAx7M5RSnHfeeRxzzDH82Z/92XyLExCwV6LdiTj3wmv41rUPTnJcXlmaaWm3eyY4GuXvTT5b15rweAzdQkm2UXFZUDsZEr3sue2oew6hFUXU47jUXFQlBcMwS7j66qv5+te/zhVXXMHxxx/P8ccfz6WXXjrfYgUE7FVotCOa7YjhiWKqCdCK08X9j40CsG55b27N7Lp9yWdb4Xs9hsQwdOc0yiv/4jyBOa9eKXk9gk6k6KmWvOfOBhZ/KGmecOqpp07aKBMQENAd3egnbPg8hvu3a8Nw4DKPYYiPn6xc1esxtE25qs9j6BIumkKOocgwtDqKemXucgzBYwgICFiwSCiuPUrYhi/ef/92HUrqr+f3v0b57p5o5TZwLacqqUgm3z27lZ1m+hgKjEa9Wi7wGNJQUuhjCAgI2KfR6NJlbKPlUaYmlNStk1gpz+59EsK6bqGkrPL3VyVVy5LLE9geQxGJXj0OJc0FJUYwDAEBAfOKX97zGH/5HX+vUVIaOkkoycdb9Gg8Y9lX/tl1Zx919xiS8NaeegyJ8s97BcZQGMPgejHtSNGTJJ+DYQgICFjkePUXfs03f/0gkUfhpbxE3ZWhf4bB1CaiuUq6NcWqJF8oKTO+s6AqyecVmHvWC5R/uxMlHkMoVw0ICNhn4A3bTDH53C2sUxSzT153uoWSsh5DJ1KYyxVVJRl6JLdSyshR8ySY0xyDP1yU8RgmCavNBIJhCAgIWBDwUVY3p5x89tFIFM9NaGVCPpGzZoeSsmu2gfLlPVqd4pBPJ1KUBKrlvMdg5xh857YjFTyGxYCJiQlOOukknvKUp3DsscfyoQ99aL5FCghYkKjE9BRew9DFY7Dj8L4+hmTwjS8X0KXTONvglpXJNlBFOQajwF3D0Y4UlVKJSkm65BjKybFZmaI5zTGEPoZZQr1e54orrmBgYIBWq8Wpp57KmWeeydOf/vT5Fi0gYEGhHCtKm7LaoNt8ZVsxd8sj+D0Ga+fvUcIG+VxA93u2o4jeapkhWt6S1HJJKJc8VUkdx2Nww1uL1WMQkR4RuVZEbhaR20XkI55jREQ+KyJ3i8gtInLCXMk30xARBgYGAM2Z1Gq1cgM/AgICdGgFJqkA8ngME83uYZ2uHoPdbOZRwsl1oz0LJekO5aIEsqISG4ZufQyuDOZ90XVnA3PpMTSA5yqlRkSkCvxCRC5TSv3KOuZM4Mj452Tg8/G/08bfXft3/HbHbyc/cA9w9Iqjed9J75v0uE6nw4knnsjdd9/N29/+9kC7HRDgQXkKoSQvxXUrpcnwx/uLcwzZoTldeIs6fo+ht1ou4EpSDNTLXpk6UUS5LFTKsuc5hk6UsKsuKo9BaYzEb6vxj/sNXwJ8LT72V8AyEdkzovUFhHK5zE033cSmTZu49tprue222+ZbpICAecGO0aZ35w4krKjeUFLSM5BXhpnZB114i7olpu3jDLqXsurz+mrlwqqkbrt+7TF0qUqqGOWfyhfFlVCVsj8MNRuY0xyDiJSB64EjgM8ppX7tHHIg8JD1flP82WbnOucD5wMcfPDBXe85lZ39bGPZsmWcfvrp/OhHP+K4446bb3ECAuYUrU7ECX9zOeeeuI5/ePlTcutdPYakwS2/Np4ZipNVlkqpRPkWdRKn8hUnn4t29r21MjtGfZTdip6Kf2dvcgyVUt5jMAbHJJ/tr2Ouk4ShFpPHAKCU6iiljgfWASeJiKslfUH43FNQSl2klNqglNqwevXqWZD08WPbtm0MDQ0BMD4+zk9+8hOOPvro+RUqIGAeYHb9/3n9Ju96pTR5jsG3Ox/PDMUpJqzr1vzmHmsfr5WwP0lcFErKeAwFVUm+67p9DD6PplLWFU2+RsCZxrxUJSmlhkTkZ8AZgB1f2QQcZL1fBzwyh6LNGDZv3swf/dEf0el0iKKIV7ziFbz4xS+eb7ECAuYck5G+dQslJSR6nuTzWBePYbJRmJkOZbePwVL+ruy2x9DqaOoKu6hEl5XGyr2gKqlSEm8pK/hzDCYBPpcew5wZBhFZDbRio9ALPA/4O+ewS4A/EZGL0UnnXUqpzeyFePKTn8yNN94432IEBMw7fD0GNrqFkrqR6I037eRzcWWRN8fQtY9B36un6mlES9bSPII9Oc6uSirOMQjjraIcQ/5ckwCvFIShZgNzGUo6ALhSRG4BrgMuV0r9QETeKiJvjY+5FLgXuBv4AvDHcyhfQEBAF9y9dZj17/8hv7znMe/6dffv4Mrfbs19PrnHoNXQnja4NbqUjna6VB3pz3QXsj63qEKonO9xiN8XlY62IuVNIOtjo8Icw1Q8hnK55E1czwbmzGNQSt0CPNXz+YXWawW8fa5kCggImDquvns7AJfduoVnHL4qt/7yC68B4P6Pvyjzua20m+2IWiW7HzWhmIkuDW6+LuNM9VBOuduhIl8oSe/sx5qdwkSw9hi6N6K1OlFiJCDrMfiS2mVTlVREsOdpYkvouo1RCfMYAgIC5hJ3PTrMbQ/v8q4ZhWl2+FOFreS2Dk/k1+PrdvUYOlGOitpW2kUxe319XygpskI+eeVvOI2KDI7PY1BKZUZwukalEykq5ck8hvxcZyNDebFWJQUEBCxs/N2Pfstfftffb9NMDEO+eNA3G9nArs7ZsitvGFpTMAy+gTrd+g26VR2Zz4qSxK0oolIuecnuzPuexGPI36fQY4gU5VKJcrlLVVISSsp/l2q5FDfHBXbVgICAOcRoo8NYo+1dM7OOfR7DQzvGC69pK8jtntp/sz7ezCu8LAVFl5JU12NI+gJKhV3RhUnijqIa787dHIORwecxuPkHX1VSUQLZDVFl5zqk5bMLpipJRLp3kKUYUkrtfpzyBAQEzCMa7U4hxbVRVn7DMFZ4zW7DayD1GLrNVwZtJHprZe9acQLZPyqzEyl6a5XkdebcTpT0DPjCQUASLvL1G1TLgkg+lNSOk88+5d5OcgzFBqdaEIaaDUwl+fwv6CazbgxwCvgq8LUZkGlRodPpsGHDBg488EB+8IMfzLc4AQFd0exENDxTyyBVvhVPKOmB7aOF12xNoUIICspVu9BcZ8juCuYr91TLBQZHsaygeqhldvblPNldosArea/AyFMulaiWSjlvoxMpHQ7qkmPwdU2nOYYSJVkgHoNS6jnuZyKyRim1ZXZEWlz4zGc+wzHHHMPu3cGZClj4aLSiQo+hZYU0XGzZ3QBgSU9epdhhHq/HEIeLunElQd4wdBJFnFeWaWVRmVFPaMxOEudCPh2TJC7ljFW743oM+RxDalTyhqyn6udKMteteWi3jTGqFBDwzQamm2N43YxKsUixadMmfvjDH/KmN71pvkUJCABgaKzJyy/8JZt2+kM/zU5UOEbTKFufYuq2lu1C9sT7o8mTz5AaEPeePZ48gh3ycXfuRo7iXoTIoq4oSD57KppsKo2icwtzDFHWMPg6t4sI+GYD0+1jeImIjKGb1O6cSYFmGls++lEad8ws7Xb9mKNZ84EPTHrcu971Lv7+7/+e4eHhGb1/QMB08YNbNnPd/Tv5/M/u4W/PflJuvdGKCiuMutFTmN2xTwl3ywXYn3XjSgK/xyASz1DO0WOnCtxvyNIRnN7kcxLPd8NM2VyAr4O6UhJ/qWsnrkoqebyJTpScZ1/LvoeZ/jYXXEnT9Rhehu5OPltEvjiD8iwa/OAHP2C//fbjxBNPnG9RAgISmFJTX6UOaOXb6iiv8jGhHv+uXx/vo9bOxOGd9ShSKT22555NJ/mcuWdHUS2VqJRLXcs/O5Hy9ECkE9F8SeJKXBpaNFCney5A4vGdnj6GLh6DodUG6CjbY0hDST4CvtnAtDwGpdSjwI/inwWNqezsZwNXX301l1xyCZdeeikTExPs3r2b1772tXzjG9+YF3kCAiBlMi2iqWjEu/ZmJ6KnVM6sjcaGwbfrNwo/UlrZl6w8RLcu5JanLDOz3okQ0X0M3sE3JaFaEk+XcXdOo5Y1Q9k9t9UxCjwftsmXq+a/m2li8yWuy2WJ+xjyOZFq7BEUXreAgG82MC2PQUQ+JyJfjV+/YEYlWiT42Mc+xqZNm7j//vu5+OKLee5znxuMQsC8oxrvdIsSzObzhidcZDwGfyjJqhAqYCsFf9jGd1wiTztiIC4r9XkMlbJQ9eQY8p3E+Z1/2qGcNyrVcikeiuOel/ZHuDJ3khyD8WL2rI/B9hiyXlYaSlronc9NNNkdwHNnSJaAgIBZRsWjeAyiSCWKzk9zrat7ikZaJq+78RblYuvdE9PNdkR/vRLft7j8szDkU005jQzMEJ+uLKhlfzioG4le0m8QVyX5jFXZSiArJ1ykeyfyxqpjVyUtoD4GH8aApfHs5qk2wO2zOP300zn99NPnW4yAgER5eZVwl54BSOcfTDYq05d0NXCVu30fb5I4iuiLZyg3O07pqAkllfMeQ8sJJWUVbZp/0O/z5+rchScc5ISS7Pu6OQafl2I8huR9kvNJu631d8s/s6QqaQ5I9KZrGHYA48DngKtnTpyAgIDZRKvLDGW7sa3bYBw/xURxKGkq09I0dYUvd6FY2lv2ymSoKyqemH3eY8jv7OtdWFBrFT/FdTd67HTSms5PFHElGWOgPRNzT+0xlC2jkb+uvzluNrBHoSQRWSYiXwHOiT/6GrBhxqUKCAiYNq69bwdX/W6bd80odbcnAKBh7ch9JasmlOTzJro1sdlrufxDzL/UVysXJJ8VvV1CPuVECee7l4EkwVxEMVES/0yFIiVsykpt5e5et1wqUS0gyquUhGopH95qOVVJvq7uSkm8BHyzgT0yDEqpIeDjwEeAXwNHAt+eyrkicpCIXCkid4jI7SLyTs8xp4vILhG5Kf754J7IFxAQAK/452t43Zev9a4ZJeNTLo/HY+hGT9FtboIxFL3V/FAcI2cRKV070uWqVW9ZaTaUlA35GEXrTxK3O1ES1nGNVUqdna/usvsYfInrdice1FP2JZizVUlRoSeycHMM5wH3KaX+G7h+D85rA+9WSt0gIoPA9SJyuVLqN85xP1dKheHIAQGPE27ZKKTVRr5QUreegShSSWeyv0mtuCQ1Jd/LK7UkF1Ar0xn2h5J6Pcpdr5mJaPk+Bpe6wucxVAqa2EyFUNUTotLjOe1wkL/zueLJeyQeQznvMeSqkmxDm3giQnmOuJKmU5W0E3iriHxaRN4gIrmpbD4opTYrpW6IXw8DdwAHTuP+AQEBU8CW3b7ZB1qpeENJlsfglqvqQTnmGnvWxGbX/ueVu17rjTuU3Ua0VidlVPX1FFTKJaqVUs7Q5SiwPclxU/6Z62OITLzf702UrQRyceezr49Bh76SJkNH+Zvwlb6WlZQ3czBK/hLa2cAeGwal1MeANwMfBu4DTtvTa4jIevSYz197lk8RkZtF5DIRObbg/PNFZKOIbNy2zR9LDQjY23H9AzsLOY0eGRrnY5fd0ZUe4X4P42m3UFI3j8Fe8yafPVU0BnYlj6sszXV7uwy3SagrPA1ulbjBzUdYB/Z8g3xZrPYK8rTc7U73DuVqWXsEWgZfjsHPadSJFGWxw1DZ8FZRVVJy3Tkk0dvjUJKI/DVQBm4CblJK/WwPzx8A/gt4l2d+ww3AIUqpERE5C/guOo+RgVLqIuAigA0bNsz+U5om1q9fz+DgIOVymUqlwsaNG+dbpIC9COd8/peIwH0fe1Fu7a3fuJ5bNu3inBPWcdT+g5m1wXqF4UabB7eP8YzDs+elsw98HoOdfC7uN+jW+Qx5o9OOdPdyrVzKVywZj6FWPCrTrPmMhmEcLUp4+ziNUo+hYDZCJyXRM16MmUtt5jabnX2rwBOpOj0QpnfCTGFzv48JJYnk8xNpf8TC9hg+CDTic88RkS9M9dy47+G/gG8qpXJJa6XUbqXUSPz6UqAqIvmp43sRrrzySm666aZgFAKmBVWgA+7bpr0B39Cc1YN1AB7wDM8xO3RTYeRbg3xVUnsSjyGbC8iHfEySuDDHYM71UEF0m81cMfH8woE6+TBUmmPwD+MxXkG1oPLIGA37Pvq1nWMQrzGtloWaJ8dgGF3N+S1PaC7NpyxAwxDjy8AxwErgn6ZygmiT+yXgDqXUPxYcsyY+DhE5KZZv+zRlDAhY0BieaPH9mx/xrk3GoDncKO5CjmJrsjWekWDDlIeONjxDcbpUJXULFen1yJpvkE8SV+LwS54FVR/bVyve2ReHmaJ0d16UY/A0sSWhpKTyyO+JlD1dyLpD2S45LUpql7zhK+0x+CuajCdRK5ccD6x7tdNsYLoNbn+KpsWoAJ9hanmGZwJ/CNwqIjfFn32AuHNaKXUhcC7wNhFpoxvoXqncbNQe4uf//jsee2jk8Vwih1UHDfCsVxw16XEiwgte8AJEhLe85S2cf/75MypHwN6NH96ymfd/+1ZOOnQF+y/pyaz5ZhP40K3ZrGjWsbm+W7XUrfO51Z6ax7CTVkElj58AruUof1/PQ2/NT/xnBt9UHEVqX6fHY1Taye69pOmxPV5MxSoddT2GctxPAE6S2FLg7qAee152EkqK7GeqEo+h6tBptDuKkkCpgLV1NjBdw3APOvb/PaXU/57KCUqpX9B9PChKqQuAC6Yp04LD1Vdfzdq1a9m6dSvPf/7zOfrooznttD3O1QcsUhi2Ut+EMd9nBp3Jdu/dEsyWgh9vdRIeIsiGj9zxnnYppt8wRPTU/GWlrZiUzteh7GNBTdf061q5hEhxKKlaLq5K8nUoG6NnykN9yedq2e43sCuEVKbfwCevNirZzmdzz6rlbeT6GOL7ud+nHVcsAQveY7gdeAg4T0Q+oZR62gzKNKOYys5+trB27VoA9ttvP84++2yuvfbaYBgCEpjBND4m01HPmEuDR4bGk9fdvILJ+g1Gm+2sYWh18Rjia/VVy95S11akWF7UiNZR3vCKfZ9ebyjJKPB4hrI35OPvMja77GrF3zMA2uD4vJiU0M7nMUxerlr2NKLZoSTfTAxb+bvcT6bbGog9hoWbYzgcbVQuAt4wc+IsHoyOjiaT20ZHR/nxj3/McccdN89SBSwkGIPgm1zWzWPYOpz2J+xpKMlW+BPN4pJUHy8RaAXua47rRDZ1hZufiHMBvjnIlsExx6bnpQlbXabpyV2YhGyR0fDkCTIUE44CV0pZhHb+ktRqQSNa2w0l2d8lE0ryJJ/jclXzfXNGI14rl0ooNXkO6vFiuh7DQ0qpK0TkAGDrTAq0WPDoo49y9tlnA9But3n1q1/NGWecMc9SBSwkmNCNz2MY6WIYmu0phpIm8RjcSp5sg1vWWJlj+2plhsZb3usWlpV2UmVaRMntK1fNUFd4GtE6lsfg64o2it+VyRxbreQpMVzCOi1jNlxULumy0orTP2FXJbm5Czt8lVQ7ecpVweMxxB6MOR/076PuDFKaSUzXMJwhIr9Ds6s+gE5GB1g47LDDuPnmm+dbjIB5xtu/eQNPP2wFf3jK+tyaUcQ+j8FXTmqQ3Yl2CyUVexOQNxxNaydd7DFU2Dacr3Zqd1RxWWms2KrlEiPt7Pcy3oeP0yihmzYVTV5PxM+uanbZaclp/romV1BIl+HJMZhKKHOM91xPtZO5f82aueDSaWRDSU7FkhVKMp/NJqYbSloGvA/4c3RPQ0BAgAc/vHUz/+d7t3vXunsMxTkGNwRhoxMpjM7oln/wrZsGt/56xWMYUo/B2+AWRV37GIonl8Ueg68RLcp6DN7cRRxK6kQqRzxnjFHuuonHILlkeuJNWL0KrkdhDIabYE5yDJ5BPXYoqVbR5zczXoxKQ0nORDrz/Mz54Cc5nElM12P4a+BopdSdIjK1urqAgIAMJrp5DHEoySgEG9nZB/6+AMCbpGx2KTttdCJqlRL1SilnrMx9+mrlmDcp7QY2cXmfctfvoyS2njcaTvLZ10lcltwu2nw/OzRjh1eSJHHZKOF8Yt0YHPuZ2Pf0TVNrdXSJrDnGP5tZ5zaKKqGKKDGMx1BzjIoxcgC1SUazzhSm7DGIyFPMa6XUJqXUT+LX758NwQICFjumkmMwis1GdieaLw1NX3sMQ0fTU0DecLTailq5RK1Syje4tYvLSo0C9Cl3c2wyKnPSPoZ8aMYkn/OVRyap7fMK9A7c12Wc9jFILsdgcin20BxXSZv7VUqSMcx2h7Kh2jBtWGatZvUxtB0Dn/FEMnmktCqpNkcew56Ekm4UkVtE5M9F5KBZkyggYJFgssoRk2NoeHMM+jMf5UWWasGfC/Ctmc/6CmisW3EtfbVcynkibSv57N7Hpa7weQXVgtkHLiVG26NoC0NJcbOZr5M4ZTLNryXhIs8wnsRoWPkJt6LJGIxySeh4aC+yuQ2VWatWUkOW5VmKkgoqzRbregyxYagsPMPwSaAfPajnvnjozhtnR6yAgL0fk7n7E108BlOu6jMuGabTbqEkn2FoK/ri3gUvxYSp8sl5ImkoKSdDLk+QN1aaRqK436Dm6Tdo5UJJ+XOrTigp/S66k9jXx2CemWlwK5rbXJRjqFo7e7fyqFoW3aHssK/aJbKJYYifcRTnhVJKDDfvoZLS2XSWwwJJPiul3quUOhw9yvOLaBqMi2ZLsICAvR2TGYZuVUmjTcOFNEnJaVd6bP+56a7fOTcOJXkH3yST1irJdZK1pGIpT3ENpLMGPCyopivatzvP8gv55zqXS1aVj5NgthvRmp5nVkua4/KhpKpVPeTOXy5bVUluhZgdZrKfU8ZLcb0J657m32z4Ku2KXnAeg4isFJE3AR9FN7UJuvs5oABDQ0Oce+65HH300RxzzDFcc8018y1SwBxisj9e4yn4PQZtLEyi18ZUQkn1Sn6Hba7XlZSuLN7BN67H4OuH8JWcapmipGHMy7yaiefnwzqm8ig/1znKUFe4u+yaVZVkx+zbVh5BN8dlwzZ6Tbw5BlMia+RyPQajuN3OaPO9apVSjoDP9lJAG4ZcWKzkGIaFknwGtgD/jPYYvgKcppQ6dFakWiR45zvfyRlnnMFvf/tbbr75Zo455pj5FilghvHft29h/ft/yI7RZm4tW+2S/0M2nsJknc95eoriyiObrdRXldTqRAkNRq4vwOzefYNvrM5n+739ulYuUZJiSgwfdYWd13BlsnfZLmV3FCmUIumodp9FqxNRrZSsRLCnj6Es1CpZY5WGfPxeTKdj9xRkjUqrEyXJ4STv4Q0lZfsjbAOoz5XM77wd8zMZmWEBeQzAd4CzgQOUUm+NSfECCrB7926uuuoqzjvvPABqtRrLli2bX6ECZhwXX/sgAL++N88Ob//xemmuu3gMNruqb5ftu4e91usZo2nWfbt+s2YYR338QeDPMdg7Xt9sBDMqs1IqZZK15rqZLmNPUjvhWcpU8aTln74Zys12RC3pJBZvTqQaVzQ1POWqRbQXmeohx1g1PKEk89xsI+d6Im0nlFTzdD6bc+pz5DFMuY9BKfWK2RRktnDlVy9i6wP3zug19zvkMJ7z+u4U2vfeey+rV6/mDW94AzfffDMnnngin/nMZ+jv759RWQLmF4evHuDKO7dx72P5MZr2H+9wo8XSvmpmvZvHYCv8ZjuCerpmlIaIv7II9M5+x5jfi+kroK4wu/dKWRhv7XkoKfU28h5D1TR9OUbDzmtAftcPcVVSWZJkPTgU1yVf4jqiHs+HqHrKP8slnSR2E71umMnIb9836Xx2aDqa7ShR3G6llB1KEtFeg0mC2wbQPEd3zoPpnXAT17OF6XY+B0yCdrvNDTfcwNve9jZuvPFG+vv7+fjHPz7fYgVMA0opPnfl3TxssZoaLO+vAXDP1vzMD1u5+7iPunkM3TqU23EvQk8l7xWkoaSKlyup2Ynor8WhJC+nUSm3Y7Wv2xufaytaOy7vm43QimPv/pJTM8THQ3FtKX837t6yvBQf95AJi0G+k7hthYNqni5jIDN/ueOEt8pJyKeUK2VNE8huuWoaStL/ps/J9mD0uaWM4nflhQXkMRiIyO8rpb4/G8LMBibb2c8W1q1bx7p16zj55JMBOPfcc4NhWMD4xV2PccODO/nT38uNGOf2R3bzif++k1/du52vn3dyZs0o/7u35Q2DrfBHJnyGodhj6BYuanbSUZlFYabeOMeQ71C2ye7yFU3pkBnXaGRLUn2hGROX95XQms5nVyZjjFJyOE/yuZwf8mMUcmYimqXA7bCOS7JnEtPmfH/ns02P7XoMaR9DLnxVSecm2M/NJu5LZcomnxOPoZIPfdk8Svb1ZgvT8Rj+djo3EpGD4t6HO0TkdhF5p+cYEZHPisjdcTPdCdO510LAmjVrOOigg7jzzjsB+OlPf8oTn/jEeZYqoAiv/dKv+cfLf+dd27RTz042YQIb5g/4ge2e+cqWwhl2PAalVEKJMZnH4Es+p4nTIo8hHy7qxAnbohxDO97Z+3IMbiip3ckr02qSC3DDRWlS28hhf7dKKR1e0ykIUbnlqnaXcbWUV+CZRHApn2C2G8baFs/SZLkLe26C2xzX6mR7HGyZklCSpyTVDl+ZY+x7NtpRUvFlzvf9n5lJTIcrqesUti5oA+9WSt0gIoPA9SJyuVLqN9YxZ6Inwx0JnAx8Pv53r8T/+3//j9e85jU0m00OO+wwvvKVr8y3SAHTwCNDev7BmqU9uTXj8vuqRGyF7noMmbkIvhxDrDDbkfIS2hmCuMmSxO0ookZWSfWZUFJuZ59ORHNzASYBmjaiFZR/erwYU8ZZtsIrlXL6Xdy19Htm8wjZsZ+WMfJ2N6tEVteAtiPbm0i7kOulstX5XPL2DGSG5pRLmYFKtsfgVjTlQkmWV2aHr/QxJSJleiaERquTzK6uexr2ZgPTMQzTarlTSm0GNsevh0XkDuBAwDYMLwG+Fs95/pWILBORA+Jz9zocf/zxbNy4cb7FCIhx2a2becYRq1jaWy08xg5zGGzaqXMLy3prueONgvf2DGSqkrKGwd7xFXkMfbUyuyfa/lBSQcOYmdWQNqJld+cA/fXYY/DwLJnSUDuHAGmc223csu9RLRV5MSoz0rLViTL0GbbH4C0d9RgcU91ULvknohmvCvKhpGY75TuyuYfqlbI1NU4SJWx+P+1ORKRSY6I9hqxnt6RWjeXKdmObvFDZUv7pWhq+Ah1KMt+hXCrTaFuJ9AXIlTRjEJH1wFOBXztLB5JtmtsUf+aef76IbBSRjdu2bZs1OQMWDx4bafC2b97AJTc/0vU4X7fwgztG47XikI8djjDolny2vYSJlue6bZX0G3gbxspm1vFkoaR8LiBpcOuaC/Ap97RhzFeuWvEkrjuRSojnvORxnchZy4ZtIJ2TnOlFSMJMxeWqRZ3EbU8ncRLyse7pegzmOxsl7SbTsyWyWS/GGHOz6bD7J+zwFZAj/mvERsuWd9EZBhEZAP4LeJdSare77Dkl95eqlLpIKbVBKbVh9erVsyFmwCKD2bF3G5kJ/moPkz/wrWWmqbmlmJ1U+bthm27T0vTxaSNavlchKqwe6kZ2Z66j8wieJraYB6hWzrOrGmVqFFO3ngIftXetYieJPYbBOy0tTWq73pE7+8A9N9OFXPblGPw7cPuebgWQOSYtSZ1C57PVx2BCRWbdbXCzq5L0OfrzRruT3HMhJ58fne7NRKSKNgrfVEp923PIJsBmbl0HdN/iBQRMAWZXPtbsPj7Ex3T62IieRTVZHiEXW7cVpHOuMQb1SiljJOxz+z3NZKB3tQkVtVuVZEJJXTwGwwOUp91Om828+QebYsKXfI6VqS8cVMso/6xXUC3rUZndOpRzozLb2e/i+65m5+0jpXPLSluOkq6UJZfobViG1XynfPgqNRr29dqdKKlI0uvpc7LDV+Y7met1Ij3rwngMC7HzGQCl1POncyPRPtSXgDuUUv9YcNglwOvi6qSnA7v21vxCwMLCeJdmMhu+eH8SSvDlAroo/25DcYyhWtpb9XoMrY4q9hhMlY8vlOR4DIWGoZwf32nCHW7dvznXpqLOhpJsj8EttbTKSj3dzc22Nc/YMw6zaL6yuYfxftzrZpW/T4H7+wIS76ekwz6292QMuFHS9Uo5Y9R1KCmthDLfwX62BjY9iB2+sv9ttqN0AxGHrxKZPCHPmcR0J7hNB88E/hC4VURuij/7AHAwgFLqQuBS4CzgbmAMTdYXEPC4MR57CuMej8EmqfMq/6R6pLvH4Cpp28i4f8hmbUlvlS27Jjz3tEJJ3pBPQVlpfN1eT+VR0x4v6ckjmHBRNe7ozfYbRIUeg63YquUSw1YFlr2zLyr/rFo7ZbcqyW4ms3MiqZLO9zGYvEbNCr/Y1UPtjj/5bNb0/VLDkeYYOslnoJW13Y3dsrwC12NwQ0mZclUrfGXWzDnme/ZY3oZvkNJMY84MQ8yt1LXUNa5GevvcSBSw2HDBFXfxg1s286N3nZZbM3/A412G4kDeY1BKpTHmLsln8DWimT94z+48ft9fr+SUexQp2pFKQkm+3bvZnbuJa3cims9jqFWKwlBRRoHbSttwBPkoGWzFVq+U2OH1UsTbtWuHX8qOV9COrDnIZb/HUK+k/RFNx4Db4SL3XHeGsl1EAGm8v14pJQZhwjJG5t9srsjnMViGwQ4lWXQaafWVk7iOVPL/sR7/PiE2DJ3unu/jxbSSzyLyZ9brJ8ycOIsHd955J8cff3zys2TJEj796U/Pt1iLGv/w49/x2y3D3rWJZrFhsCuG3LBOtgM57743uoSLuil/836gns5QTtZMOKgglNS0FHiOfiI+t9/T4ObmGHy5C0NrAS6DapR0W4Of08hMJ8vwPFkhH99YSl0Ga3UDO8nniqVoI5UOLkoS6eWyVQGUNeC2J5LNiaTGyB0Q5Mb7a5byt40RaJrxRruT/O4M9Yd9vp27yIaS0t+dMTjGmHtDSRX73Hw58UxjjzwGEVkGfAo4WkQmgFuA8wghnxye8IQncNNNNwHQ6XQ48MADOfvss+dXqH0EuoqjnPnMeAwTnlCSL/SRvO8SKgJ/Pb99rUpJvLMRzH36ahWUyo5vNNdJk89OT0Gk6KmaHEP35LNvl10t6ySxb2iOGV5jju8lrW6yPYbMc8kMvsnH882ar9RSV/IU0Fjb09ISz0U3oiUVQtV8GaxbPeSS0tkdyub7JL0KkSeUZMpGW9nkc72ijZXxrOwcg+nTsI1Kxa5KsiqaTN7L/M7sqXOJx1BxPYYFFEpSSg0BbxCRFwKPAU8Gvj0Lci0q/PSnP+Xwww/nkEMOmW9R9gnsHm+zejBrGMab+g/JV5WU9Rj8MXv3tUG3BLPphO3WbzBgjdm0u4GBruWqgz2VXOMW6Dh7dlSmv1y14lQAGbqMSqmU24GD8Sb8g2/sap1cVZKd1yjsJLZCSa7H4MwhaHcU9Urq2WWG8XgoroFcot0uV61VssbYJbTLJJ+T3Xs582+jHVESIVLpczc5AbMhsb0JI5u5rvFie0yvglWu2nDCV8m5C8kwWGgppa4XkUeArTMp0Exj6Pv30HwkT4n8eFBb28+y3z98ysdffPHFvOpVr5pRGQKKsWu8xerBeuYz88fnCyUNT7SS1/lQ0uQeQ2+1zHirk1s3de2usrSvZbqQ7d15M2c08nmEolBSM1Z6bpOUOQ/i0lFPbT/orlvfXOF0CptQcui+G9YO3Z1vkHgpldQwNApKR93nZLwUsGL2jldgjJy9Zhsj833dAUBpKWu2C3yilc5tNtd3q9KSHENcKdRodShL1gMxu39T7JAPJaVGcNz1GKzfnWnCN/cy32fBlavGOENE1gEXokNLAQVoNptccsklvPzlL59vUfYZ7Bpv5T7rNvtgpEsoKaPkCjyGpEPZkwuomUa0ouRzLe8VuJxG/gY3yYVItAwqUfxATiGCqUpya/vTnbJvVKatpF0uJTuU5F43rUoSb44hUzpaLtG0q3wiT79BUv6ZKmmXydQ2Rom8mTJY67tUsuW3E61OsnM3109CSa5hsCgzbEMF6e5/oiCUZIfcTHjTbpwz5yRVSU7yeSFyJQEsA94H/DnwphmTZhawJzv72cBll13GCSecwP777z+vcuxL2N3FMHg9hm6hJI/yzK4r+utlHhvx5xhqlRLVSj7kk+QRPF5BWnKqR2X6SPQMp1HeS+lkdtH+5LOZm5CNu5s1n7fR7EQMxvxL2tBlO34rZvBNbr5BajTqvlCSpfzrVXeaWqpMy47HYMf73cE3tqHS36mUCwm65aop/USHnlpWCbsNbm4oaaLVsa6n5dVDgErJ/7dWJ0o8QNCJZuNNTLS115nQZViVX1FJxffaOzyGvwa+q5S6E5jduqm9HN/61rdCGGmGoJTia9fcn3Qiu+iJ3W2fx9Ctj2HMNgwtV9Hq92VPySloZZHs+p0SwkaXHIPZGXdrRDPxfp9RKVpLvBQPC2e2W9iZXGbtsn0UExlGUkf5Z1lFiykx3BxDFPcbmPu55Z92LsD1YuxqJ3Nfo/ztsly95jTdRcXJ54lWlPw/0tcoJ2t2whvS/2+NdpSTx6ybDYkbSuqtlTP/J+17estV3eTzAjUMf4FuVgO4coZkWXQYGxvj8ssv52Uve9l8i7IosHnXBB/83u287kvXeteNu717wuMxdOljsJVGw1XC7bRCqCjHMJAkifNNbL5KHX2ePtaXR3Crh1wvxlTyuDthLUPkjbvb90zzHp57WsnnfFmpiffnw0V2BVBmvoHzXex72fMWQCu/zO+inSppl8a64XgFNo1Hvo+hlCuvLSpXdUNJvuRzzZLXyNJqZ+8J+v+jMQymQs2gr1ZmrKVLXcdbnaRU1f6uxeWqsx9Kmq5haAL3xq+fM0OyLDr09fWxfft2li5dOt+iLAqYP4bfbN7tXTd/PLvGfB5D+ofvwlaALleS8QIG6pWCrugopbH2JILrFUN2V5R81oYh2w9hFLj4ifLiah2vJ9JJvRRXpmwfg1sBFIeSKtaozMKxldn72h5DomgtKghzjptjsMNXEHsMVo7BVtImSWwT2pkwkrl+y1rT56Tymm5o810rVtUR2MnnTiaeX6+keY+G4zEkOQar8CDrMaSGYazVTn7XoPNHnUg3T060suErk1saa3bSqqSMF5PfLMw0pmsYxoClMSnewTMoT0AA192/gxse3Jn73P5j8Cl4o6u8yeekbFB5FHg2Xp5Za6e5AD+7apQ0ouXDOp2Ey6e4jyHfiNZ2dtn55LMOS9TjKh6b7rtpeSnude1EcFFVkl2u6lJXZKaeOc/MJpaz75VJTDuhpLazs69Xs6EkO6xj/jW/90a7Q93andud3LnkcyUfhjKfVR0vJh9KKmWMkf0d63YoyeMx9FbLSfJ5vNlJqo7Mmvnc9VLMRmO00faHkhawx/Ah4B7gc8A3Z06cgAB4+YXX8LJ/+mXuc1tB3uHxGsxu02sYrNyCG07SncRaURTlGPrrlVzYxlBXDNSKDIOVYyioLDJ/8N1CSV5Cu4qfYsLkNdI8Qf66PmOVJbvzeBtt22PwzDp2q4fcvgCPvAlliBWayQ4wShsVzS4+qfJpZ/sC7ME3uTGazvcxXdw+eSfaPo8hDSVpmu98KKkox2D+r402OknDIqQbgrFmR4eSrDWTsxpptBNDaBurerXkneExk5iuYfhTpdQ/KaXORxPeBQRMGTc9NMT69/+Qux7N01e4w25s2GGG0UbeYzBK3Zt8tgfjNPOGoV4pe110YwwGPB6Ded+X9CLkw0W1smYrzXsiaWWRfR/IKumi5rhqyary8YR1uk1EM3mETAObVbHkNn1BNt6vZyi7xsgMkskaumyJbDbRm9J1F4WSij0GO69h5HaNkTtms91RyRS2Ig9nohUVJnobrew9zeuJVidNTHtyDFGk8wgmRARpz8JYs8NEK8rkGEoloa9WZsTyGGrWdZf0VDO9N7OBPTIM8ajNbwHnisgfi8gzgffPjmgBixXfvfFhAK6667Hc2ubdeaZRg2zjVFa5R1FKdjc8kR/GY4eech5DXOJZ94ZtjMdQxjCOumsD3foYKv6BOiZm7236yvQFZGXqRCoZL1lEMVH3VACZe5qyUq3cs1VHkPUYbMMx0Up379rQ+UNJ7rwAu77fpbF2k8R1xzDbHoNdGqrXsh5DvVJOcgFuWMemmBhrZavBTKlrSnuRrRCqWQ179vcEi/aiHVmeUd4wjDv31K/1/5nxZieuSsp26vfXK3EoqaNHqmYMQ4XhRrvrJurxYo8MQ0yJsQn4OvAr4CgCJUbAHsIdeGLj3m0jk54H+dr+bDgl702MW663L5Rk6uzdc9Mu5GruPjZJnruWXLdS9pKeNTsqmyT2lHhWypJTwvaar2HMLVd1G+cyjKOZJrWUI8iXY2hYO/Say1ZqxftzlUdOWMc2vmbNR1gHrscQGwbL4GSUdK2c/I5zJHqlVCZTItqTqQIqFSafp+IxNNqpx1DLeAw65DPa1BuVvkzy2XgM7fie2b+FgXpFewzOPUFTtSsFI83u0wgfD6YTStoOvBV4Xfx+08yJE7AvwOd2G9z3mKYvcf9QwB2HGRWu+ZLEjVaHwXq6S7PR6iiqFcnFuG1ZB5LKo3z5Z7fOZ0MTMXm/QT4BXi2XqLvdwJmQT4FhiLuBq2XJGDo7l5LvBk4Vmxt3b3eimLivbJ2bv6c535bT9Qpsymi7+Q185aqdhG7aDtuYZ2SHfPqq5SRE6F63aoXGzO++z2liS8pV2/nksym/de+Z5Bhaxcnn8VaHsTjsaecYklBS7FH05jyGcpJ8rjtrS3r0JsXXyDlT2GPDoJT6OPBm4MPAfcCzZlimRYNPfepTHHvssRx33HG86lWvYmKiOEyyL8H88Zesum4DYxjMf37feZA3DBOOAnQx3uqwvL+mX3tyDMZjKPJEfBTY5nVPpYQ4/EHm3G4kesVlpekuW3dN5yuLeqrlRDG5DLC2knZpwW1aaG9TXTkvk0s37bK6ZkNJ+aqkkpDQVvi4h+xQUifSeQCllPYYKlmPoWHlGGyPobdWZqzVzlw3fQ7l5PMxj2Gwfz95Soz0GTfiKrNkzapKMkSMgz2pV2BCSb579llcShNO8hl0Anq00cnMezZY0qvvsXt8AXkMIvLXwEuA5wMPK6U+O8XzviwiW0XktoL100Vkl4jcFP98cE9lW0h4+OGH+exnP8vGjRu57bbb6HQ6XHzxxfMt1oJAWhdeTIFdtOtPr9HFY/AYholWJ/mjdZvYTPK05gkl2cln99rZKp88BXbDMjg+j6Fo1592IUsux2Dz9ST5iYLxkvV4XkD2nqnRyO76054Cl8baHVCjQ2P+e9rxfPOvvYu2DYMbe697OonNbjlNPsdhnXYnE7axKSZcL8UUB4w124zHxqPXSgTrZ6xiY5QPJRmZ3LBOmkzvJIbBpr3oMR6DCSXVspQYWia/x2BCSaPNvNFIPIZZTEDvMVeSUuqDIrI/8FTgHBE5XCn15imc+lXgAuBrXY75uVLqxXsq00JFu91mfHycarXK2NgYa9eunW+RFgTsChAXCS9NlzX3tX6fKpki6grzB+XzCmqVEiiVDyWZ5LOHusJm2/QlmLOhpPzsA7sqyZ1qBv4+BhNKMVVU+tys8rfnBbgUE26i14zvtJPPSe6ikyphSJX0VEJJxtCYyiyDmrU7T+imjWGwyj/bUVqpBHa5auox9Pdnq3zM/ye7qgt0mAm0Eo7i4oFeN4/QiXRPiCIXSjL3c5PPhg+p0Y4SIsYBx2NotKJkrKjpTzDyapnauhLKl3xuttkx0mRFXy2ztqR39kNJ0yXRewvwz0qpH031BKXUVSKyfpr3mzYuu+wytmzZMqPXXLNmDWeeeWbXYw488EDe8573cPDBB9Pb28sLXvACXvCCF8yoHHsrbLfdRaOVehP2zGHwh3EMjFIY7CluRDMeQ84wWMlTXzMZwEBsVHwT23z9BmYkqKanSDtvTUgloeT2hJKaTrlqEcW1W/5p5E8redxQUjoHuV4to1Qaq890RZezVUkpw2caLrK7ou0KoZrDVurOIbANnckJ9Dp5hEY7pbG28xrlkiQhQ3uMprnGuFWxpM/R1zA5oFGLE8sO69QrJR3SaecT03XLSPoSwfWYD6ljDU8y6Klqg2OMRm812/kMsHO0lXkGBgM9uippx2iTQ1b2ZdZSj2EBhZJifBl4m4h8QkSOn0F5ThGRm0XkMhE5tuggETlfRDaKyMZt27bN4O1nDjt37uR73/se9913H4888gijo6N84xvfmG+xFgSMEvcahviP2kzG8q2BJ5QU/1EP9lRz3kYnbkQbLPIYTFmpp4/BvPd6DJYydZu+2vHgG5MnyJ3bzs5XLmIkdWWyaRl8YahGx/YYst5T0/IY3IaxlhVKcpPPbvet27Dnkujp66XXdUNJ5nrJHIKqE0pqRRkDaNBTSRu7vDmGOGQz3mzTV0vZSt1mMnO8wWCshBNvzBdKapl4f1aBm4KF4Yl2UrmWyBtfZ8dYE3A8BrM22ojf+6uSto82WTngegwmx7DwPIY/BZrx+Z8FTpsBWW4ADlFKjYjIWcB3gSN9ByqlLgIuAtiwYUPXYt7JdvazhZ/85CcceuihrF69GoCXvexl/PKXv+S1r33tvMizkGCacyblLWpn49NmTSTfx2AUyZKeCg/uyCt+SBOD+USw3kkLMDTedNaKcwF2KKkax6ndNVMhZK5llEWrE9FXq3gJ64xSNSWpGY/BCiW5NNZKqWwoqZrNmegBNdkQTaPVgd5qRkm7JacukVu3zmeXlM50aRvYOZNcjiEzEU0fb+/ebe4ht4+hJ6afiCLFSCPbTJZ4DM02JcdYgFbCj400U8/I6V4GbUDde5pn0mjpMJOdeDbPEmDHSDO+Z7pejke+7oh5vXJ9DLUKE62IiVaDFf1Zw2DyGLOZY5iux3AP0AN8Tyk1E0YBpdRupdRI/PpSoCoiq2bi2vOBgw8+mF/96leMjY2hlOKnP/0pxxxzzHyLtSBgqin8OYYuCea42ac3jt36zhvsqdKMY+f5tTj5XECJUa96qpKcslJfv0RPtZyJnduyZyuP8pU8aY7Bx1skGa4efc/UGLmdz+b69iAZN/RV5DHYc4drZT0HIh1ulPcYMsaqk2VXtWVq+JLPJsfQdHMMaSjJ6zFY3EO5ctVaalRGG+2kvNheG2tYFUJWWGegp+rQT6Tn2one4Yl2UvJsYIzv8EQrZxiMUdkeewV9ThK5r1Zma9zQ2e9c1/YuVvRnpxFWyiUG6hVvI+dMYbqG4XbgCuA8EbluJgQRkTUS+34iclIs2/aZuPZ84OSTT+bcc8/lhBNO4ElPehJRFHH++efPt1gLAoayolsoSb/OewWmGsfd9ds5BvCTxxV5DFpJl3Plnfo6kR5L6dnZ28yXLgW2W7FkrpVct61nAphuYDfHUCunncKtdt4w9Ng7+3aqLCHbF5AxDFZYJ50lkKUj76noEIxd5ZMawFT5m+freik5BlUnF2AnxCfcUJIpDW1HXiVdr5aSPIBLiZGQ0rU6jDbyTKagPYbkurX0XKNkJ1rpszUwid5d4y12jbdY2pcNF5lzRybamYok+zrbR5sZGW25THn2mqU9uesarHQ8BtD/l+97bJQdo83c2kxguqGkw4Gd6HBOngbTg5hK43RglYhsQhPxVQGUUhcC56LzFm1gHHilsrd9eyE+8pGP8JGPfGS+xVhQaLajRAlNOEoYHMPgEtq1dfVGxTM0xygv84dsV5A0EsPQJcdQ1lTU7j1bcVWNiTv7S0fLuSltvk5Yl56iluzAs+Wf7U5kjZ50PYY0rON+v1z9fqWUCY01OhFLa/oZuKMnx1u6Rt/0lvTYyVzXY6ikz9/1UtyGPd0wlq8AMveslNJOa/f72Nc1MtvFCTWPYRhrthlxDEO5JPRUS4w1O1TLEeWSZH4vgz0VRhotK/mcri2N/z9tH2ky0mizrDerpFf213hspEmrE3FwfzZJbDYij+6aoK9WzvXt9NbKPLx1HIADHMNgy+/mGIxcV/x2K1/6xb2894VH59YfL6ZrGB5SSl0hIgcAW6dyglKq6xgzpdQF6HLWgEUMm/zLN03N7AQb7Si3eze169WKFHY+ZyqP6uY8vWZc+bxRScM6rjdh8hxu562RB9IKIV/Ix1Ze7nq1QPnbDJ9mlkMUKUqW4arHHo79fVzDkCtXbVs5BhM7b6fKv9eJ57tVPuac3qruUO5Y/FT5Brd4DkGjnQmLZHIMzew97VCS2RJmcwzZ5HPGaNTSctbRZpv9Bh1FW9MJ5lqlRJ81RhNgsK7j+aZ6yL7nsthDeHDHWOa9wcqBOnduGUZEMqWqAGuW9AJw97aRXBgJtDG4e+sIIrD/kqy861f2J6/dHAPAR/7Xsdz+yG6etn5Fbm0mMN1Q0hkisg64EPjUDMoTsMgx1swrVhuNdifZ9XtDSdU8sRykCtvXq5Aq8HIu7g56926Uu5t/aHVUJp6fnQmRTT4X9TgUVR4lCVvnXLvj1x18060qyfVSfDkGc47bF+COl9R9AdlQknkG/ckgmXbunm5F02gzmwjONri1MwNq7KqkiVbWGOn7lxMm00hlvQnTqzDejDTFtRPW6auXdVWSp2HMKPRt8chYu/N5oF6hXBIe3KFDPjnD0F9j+2iT3ROtXLf+2mVa2Q+NtTLPwOAJ+w8CsGqgnsnDABx34BLrHtkcA8DJh63kjaceypPWzc4QsOkahmXA+4A/B/wDeOcZe0MUam+QcaYx2bAd3YiWn2oG6S6xVslzGtlVSeZY+zxIlanvurVKKTeMXq/pQe8mlGQbK7vxy72uN8fQziaY7V22XdFkd9/maaHzoaR0vkEnuac+Jtv5nEk+O6GkiXa2+zYzrN6JvfdadA6pl+JWFsUeQ7Od4Qhyk89ZjyFNICd5jYrjMcSJXkjDhhmZWroL2U4+Q+oxuLMPII3nP7pLJ4L7rHNFhCU9FR7Yrj2Gpb2ux1CzylWzyn9pbzX5fgevyIaZAI5aow1D2/FSzX1ferxuiPV5DLONKRsGEXmK9fav0RVJdwL5v+55Rk9PD9u3b1/Qilcpxfbt2+np6Zn84EUE2xh4q5JaUZILyFceRSk9tifkA2keIavAY8NQ9p9runNr5TJtawQkpAR7PR6PwS5vtCtmwN69l73dzRl6iorrMaSGoVtPgdvg5oavXENn3zOXfHaon+3pY67HYPcF+PIa1bIw0kgH1NisorVy2fIYXMOQyuRLBJtnbBq77B16j5VjGG20E6/GoK+mPYaxZp5+woQf79uuvYJVA9kd+tLeKg9uN6EkN8eQHuuGkkQkyR0cFXsHNozHUNSo9slXHM91f/k8LwvxbGNPcgw3xjxH3wC+pZT6CYBSasHNY1i3bh2bNm1ioTa/GfT09LBu3br5FmNOYTeMefsYOlGXUJJuMCqXJBfySUpZrbLF5Jq2x+CEoUxHsvYK0t15r5WPsJPPLsOrmeil4/n5UttapUQp/tglyrMpsLO0FynDZ82q1LGfSTLfoJInpbNzDPZ1x1qdXM+AnXzOKOFaOWmgchvc7CofN+kM6SwByHsMdknweCvKhpIs42uMc75ctZPIZRq9IMs9NNbMh5L644YxLb/rMej/b/c/NkqtXEq8ToOlvVXuN4bB4zEYuOWqkDZpPmHNQG7tyP31Z+tX5r0J0Enz1YP5MNJcYE8MwyeBlwEfBz4qIj8Hvq6U+vKsSPY4UK1WOfTQQ+dbjAAPjGJbajVVGbTjhKYvHGTe18p6bOVII7vLmmhF3vCKvme6e8+FfCxlau9YM4ahUpx8trl87DU7rGOKUTKNaE4oyTYadrjDzSOYpLVpmquX84ahXrZDSZZhsBq/cjOUneRzb7XE1t1uVVLWY7CLB+wqHxO2iSLFmJNjMJPwGu0OE81OpuPXrvwyHpIv+WwauwYtj8HItD3OE7hhHd0z0EAgF+83O/37t4+xaqCWSUxDNmSVzzGkitsNM0FabOHzGPpqFb7wug0cu3ZJbm2+MWUfRSn1XqXU4cAG4IvobueLZkuwgMUJo2SW9tVyoaR8OCi/XpR8Ntz9Ps4j22OwJ31BNhfg62424Y5KSShJnsgvNQylTPmtnZR1E70prbZFRe2GkirZUFI6YcwzerLTyRxjewyGxrrd0d25KZOpk3x2hsVkuYd0NZgpt7RDST5KaV3+2U7Ot6uSzK56eKJdGEoab3Zy4Sv9WpermgZJO5RkDOk202XsyTGMtdraSykIJe0YbbLKs0M3Cl8ka4wg6zE84/B8P+4zjtCfHekxDADPf+L+rF3W612bT0zZYxCRlcDZ6H6D5wACPDhLcgUsUpg/+GW9VTbFJYDpWjaBnJumFivicslfrlo00jIJv3jYSrMeQz4MZeL9IpJL5tpKuqdSdryJ9LpmAzqeGIZ8iWdRjsGlvXD5+e2pZ754v5GlE+fbjAJPcwxWvN8ZJGMnnzMVQFZVkgn52GEUwww66qGbzhkGZy5CX63MrvEWIlpGu/a/p1pmot1JPAY7lGSe12NFHkO9zFhD50SOc3bodjezm1+A1EsYjCuUbNiJYV+S+B/OfQrv+r0jc/IsdOyJtFvQHsZO4CvAN5RSv5gVqQIWLYwiWtpbzQzXgVSxpTkGX/K5TFn8vQi+bmD7talKcgfbQJqY1teyEuRWtU6Pk8ydaHeSvIQJJRlGWLtc1Si3lGIiNVTmGDs0NmHtat1SV/M9Dezv48sxmHPMmlHSurM6pQdx5xD0OB6DXTaaST53/IZh13grnVxm7d7t6WO+WcfL+2rsjPmDXLrppb1VWh3Flrh6KOMxxNfZulsbBjf53F+rsHOsSaRg3fJsTN9OGq/2GYa4qc1NPIN+Tu994RN49lGrc2ugDWyRt7CQsSeG4TvoxPNlSqnZY28KWNRIQknxH7nu8s0q5MRjcENNLb1bLnkMw0S81j3HYHoV/B6Dr/N2vJly5etQRrYqyYR8eqolImUI+STjMRjlbnbgafjFxPvLbBtOq77tGcB5Qrv8sJhCSgyrxNYdaak9oDT85RqGXoewzsdLNNbsIJJyVBkM1Ms8vHOswGPQx2kKinyF0NLeKkNjTRQkE/cMVsVhm3sfG6Vcktx4Tp0k1pVFbvJ5WV8NU2y2bnk2dNNbLbOkp8LuiTarBvPK/9wT19HsRJxU0Ez29ucc4f18b8akhkFEDo5fvif+9wA3ORNjSCm1e6YEC1icMF6Ccc8n2hEDTtmlr+QUDHFaKWZX9eQfKn5Oo9RjKFOvlhKFZa9Vy/4mtoalpG2uHiOf7TGY72eHq+wcw7hVAQRpXLyvVs4k4u0KIZfGutHKj5dMwkytAo+hlY60tEM3dsJ8wtP53OooWp0oZ4xM+elYs510KNuhEjOW0tzT3r0nlNETLe/ksuX9VXbGhsENzZgKnXu2jjDYU8kliQ9c1stvNu/OyQNw9Jp01+4aBhHh1CNXcemtW3LyAKxf1c8Hztq3CDCn4jH8C2AKu70WIV7/Kt2nswUEJMrLhIsmWp3kj9is9dXKuUSvPjaKq3z85ar1Srl7I1oln7j25hgsr8BWXi7FhK0w7WTukp5qJhGcJFVbrseQGgbzmRkvmYavyplzJ9rZaV82FYcxeOZ52jkTn5I2eRGlVE5J91rfZ6LVydzTLg1tdxQlySafTbmqKVntyySfrVCSp9lsWV+Nzbt2E0UqF/Ix8f97HxvJUV6AVvjGMKxw+IWOOSDNK6zzNJu98mkHc+mtWxZkIng+MKlhUEo9Zy4ECdg30HA9Bk+Jpxl07wsX9VbLKPIew0RL8+EXeQwiFo11QYeyG7ZpdyLakbISwU7yuZ3usnus3bl9f0NM1xNP+gKSgTJGKfZWK9a84ux4SdMDYMZDmnCagV1+a7h++hPDkIbo3HuCmT6mS0PNBDKDlHtI01jbit/MEtDVQxED9ezufcAknxsejyEOE27eNYFS+ZDP8r4qQ2Mt2p2IFU5p6H6xxzDRijKJZ4MDY09gSU+FtQ4p3f5L0tzB/p7Ko9OOWs1P3/1sDrU4ivZlzH1LXcA+jYmWHsJidrUTTswe4lkDliIFnXxtR0oPkrGI5ZJz4zi4L09gdvamIczbx2CHkhz216Lks9vHoL9PSgttjJG5hs1LBGnsva9WZrTZTnbu9vWM4hyLd99uWMeUcAKMxA1nyVxnq2Ev8Ris3XtPbOh8Iy1tj2HXeCvX2GUqj4Yn2rkSzv56hUj55xD01yqIwD3bRoBU2Rss76uxY7TJ7ol2Lsewor+WVHgN1vM9A8bDOHB5Xy7MZL+vlP1q7/DVAzkG1H0Ve1cNVcBej0bMHOoqUr2W7rJtSgbIxuVTbqCInlIaOtJ9Cv7kc9GMgvFW2g1rdsy5QTLV9NwxKz/RaEX5HIM1SMbMVIAs95AbSuqt6fnLjXaUKHnXMIxYhmGVTfLWU2HTTl32684E8IWS7AE1pmFswpN/sOcbDI21eIIVozfrY80OIxPtXMevqfJJKoQsmUolYaBe4e6t2jC4rKJ2k5ibY6iUS6zo06R1Po9hTXytpZ41gB+849RkFkhAdwTDEDCnMDtev2FIWVDtckn7ODvWbZdumgoh70Cdtl1ZVMo0uNlKulbO5hjcYTH1SomdY9nr2lVJQOEgmR4rwWwMhFG+vpnEiWEwoaSGv3R00JrkNdpoZ0ovjUyaVdQXStJejD2kx6C3llZS7R5v5bp6++I+B01Y5xiG2CvZOjyR+X4GS3qqlmHIewwGvvJQo9hPOHh5bu2AmM301CP8gx+PO3B2mEgXI+YslCQiXxaRrTHfkm9dROSzInK3iNwiIifMlWwBcwfTFGZi8hNOMhd0CCRnGJppWCc1BvkKoVJJcoN83JnEtjdhV+vUnaavnGFw+xhanqokE9ZxhsXYoaSxZpazx6axNs/DGA3Dw2TOMY18BqbLOLlnJp6fTh8b9YSS6pVSnFyOkmdgYL7P8ESbYc+Amr56RXsMjbzHYGR4dHcjyUfYGOypJBxCq50k8vJ+y2PwGAZz3jkn5jnGTjh4Of/1tmfwx6cvvvLRucZcegxfRQ/iKapcOhM4Mv45Gfh8/G/AIoJpCuutdQkllUuZZC1YoaRqOSmNsw2HrTDdBLO9yzbjO00jmh3vTzmN/HTTPZ7ks935bJ/jjpe0KSbGWtkcg01jnRqjVJkOWARwo82s8h+oV+PqoEjv3i0lbRL8u8ZbiQG0vYKlvVUe2pH2G/hCSVvimcQuR1BfVYfVhifaHOIkbI0Hcdejw+w/WC/kHuqp5gnrbC/BNhIG//SaE9i8a8LboQxw4iF5TyJgzzFnhkEpdZWIrO9yyEuAr8XjPH8lIstE5ACl1Oa5kTBgLmBCPnbdf7JmeQz2DhvsYfUpKV126E+qpN0BNc1MjqGEUnrnWS1LJpQUqSy1tZGt1/YYWv7kczIRLZZz1GH47K2Vk/LN8WYnoXww9zbfxw0lQTpkRimVC+uY3fpIQ4+0tMs4By2PYbzZpreaHS+5sl8nenfE/EIrPfQO9z2mQz5uKGmgp8KD28fi5LM/x/DIrgmefli+Kcx4Aqs9RuOYNUt4yfFrKYlwxH55RtKznnRA7rOAmcdCyjEcCDxkvd8UfxYMwyKC2b27O2xIQ0P1SpneajnhxIH8sHr7sygeMZkq2kreaJjBNxZlRrVcYrzZRiQlnDPHgz/5bBS/UipLolfJekCjzrCYnmqZx2IFbGYCJIlpyzA0PBVC/TXtMYw2O0QqyxE0YHEPjTY69K/Kzjoe7Kmwe7xFsxNlwkigO4t3T7QTr2CltQs3BuZ3j8aGwfEYDlzWyy/vfox2pDJcQ6AbwpLXnvLPFx63Pz+6fQsP7RjPrfXWynzmlU/NfR4wt1hI5aq+OjHvpB0ROV9ENorIxoU+cyEgC0PIZpStHQ6yd+89VhWPfVxPrWyNcUwpGyCtwumtZauHmu0oYV11y1ltJV0plzL5CV/y2ZzX6iiUSpPhafLZCiXVinIMnUxC1oSUxlttbyjJNIwlcwis8tAllmEomiK2K+YlcpvJjIdgEsG2x9BbKzPYU+GuR4eT69g4eEUfo3Efg+sxLOmpJmWoB3tmDZx5nN71H7Y69AwsVCwkj2ETcJD1fh3wiO9ApdRFxJTfGzZsWLhj2gJyaLQ1P3/dk0Aea3aoloVqOT8RbcKq5DG9AalhyFI091udxKBj+qYOPw3btFnRX8sMrwHTMBZXDxUYBu0tZO/pfh+3WscuVx1vtjNK2g4ltWNSOrsL2ZDS7faMtDRDZkbiTmN3pKUxDNWy5IjlVsSzBO7aOsxAvZIjtNt/SU9iNNw+hkMshe8L+Szrq7J1uMEhK/LKv6da5sf/+7TcjOSAhYOF5DFcArwurk56OrAr5BcWH3SJaeoxZBLMzbaVkM0mn+0mrESRthyPIb6mTRkNJqyjr5s0jCVKOruT1pU6We4hs54MkunkuYfc7+Mmn3uqpQwlht1PkFBMNPw5hoG6zk/sillHfTmGobEm461OYigMjGEYGmvldvYmuXvXoyOZuQIGdimpz2MweMpBy3LnGmOx3xJ/kvio/QdZs3TfGmu7N2HOPAYR+RZwOrBKRDYBHwKqAEqpC4FLgbOAu4Ex4A1zJVvA3EGzoOp+g5Jkcwx2iKWn4hDLWeWq7SimsU7mBWQrbvprlSRuDmQoHdyGsdFGO6Ok7fxEYowcUrqJVpRM5jIJXkNjnVYlZZPPPdYoU5cjyPZiDNGeXQXUF09E8806NjkG833dPMLS3ip3bR2h1Yl48rplmTUzfWzrcIMTDs6uAZlEtmsYDrIMw5oleQX/f1/6JI47cCknevoNAhY+5rIq6VWTrCvg7XMkTsA8waancMdhjlm79964ISwpK7XKVTsqm5+YzGOwewpMOCWpEHKU9GBPJVH6afI5S2inaSKMktbXE5GElK7Z1tPS7LBOb1V3XKfjLrOhItAe0NBYi3rc+W0w4OYYrOTzoMU9ZL830DTWOgx1xrFdegb68zt7s9s/aEVvjkbC9mh8bMsr+muhn2AvxkLKMQTsAzDjOSE7DAbM4Ph0RoFShmo7NSD1aimhejY7+5RjKfUYTG2+UsoJJWU7iV0lbTeMuX0Mg5lEb37ucE9My22MjtvHANoLGWt2Mh2+hkp8vNlhx2gz5gRKlW1/vcxos5N0/doeg+EMMsNrXFK6pb3VZKqZG7qxZVjlCSWZfMeLnrQ2twbw/T851dtrELD3IxiGgDmFCSWBDtG4oaQ0Zh8r0mZqGExZqYE9YUyfk3oMSTioFRFZLJ7GQBjlrZW0ncytsH20mVy/Vi4l4xxN0nfXeCuhobAbtAZ6ND3FiM8w2L0KzSxbqYjEDWMdhsaaOSqIvlqFTqQSBT/o0F5USsJD8ZhUN6FrJ6oPcAxDtVzSlBqNtjfH8PIN67hr6whve/bhuTWAJ60LFBOLFQsp+RywyKFUNoxiZvgajFsVQjaJG8RJ4risVETiKp925pjEY7AawoySNmEdk9w2HoWuELKVezWhr7YpL8AaSznhrxAyYynduQj2uYaewuUP0hQT7dhjcJrJ6mm4aKBeyYR1RISBngq3PLwLyPcN2LmKNUvzswae98T9WT1YZ4NnOtnRa5bwtTeelOthCFj8CB5DwJyh0Y7oRCpJmPZUy5ly1dFGm4Ni6mRD4pZMGGtnR0/aU8/M7t3spM0Ou9mJcmGdASf5rCuEsvF8k+TdPdHK7MBNAna35TEMZigoagyNNb2hJLMj3zbcYMdoM0fpsGqgzrbhBkNjrdywmBVWv4FLIQGw/2APdz46TK1SSmYSGJx8aKrw3RkFAJ/6g+NznwUEBI8hYM6Q7t6NYciGkuzSUVNhlHoM+dGTJlyUxvvT+Qbmeu7c4Z6qroYyg+rdclWdY9DX2zXWyuy407GUOhFcLklGpuV9eizlSHxtO/lsDMFdW0foRCoZU2lwwNIeHhmaYMdYMxP7Bzg07iS+9eFdGQ/F4Pi4XPSQFX1J2MvgiP1SuuyVBfxCAQEugmEImDMkE8asBHMm+WyFkswEsWSkpTV7GXTMfiLnMWSb2EabnSTJbIyRiNAfk9IppXINboP1SjzVLGJo3DEMPVmPYYkzd3h5X42h0VY60tIKURnD8JtH9OhJ1zCsWdrDw0Pj7Bpv5QbU2BQT7vwCgBMOWQZAyT+Lnave+xwu+sMTc0YjIKAIIZQUMGdwk7I91XJmcEqmXNWhsfbV/huPwYR+jPI3OYPxZtsK62S5h0YbbZodHdqyDYMJc41MtBkaa3K0NStYjxwtxYahlZtctqyvynCjnXwnO8ewvK+KCNyx2W8Y1i7tSc5zR1rqrmTtXfnYQ02DWaXsV/wHr+zzUlMEBBQhGIaAOcOoN5SklXu7E9FsRxlvAqwcQ6uToYy2uZSGJ1oM1CvJjtgebuOGryBNTicDczI01mkOYmgsP9JySW81Tj7nWUVNCMjQSNgTyMz0MWMY3JGWdmLY9Rj099chtw0ew3DUfoO85dmHcc4J+RkFAQHTQQglBcwZTLzf7N5tPqR0RoFTldRMSen6LOXe54SSbCVtl4b6EsFmvkHaF5BvGNs90cqFksyxuxKPwZ0loI+97eFdLOur5noKVg3Uk2Y8N/lsl5LuN5gPFxl6Ch/9RKkk/MWZx3DU/oO5tYCA6SB4DAFzBpOUtZPEY0nZaJZ7yC1X3TXeygyE6a2WedjyGGwlbU9E8/UUGIoJ069gK2kTHnp09wSdSOUmly3trbJ7XDOZ2nxBkHoIv3lktzd0s3KgBo9qj8Y1GrZhOOnQfOnov51/Cr/dMpw7LyBgNhD+lwXMGdzd+9LeKrsn2kl3MqRKPd3168+HnAE1vU65qh3v78t4DPFIS4eC4uGhcbabATVWc5cJJZlZATmPobfKjtEmu8fzOQYTShputDlwWb5nwBggN78AcODyXtYt7+XtzznCmyRev6o/k4QOCJhNBMMQMGdwDcOSniqdmDvIZSs1RmDXWIso0pPLbCVthteANgy2cjchp7Fmm9Fmm3qllGkKM2yl2+NOYruM0ySfTSex24W8pKfKXY+O8OhwIzfI3pbP7SeAlHH0SE/Ip14p84v3PTf3eUDAfCAYhoA5w7BTrmpTTIw7OYZapUR/rczOsRbDjTaRyjJ8Lu+vsWu8RSdSDE+0MrvpJQkVdatw9OTwRCsJJdkDasw0sgcSw+B6BVUeHtLehBvTtz0Bn8fwjucewSs2HOSlnwgIWEgIyeeAOcNoQ88dNqGSpJN4ouXNBSzrqzE03vTOIVjZX0Mp2DnWzCn/gXqF3mqZrcMNtu6eYLWTzF2zpIedYy027RzLDahZOVCnp1rilk1DABkeJYBj16b8QO6AmnqlzP96iiacW+GpLBIR1iztoVoOf3YBCxvBYwiYM4w2s8Nr0oaxdjKQfoUVulnWpymjTfWQHdYxu+7tI3nDICLst6TO1uEGjw5P5EI+62LajVs27crt3ssl4bBVA/wmLit1u5DtxPDhq/OTy/7v2cexdlkvLzh2TddnERCwkBG2LgFzhpFGJ6PAl1qhpB1xWGfFgGsYmgyNNzPHQ7oj37xrnGYnyrGK7jdYZ+vuCbbsauQGyZj4/+2P7M6EkQyMJ7BueW+ORsIeaenOUAZt7N5/5tG52csBAXsT5tQwiMgZInKniNwtIu/3rJ8uIrtE5Kb454NzKV/A7EKPu0yVacI9NN5ix1iTalmSGD+YUJLtMdihJK2w73tsVF/LySPst6SHR3aNs320kaORsOP/Pv4gYxie7KGVFhH+6kXH8IGzjp7CNw4I2Dsxl6M9y8DngOcDm4DrROQSpdRvnEN/rpR68VzJFTB3GGm0MwPpbRrrHSOaPM7mHloWTx8binMMyzwew62bNN30AQ6l9H6D9aTk1B1QYxsKt9EMUs/k0ILy0Dc967BuXzMgYK/HXPq7JwF3K6XuBRCRi4GXAK5hCFik2DnazMTlTVhpV+wxuAnb5TGN9dCYDiVlZx/o1zc9NASQayizu4fdUJLdJ3DGcflcwLknruPhoXHeWjCgJiBgsWMuQ0kHAg9Z7zfFn7k4RURuFpHLRORY34VE5HwR2SgiG7dt2zYbsgbMAraNNJI5wqD5gwbqFZ18Hs0bhmV9VSIFDw+N01MtZaqHKuUSy/qq3BuHktYtz3sMyeslea/gqQcvo79W5rQjV+XW+usVPnDWMbkGtoCAfQVz6TH4qB+V8/4G4BCl1IiInAV8Fzgyd5JSFwEXAWzYsMG9RsACRKOtB92vdkI3S2NSuh2jTY5duyS3BnDnluEkp2BjRX+NobEWqwbqGYpryBqKdcvy9BQXn/90lPIPsg8I2Ncxlx7DJuAg6/064BH7AKXUbqXUSPz6UqAqIvktXcBeh8ficlSXDmIwJqXzeQymVPSGB4c4cv98aahJIruzjAGetn4FXz/vJH70rmd5R1PWK+WMBxIQEJBiLg3DdcCRInKoiNSAVwKX2AeIyBqJt3AiclIs3/Y5lDFglrBtWNNPuIZh9WCdTTv1gBrXMBy2Ok3+PsFDI/HGZx4K6CY3F6WS8KwjV3P0miW5tYCAgO6Ys1CSUqotIn8C/DdQBr6slLpdRN4ar18InAu8TUTawDjwSqVUCBUtAhjD4FJKH7X/ID+/6z6AXE+BXRXko5Q+/QmreeuzD+cZh6+caXEDAvZpzGkXThweutT57ELr9QXABXMpU8DcYOvwBJD3GGxP4LgDs30DInqm8nir4zUMIsL7zwz9BAEBM43Q+RwwJzAeg0tBcdSaYsMA8M9/eCInHrKco9bkcwwBAQGzg9C3HzAn2DbcYHlfNUcgd6RFROcjlzvtqNWcdtTqWZcvICAgRTAMAXOC4Yl2huvIoL9e4fzTDuOUkCcICFgwCIYhYE4w1mzneg0MPnDWMXMsTUBAQDeEHEPAnGCk0Q6MowEBewmCYQiYE4w1O/TVQ0NZQMDegGAYAuYEmnI7eAwBAXsDgmEImBOMNjr0ewbbBAQELDwEwxAwJ3DHegYEBCxcBMMQMOtQSjHW7GSG9AQEBCxchL/UgFlHox3RiVRx8rnThs03wc77oVKH/Y+DFYfOpYgBAQEWgmEImHWMNtoA+XLVxghc9wW45nMw6gxcOuhkeO7/gUOfNfUbPfobuOFf4L6f6+v1LoeDToKnvQnWHr9nQisFW26BTRuhNQaDB8Dhz4W+FXt2nYCAvRDBMATMOkYbHYBsg9uDv4ZvvwmGHtQK94TXwepjtBJ+4JfaWPzLi+H418KL/gGqvQVXB0a2wmXvg9u/DeUaHPpsWLdBG4fbvwM3fh2OOhN+/zMwuH93YaMO3PSv8PN/0B6MjVIVjj4LnvdhWDHFuc9DD8K1X4D7roJtd0KpAssOhiOfDxveAMvXT+06oI3Vtjvh/p/D2A6QEhzwFDj4ZOjJ80xNCZ2W/qn0QClElgM0gmEImHWMNo3HUNbK7ZoL4PIPwdID4fWXwvpnZk848AS9y7/qE1pBb74ZXvUtWHZQ/uL3XAn/+UZojsCz3w8nvyW7q5/YBdd9Ef7n7+Hzp8DLvgBH/J5f0KEH4d//CB65AQ7cAM96Nxz2HOhZAtvvhtu+Ddf/C/zuv7U3c8rboWgCXLuhv+N1X9DvDz5FGwKl4NHb9DO45nNa3uf8JdTyU+YSKAV3fB9+9nHYent+vdoPJ74eTv3fMDAFXqndm+H6r8Kdl8LWOyBqgZT1cz/qhbDhvKl7Rub7PHAN7LgXOk0YXKMN1qHPhmp+iNKkaI7B+E5QkfbUykFNzTVkbx93sGHDBrVx48b5FiOgC65/YAfnfP4avvG6J3HqHX8Nt/4HHPO/4CUXTL7TvetyrfirffDqf0tDQkppxXr5/4FVT4CXfxX260LBve1O+I83wLbfwll/rw2PjXt/ptejDrzok/Ckc/1Kf/cj8MP3wJ0/hCf/Afz+Z/PKzzYwJ74eTnsvLF2Xv86VH4UbvwH7PRFe8TVYdUT+fhO74Lt/DL/9Aaw8Ep7+Nu1tLDkQWuP6Hjd+A279T+hdBi/+FDzxJf5nEEXaIP30ryFqwyHPhHUn6pDb+E64/2p4eKM2NKe+SxuacsHca6X0PX/5WR1yA6gNQqWmvRkU9CyDp74WTv0z6J+EC+uxu7SxuucK2Pqb9HMpwwFPhqPOgONf498cuGg34cFr9HfZfq/2QstV7antf6w2WHsSElRKe6Vj27Xhqw9C/6rpe2kLBCJyvVJqg3ctGIaA2cb//G4bn/rKv3Lxqi/TM/wAPPev9G58qvOWH/0N/OsrtMJ50Sd16OTH/0cry2N+H176ef3HOhkaw/Bfb4Lf/QhOegu88KNQKscezAdh1VHwyn+FlYd3v45S2pO54v/CQU/X3oxRNHf9RIfIog685HPwxP/V/Vp3/QS+/WZQHfiDb8Chp6VrW26Df/9DbWie9xE4+a3Fu+etd8B33qqT+M94hz6+ZCX7R7bBd98Kd/8Ejn4xvOBv/OGwR38D//Nx+M33YM2TtYflGtxtd8L336mV7+pj4KQ3w5Ev0MZPRD/nh34NN34TfvNdbTBOf59+5q78O+/Xv8s7LtGhukOfpfNLg2v0cx56EO7/BWy6TofOjj0bnv3nsPoJedkfuwt+/c9wy79BY7f+bGB//X+j3YTdm7QXguh7HPtS/f/HNdqdlr7ffVfpez98A7RG8/cbPEAb9TVP0sZr/yfBkrVQH9C//5GtsGsT7HoIdj+sPbWRR7VB7zS0HNVeqPXrjU+tTxvlWr82ZFKKf0QbyOR9/FOpw37H6J9pYMEYBhE5A/gMeoLbF5VSH3fWJV4/CxgDXq+UuqHbNYNhWPi47NbNLP33l3HS4GNUzrkIDn9OsjbSHGHL6Ba2jG1hy+gWNo9uZsvoFh4de5Tx9jjtqE0n6lCKOgzsfID+8V0siSL2ixRrjjiTNU/6A9b0H8Ca/jUsqS1BJjM2UUcrol99jtYBT2FLSXh4+x1sPmgD2445k5GoxXBrmNHWKIJQljIiQn+1n2X1ZSyrL2Nl70rW9q9l7cM3seL770aWroOzPqFj/7/4tN6VvuJrkxqY0dYom0c288jWmxn62UcZHd3G2HEvpbHf0ZQfvZ3yby+lWullyYY3snztBpb3LGdFfQWr+1bTU/GEaDot+NH7dejsCWdppV4f0N7Qt8+H8SE446Ow4TzaqsPOiZ0MN4cZbg0z0hxhvD2OIIgI5U3X0//ri1jaHGPpsz/AkhPfSE+1V+dffvhunZN4/kd0DqhbbmLrb+HHf6kN0v5P0h7NQU9Dje9i/BefZPd1F9EulYlOeB3t486hOrg/fZU+eiu99FZ609/n0ENw7T/Dxq9AcxSOOwee/sew8jDt6Wz8MtzzU51jOvZs7TWtPzW7q283dVjy7p/oTcWjt+nP1z0NDn66ro7beb82Bs1hQLTSP/gUWHmEDtOVqvr+w5u1Md56u/6OUcv60gJ49GqlV+e4agNaTpQ2Es0xbXiaY9AeB7RNRMX/RoJSoOJ/iQQV6bXys86ncvbH8/eaAhaEYRCRMvA74PnAJvQM6FcppX5jHXMW8A60YTgZ+IxS6uRu1w2GYeHje9fcziFXPofL1j+DsQOOZufYdh4bfpTto1sZa4xQjqCkoBRBRZVYXVvOfvVV9Jd6KUuJihKiKKLRHKMxup2x5ii7Og1U1EHi80oKeks9rKwvZ2V9OSuqy1hRX86SygBEERPNMXZP7GL3xJD+d3QbY60JfX78J6CAUrlMrdJDpVJDlaCDIhLFeNRgrDNBVAIl+icSqJQqLOu0Wd5psjzqsGL5elYeeQZLB/anWqrQaE2we3wnu8Z3snN8B0NjO9g1voNd4zuZaI0nspes71H4OoKSUoiC/nIfS6qDLKkOMFjRPwOVfnpLderb74WHrmW8ZxkTvcsZ2/UQY5VexgdWMx61mWiO0WhPQKQoKa3GzPdXYv0bL0QCCJRF6I069Jaq9C5dR199CX3VfvrrAwzUBuip9SMiRCjGOxOMtkYZaY8y0hpldPgRxoY3M64UzVKFZhQlNy0BorI/Rq6aVKmXavSU6/RInTpl6o3d1EZ2UI861CJFTSmqpR7U4FpaA/vRUopWp0mr3Uz+bXdatDstoqiNijpEUYSKIkRFSJQ+AwSkVKJUriDlKqVyhXK5QqlUoVKuUq5UKZerVEoVKlKmQgmJIqLGCFFzjE6rSRS16USKCCFCUOgonooiVNRBqQiiSP8+I0W5E/8bQamj4s+mppcrr3oxR37oE9P6u1wohuEU4MNKqRfG7/8CQCn1MeuYfwZ+ppT6Vvz+TuB0pdTmoutO1zB86S/+nrHA0BAQELAXoycq8eaPvmda53YzDHOZ7j8QeMh6vwntFUx2zIFAxjCIyPnA+QAHH3zw9KSRAncvYBFjijmNSTFT/29mSh6DIrlm+j5TuedivvdUfv9z870rlYLigMeJuTQMviflPuGpHINS6iLgItAew3SEOe+j753OaQEBAQGLHnPZ0bIJsGvN1gGPTOOYgICAgIBZxFwahuuAI0XkUBGpAa8ELnGOuQR4nWg8HdjVLb8QEBAQEDDzmLNQklKqLSJ/Avw3ulz1y0qp20XkrfH6hcCl6Iqku9Hlqm+YK/kCAgICAjTmtNdcKXUpWvnbn11ovVbA2+dSpoCAgICALAJrVkBAQEBABsEwBAQEBARkEAxDQEBAQEAGwTAEBAQEBGSw17Orisg24IFpnr4KeGwGxZktBDlnDnuDjBDknGnsDXLOtYyHKKW8Azz2esPweCAiG4u4QhYSgpwzh71BRghyzjT2BjkXkowhlBQQEBAQkEEwDAEBAQEBGezrhuGi+RZgighyzhz2BhkhyDnT2BvkXDAy7tM5hoCAgICAPPZ1jyEgICAgwEEwDAEBAQEBGeyzhkFEzhCRO0XkbhF5/zzLcr+I3CoiN4nIxvizFSJyuYjcFf+73Dr+L2K57xSRF86iXF8Wka0icpv12R7LJSInxt/vbhH5rCQT3mdVzg+LyMPxM70pnic+b3KKyEEicqWI3CEit4vIO+PPF9Tz7CLnQnuePSJyrYjcHMv5kfjzBfM8u8i4oJ6lF0qpfe4HTft9D3AYUANuBp44j/LcD6xyPvt74P3x6/cDfxe/fmIsbx04NP4e5VmS6zTgBOC2xyMXcC1wCnpC32XAmXMg54eB93iOnRc5gQOAE+LXg8DvYlkW1PPsIudCe54CDMSvq8CvgacvpOfZRcYF9Sx9P/uqx3AScLdS6l6lVBO4GHjJPMvk4iXAv8Sv/wV4qfX5xUqphlLqPvTsipNmQwCl1FXAjscjl4gcACxRSl2j9P/wr1nnzKacRZgXOZVSm5VSN8Svh4E70PPMF9Tz7CJnEeZLTqWUGonfVuMfxQJ6nl1kLMK8/Q252FcNw4HAQ9b7TXT/zz/bUMCPReR6ETk//mx/FU+vi//dL/58vmXfU7kOjF+7n88F/kREbolDTSakMO9yish64KnoHeSCfZ6OnLDAnqeIlEXkJmArcLlSasE9zwIZYYE9Sxf7qmHwxefms273mUqpE4AzgbeLyGldjl1oshsUyTVf8n4eOBw4HtgMfDL+fF7lFJEB4L+Adymldnc7tECe+ZJzwT1PpVRHKXU8ejb8SSJyXJfD50XOAhkX3LN0sa8ahk3AQdb7dcAj8yQLSqlH4n+3At9Bh4YejV1I4n+3xofPt+x7Ktem+LX7+axCKfVo/EcZAV8gDbfNm5wiUkUr228qpb4df7zgnqdPzoX4PA2UUkPAz4AzWIDP05VxIT9Lg33VMFwHHCkih4pIDXglcMl8CCIi/SIyaF4DLwBui+X5o/iwPwK+F7++BHiliNRF5FDgSHRiaq6wR3LF7vywiDw9rqR4nXXOrMEohxhno5/pvMkZX/NLwB1KqX+0lhbU8yyScwE+z9Uisix+3Qs8D/gtC+h5Fsm40J6lF7OZ2V7IP8BZ6IqLe4C/nEc5DkNXItwM3G5kAVYCPwXuiv9dYZ3zl7HcdzKL1QnAt9Cubgu9azlvOnIBG9D/+e8BLiDuuJ9lOb8O3Arcgv6DO2A+5QRORbv/twA3xT9nLbTn2UXOhfY8nwzcGMtzG/DB6f7dzJacXWRcUM/S9xMoMQICAgICMthXQ0kBAQEBAQUIhiEgICAgIINgGAICAgICMgiGISAgICAgg2AYAgICAgIyCIYhIMCCiCwTkT+23q8Vkf+cpXu9VEQ+WLA2Ev+7WkR+NBv3DwgoQjAMAQFZLAMSw6CUekQpde4s3evPgX/qdoBSahuwWUSeOUsyBATkEAxDQEAWHwcOj3nyPyEi6yWe8yAirxeR74rI90XkPhH5ExH5MxG5UUR+JSIr4uMOF5EfxaSIPxeRo92biMhRQEMp9Vj8/lARuUZErhORv3EO/y7wmln91gEBFoJhCAjI4v3APUqp45VS7/WsHwe8Gs1v87fAmFLqqcA1aKoC0EPd36GUOhF4D36v4JnADdb7zwCfV0o9DdjiHLsReNY0v09AwB6jMt8CBATsZbhS6TkFwyKyC/h+/PmtwJNjVtJnAP9hDdmqe65zALDNev9M4Jz49deBv7PWtgJrZ0b8gIDJEQxDQMCeoWG9jqz3EfrvqQQMKU213A3jwFLnsyJ+mp74+ICAOUEIJQUEZDGMHmk5LSg9u+A+EXk5aLZSEXmK59A7gCOs91ejWX4hn084ipSBMyBg1hEMQ0CABaXUduBqEblNRD4xzcu8BjhPRAxjrm9s7FXAUyWNN70TPaTpOvKexHOAH05TloCAPUZgVw0ImCeIyGeA7yulfjLJcVcBL1FK7ZwbyQL2dQSPISBg/vBRoK/bASKyGvjHYBQC5hLBYwgICAgIyCB4DAEBAQEBGQTDEBAQEBCQQTAMAQEBAQEZBMMQEBAQEJBBMAwBAQEBARn8fzseC/roFehMAAAAAElFTkSuQmCC\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": 21, "metadata": {}, "outputs": [ { @@ -588,26 +588,26 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'pz' ()>\n",
    -       "array(0.)\n",
    +       "array(-6.7524815e-10)\n",
            "Coordinates:\n",
    -       "    id       int64 109\n",
    -       "    time     float64 794.0
    " + " id int64 105\n", + " time float64 1.1e+03" ], "text/plain": [ "\n", - "array(0.)\n", + "array(-6.7524815e-10)\n", "Coordinates:\n", - " id int64 109\n", - " time float64 794.0" + " id int64 105\n", + " time float64 1.1e+03" ] }, - "execution_count": 13, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['pz'].sel(id=109).isel(time=794)" + "swiftdiff['pz'].sel(id=105).isel(time=110)" ] }, { diff --git a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in index 2dfbf4777..c8cc418b0 100644 --- a/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in +++ b/examples/rmvs_swifter_comparison/8pl_16tp_encounters/tp.in @@ -1,4 +1,7 @@ 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 @@ -14,9 +17,6 @@ 104 -0.6440390060468921263 -0.32491224837740956266 0.032702713983447248558 0.002622475790030579998 -0.018153139924556138673 -0.0007667345025597138231 -105 -0.59427697124197276235 -0.8232523083817967491 3.7129329104855261984e-05 -0.020564990514662154913 0.010004295439859960809 -5.226292361234363611e-07 106 0.5941565154300937346 -0.82337276419367577684 3.7129329104855261984e-05 0.0067761100461144049487 0.010004295439859960809 -5.226292361234363611e-07 diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index e35d6cad7..95d4ca4b4 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -97,10 +97,12 @@ subroutine discard_sun_tp(tp, system, param) tp%status(i) = DISCARDED_RMAX write(*, *) "Particle ", tp%id(i), " too far from sun at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then tp%status(i) = DISCARDED_RMIN write(*, *) "Particle ", tp%id(i), " too close to sun at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. else if (param%rmaxu >= 0.0_DP) then rb2 = dot_product(tp%xb(:, i), tp%xb(:, i)) vb2 = dot_product(tp%vb(:, i), tp%vb(:, i)) @@ -109,6 +111,7 @@ subroutine discard_sun_tp(tp, system, param) tp%status(i) = DISCARDED_RMAXU write(*, *) "Particle ", tp%id(i), " is unbound and too far from barycenter at t = ", t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. end if end if end if @@ -193,6 +196,7 @@ subroutine discard_pl_tp(tp, system, param) call discard_pl_close(dx(:), dv(:), dt, radius**2, isp, r2min) if (isp /= 0) then tp%status(i) = DISCARDED_PLR + tp%lmask(i) = .false. pl%ldiscard(j) = .true. write(*, *) "Particle ", tp%id(i), " too close to massive body ", pl%id(j), " at t = ", t tp%ldiscard(i) = .true. diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index c5b86ee26..0c545d5ed 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -16,11 +16,10 @@ module subroutine helio_coord_vb2vh_pl(self, cb) ! Internals integer(I4B) :: i - associate(npl => self%nbody, vbcb => cb%vb, xh => self%xh, vb => self%vb, & - vh => self%vh, Mcb => cb%Gmass, Mpl => self%Gmass) + associate(pl => self, npl => self%nbody) do i = 1, NDIM - vbcb(i) = -sum(Mpl(1:npl) * vb(i, 1:npl)) / Mcb - vh(i, 1:npl) = vb(i, 1:npl) - vbcb(i) + cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vb(i, 1:npl)) / cb%Gmass + pl%vh(i, 1:npl) = pl%vb(i, 1:npl) - cb%vb(i) end do end associate @@ -40,11 +39,11 @@ module subroutine helio_coord_vb2vh_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body - associate(ntp => self%nbody, vb => self%vb, vh => self%vh, status => self%status) - where (status(1:ntp) == ACTIVE) - vh(1, 1:ntp) = vb(1, 1:ntp) - vbcb(1) - vh(2, 1:ntp) = vb(2, 1:ntp) - vbcb(2) - vh(3, 1:ntp) = vb(3, 1:ntp) - vbcb(3) + associate(tp => self, ntp => self%nbody) + where (tp%lmask(1:ntp)) + tp%vh(1, 1:ntp) = tp%vb(1, 1:ntp) - vbcb(1) + tp%vh(2, 1:ntp) = tp%vb(2, 1:ntp) - vbcb(2) + tp%vh(3, 1:ntp) = tp%vb(3, 1:ntp) - vbcb(3) end where end associate @@ -67,12 +66,11 @@ module subroutine helio_coord_vh2vb_pl(self, cb) integer(I4B) :: i real(DP) :: msys - associate(npl => self%nbody, vbcb => cb%vb, vb => self%vb, vh => self%vh, & - Mcb => cb%Gmass, Mpl => self%Gmass) - msys = Mcb + sum(Mpl(1:npl)) + associate(pl => self, npl => self%nbody) + msys = cb%Gmass + sum(pl%Gmass(1:npl)) do i = 1, NDIM - vbcb(i) = -sum(Mpl(1:npl) * vh(i, 1:npl)) / msys - vb(i, 1:npl) = vh(i, 1:npl) + vbcb(i) + cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vh(i, 1:npl)) / msys + pl%vb(i, 1:npl) = pl%vh(i, 1:npl) + cb%vb(i) end do end associate @@ -92,11 +90,11 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body - associate(ntp => self%nbody, vb => self%vb, vh => self%vh, status => self%status) - where (status(1:ntp) == ACTIVE) - vb(1, 1:ntp) = vh(1, 1:ntp) + vbcb(1) - vb(2, 1:ntp) = vh(2, 1:ntp) + vbcb(2) - vb(3, 1:ntp) = vh(3, 1:ntp) + vbcb(3) + associate(tp => self, ntp => self%nbody) + where (tp%lmask(1:ntp)) + tp%vb(1, 1:ntp) = tp%vh(1, 1:ntp) + vbcb(1) + tp%vb(2, 1:ntp) = tp%vh(2, 1:ntp) + vbcb(2) + tp%vb(3, 1:ntp) = tp%vh(3, 1:ntp) + vbcb(3) end where end associate diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index b3304926a..9bee84104 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -51,7 +51,6 @@ module subroutine helio_step_pl(self, system, param, t, dt) call pl%vh2vb(cb) pl%lfirst = .false. end if - pl%lmask(:) = pl%status(:) == ACTIVE call pl%lindrift(cb, dth, lbeg=.true.) call pl%kick(system, param, t, dth, lbeg=.true.) call pl%drift(system, param, dt) @@ -93,7 +92,6 @@ module subroutine helio_step_tp(self, system, param, t, dt) call tp%vh2vb(vbcb = -cb%ptbeg) tp%lfirst = .false. end if - tp%lmask(:) = tp%status(:) == ACTIVE call tp%lindrift(cb, dth, lbeg=.true.) call tp%kick(system, param, t, dth, lbeg=.true.) call tp%drift(system, param, dt) diff --git a/src/io/io.f90 b/src/io/io.f90 index addacafce..bad7838ab 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -645,6 +645,7 @@ module subroutine io_read_body_in(self, param) read(iu, *, iostat=ierr, err=100) self%xh(1, i), self%xh(2, i), self%xh(3, i) read(iu, *, iostat=ierr, err=100) self%vh(1, i), self%vh(2, i), self%vh(3, i) self%status(i) = ACTIVE + self%lmask(i) = .true. end do end if case (REAL4_TYPE, REAL8_TYPE) !, SWIFTER_REAL4_TYPE, SWIFTER_REAL8_TYPE) @@ -654,6 +655,7 @@ module subroutine io_read_body_in(self, param) if (nbody > 0) then call self%read_frame(iu, param, XV, ierr) self%status(:) = ACTIVE + self%lmask(:) = .true. end if case default write(*,*) trim(adjustl(param%in_type)) // ' is an unrecognized file type' diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 1f1927e7a..7eeaeb6dd 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -25,6 +25,7 @@ module subroutine rmvs_discard_tp(self, system, param) tp%status(i) = DISCARDED_PLQ write(*, *) "Particle ",tp%id(i)," q with respect to Planet ",pl%id(iplperP)," is too small at t = ",t tp%ldiscard(i) = .true. + tp%lmask(i) = .false. end if end if end associate diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 1e26107bb..6406db4b0 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -30,7 +30,7 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) tp%plencP(:) = 0 do j = 1, npl do i = 1, ntp - if ((tp%status(i) /= ACTIVE).or.(tp%plencP(i) /= 0)) cycle + if ((.not.tp%lmask(i)).or.(tp%plencP(i) /= 0)) cycle xr(:) = tp%xh(:, i) - pl%xbeg(:, j) vr(:) = tp%vh(:, i) - pl%vbeg(:, j) r2 = dot_product(xr(:), xr(:)) diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 9ca6e7d1c..778ba3714 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -103,6 +103,7 @@ module subroutine rmvs_setup_initialize_system(self, param) plenci%lplanetocentric = .true. call plenci%setup(npl, param) plenci%status(:) = ACTIVE + plenci%lmask(:) = .true. ! plind stores the heliocentric index value of a planetocentric planet ! e.g. Consider an encounter with planet 3. ! Then the following will be the values of plind: diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index d4791aefd..987ce5230 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -48,7 +48,10 @@ module subroutine rmvs_step_system(self, param, t, dt) call pl%set_beg_end(xbeg = xbeg, xend = xend) tp%lfirst = .true. call tp%step(system, param, t, dt) - where (tp%status(:) == INACTIVE) tp%status(:) = ACTIVE + where (tp%status(:) == INACTIVE) + tp%status(:) = ACTIVE + tp%lmask(:) = .true. + end where pl%lfirst = lfirstpl tp%lfirst = lfirsttp if (param%ltides) call system%step_spin(param, t, dt) @@ -168,6 +171,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) dto = dt / NTENC where(tp%plencP(:) == 0) tp%status(:) = INACTIVE + tp%lmask(:) = .false. elsewhere tp%lperi(:) = .false. end where @@ -177,7 +181,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) vbeg = pl%outer(outer_index - 1)%v(:, :), & xend = pl%outer(outer_index )%x(:, :)) system%rts = RHPSCALE - lencounter = tp%encounter_check(system, dt) + lencounter = tp%encounter_check(system, dto) if (lencounter) then ! Interpolate planets in inner encounter region call rmvs_interp_in(cb, pl, system, param, dto, outer_index) @@ -192,7 +196,10 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) end if do j = 1, npl if (pl%nenc(j) == 0) cycle - where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) tp%status(:) = ACTIVE + where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) + tp%status(:) = ACTIVE + tp%lmask(:) = .true. + end where end do end do end associate @@ -282,8 +289,8 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) do inner_index = NTPHENC - 1, 1, -1 call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - -dti(1:npl), iflag(1:npl)) + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + -dti(1:npl), iflag(1:npl)) if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /=0) then @@ -389,7 +396,10 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) inner_time = outer_time + j * dti call rmvs_peri_tp(tpenci, pl, inner_time, dti, .false., inner_index, i, param) end do - where(tpenci%status(:) == ACTIVE) tpenci%status(:) = INACTIVE + where(tpenci%status(:) == ACTIVE) + tpenci%status(:) = INACTIVE + tpenci%lmask(:) = .false. + end where end associate end select end select @@ -440,6 +450,7 @@ subroutine rmvs_make_planetocentric(param, cb, pl, tp) tpenci%cb_heliocentric = cb tpenci%ipleP = i tpenci%status(:) = ACTIVE + tpenci%lmask(:) = .true. ! Grab all the encountering test particles and convert them to a planetocentric frame tpenci%id(:) = pack(tp%id(:), encmask(:)) do j = 1, NDIM @@ -517,7 +528,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) associate(nenc => tp%nbody, xpc => tp%xh, vpc => tp%vh) if (lfirst) then do i = 1, nenc - if (tp%status(i) == ACTIVE) then + if (tp%lmask(i)) then vdotr = dot_product(xpc(:, i), vpc(:, i)) if (vdotr > 0.0_DP) then tp%isperi(i) = 1 @@ -528,7 +539,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) end do else do i = 1, nenc - if (tp%status(i) == ACTIVE) then + if (tp%lmask(i)) then vdotr = dot_product(xpc(:, i), vpc(:, i)) if (tp%isperi(i) == -1) then if (vdotr >= 0.0_DP) then @@ -607,6 +618,7 @@ subroutine rmvs_end_planetocentric(pl, tp) ! Copy the results of the integration back over and shift back to heliocentric reference tp%status(tpind(1:pl%nenc(i))) = tpenci%status(1:pl%nenc(i)) + tp%lmask(tpind(1:pl%nenc(i))) = tpenci%lmask(1:pl%nenc(i)) do j = 1, NDIM tp%xh(j, tpind(1:pl%nenc(i))) = tpenci%xh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%x(j, i) tp%vh(j, tpind(1:pl%nenc(i))) = tpenci%vh(j,1:pl%nenc(i)) + pl%inner(NTPHENC)%v(j, i) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 8d276c897..50da6ce1c 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -126,6 +126,7 @@ module subroutine setup_body(self, n, param) self%id(:) = 0 self%name(:) = "UNNAMED" self%status(:) = INACTIVE + self%lmask(:) = .false. self%ldiscard(:) = .false. self%xh(:,:) = 0.0_DP self%vh(:,:) = 0.0_DP @@ -134,7 +135,6 @@ module subroutine setup_body(self, n, param) self%ah(:,:) = 0.0_DP self%ir3h(:) = 0.0_DP self%mu(:) = 0.0_DP - self%lmask(:) = .false. if (param%loblatecb) then allocate(self%aobl(NDIM, n)) diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index fae625369..fc4584ec2 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -26,7 +26,10 @@ module subroutine whm_drift_pl(self, system, param, dt) iflag(:) = 0 call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, pl%lmask, iflag) if (any(iflag(1:npl) /= 0)) then - where(iflag(1:npl) /= 0) pl%status(1:npl) = DISCARDED_DRIFTERR + where(iflag(1:npl) /= 0) + pl%status(1:npl) = DISCARDED_DRIFTERR + pl%lmask(1:npl) = .false. + end where do i = 1, npl if (iflag(i) /= 0) then write(*, *) " Planet ", pl%id(i), " is lost!!!!!!!!!!!!" diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index bb40a6416..07944c807 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -80,13 +80,13 @@ module subroutine whm_kick_getacch_tp(self, system, param, t, lbeg) if (lbeg) then ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xbeg(:,:), npl) - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xbeg(:,:), npl) else ah0(:) = whm_kick_getacch_ah0(pl%Gmass(:), pl%xend(:,:), npl) - do i = 1, ntp + do concurrent(i = 1:ntp, tp%lmask(i)) tp%ah(:, i) = tp%ah(:, i) + ah0(:) end do call tp%accel_int(pl%Gmass(:), pl%xend(:,:), npl) @@ -145,7 +145,7 @@ pure subroutine whm_kick_getacch_ah1(cb, pl) real(DP), dimension(NDIM) :: ah1h, ah1j associate(npl => pl%nbody) - do i = 2, npl + do concurrent (i = 2:npl, pl%lmask(i)) ah1j(:) = pl%xj(:, i) * pl%ir3j(i) ah1h(:) = pl%xh(:, i) * pl%ir3h(i) pl%ah(:, i) = pl%ah(:, i) + cb%Gmass * (ah1j(:) - ah1h(:)) @@ -176,7 +176,7 @@ pure subroutine whm_kick_getacch_ah2(cb, pl) ah2(:) = 0.0_DP ah2o(:) = 0.0_DP etaj = cb%Gmass - do i = 2, npl + do concurrent(i = 2:npl, pl%lmask(i)) etaj = etaj + pl%Gmass(i - 1) fac = pl%Gmass(i) * cb%Gmass * pl%ir3j(i) / etaj ah2(:) = ah2o + fac * pl%xj(:, i) @@ -252,12 +252,20 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) associate(tp => self, ntp => self%nbody) if (ntp == 0) return if (tp%lfirst) then - tp%ah(:,:) = 0.0_DP + where(tp%lmask(1:ntp)) + tp%ah(1,1:ntp) = 0.0_DP + tp%ah(2,1:ntp) = 0.0_DP + tp%ah(3,1:ntp) = 0.0_DP + end where call tp%accel(system, param, t, lbeg=.true.) tp%lfirst = .false. end if if (.not.lbeg) then - tp%ah(:,:) = 0.0_DP + where(tp%lmask(1:ntp)) + tp%ah(1,1:ntp) = 0.0_DP + tp%ah(2,1:ntp) = 0.0_DP + tp%ah(3,1:ntp) = 0.0_DP + end where call tp%accel(system, param, t, lbeg) end if do concurrent(i = 1:ntp, tp%lmask(i)) diff --git a/src/whm/whm_step.f90 b/src/whm/whm_step.f90 index 40135dc30..d194e2c02 100644 --- a/src/whm/whm_step.f90 +++ b/src/whm/whm_step.f90 @@ -48,7 +48,6 @@ module subroutine whm_step_pl(self, system, param, t, dt) associate(pl => self, cb => system%cb) dth = 0.5_DP * dt - pl%lmask(:) = pl%status(:) == ACTIVE call pl%kick(system, param, t, dth,lbeg=.true.) call pl%vh2vj(cb) if (param%lgr) call pl%gr_pos_kick(param, dth) @@ -85,7 +84,6 @@ module subroutine whm_step_tp(self, system, param, t, dt) class is (whm_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl) dth = 0.5_DP * dt - tp%lmask(:) = tp%status(:) == ACTIVE call tp%kick(system, param, t, dth, lbeg=.true.) if (param%lgr) call tp%gr_pos_kick(param, dth) call tp%drift(system, param, dt) From e6fe6179597dfbe4c68fab8097bde80ce28a4d6e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 09:46:31 -0400 Subject: [PATCH 120/194] Fixed problem in which, due to the new masks, accelerations were not computed properly for particles that had transitioned from being in an encounter state to being out --- src/rmvs/rmvs_kick.f90 | 20 +++++++++++--------- src/rmvs/rmvs_step.f90 | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index 342fdb650..b340ff3da 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -22,7 +22,6 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) real(DP), dimension(:, :), allocatable :: xh_original real(DP) :: GMcb_original integer(I4B) :: i - real(DP), dimension(:, :), allocatable :: xhp associate(tp => self, ntp => self%nbody, ipleP => self%ipleP, inner_index => self%index) select type(system) @@ -36,19 +35,16 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) associate(xpc => pl%xh, xpct => self%xh, apct => self%ah, system_planetocen => system) system_planetocen%lbeg = lbeg - if (system_planetocen%lbeg) then - allocate(xhp, source=pl%xbeg) - else - allocate(xhp, source=pl%xend) - end if - + ! Save the original heliocentric position for later allocate(xh_original, source=tp%xh) + + ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter using a copy of the parameter list with all of the heliocentric-specific acceleration terms turned off allocate(param_planetocen, source=param) - ! Temporarily turn off the heliocentric-dependent acceleration terms during an inner encounter param_planetocen%loblatecb = .false. param_planetocen%lextra_force = .false. param_planetocen%lgr = .false. - ! Now compute the planetocentric values of acceleration + + ! Compute the planetocentric values of acceleration call whm_kick_getacch_tp(tp, system_planetocen, param_planetocen, t, lbeg) ! Now compute any heliocentric values of acceleration @@ -61,15 +57,21 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) tp%xheliocentric(:,i) = tp%xh(:,i) + cb%inner(inner_index )%x(:,1) end do end if + ! Swap the planetocentric and heliocentric position vectors and central body masses tp%xh(:,:) = tp%xheliocentric(:,:) GMcb_original = cb%Gmass cb%Gmass = tp%cb_heliocentric%Gmass + + ! If the heliocentric-specifc acceleration terms are requested, compute those now if (param%loblatecb) call tp%accel_obl(system_planetocen) if (param%lextra_force) call tp%accel_user(system_planetocen, param, t, lbeg) if (param%lgr) call tp%accel_gr(param) + + ! Put everything back the way we found it tp%xh(:,:) = xh_original(:,:) cb%Gmass = GMcb_original + end associate end select end select diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 987ce5230..972aff7a0 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -53,7 +53,7 @@ module subroutine rmvs_step_system(self, param, t, dt) tp%lmask(:) = .true. end where pl%lfirst = lfirstpl - tp%lfirst = lfirsttp + tp%lfirst = .true. if (param%ltides) call system%step_spin(param, t, dt) else call whm_step_system(system, param, t, dt) @@ -196,6 +196,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) end if do j = 1, npl if (pl%nenc(j) == 0) cycle + tp%lfirst = .true. where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) tp%status(:) = ACTIVE tp%lmask(:) = .true. From 8a8dc1b3721e3d3c0cbc5b7892b662ce5823a944 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 09:54:40 -0400 Subject: [PATCH 121/194] Changed out ACTIVE/INACTIVE status swapping in RMVS to simply using the masks --- .../8pl_16tp_encounters/cb.swiftest.in | 4 +-- .../8pl_16tp_encounters/param.swifter.in | 4 +-- .../swiftest_rmvs_vs_swifter_rmvs.ipynb | 26 +++++++++---------- src/modules/swiftest_classes.f90 | 6 ----- src/rmvs/rmvs_step.f90 | 21 +++++---------- src/util/util_reverse_status.f90 | 23 ---------------- 6 files changed, 23 insertions(+), 61 deletions(-) delete mode 100644 src/util/util_reverse_status.f90 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 81c636655..2e8d49f62 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 -4.7535806948127355e-12 --2.2473967953572827e-18 +0.0 +0.0 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 36dd2060f..6a283276e 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 4.7535806948127355e-12 -J4 -2.2473967953572827e-18 +J2 0.0 +J4 0.0 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 8e8bf2f60..124ae2910 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": "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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": "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\n", "text/plain": [ "
    " ] @@ -230,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -587,27 +587,27 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'pz' ()>\n",
    -       "array(-6.7524815e-10)\n",
    +       "
    <xarray.DataArray 'px' ()>\n",
    +       "array(0.)\n",
            "Coordinates:\n",
            "    id       int64 105\n",
    -       "    time     float64 1.1e+03
    " + " time float64 1.09e+03
    " ], "text/plain": [ - "\n", - "array(-6.7524815e-10)\n", + "\n", + "array(0.)\n", "Coordinates:\n", " id int64 105\n", - " time float64 1.1e+03" + " time float64 1.09e+03" ] }, - "execution_count": 21, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['pz'].sel(id=105).isel(time=110)" + "swiftdiff['px'].sel(id=105).isel(time=109)" ] }, { diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index cd6106253..50ec658b6 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -165,7 +165,6 @@ module swiftest_classes procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: reverse_status => util_reverse_status !! Reverses the active/inactive status of all particles in a structure procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods @@ -781,11 +780,6 @@ module subroutine util_peri_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine util_peri_tp - module subroutine util_reverse_status(self) - implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - end subroutine util_reverse_status - module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 972aff7a0..194a35006 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -44,14 +44,11 @@ module subroutine rmvs_step_system(self, param, t, dt) pl%outer(NTENC)%v(:,:) = pl%vh(:,:) call rmvs_interp_out(cb, pl, dt) call rmvs_step_out(cb, pl, tp, system, param, t, dt) - call tp%reverse_status() + tp%lmask(1:ntp) = .not. tp%lmask(1:ntp) call pl%set_beg_end(xbeg = xbeg, xend = xend) tp%lfirst = .true. call tp%step(system, param, t, dt) - where (tp%status(:) == INACTIVE) - tp%status(:) = ACTIVE - tp%lmask(:) = .true. - end where + tp%lmask(1:ntp) = .true. pl%lfirst = lfirstpl tp%lfirst = .true. if (param%ltides) call system%step_spin(param, t, dt) @@ -170,7 +167,6 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) associate(npl => pl%nbody, ntp => tp%nbody) dto = dt / NTENC where(tp%plencP(:) == 0) - tp%status(:) = INACTIVE tp%lmask(:) = .false. elsewhere tp%lperi(:) = .false. @@ -197,8 +193,7 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) do j = 1, npl if (pl%nenc(j) == 0) cycle tp%lfirst = .true. - where((tp%plencP(:) == j) .and. (tp%status(:) == INACTIVE)) - tp%status(:) = ACTIVE + where((tp%plencP(:) == j) .and. (.not.tp%lmask(:))) tp%lmask(:) = .true. end where end do @@ -266,8 +261,8 @@ subroutine rmvs_interp_in(cb, pl, system, param, dt, outer_index) do inner_index = 1, NTPHENC - 1 call drift_one(GMcb(1:npl), xtmp(1,1:npl), xtmp(2,1:npl), xtmp(3,1:npl), & - vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & - dti(1:npl), iflag(1:npl)) + vtmp(1,1:npl), vtmp(2,1:npl), vtmp(3,1:npl), & + dti(1:npl), iflag(1:npl)) if (any(iflag(1:npl) /= 0)) then do i = 1, npl if (iflag(i) /=0) then @@ -397,10 +392,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) inner_time = outer_time + j * dti call rmvs_peri_tp(tpenci, pl, inner_time, dti, .false., inner_index, i, param) end do - where(tpenci%status(:) == ACTIVE) - tpenci%status(:) = INACTIVE - tpenci%lmask(:) = .false. - end where + tpenci%lmask(:) = .false. end associate end select end select @@ -450,7 +442,6 @@ subroutine rmvs_make_planetocentric(param, cb, pl, tp) call tpenci%setup(pl%nenc(i), param) tpenci%cb_heliocentric = cb tpenci%ipleP = i - tpenci%status(:) = ACTIVE tpenci%lmask(:) = .true. ! Grab all the encountering test particles and convert them to a planetocentric frame tpenci%id(:) = pack(tp%id(:), encmask(:)) diff --git a/src/util/util_reverse_status.f90 b/src/util/util_reverse_status.f90 deleted file mode 100644 index 5dfc5fe6c..000000000 --- a/src/util/util_reverse_status.f90 +++ /dev/null @@ -1,23 +0,0 @@ -submodule (swiftest_classes) s_util_reverse_status - use swiftest -contains - - module subroutine util_reverse_status(self) - !! author: David A. Minton - !! - !! Reverses the active/inactive status of all particles in a structure - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - - where (self%status(:) == ACTIVE) - self%status(:) = INACTIVE - elsewhere (self%status(:) == INACTIVE) - self%status(:) = ACTIVE - end where - self%lmask(:) = self%status(:) == ACTIVE - - return - end subroutine util_reverse_status - -end submodule s_util_reverse_status \ No newline at end of file From 1a09d084c2ef5c7dd135220ed6a9c3e0d9c5c74a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 10:24:36 -0400 Subject: [PATCH 122/194] Fixed issue when calling sort when xbeg/xend/vbeg are not allocated --- src/rmvs/rmvs_step.f90 | 1 - src/util/util_sort.f90 | 6 +-- src/util/util_spill_and_fill.f90 | 71 ++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 194a35006..113b4d02f 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -36,7 +36,6 @@ module subroutine rmvs_step_system(self, param, t, dt) lencounter = tp%encounter_check(system, dt) if (lencounter) then lfirstpl = pl%lfirst - lfirsttp = tp%lfirst pl%outer(0)%x(:,:) = xbeg(:,:) pl%outer(0)%v(:,:) = vbeg(:,:) call pl%step(system, param, t, dt) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 79227d2f0..59f44c003 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -207,9 +207,9 @@ module subroutine util_sort_rearrange_pl(self, ind) pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) - pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) - pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) - pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) + if (allocated(pl%xbeg)) pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) + if (allocated(pl%xend)) pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) + if (allocated(pl%vbeg)) pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) if (allocated(pl%radius)) pl%radius(1:npl) = pl_sorted%radius(ind(1:npl)) if (allocated(pl%density)) pl%density(1:npl) = pl_sorted%density(ind(1:npl)) if (allocated(pl%Ip)) pl%Ip(:,1:npl) = pl_sorted%Ip(:,ind(1:npl)) diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 9f0e65df4..8ea85f654 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -250,6 +250,24 @@ module subroutine util_spill_pl(self, discards, lspill_list) if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + discards%xbeg(i, :) = pack(keeps%xbeg(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + discards%xend(i, :) = pack(keeps%xend(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + discards%vbeg(i, :) = pack(keeps%vbeg(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%Ip)) then do i = 1, NDIM discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) @@ -272,6 +290,24 @@ module subroutine util_spill_pl(self, discards, lspill_list) if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i,:) = pack(keeps%xbeg(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + keeps%xend(i,:) = pack(keeps%xend(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i,:) = pack(keeps%vbeg(i,:), .not. lspill_list(:)) + end do + end if + if (allocated(keeps%Ip)) then do i = 1, NDIM keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) @@ -323,39 +359,60 @@ module subroutine util_fill_pl(self, inserts, lfill_list) keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - if (allocated(keeps%radius)) then + if (allocated(keeps%radius) .and. allocated(inserts%radius)) then keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) end if - if (allocated(keeps%density)) then + if (allocated(keeps%density) .and. allocated(inserts%density)) then keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) end if - if (allocated(keeps%k2)) then + if (allocated(keeps%k2) .and. allocated(inserts%k2)) then keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) end if - if (allocated(keeps%Q)) then + if (allocated(keeps%Q) .and. allocated(inserts%Q)) then keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) end if - if (allocated(keeps%tlag)) then + if (allocated(keeps%tlag) .and. allocated(inserts%tlag)) then keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) end if - if (allocated(keeps%Ip)) then + if (allocated(keeps%xbeg) .and. allocated(inserts%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i, :) = unpack(keeps%xbeg(i, :), .not.lfill_list(:), keeps%xbeg(i, :)) + keeps%xbeg(i, :) = unpack(inserts%xbeg(i, :), lfill_list(:), keeps%xbeg(i, :)) + end do + end if + + if (allocated(keeps%xend) .and. allocated(inserts%xend)) then + do i = 1, NDIM + keeps%xend(i, :) = unpack(keeps%xend(i, :), .not.lfill_list(:), keeps%xend(i, :)) + keeps%xend(i, :) = unpack(inserts%xend(i, :), lfill_list(:), keeps%xend(i, :)) + end do + end if + + if (allocated(keeps%vbeg) .and. allocated(inserts%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i, :) = unpack(keeps%vbeg(i, :), .not.lfill_list(:), keeps%vbeg(i, :)) + keeps%vbeg(i, :) = unpack(inserts%vbeg(i, :), lfill_list(:), keeps%vbeg(i, :)) + end do + end if + + if (allocated(keeps%Ip) .and. allocated(inserts%Ip)) then do i = 1, NDIM keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) end do end if - if (allocated(keeps%rot)) then + if (allocated(keeps%rot) .and. allocated(inserts%rot)) then do i = 1, NDIM keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) From 85ebdab7c2ba9f4ae25895f1e6c22e96f458ac72 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 12:47:43 -0400 Subject: [PATCH 123/194] Started to enable GR in helio. Restructured helio subroutines. Initial tests show incorrect Mercury precession, so the correct Hamiltonian for GR in the DH coordinate system needs to be derived. --- examples/helio_gr_test/cb.swiftest.in | 5 + examples/helio_gr_test/init_cond.py | 51 +++++ examples/helio_gr_test/param.swifter.in | 27 +++ examples/helio_gr_test/param.swiftest.in | 35 ++++ examples/helio_gr_test/pl.swifter.in | 36 ++++ examples/helio_gr_test/pl.swiftest.in | 33 +++ .../helio_gr_test/swiftest_relativity.ipynb | 192 ++++++++++++++++++ examples/helio_gr_test/tp.swifter.in | 1 + examples/helio_gr_test/tp.swiftest.in | 1 + .../whm_gr_test/swiftest_relativity.ipynb | 14 +- src/gr/gr.f90 | 30 +++ src/helio/helio_gr.f90 | 107 ++++++++++ src/helio/helio_kick.f90 | 4 +- src/helio/helio_step.f90 | 2 + src/io/io.f90 | 5 +- src/modules/helio_classes.f90 | 62 ++++-- src/modules/swiftest_classes.f90 | 42 ++-- src/whm/whm_gr.f90 | 23 +-- 18 files changed, 615 insertions(+), 55 deletions(-) create mode 100644 examples/helio_gr_test/cb.swiftest.in create mode 100755 examples/helio_gr_test/init_cond.py create mode 100644 examples/helio_gr_test/param.swifter.in create mode 100644 examples/helio_gr_test/param.swiftest.in create mode 100644 examples/helio_gr_test/pl.swifter.in create mode 100644 examples/helio_gr_test/pl.swiftest.in create mode 100644 examples/helio_gr_test/swiftest_relativity.ipynb create mode 100644 examples/helio_gr_test/tp.swifter.in create mode 100644 examples/helio_gr_test/tp.swiftest.in create mode 100644 src/helio/helio_gr.f90 diff --git a/examples/helio_gr_test/cb.swiftest.in b/examples/helio_gr_test/cb.swiftest.in new file mode 100644 index 000000000..e4a010b1e --- /dev/null +++ b/examples/helio_gr_test/cb.swiftest.in @@ -0,0 +1,5 @@ +0 +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 diff --git a/examples/helio_gr_test/init_cond.py b/examples/helio_gr_test/init_cond.py new file mode 100755 index 000000000..8d197c6f4 --- /dev/null +++ b/examples/helio_gr_test/init_cond.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import swiftest + +sim = swiftest.Simulation() +sim.param['PL_IN'] = "pl.swiftest.in" +sim.param['TP_IN'] = "tp.swiftest.in" +sim.param['CB_IN'] = "cb.swiftest.in" +sim.param['BIN_OUT'] = "bin.swiftest.dat" +sim.param['ENC_OUT'] = "enc.swiftest.dat" + +sim.param['MU2KG'] = swiftest.MSun +sim.param['TU2S'] = swiftest.YR2S +sim.param['DU2M'] = swiftest.AU2M +sim.param['T0'] = 0.0 +sim.param['DT'] = 0.25 * swiftest.JD2S / swiftest.YR2S +sim.param['TSTOP'] = 1000.0 +sim.param['ISTEP_OUT'] = 1461 +sim.param['ISTEP_DUMP'] = 1461 +sim.param['CHK_QMIN_COORD'] = "HELIO" +sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" +sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_RMAX'] = 1000.0 +sim.param['CHK_EJECT'] = 1000.0 +sim.param['OUT_FORM'] = "EL" +sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['GR'] = 'YES' + +bodyid = { + "Sun": 0, + "Mercury": 1, + "Venus": 2, + "Earth": 3, + "Mars": 4, + "Jupiter": 5, + "Saturn": 6, + "Uranus": 7, + "Neptune": 8, +} + +for name, id in bodyid.items(): + sim.add(name, idval=id) + +sim.save("param.swiftest.in") +sim.param['PL_IN'] = "pl.swifter.in" +sim.param['TP_IN'] = "tp.swifter.in" +sim.param['BIN_OUT'] = "bin.swifter.dat" +sim.param['ENC_OUT'] = "enc.swifter.dat" +sim.save("param.swifter.in", codename="Swifter") + + diff --git a/examples/helio_gr_test/param.swifter.in b/examples/helio_gr_test/param.swifter.in new file mode 100644 index 000000000..789250f41 --- /dev/null +++ b/examples/helio_gr_test/param.swifter.in @@ -0,0 +1,27 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 1000.0 +DT 0.0006844626967830253 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 +OUT_FORM EL +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swifter.in +TP_IN tp.swifter.in +BIN_OUT bin.swifter.dat +ENC_OUT enc.swifter.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +C 63241.07708426628 +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 +RHILL_PRESENT YES diff --git a/examples/helio_gr_test/param.swiftest.in b/examples/helio_gr_test/param.swiftest.in new file mode 100644 index 000000000..ace6f3cad --- /dev/null +++ b/examples/helio_gr_test/param.swiftest.in @@ -0,0 +1,35 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 1000.0 +DT 0.0006844626967830253 +ISTEP_OUT 1461 +ISTEP_DUMP 1461 +OUT_FORM EL +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +CB_IN cb.swiftest.in +BIN_OUT bin.swiftest.dat +ENC_OUT enc.swiftest.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY NO +GR YES +YARKOVSKY NO +YORP NO +MTINY 0.0 diff --git a/examples/helio_gr_test/pl.swifter.in b/examples/helio_gr_test/pl.swifter.in new file mode 100644 index 000000000..782e57140 --- /dev/null +++ b/examples/helio_gr_test/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 39.476926408897625196 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 6.5537098095653139645e-06 0.0014751234419554511911 +1.6306381826061645943e-05 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +2 9.663313399581537916e-05 0.00675908960945781479 +4.0453784346544178454e-05 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +3 0.000120026935827952453094 0.010044837538502923644 +4.25875607065040958e-05 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +4 1.2739802010675941456e-05 0.0072467236860282326973 +2.265740805092889601e-05 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +5 0.037692251088985676735 0.35527094075555771578 +0.00046732617030490929307 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +6 0.011285899820091272997 0.43765464106459166412 +0.00038925687730393611812 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +7 0.0017236589478267730203 0.46956055286931676728 +0.00016953449859497231466 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +8 0.0020336100526728302319 0.7813163071687303693 +0.000164587904124493665 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/helio_gr_test/pl.swiftest.in b/examples/helio_gr_test/pl.swiftest.in new file mode 100644 index 000000000..10d425453 --- /dev/null +++ b/examples/helio_gr_test/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +1 6.5537098095653139645e-06 +1.6306381826061645943e-05 +0.13267502226188271353 0.2786606257975073886 0.010601098875389479426 +-11.331978934667442676 4.8184460126705647045 1.4332264599878684131 +2 9.663313399581537916e-05 +4.0453784346544178454e-05 +-0.69398700025820403425 -0.19235393648106968723 0.03740673057980103272 +1.9245789988923785786 -7.1528261190002948057 -0.20922405362759749996 +3 0.000120026935827952453094 +4.25875607065040958e-05 +0.49463573470256239073 -0.8874896493821613497 4.051630875713834232e-05 +5.386704768180099809 3.0357508899436080915 -0.00016218409216515533796 +4 1.2739802010675941456e-05 +2.265740805092889601e-05 +-1.5655322071100350456 0.56626121192188216824 0.050269397991054412533 +-1.5477080637857006753 -4.370087697214287981 -0.05361768768801557225 +5 0.037692251088985676735 +0.00046732617030490929307 +4.0891378954287338487 -2.9329188614380639066 -0.07930573161132697946 +1.575024788882753283 2.3719591091996699917 -0.045089307261129988257 +6 0.011285899820091272997 +0.00038925687730393611812 +6.3349788609660162564 -7.674600716671800882 -0.11868650931385750502 +1.4598618704191345578 1.2948691245181617393 -0.080593167691228835176 +7 0.0017236589478267730203 +0.00016953449859497231466 +14.832516206189200858 13.032608531076540714 -0.14378102535616668622 +-0.9573374666934839659 1.014553546383260322 0.016118112341773867214 +8 0.0020336100526728302319 +0.000164587904124493665 +29.561664938083289655 -4.6012285192418387325 -0.586585578731106283 +0.17051705220469790965 1.1424784769020628332 -0.027423757798549895085 diff --git a/examples/helio_gr_test/swiftest_relativity.ipynb b/examples/helio_gr_test/swiftest_relativity.ipynb new file mode 100644 index 000000000..a612e82b0 --- /dev/null +++ b/examples/helio_gr_test/swiftest_relativity.ipynb @@ -0,0 +1,192 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import swiftest\n", + "from astroquery.jplhorizons import Horizons" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 1.000e+03\n", + "Creating Dataset\n", + "Successfully converted 1001 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftersim = swiftest.Simulation(param_file=\"param.swifter.in\", codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "Reading in time 1.000e+03\n", + "Creating Dataset\n", + "Successfully converted 1001 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "swiftestsim = swiftest.Simulation(param_file=\"param.swiftest.in\")\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swifterdat['varpi'] = swifterdat['omega'] + swifterdat['capom']\n", + "swiftestdat['varpi'] = swiftestdat['omega'] + swiftestdat['capom']" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "obj = Horizons(id='1', id_type='majorbody',location='@sun',\n", + " epochs={'start':'2021-01-28', 'stop':'3021-02-05',\n", + " 'step':'1y'})\n", + "el = obj.elements()\n", + "t = (el['datetime_jd']-el['datetime_jd'][0]) / 365.25\n", + "varpi_obs = el['w'] + el['Omega']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "varpiswiftest = swiftestdat['varpi'].sel(id=1) * 180.0 / np.pi\n", + "varpiswifter = swifterdat['varpi'].sel(id=1) * 180.0 / np.pi\n", + "tsim = swiftestdat['time']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "dvarpi_swiftest = np.diff(varpiswiftest) * 3600 * 100 \n", + "dvarpi_swifter = np.diff(varpiswifter) * 3600 * 100 \n", + "dvarpi_obs = np.diff(varpi_obs) / np.diff(t) * 3600 * 100 " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", + "JPL Horizons : 571.3210506300043\n", + "Swifter GR : 571.6183105524942\n", + "Swiftest GR : 528.6778623554625\n", + "Obs - Swifter : -0.2972599224899675\n", + "Obs - Swiftest : 42.643188274541785\n", + "Swiftest - Swifter: -42.94044819703174\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "ax.plot(t, varpi_obs, label=\"JPL Horizons\")\n", + "ax.plot(tsim, varpiswifter, label=\"Swifter GR\")\n", + "ax.plot(tsim, varpiswiftest, label=\"Swiftest GR\")\n", + "ax.set_xlabel('Time (y)')\n", + "ax.set_ylabel('Mercury $\\\\varpi$ (deg)')\n", + "ax.legend()\n", + "print('Mean precession rate for Mercury long. peri. (arcsec/100 y)')\n", + "print(f'JPL Horizons : {np.mean(dvarpi_obs)}')\n", + "print(f'Swifter GR : {np.mean(dvarpi_swifter)}')\n", + "print(f'Swiftest GR : {np.mean(dvarpi_swiftest)}')\n", + "print(f'Obs - Swifter : {np.mean(dvarpi_obs - dvarpi_swifter)}')\n", + "print(f'Obs - Swiftest : {np.mean(dvarpi_obs - dvarpi_swiftest)}')\n", + "print(f'Swiftest - Swifter: {np.mean(dvarpi_swiftest - dvarpi_swifter)}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/helio_gr_test/tp.swifter.in b/examples/helio_gr_test/tp.swifter.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/helio_gr_test/tp.swifter.in @@ -0,0 +1 @@ +0 diff --git a/examples/helio_gr_test/tp.swiftest.in b/examples/helio_gr_test/tp.swiftest.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/helio_gr_test/tp.swiftest.in @@ -0,0 +1 @@ +0 diff --git a/examples/whm_gr_test/swiftest_relativity.ipynb b/examples/whm_gr_test/swiftest_relativity.ipynb index 53c4e5453..69bacdf51 100644 --- a/examples/whm_gr_test/swiftest_relativity.ipynb +++ b/examples/whm_gr_test/swiftest_relativity.ipynb @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -116,10 +116,10 @@ "Mean precession rate for Mercury long. peri. (arcsec/100 y)\n", "JPL Horizons : 571.3210506300043\n", "Swifter GR : 571.6183105524942\n", - "Swiftest GR : 571.6183105392645\n", + "Swiftest GR : 571.61831053222\n", "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : -0.29725990926022927\n", - "Swiftest - Swifter: -1.3229737305664457e-08\n" + "Obs - Swiftest : -0.29725990221562437\n", + "Swiftest - Swifter: -2.0274342205084395e-08\n" ] }, { diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index cd8bc2a23..0c0333907 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -43,6 +43,36 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) end subroutine gr_kick_getaccb_ns_body + module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of massive bodies + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 + implicit none + ! Arguments + real(DP), dimension(:), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:,:), intent(in) :: x !! Position vectors + logical, dimension(:), intent(in) :: lmask !! Logical mask indicating which bodies to compute + integer(I4B), intent(in) :: n !! Total number of bodies + real(DP), intent(in) :: inv_c2 !! Inverse speed of light squared: 1 / c**2 + real(DP), dimension(:,:), intent(out) :: agr !! Accelerations + ! Internals + integer(I4B) :: i + real(DP) :: beta, rjmag4 + + agr(:,:) = 0.0_DP + do concurrent (i = 1:n, lmask(i)) + rjmag4 = (dot_product(x(:, i), x(:, i)))**2 + beta = -mu(i)**2 * inv_c2 + agr(:, i) = 2 * beta * x(:, i) / rjmag4 + end do + + return + end subroutine gr_kick_getacch + + module pure subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton !! diff --git a/src/helio/helio_gr.f90 b/src/helio/helio_gr.f90 new file mode 100644 index 000000000..4ec16d464 --- /dev/null +++ b/src/helio/helio_gr.f90 @@ -0,0 +1,107 @@ +submodule(helio_classes) s_helio_gr + use swiftest +contains + + module subroutine helio_gr_kick_getacch_pl(self, param) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of massive bodies + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_whm_kick_getacch.f90 + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i + real(DP), dimension(NDIM) :: suma + real(DP), dimension(:, :), allocatable :: aj + real(DP) :: beta, rjmag4 + + associate(pl => self, npl => self%nbody) + if (npl == 0) return + call gr_kick_getacch(pl%mu, pl%xh, pl%lmask, npl, param%inv_c2, pl%agr) + pl%ah(:,1:npl) = pl%ah(:,1:npl) + pl%agr(:,1:npl) + end associate + + return + end subroutine helio_gr_kick_getacch_pl + + + module subroutine helio_gr_kick_getacch_tp(self, param) + !! author: David A. Minton + !! + !! Compute relativisitic accelerations of test particles + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_kick_getacch.f90 + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i + real(DP) :: rjmag4, beta + + associate(tp => self, ntp => self%nbody) + if (ntp == 0) return + call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) + tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) + end associate + + return + end subroutine helio_gr_kick_getacch_tp + + + module pure subroutine helio_gr_p4_pl(self, param, dt) + !! author: David A. Minton + !! + !! Position kick to massive bodies due to p**4 term in the post-Newtonian correction + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_p4.f90 + implicit none + ! Arguments + class(helio_pl), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + ! Internals + integer(I4B) :: i + + associate(pl => self, npl => self%nbody) + if (npl == 0) return + do concurrent(i = 1:npl, pl%lmask(i)) + call gr_p4_pos_kick(param, pl%xh(:, i), pl%vb(:, i), dt) + end do + end associate + + return + end subroutine helio_gr_p4_pl + + module pure subroutine helio_gr_p4_tp(self, param, dt) + !! author: David A. Minton + !! + !! Position kick to test particles due to p**4 term in the post-Newtonian correction + !! Based on Saha & Tremaine (1994) Eq. 28 + !! + !! Adapted from David A. Minton's Swifter routine routine gr_helio_p4.f90 + implicit none + ! Arguments + class(helio_tp), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + ! Internals + integer(I4B) :: i + + associate(tp => self, ntp => self%nbody) + if (ntp == 0) return + do concurrent(i = 1:ntp, tp%lmask(i)) + call gr_p4_pos_kick(param, tp%xh(:, i), tp%vb(:, i), dt) + end do + end associate + + return + end subroutine helio_gr_p4_tp + +end submodule s_helio_gr \ No newline at end of file diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index c0d14a9ab..9e47b62af 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -36,7 +36,7 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) end if end if if (param%lextra_force) call pl%accel_user(system, param, t, lbeg) - !if (param%lgr) call pl%gr_accel(param) + if (param%lgr) call pl%accel_gr(param) end associate return @@ -67,7 +67,7 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) end if if (param%loblatecb) call tp%accel_obl(system) if (param%lextra_force) call tp%accel_user(system, param, t, lbeg) - !if (param%lgr) call tp%gr_accel(param) + if (param%lgr) call tp%accel_gr(param) end associate return diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 9bee84104..8884393e9 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -94,8 +94,10 @@ module subroutine helio_step_tp(self, system, param, t, dt) end if call tp%lindrift(cb, dth, lbeg=.true.) call tp%kick(system, param, t, dth, lbeg=.true.) + if (param%lgr) call tp%gr_pos_kick(param, dth) call tp%drift(system, param, dt) call tp%kick(system, param, t + dt, dth, lbeg=.false.) + if (param%lgr) call tp%gr_pos_kick(param, dth) call tp%lindrift(cb, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) end select diff --git a/src/io/io.f90 b/src/io/io.f90 index bad7838ab..835591dbb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -260,10 +260,13 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Determine if the GR flag is set correctly for this integrator select case(integrator) - case(WHM, RMVS, SYMBA) + case(WHM, RMVS, HELIO, SYMBA) write(*,*) "GR = ", self%lgr + case(HELIO, SYMBA) + write(*,*) "GR is still in development with this integrator and will not produce correct results." case default if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + self%lgr = .false. end select end associate diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index 84417ea6b..89f4aa055 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -35,13 +35,15 @@ module helio_classes !! Helio massive body particle class type, extends(swiftest_pl) :: helio_pl contains - procedure :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) - procedure :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) - procedure :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates - procedure :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities - procedure :: step => helio_step_pl !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_pl !! Convert massive bodies from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_pl !! Convert massive bodies from barycentric to heliocentric coordinates (velocity only) + procedure :: drift => helio_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: lindrift => helio_drift_linear_pl !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: accel_gr => helio_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => helio_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: accel => helio_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_pl !! Kicks the barycentric velocities + procedure :: step => helio_step_pl !! Steps the body forward one stepsize end type helio_pl !******************************************************************************************************************************** @@ -51,13 +53,15 @@ module helio_classes !! Helio test particle class type, extends(swiftest_tp) :: helio_tp contains - procedure :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) - procedure :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) - procedure :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun - procedure :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates - procedure :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies - procedure :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities - procedure :: step => helio_step_tp !! Steps the body forward one stepsize + procedure :: vh2vb => helio_coord_vh2vb_tp !! Convert test particles from heliocentric to barycentric coordinates (velocity only) + procedure :: vb2vh => helio_coord_vb2vh_tp !! Convert test particles from barycentric to heliocentric coordinates (velocity only) + procedure :: lindrift => helio_drift_linear_tp !! Method for linear drift of massive bodies due to barycentric momentum of Sun + procedure :: drift => helio_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates + procedure :: accel_gr => helio_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction + procedure :: gr_pos_kick => helio_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: accel => helio_kick_getacch_tp !! Compute heliocentric accelerations of massive bodies + procedure :: kick => helio_kick_vb_tp !! Kicks the barycentric velocities + procedure :: step => helio_step_tp !! Steps the body forward one stepsize end type helio_tp interface @@ -130,6 +134,36 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp + module subroutine helio_gr_kick_getacch_pl(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine helio_gr_kick_getacch_pl + + module subroutine helio_gr_kick_getacch_tp(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine helio_gr_kick_getacch_tp + + module pure subroutine helio_gr_p4_pl(self, param, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_pl), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + end subroutine helio_gr_p4_pl + + module pure subroutine helio_gr_p4_tp(self, param, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(helio_tp), intent(inout) :: self !! Swiftest particle object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Step size + end subroutine helio_gr_p4_tp + module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 50ec658b6..913d678eb 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -153,22 +153,22 @@ module swiftest_classes procedure(abstract_step_body), deferred :: step procedure(abstract_accel), deferred :: accel ! These are concrete because the implementation is the same for all types of particles - procedure :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables - procedure :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators - procedure :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators - procedure :: initialize => io_read_body_in !! Read in body initial conditions from a file - procedure :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body - procedure :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors - procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements - procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays - procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) - procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen - procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: drift => drift_body !! Loop through bodies and call Danby drift routine on heliocentric variables + procedure :: v2pv => gr_vh2pv_body !! Converts from velocity to psudeovelocity for GR calculations using symplectic integrators + procedure :: pv2v => gr_pv2vh_body !! Converts from psudeovelocity to velocity for GR calculations using symplectic integrators + procedure :: initialize => io_read_body_in !! Read in body initial conditions from a file + procedure :: read_frame => io_read_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: write_frame => io_write_frame_body !! I/O routine for writing out a single frame of time-series data for the central body + procedure :: accel_obl => obl_acc_body !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: el2xv => orbel_el2xv_vec !! Convert orbital elements to position and velocity vectors + procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements + procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays + procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) + procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen + procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -415,6 +415,16 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_kick_getaccb_ns_body + module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + implicit none + real(DP), dimension(:), intent(in) :: mu !! Gravitational constant + real(DP), dimension(:,:), intent(in) :: x !! Position vectors + logical, dimension(:), intent(in) :: lmask !! Logical mask indicating which bodies to compute + integer(I4B), intent(in) :: n !! Total number of bodies + real(DP), intent(in) :: inv_c2 !! Inverse speed of light squared: 1 / c**2 + real(DP), dimension(:,:), intent(out) :: agr !! Accelerations + end subroutine gr_kick_getacch + module pure subroutine gr_p4_pos_kick(param, x, v, dt) implicit none class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index 4badcd2b1..2816562a9 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -2,7 +2,8 @@ use swiftest contains - module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton + module subroutine whm_gr_kick_getacch_pl(self, param) + !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies !! Based on Saha & Tremaine (1994) Eq. 28 @@ -20,17 +21,12 @@ module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton associate(pl => self, npl => self%nbody, inv_c2 => param%inv_c2) if (npl == 0) return - allocate(aj, mold = pl%ah) - do i = 1, npl - rjmag4 = (dot_product(pl%xj(:, i), pl%xj(:, i)))**2 - beta = -pl%muj(i)**2 * inv_c2 - aj(:, i) = 2 * beta * pl%xj(:, i) / rjmag4 - end do + call gr_kick_getacch(pl%muj, pl%xj, pl%lmask, npl, param%inv_c2, pl%agr) suma(:) = 0.0_DP - pl%ah(:, 1) = pl%ah(:, 1) + aj(:, 1) + pl%ah(:, 1) = pl%ah(:, 1) + pl%agr(:, 1) do i = 2, npl - suma(:) = suma(:) + pl%Gmass(i) * aj(:, i) / pl%eta(i) - pl%ah(:, i) = pl%ah(:, i) + aj(:, i) + suma(:) + suma(:) = suma(:) + pl%Gmass(i) * pl%agr(:, i) / pl%eta(i) + pl%ah(:, i) = pl%ah(:, i) + pl%agr(:, i) + suma(:) end do end associate @@ -55,11 +51,8 @@ module subroutine whm_gr_kick_getacch_tp(self, param) associate(tp => self, ntp => self%nbody, inv_c2 => param%inv_c2) if (ntp == 0) return - do concurrent(i = 1:ntp, tp%lmask(i)) - rjmag4 = (dot_product(tp%xh(:, i), tp%xh(:, i)))**2 - beta = - tp%mu(i)**2 * inv_c2 - tp%ah(:, i) = tp%ah(:, i) + beta * tp%xh(:, i) / rjmag4 - end do + call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) + tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) end associate return From 00ac79026095d021256110a57a87a8003c4ba9b1 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 12:49:03 -0400 Subject: [PATCH 124/194] Fixed bad select statement in io_param_reader --- src/io/io.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 835591dbb..a4a789e67 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -260,10 +260,11 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Determine if the GR flag is set correctly for this integrator select case(integrator) - case(WHM, RMVS, HELIO, SYMBA) + case(WHM, RMVS) write(*,*) "GR = ", self%lgr case(HELIO, SYMBA) - write(*,*) "GR is still in development with this integrator and will not produce correct results." + write(*,*) "GR = ", self%lgr + if (self%lgr) write(*,*) "GR is still in development with this integrator and will not produce correct results." case default if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' self%lgr = .false. From 0ece327a90a39f29984e308af86982127f50448b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 13:00:54 -0400 Subject: [PATCH 125/194] Added missing position kick term in the helio pl step and now GR works for Helio!!! --- examples/helio_gr_test/swiftest_relativity.ipynb | 8 ++++---- src/helio/helio_step.f90 | 2 ++ src/io/io.f90 | 5 +---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/examples/helio_gr_test/swiftest_relativity.ipynb b/examples/helio_gr_test/swiftest_relativity.ipynb index a612e82b0..03948cdf7 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 : 528.6778623554625\n", + "Swiftest GR : 571.6157754511288\n", "Obs - Swifter : -0.2972599224899675\n", - "Obs - Swiftest : 42.643188274541785\n", - "Swiftest - Swifter: -42.94044819703174\n" + "Obs - Swiftest : -0.2947248211246545\n", + "Swiftest - Swifter: -0.0025351013653107657\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEGCAYAAAB2EqL0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABHnklEQVR4nO3dd3zN1//A8dfJktgSVI1YJUZEEGLvUUqNolSLDkpbbbVa1Gir1a/6aYuqolZV7V27tam9916xV4xEZNz37497aRDcS5Kb8X4+Hnm499zP+XzenyDvnPE5x4gISiml1JO4ODsApZRSyYMmDKWUUnbRhKGUUsoumjCUUkrZRROGUkopu7g5O4CElDVrVsmXL5+zw1BKqWRj69atl0UkW1yfpeiEkS9fPrZs2eLsMJRSKtkwxpx81GfaJaWUUsoumjCUUkrZRROGUkopu6ToMYy4REVFERISQkREhLNDSXU8PT3JnTs37u7uzg5FKfUUUl3CCAkJIUOGDOTLlw9jjLPDSTVEhCtXrhASEkL+/PmdHY5S6imkui6piIgIfHx8NFkkMmMMPj4+2rJTKhlLdQkD0GThJPp9Vyp5S5UJQymlUqq96xfx75TvEYsl3s+tCcMJ0qdPz4kTJ/Dy8iIwMJBixYrRqVMnLBYLJ06cwN/f/7H1v/rqKwYNGnRfWb58+bh8+bJDcTRo0IDQ0FBHw1dKJUXRdzg1+g2KL2lF3oNjibgdFu+X0IThRAULFmTHjh3s2rWLffv2MWfOnES5rohgsVhYuHAhmTNnTpRrKqUSzoG1czjw00v4hsxjrtuLRLSahle6DPF+HU0YSYCbmxsVK1bkyJEj8XK+H3/8EX9/f/z9/Rk8eDAAJ06coGjRorz33nuULl2a06dP32uVjBgxgsDAQAIDA8mfPz81atQAYPLkyZQoUQJ/f3+6d+9+7/zp06enV69elCxZkvLly3PhwgUApk+fjr+/PyVLlqRq1arxci9KqUe7cf44B4a3osg/7SgStpk12VrxYo9JFPQrmSDXS3XTamP7+q+97Dt7I17PWSxnRr5sVNyhOuHh4Sxbtox+/frZXeenn35i4sSJ996fPXsWgK1btzJu3Dg2btyIiBAcHEy1atXIkiULBw8eZNy4cQwfPvy+c3Xq1IlOnToRFRVFzZo1+eSTTzh79izdu3dn69atZMmShbp16zJnzhyaNGlCWFgY5cuXp3///nz++ef89ttv9O7dm379+rFkyRJy5cqlXV1KJSSLhWP7t+A183UKx1xkrHmZxu27USVvACTg5BJtYTjR0aNHCQwMpFKlSrz00kvUr1/f7rpdu3Zlx44d975y5swJwNq1a2natCnp0qUjffr0NGvWjDVr1gCQN29eypcv/8hzfvTRR9SsWZNGjRqxefNmqlevTrZs2XBzc6NNmzasXr0aAA8PDxo2bAhAmTJlOHHiBACVKlWiffv2/Pbbb8TExDzNt0Qp9QQnD+/i+I81KTC9Ds9bLrAmaCgNuv6GT76SCZosIJW3MBxtCcS3u2MY8UlEHvlZunTpHvnZ+PHjOXnyJMOGDXviedzd3e9NkXV1dSU6OhqAESNGsHHjRhYsWEBgYCA7duzAx8fnaW5DKfWgmGj2bl5G8cUtAVjkUZeSlRtSrWrbRAtBWxgpTNWqVZkzZw7h4eGEhYUxe/ZsqlSp8tg6W7duZdCgQUycOBEXF+s/ieDgYFatWsXly5eJiYlh8uTJVKtW7bHnOXr0KMHBwfTr14+sWbNy+vTpeLsvpVIrESHmwgEi+vtSfHFLonBj8guDCHx/AjmrtkvUWBKthWGM8QOmxioqAPQFVgAjgPTACaCNiDw0sGCMeREYArgCo0VkQELHnBCio6NJkybNY485ePAguXPnvvf+p59+okWLFnadv3Tp0rRv355y5coB8M4771CqVKl73UZxGTZsGFevXr032B0UFMTo0aP53//+R40aNRARGjRoQOPGjR977c8++4zDhw8jItSqVYuSJRNm4E2p1GTZsPepfeVPXIGlpiIFGnSlddm6TonFPK7rIcEuaowrcAYIBmYA3URklTHmLSC/iPSJ4/hDQB0gBNgMtBaRfY+7TlBQkDy4gdL+/fspWrRovN2Lo3bu3EmHDh3YtGmT02JwJmd//5VKLs4uGYLr1t94LvI0UbixtnB3qrf+LMFXTDDGbBWRoLg+c1aXVC3gqIicBPyA1bbyv4FX4ji+HHBERI6JSCQwBXj8r7tJ0IgRI2jdujXffvuts0NRSiVRYZdOsuzn98i5vi/PRZ7mD5cmhHULocZrnzt9eR1nDXq3AibbXu8BXgbmAi2APHEcnwuI3SEegrV18hBjTEegI4Cvr288hRs/7k5fVUqpB8XEWNj9z0SKbPicWnKbaHHhZPPFNPcLwsvD1dnhAU5oYRhjPLAmiOm2oreA940xW4EMQGRc1eIoi7MvTURGiUiQiARlyxbnPuZKKZWk3Dm7lw0j3yNwfRc85TZjsnYnpvN6CpYITjLJApzTwqgPbBORCwAicgCoC2CMKQy8FEedEO5veeQGziZwnEoplaCiYyzcPrObtGOrUwkLZ1xzcaLKD7xSrhZp0no4O7yHOGMMozX/dUdhjMlu+9MF6I11xtSDNgOFjDH5bS2UVsC8RIhVKaXinwjcucmSX7vhPqYW0eLK+Mzvk77T31SqXp/MSTBZQCInDGNMWqwznWbFKm5tjDkEHMDaahhnOzanMWYhgIhEAx8AS4D9wDQR2ZuYsSulVHy5tnIY/C83L10ew3nPAqwsM4S2H/YnU7Zcz3TeaEs0f+7/k/9t/B93Yu7EU7T/SdSEISLhIuIjItdjlQ0RkcK2rx5im+crImdFpEGs4xbajikoIv0TM+741r9/f4oXL05AQACBgYFs3LjRrnp9+/bln3/+AWDNmjUUL16cwMBA1q9fz8KFC585rgsXLvDaa69RoEABypQpQ4UKFZg9ezYAK1euJFOmTJQqVYoiRYrQrVu3Z76eUqlN5K1rTBreD7eV/QmTNMzN3Y3nP11DvZfb4OLybDOgLoVf4pV5rzBg0wB2X96Nq4n/sY9UvTSIM6xfv5758+ezbds20qRJw+XLl4mMjGuc/2GxFyf8888/6datG2+++Sbjx49ny5YtNGjQ4DG17xcdHY2b239//SJCkyZNaNeuHZMmTQLg5MmTzJv3X89flSpVmD9/Prdv36ZUqVI0bdqUSpUq2X1NpVIrS4yFg7+/R/7Ts3lNIrjs4s3lZtNpXCLOxx0cEhoRytDtQ1l6cimRMZF8XfFr6uWrh5tL/P9414SRyM6dO0fWrFnvPe2dNWtWADZt2sSAAQOYNWsWc+fOpVWrVly/fh2LxUKxYsU4duwY7du3p2HDhoSGhjJt2jSWLFnC0qVLWbduHbdv32bt2rX07NmThg0b0qVLF3bv3k10dDRfffUVjRs3Zvz48SxYsICIiAjCwsJYvnz5vbiWL1+Oh4fHfdN+8+bNS5cuXR66h7sbP505cyaBv1tKJX839i5lz4qpVLw8g0hxZVqxobRs8QZZXZ69g2f6oen8tPUnbkXeIke6HHxZ4Uvq5K0TD1HHLXUnjEU94Pzu+D1njhJQ/9GrltStW5d+/fpRuHBhateuzauvvkq1atUoXbo027dvB6zdTf7+/mzevJno6GiCg+9/5OSdd95h7dq1NGzYkObNm99rYdxdOPCLL76gZs2ajB07ltDQUMqVK0ft2rUBawtn165deHt733fOvXv3Urp0abtu8dq1axw+fFj3vFDqMS6G3mT/0jFU2/clFYF9noHk/WgpLb0evzSQPTae28jEfRNZGbISfx9/+lboS1GfhF9BIXUnDCdInz49W7duZc2aNaxYsYJXX32VAQMG0L59e1544QX279/Ppk2b+OSTT1i9ejUxMTFPXDzwQUuXLmXevHn3tnGNiIjg1KlTANSpU+ehZBGX999/n7Vr1+Lh4cHmzZsBayILCAjg4MGD9OjRgxw5cjh490qlAhYLUVeOcWJkR6pFb+WaZOBUtR8JqNYU4+r+TKe+FnGNHmt68O/ZfwHInjY7P9f6maxeWeMj8idK3QnjMS2BhOTq6kr16tWpXr06JUqU4Pfff6d9+/ZUqVKFRYsW4e7uTu3atWnfvj0xMTEP7d/9JCLCzJkz8fPzu69848aNj1zivHjx4sycOfPe+19++YXLly8TFPRfH+vdMYxDhw5RuXJlmjZtSmBgoEOxKZWiiXB+wpvkODGHcsBsn3cIaNadkrmyP9Npw6LCGLBpAH+f/JuwqDAq5qzId5W/I2OajLi7PFsScoQub57IDh48yOHDh++937FjB3nz5gWsS5MPHjyYChUqkC1bNq5cucKBAwcoXvzx+3ZkyJCBmzdv3ntfr149fv7553t7Wtzt6nqcmjVrEhERwa+//nqvLDw8PM5jCxcuTM+ePfn++++feF6lUotzBzax4pv65Dgxhy2ugeyoMpKmXX6g4DMmi5WnV9JkbhPmHJlDWFQYb/u/zcg6I/Hx8knUZAGpvYXhBLdu3aJLly6Ehobi5ubGCy+8wKhRowDrHhQXLly4NzYQEBBA9uzZn7jgWI0aNRgwYACBgYH07NmTPn368PHHHxMQEICIkC9fPubPn//YcxhjmDNnDl27dmXgwIFky5aNdOnSPTIpdOrUiUGDBnH8+HHy58//FN8JpVKGiPCbHJz+JX7H/6CcuLAxT3uKvz6I9J7P9sP875N/M/3gdNafWw/AywVfpm+Fvni4OO+hPqcsb55YkuLy5qmdfv9VSnJx70oiZn2Ab8xpFksFcr06iBLF/J/pnFcjrrLkxBK+2/gdAGVzlOWrCl+RK30uXF0Sfl2pxy1vri0MpZRyUPidKC4u6E++XT8BsKFEP4Jf7EyWdE//27+I8PfJv/lq/VfcjLR2Mf9R/w8CswfGR8jxQhOGUkrZS4Tzu/5GZncmH5dZRRAFW35L+WIVnum0m89v5q+jfzH7iHVlhY9Kf0RA1oAklSxAE4ZSStknOpKTI1uS99IKAJYW+oqcVduSO4/PM512w7kNdFjaAYCCmQrSu3xvgnI8+xPgCUEThlJKPcGuFTPwXt2bvHKOpV71KVDnXeqWrvHU5wuPCmfl6ZUsPL6QVSGryOCegb4V+1IxZ0UyemSMv8DjmSYMpZR6hLCz+7k84U0CIvZjwbA0a1vKvfXDMy8//n9b/o8Zh2YA0KhAI970f5NCWQrFR8gJShOGUko9QKLv8O+80RTdPZBMlih+lha83OFL6uaJawdp+1wIu8CqkFUsPrGYzec3UzZHWT4v+zlFvIvEY+QJSx/cc4KktLx5aGgow4cPf+TnuuS5Sm32Lf+TYwOrUGnXF3hLKGfL9+H9r34j7zMki2sR12i9oDXfbPiGC2EXaF2kNcNqDktWyQK0hZHoksry5nfdTRjvvffeQ5/pkucqNblzcgv7t64gcNe3AExwb0mbDt0olt3vCTUfLTwqnHeWvsO+K/uIkRje8n+LTiU74eXmFV9hJ6pEa2EYY/yMMTtifd0wxnxsjAk0xmywlW0xxpR7RP2uxpi9xpg9xpjJxhjPxIo9PsW1vHnOnDnZtGkTzZo1A2Du3Ll4eXkRGRlJREQEBQoUAKB9+/bMmDGD0aNHM23aNPr160fr1q3p27cvU6dOJTAwkKlTpxIWFsZbb71F2bJlKVWqFHPnzgWsK9KWK1eOwMBAAgICOHz4MD169ODo0aMEBgby2Wef3RerLnmuUoPo6BgObluFGd+AwF3fEoNhSe0l1OvyM67PkCz+OvoXL858kd2Xd5MjXQ6G1hhK1zJdk22ygERsYYjIQSAQwBjjCpwBZgO/AV+LyCJjTANgIFA9dl1jTC7gQ6CYiNw2xkzDuq/3+GeJ6ftN33Pg6oFnOcVDingXoXu57o/83JnLm48YMYKPPvqINm3aEBkZSUxMDAMGDGDPnj3s2LHjoVh1yXOV4t0OZcWkH6hzeigA0z1bUOHF1tQLLP/Up5xzZA4jdo7gzK0zFMpSiN7le1M3X934itipnNUlVQs4KiInjTEC3J1Hlgnrvt5xcQO8jDFRQNrHHJekOXN58woVKtC/f39CQkJo1qwZhQo5NitDlzxXKcm1NaPIsuwz7m439G/xL2nc9GM83J6u4+VqxFXmHpnLkG1DcDWuNC7YmN7le+Ppliw7Q+LkrITRCphse/0xsMQYMwhrF1nFBw8WkTO2z08Bt4GlIrI0rhMbYzoCHQF8fX0fG8TjWgIJyVnLmxctWpTg4GAWLFhAvXr1GD169L3urrjokucqJYqJjGDZsPeoe2MmNyQtyzI2oexrX1Lx+af7ZSfaEs3sI7MZsXMEF8MvUua5MvxS6xfSuce9lUByluizpIwxHsDLwHRbUWegq4jkAboCY+KokwVoDOQHcgLpjDGvx3V+ERklIkEiEpQtW7aEuIVn4szlzY8dO0aBAgX48MMPefnll9m1a9dDdWPTJc9VSnNq2W/c+L8Aa7IgPRcaTaTpp7+S+ymTxd7Le2m7qC391vcjq1dWxtYby/gXx6fIZAHOmVZbH9gmIhds79sBs2yvpwNxDXrXBo6LyCURibId/1BLJDm4desW7dq1o1ixYgQEBLBv3z6++uorIO7lzQMCAuxa3nzfvn33Br379OlDVFQUAQEB+Pv706dPHwCmTp2Kv78/gYGBHDhwgLZt2+Lj40OlSpXw9/d/aND77pLnq1atIn/+/JQrV4527do9dsnz1atXc/z48Wf8LikVv64c3cryoR3wXdONLFEXGOH5Nmn7nKZQUK2nOl+UJYpfdvxCqwWt2H15N5+W+ZQpL02hbI6y8Rx50pLoy5sbY6YAS0RknO39fqCziKw0xtQCBopImQfqBANjgbJYu6TGA1tE5OfHXUuXN0969PuvElNUjIVd65dSaHlHMlquc95k52rbleTPlQMvD8eXCo+IjmDm4ZkM2jKIaEs01XJXo1WRVlTKWemJv9glF0lmeXNjTFqgDvBurOIOwBBjjBsQgW38wRiTExgtIg1EZKMxZgawDYgGtgOjEjN2pVTyErF/Cf/+PYuaV6dwR9yYVHQYzZs0J4fn001rDY0I5e2lb3Po2iEyemSkX8V+1PCtgYtJPc8/J2rCEJFwwOeBsrVAmTiOPQs0iPX+S+DLhI5RKZW8xViEKzsXkX1ua2oCO90CuFR9AM3LV3iqGVDnw84zYucIZh6eiYeLB92CulEjTw18Mz5+Uk1KlCqf9BaRFNN8TE5S8u6OKgmIieJO+A0WD/+UBuHzuIM764v3pULjDpRM83StioXHFtJjTQ8EoVCWQrwb8C718tWL58CTj1SXMDw9Pbly5Qo+Pj6aNBKRiHDlyhU8PVPOnHSVhIhwZmRzcl1cSWNga7rKpG/Qj+r+D3Ve2HEqYffl3QzYNIDdl3cTkDWAXuV7UdS7aKr/mZHqEkbu3LkJCQnh0qVLzg4l1fH09CR37tzODkOlMKHb53Ds798oHb6W0+Rgf2Av6jZp+1TnioyJpPWC1hy6dgg344ZfFj++qfQNBTI/+nml1CTVJQx3d3fy58/v7DCUUs/oxq2b7Jk1kIrHhlIa2J6xFsU+mEIeD8f3qoiyRPHOknfYdnEbAFVzV6V72e6pcpzicVJdwlBKJXMihB9ayYnZ/akYsZktUhTXV0ZSKqDkU51u+8XttFvUDkFwMS7Uz1+f/1X+X6rvfoqLJgylVLIRGRXNqYmdeeHkNAKApb5dKdWiJ9kypHH4XBvPbeTbDd9y6uYpBCH4+WBG1h6Jq4vjz2ekFpowlFLJQui54xwf045S0TvZ6FqazHW6Ubf8Sw6fR0SYdnAa3236DotYCMgWQK/gXhTzKZYAUacsmjCUUkladHgoRyd/ht/paRSWNKwp1I2AV3qQycvd4XMtOLaAKQemsOPSDgAGVRuUqqfJOkoThlIqyTq9eT7hi7+iYPRRZlKD3PU/oUp5x/dc2Xt5L/OPzWfi/okAtC3Wlo4BHcmUJlN8h5yiacJQSiU5Vy+d48yi/6PEMevi1XtKdKfZKz0dHogWEZaeXMpX/37FrahbPJf2OaY0nEJWr6wJEXaKpwlDKZV0REVw6p9f8d34Fd7AvJiKlOg4Cv88eRw6jUUsjN0zlt2XdrP89HK83LyYUH8CxXyKkcbV8QFyZaUJQymVJFwPv8O1sa+S7/JKAFaVHkKhoKbkz+lYt1G0JZoxu8cwbId1y+JGBRrRrWw3vD294zvkVEcThlLKucKvsnftXHzX9SSfuc18z0ZUbNKJakUqO3Sa/Vf2s+7sOhYcW8CR0CMEPRdEr+BeFMxcUJ+piCeaMJRSThN9fj+WkdUpLhFcM5lYkvd9gpp2wzuz/YsFWsTCzcibdPy7I6F3QsnmlY3ewb1pVLARad3TJmD0qY8mDKVU4ouJZu2ojwi+MJkYceVX11bUeuVd6hUv7dBpwqPC6fxPZ7Zd3IarceWbSt9Q07cmGT0yJlDgqZsmDKVUojr7z3AyrfuWyhIGwKFSX9C5STeHz7P81HJ6rOnB7ejbFPUuymdlP0vxW6Q6W6IlDGOMHzA1VlEBoC+wEhgBeGLdTe89EdkUR/3MwGjAHxDgLRFZn7BRK6XiS/jR9exdMYmyIRMAGOfanGafjqB4WscewFt3Zh191vXh0u1LFPEuQs9yPSn9nGMtE/V0Ei1hiMhBIBDAGOMKnAFmA78BX4vIImNMA2AgUD2OUwwBFotIc2OMB6Cdk0olA2KxsH3ZVPzXdaEsUcSI4UjTBbQoGkz6NPb/CIqKieL3fb8zbPswYiSGhgUa8kXwF2TwyJCA0avYnNUlVQs4KiInjTEC3O1wzAScffBgY0xGoCrQHkBEIoHIxAlVKfW0Ik9vY+/6xZTe9z0Ak57vSZP69fDzLWX3OaIt0cw4NIOxe8ZyLuwclXNVZlC1QaRzT5dQYatHcDhhGGPSAREiEvMM120FTLa9/hhYYowZBLgAFeM4vgBwCRhnjCkJbAU+ErF1gt4fX0egI4Cvr65lr5QzRETFcHXP3+Sc+yqlgKtk5Eid33kluBpp3OxfDXbP5T0M3zGcNWfWUNS7KF1KdaFRwUYJF7h6LPOkfZaNMS5Yf8C3AcoCd4A0WH+ALwRGichhuy9o7U46CxQXkQvGmKHAKhGZaYxpCXQUkdoP1AkCNgCVRGSjMWYIcENE+jzuWkFBQbJlyxZ7Q1NKxZPlP79LzStTAJiW+R3KNepIvoJ+dte/GnGVKQemMGrXKGIkhteLvs7nZT/X5ykSgTFmq4gExfWZPS2MFcA/QE9gj4hYbCf1BmoAA4wxs0Vkop3x1Ae2icgF2/t2wEe219OxDmw/KAQIEZGNtvczgB52Xk8plUjOLRtO+n+/p2ZMKCfJSWidn2hZ6UW769+IvMH4PeP5bfdvANTIU4POJTtTxLuIJoskwJ6EUVtEoh4sFJGrwExgpjHGkWkOrfmvOwqsrY1qWGdL1QQeaq2IyHljzGljjJ9t8LwWsM+BayqlEtC10/vZ8MeX1L2zlAt4Mz99Wxp0GkDeDPaPM5y7dY5uq7ux69IuAIbWGEq1PNVwMS4JFbZy0BMTRlzJ4mmOATDGpAXqAO/GKu4ADDHGuAER2MYfjDE5gdEi0sB2XBfgT1uX1jHgTXuuqZRKOGKxsGn6/1Hs4DDqW25w0qMAnm9Mo7VvIbvPsTpkNdMPTWfl6ZUA9CjXg3I5ylEoi/3nUInD7kFvY8wncRRfB7aKyA57ziEi4YDPA2VrgTJxHHsWaBDr/Q4gzn41pVQiE+HqkgEc27eV4Bt/Ey5pGFdoKG++3s7uU0TGRLLy9Eo+XfUpAEW8i/BJmU+okLNCAgWtnpUjs6SCbF9/2d6/BGwGOhljpovIwPgOTimV9NyOjGHPP39QdtMAvIE9HoF4vjWP9s/ZtxzHzcibbDi3gR+2/MCZW2fImS4n/Sv3p6hPUZ0qm8Q5kjB8gNIicgvAGPMl1sHnqlinuWrCUColi44k5uS/bJ01jMphf3NevDlZeyTlKtbAuD55GFNEiJZoPlrxEZvPb8bdxZ06eevwtv/bFM9aPBFuQD0rRxKGL/c/LBcF5BWR28aYO/EbllIqqTn7RwdynpxDZWBRxpYUad6bYN+8dtf/fPXnLD6xGIDAbIH0Lt8bP2/7p9oq53MkYUwCNhhj5treNwIm2x7k0xlLSqVQ13Yu4NCCwQRHbmKXazHCyn9K/TrN7aorIpy8cZJ2i9txNeIqGT0yUua5MgysOhBPN88EjlzFN7sThoh8Y4xZCFQGDNBJRO4+FdcmIYJTSjlPZGQkh6f2pOjRMQQjbMn5OkVeH0T6tPbtVXH6xmnaLm7L5duXAWhcsDE9g3vqOEUy5sgsKQMUBTKJSD9jjK8xplxcK8sqpZIxi4UbexZxZMFgSt/ZxAKq8HzrYQT55bP7FH8d/Yu+6/oSLdEU8ylG++LtqZ+/fsLFrBKFI11SwwEL1ofr+gE3sT64pwvQK5VCXA+L4OQfnQk4P4vSwL4XOlCn1UA83Ox7eG7ZyWWM3TOWvVf2EiMxfBH8Ba2LtE7YoFWicSRhBItIaWPMdgARuWZ7iE4plQLcPHOQM2PbEhBzgBkuL1K2yQcUK1EZ7FiS4/TN00zaP4mpB6diMNTNW5cvgr8gs2fmhA9cJRpHEkaUbR8LATDGZMPa4lBKJWOREbc5/VsrCl5ZSTFgeZGvqdrgXbJnfPJYhYgwfu94Ru8ezY3IG+RIl4NRdUaRP1P+hA9cJTpHEsZQrBsePWeM6Q80B3onSFRKqURxaPkE0q7+loJcYI5rXfJWfYOa1V5+Yr0YSwz9NvTjzM0zbDy/kQweGRhTdwzlni+XCFErZ3FkltSfxpitWBf+A2giIvsTJiylVEK6cfYIF2Z0o/DVFVw2Wdjs150GzXvYNVYRZYli9K7RzDo8C4C6eesyqNogXU02FXhiwnjEGlIA9Y0x9UXkx3iOSSmVQOTOLfb/+TnFTv2Jp7gyUhpT4Z0fKOub7Yl1j18/zpQDU1gdspqQWyGUyl6KITWGkDlNZk0WqYQ9LYy7G+b6YZ0RNc/2vhGwOiGCUkrFvwPbVmGW96fYLeu2Moer/MSrFVuTOe3j566ICNfvXOeTlZ9wJPQIGT0yMrjGYKrnro6ri/2756nkz57lzb8GMMYsxbqW1E3b+6+wbniklErC7oTsYt+qaZQ49AtuxsIYjza0e78PxTM9/8S6oRGh9FrXi9Uhq3EzbgysOpAquaqQ3iN9IkSukppnWUsqEsgXr9EopeKNxSKEhJziuXF1KCURYGBVuZG8VLExbpmePANq96XdvPvPu9yMvEnw88F8WuZTivoUTYTIVVLlSML4A9hkjJmNdWptU+D3BIlKKfVsRFg3sgtVLvwBwDjPtlR76TWqlXjyXhMbzm2g77q+nAs7R+70uRn/4ngKZymc0BGrZMCRWVL9jTGLgCq2ojdFZLu99Y0xfsDUWEUFgL5Yt2YdAXgC0cB7j1puxPYcyBbgjIg0tPfaSqUm17bNIcu8dlQBzrvk4FLJzrRr9BEuLo8fmBYR/tj3B0O2DSGLZxbq56/Ph6U+JHeG3IkTuEry7JklZUREAERkG7Dtccc8im0v7kDb8a7AGazPdfwGfC0ii4wxDbDuq1H9Eaf5CNgP2LdTi1KpSFR4KP+O+4LyF6eBgT/Tt6fG299RIsvjF/u7+/DdqF2juBV1i2q5q9GvUj+8Pb0TKXKVXNjTwlhhjJkJzBWRU3cLbcuCVAbaASuA8Q5ctxZwVEROGmOE/xJAJuBsXBWMMbmx7vLXH3jUVF+lUqWDf/3Ec9t+oppcJ9q4sL/qcNrUfPIi0jsv7WT4juH8e/ZfCmQqQCvfVnQp1QUXY9/aUSp1sSdhvAi8hXXvi/xAKOAFuABLgZ/s3dM7llbAZNvrj4ElxphBtnNWfESdwcDn/DfNN07GmI5ARwBfX18Hw1IqeQk7tpHdK2dQ/tQoAH7O+AkffPQFRZ+wA96FsAuM2DWCWYdnYRELzQo148sKX2qiUI9lntCTdP/BxrgDWYHbIhL6VBe0tkzOAsVF5IIxZiiwSkRmGmNaAh1FpPYDdRoCDUTkPWNMdaCbPWMYQUFBsmXLlicdplSyExYRxaa/RlFlbx/ciOEWabn85npy5MyDp/ujn424FXmLwdsGM/WgdTixyQtN6F62u06TVfcYY7aKSFBcnzkySwoRiQLOPWM89YFtInLB9r4d1rEJsD7XMTqOOpWAl21jHJ5ARmPMRBF5/RljUSr5uXKU9TNHUfvsCCLFldmF+lOx+ovky53vsdVWnl7JmN1j2HFpBwDfV/meBgUaJHi4KuVwKGHEk9b81x0F1tZGNayzpWoChx+sICI9gZ4AsVoYmixUqnLxRgRh22eSf8V71AbOuPkS9spEmhYt+dh6C48tZN6xeaw7sw6AHuV6UDdvXbKlffJyIErFlqgJwxiTFqgDvBuruAMwxBjjBkRgG38wxuQERouI/gqkUr3Ia2c4/nMbgi3bCZX0LM/9HlWbv0euLFkeWSc8KpyFxxfy9fqvAfD29GZC/QnkzZg3scJWKYzdYxjGmLdFZEwCxxOvdAxDpQTbxnWl9Mmx3BF3Nqerim+TvvgWDnzk8Xdi7vDX0b+YuG8iR68fxcvNixG1R5A3Y158vHwSL3CVLMXXGMYPxpg2WB+u2wRMFpG98RGgUuphV1YM58jG+QRHrOOseLPWrzctWr/12JVhI6IjGLZ9GL/v+x0348arfq/SvHBzingXScTIVUrlSMK4AnwLeGB9AG+aMWaoiIxMiMCUSq1Cb4Wze/5wqhz4Bh9gX7pyFPpwHi3TPHr9p2sR1/jn1D8M2DiASEskJbKW4LvK35EvU75Ei1ulfI4kjOsistz2erExZgiwEdCEoVR8sFgI3z2Xc/P/jypRezkgvlxuNo3KJR+94F+0JZqwqDBazm/J+bDz5M2Yl8q5KvNm8Td5Lt1ziRi8Sg0cHvQ2xnTH+ixGJuBmvEekVCoUHWPhzNyvybtrMEWBdQW7Uujl7hR5zKqykTGRvLbgNQ5eOwhAowKN6F6uO5nSZEqkqFVq8zSzpGZiXdqjMfBd/IajVOpz7cAajsz8irJRW9hsSpC+4bdUKlP9kcdbxMLyU8vpurIrAMHPB1MpZyXaF2+vO9+pBOVIwshijMkjIkeAI8aY34DtwIKECU2plE0sFg7+8TFFjv9OCXFna963ydvsa7JnfvTqN9svbuf9f97nZtRNvD29+aDUB7Qo3CIRo1apmSMJIyOw0hhzGdgHZAZiEiIopVK681vmcv6fYQRGbGKOS22eb/Ydwf5+jzz++p3rDNoyiPnH5hNtiaZxwcZ0KtlJlx5XicqRhFED2AMEY93fW9DWhVIOuXItlEMTPqDCtb/IAezJ2YJGb4/C1fXRi/4N2z6MkbtG4mJcCMwWSJdSXQjKEec0eaUSlCMbKO2yvVxv+1JK2UuEsEMrCZ3WlQoxx5lgXqbGG73xz18YHjHuMGLnCLZc2MLGcxvx9vTmi+AvqJevXiIHrtR/nLGWlFKpyunzl7kx8XWK31pPQWBLyW9oWLcT3uk84jz+VuQtRu0exbg94wCo5VuL/6v6f7g/YclypRKaJgylEtCedQvxW/o6eUwMf3vWJU+lVgRVeSXOY6/fuc6vO39l4bGF3Ii8QY08Nfiu8ne69LhKMuxOGMaYD4A/ReRaAsajVIoQduEYEaNfwj/qLLdNGrYH9qNC/U6kTxP3f7mbkTfpsaYHa8+sxcvNi19q/UKlXJUSOWqlHs+RFkYOYLMxZhswFljypH28lUp1RNg+6l1KnZtKGnFhuFsbKr7yEeWKxT0D6lL4JYbtGMbsw7NxMS70Du5Nk0JNSOOaJpEDV+rJHBn07m2M6QPUBd4EhhljpgFjRORoQgWoVHKxf9lE3DePoFTEbgCOl+3Lew27PvL4UzdO8c7Sd7gYfpFavrV4u8Tb+Gf1T6xwlXKYozvuiTHmPHAe66q1WYAZxpi/ReTzhAhQqaQu6sIBDv/1I8VCrNueTjSNaNRtLIUeMai998peeq3pxdHrR8mcJjOTXppEMZ9iiRmyUk/FkTGMD7Fup3oZ6zaqn4lIlDHGBesueY9NGMYYP2BqrKICQF+sO+2NwLr1ajTwnohseqBuHmAC1m4xCzBKRIbYG7tSCcFiEbZvWE7+le9TLPIcUeLKyVf/oVG+EmRK+/CMJhFhzpE59NvQD29PbxoVaMQbxd6gqM+jFxdUKimxK2EY6wI1JYFmInIy9mciYjHGNHzSOUTkINZl0THGuAJngNnAb8DXIrLItmf3QKD6A9WjgU9FZJsxJgOw1daq2WdP/ErFt8jz+9mydDIVj1l/bxmb6QOatWjLC7njHqv4c/+f/N/m/yNGYij/fHkGVBmgmxmpZMeuhGHriir1YLKI9fl+B69bCzgqIieNMYJ12RGwroB7No7znwPO2V7fNMbsB3JhXaJEqUQjIkSc3on72JpUJIZwvDhR9UdeCW5Opji6oM6HnefjFR+z98pecqTLQYXnK9CrfC8d1FbJkiNjGOuNMWVFZHM8XLcVMNn2+mNgiTFmEOACVHxcRWNMPqAU1r04lEo8UbdZ/Otn1L/6BwCDvd6n8RsfUyxn9ocOvXL7Ct1Xd2f7xe1EWiJ5pdAr9ArupQ/fqWTNkT2992FdQ+oEEAYYrI2PAIcuaIwH1lZEcRG5YIwZCqwSkZnGmJZARxGp/Yi66YFVQH8RmfWIYzoCHQF8fX3LnDwZZ6NIKYccnjeQQtv6A3DMJS83AzsQ0OiDh5YTFxEGbxvM2D1jAWhcsDGvFX1NB7VVsvG4Pb0dSRh54yp/VDfVY87TGHhfROra3l8HMtu6vQzWnf0yxlHPHZiP9fmPH+25VlBQkGzZssWR8JS6T0TIbnbMHUypi3OIxo0x3l15p3M30no83Dife2Qukw5MYt8Va09pl1Jd6BjQMbFDVuqZPC5hONIl1e4R5f0cjKc1/3VHgbW1UQ3rbKmaWGdc3ceWSMYA++1NFko9i+joaFb/+gEVr8yiPHe4bdIQ2moBHxZ5+P/R5vObGb17NP+e/ReAN4u/SZfSXXB30e4nlbI4kjDCYr32BBoCDg12G2PSAnWAd2MVdwCGGGPcgAhs3UnGmJzAaBFpAFQC3gB2G2N22Op9ISILHbm+Uva4s30a+9fNpeaV+QBMeGEwbVu+Si6PtPcdF2WJYtL+SQzdNpRISyTp3dMz8+WZ5Eyf0xlhK5Xg7O6SeqiiMWmAeSKSZNdb1i4p5Yiz18I4tGw81fd8AcAB92Jk/XA5WTPcv6+2RSxM2DuBzRc2szpkNQCj6oyimE8x3U9bJXvx1SX1oLRYH75TKnkTQa4c5fTIzlSP2sRVycDO8oOpUL0Bnl73J4s7MXeYsHcCQ7cPBaBRgUZ0KdWF59M/74zIlUpUjjzpvRvrLnsArkA2HB+/UCrJOfT7+xQ+8SfBwAafpuRp2JMa+e9/AO9C2AUm7JvA4hOLuRh+kQKZCjCh/gRtUahUxZEWRuynuaOBCyISHc/xKJVowg4sY+fsn6h4Zw3rxZ87ZTtT7aU2902VjbHEcD78PF+s+YJtF7fhm8GXbkHdqJa7miYLleo4slqtPtCgUoSIqBg2zPmVCnv7UZE7bPNpROA7v+H1QPfT3it7Gb5j+L1xig4lOtAhoANebl5xnVapFM+RLqnfgY9EJNT2Pgvwg4i8lUCxKRXvbm6fxbGFQ6getYMdlhcIqfMrDauUu++YkJshnLl1hneWvgNAnbx1CMgaQJtibXSqrErVHOmSCribLABE5JoxplT8h6RU/LsdGcPhab0IOPIrJYGjhd7C75UBBHrev6bT8evHaT6vOZGWSAC+q/wdDfI3wNXF1QlRK5W0OJIwXIwxWe5u0WqM8XawvlKJz2Lh1rbpXFg0gICYY/xFVfK+0p+AEvevaBMeFc6vO39l/N7xALTya0Xzws3x84579VmlUiNHfuD/APxrjJmBdbZUS6B/gkSlVDwQi4UjY96i0JnZIJ78W/BDSjXsTm7v9Pcd98uOXxixcwQAZZ4rQ6eSnSj/fHlnhKxUkubIfhgrgC1Yl+8wWPfG0OXFVZJ0bMNfXF7+M+UiN/KXRwNyNvicioH396CuCVnD7COz+fvk3xTxLkKLwi1oUbjFQwsKKqWsHNkPY46IlEH3oFBJ2I0LJzkzvj1Fb2+jAHAw9yvUbTeKNO7//VO3iIU/9v3B4K2DiZZoGhVoxJcVv9Q9KpR6Ake6pDbE434YSsWvqAhO/z2MnJv6k0c8+E7a0qLTl/jlzPrfITFR/LrzV+Yfm8+5sHNUylWJbyt9S1avrI85sVLqLkcSRg2gkzHmBM+wH4ZS8W33phVYlvenZIT1d5kzFfrRs17H+7qWLt++TN91fVlzZg3uLu70Du5NS7+W2v2klAMcSRj1EywKpZ7G9RBCdq7Ab9nHeJho/nRvTt0WHfErHHzvkPNh5/nfxv+x/PRyDIa+FfrSvFBzTRRKPQVHEsYpoA1QQET6GWN8gRyAPgGuEt3Ny6dxH16O3JZwbps07Kg5joZl65PJ678H686Hnaf94vacuXWGMs+V4bOyn1Hcp7gTo1YqeXMkYQwHLFhnSfUDbgIzgbIJEJdScRNh2x89KH3MOg12RMYPqVS3BYH+//WMrj+7npG7RrL1wlbSuqVlSsMpmiiUigeOJIxgESltjNkO95709kiguJR6yMVNM0i7uCulLTe4ZLJyvdS7dHr583ufX4u4xoxDMxi6fSjZvbLTvHBzmrzQRJOFUvHEkYQRZYxxxbbEuTEmG9YWh12MMX7A1FhFBYC+WLdmHYF1F79o4D0R2RRH/ReBIViXVh8tIgMciF0lY5Zbl9n4R28qXLDu7DvJrTFl3v4Zv+etq8VGxkSy8PhC+q7riyDU9q3N91W/x8NVf59RKj45kjCGArOB54wx/YHmQB97K4vIQSAQwJZ4ztjO9xvwtYgsMsY0AAYC1WPXtR3/C9btXUOAzcaYefrgYMq3buFECm39hgox57GI4WjdsbxWqRkA0ZZort+5zmsLXuNs2FnyZMhDxZwV6VKqiyYLpRKAI8ub/2mM2QrUshU1FpEDT3ndWsBRETlpjBEgo608E3A2juPLAUdE5BiAMWYK0Bh9iDDFCjuyjqOLf6HS5QUA/OTRkQ+69qWQVwYAbkXeosVfLQi5FQLAq36v8lHpj8jgkcFpMSuV0j0xYRhj5j1YZPuznjEGEXn5Ka7bCphse/0xsMQYMwhwASrGcXwu4HSs9yFAcBzHYYzpCHQE8PX1fYrQlDNFRlvYuX8//rNeIUBucwlvrrSYRRvforh7eQIw5cAU+m+0LmPWonALquSqQg3fGs4MW6lUwZ4WRgWsP6wnAxv5L2E8FdtA+ctAT1tRZ6CriMw0xrQExgC1H6wWx6kkjjJEZBQwCiAoKCjOY1QSZLHAwYVsX72I4HMTARiVZyCvNHyJIs/lBmDZyWV8s+EbrkRcwc240apIK7qX6+7MqJVKVexJGDmwjh20Bl4DFgCTRWTvU16zPrBNRC7Y3rcDPrK9ng6MjqNOCJAn1vvcxN11pZKp06t/J8/KjwkGdriWIKZcZ96u8xquLoazt87yy45fmHfU2thtWbglPcr1wN1VNzNSKjE9MWGISAywGFhsjEmDNXGsNMb0E5Gfn+KarfmvOwqsP/irYZ0tVRM4HEedzUAhY0x+rIPlrbAmL5XMWS4fY+uYDykZ/i9XTQb+zNuf15q3xCeDFyLC2D1jGbFzBLejb+Pm4sYvNX+hYq64ei2VUgnN3uXN0wAvYf1hnw/rjKlZjl7MGJMWa2vl3VjFHYAhxhg3IALb+IMxJifW6bMNRCTaGPMBsATrtNqxz9DCUUmAiLB9aCtKX1tMWWC3WzHSN/yOLqWsYxF/7PuDqQencvKGdSGBgVUHUidvHdxcdM8upZzFiDy+m9+2l7c/sAiYIiJ7EiOw+BAUFCRbtmxxdhjqAWHrx3B8/Rz8b6zmimRgcYFevNa2E8YYwqPCmXRgEkO2DQEgMFsg414cp4lCqURijNkqIkFxfWbP/8I3sK5OWxj4MNaibXdXq834qIpKxXb91m02zfyROscH4g8cdS9E7k9X0cYzHZfCL9FrbS9O3zxNyK0QMqXJxF9N/iKLZxZnh62UsrFnDMMlMQJRKZgIUUdWcn52P+qEb+O8eHPgpZlUL1sKAQ5ePcjIXSNZf249OdLloE/5PtTJW0eThVJJjLbzVYKKiIrh0PS+BBwahh+wPMfblGz1JdUzZ+Lfs/8yaMsgDl+zznNoWbglfSrYvXiAUiqRacJQCebOxSPs/K0zwVGb+Nc1CJcqXale9SVO3DzOxmPr6Lm2JxaxUNS7KB+W/pDgHHE+i6mUSiI0Yah4FxMTw7Y/vqD0iVEUkzRsKfgepVr0xcvLi6OhR2n+V3OiLdG4u7gzss5ISmcvrWs/KZUMaMJQ8erK7qWEzfmUsjGnWGSpADW/oH71qpwPO8/4HeMZvnM4AO2Lt6dB/gYU9Snq5IiVUvbShKHiRcSdSP6d/gM1jwzAB9j7Qgfqt/k/MIZZh2fx5b9fAlA1d1XeC3xP96hQKhnShKGeTUwUN5YNIuO/A6gJrLYE4N12Iv4v5CXkZgg/b/+ZxScWU9ynOM0KNeOVQq/g6uLq7KiVUk9BE4Z6alHRMRwf24HCZ2cDsLrE/8hXrS05vT0ZvHUwY/eMxdPNkzZF2/BB4AekdU/r5IiVUs9CE4ZynMXC5Z3zuT2vO4XlLHM9G1Oy6adU9SvJnCNzaPPPD4TeCeXlgi/zdom3KZCpgLMjVkrFA00YyiFhl09xa0Q9nos+y3VJx4Einan3yreERl3m6/VfM+PQDAC6l+3O68Ved3K0Sqn4pAlD2ScynANTelLo2ARcxZVvPbpQv+W75MrpzptL32DPlT24GBfaFWvHx2U+1rWflEqB9H+1eqIDm5bgsuxrityxLhB8ILAnvZp8xs5LO3lnaW9O3jhJ3ox5GV5rOL4ZdZdDpVIqTRjqkWLO7+P4qj/It/83PIliomtTXv5kOEfO/c03C1qz98pe0rimYVy9cZR5rgyxFqZUSqVAmjBUnA7v38HzMxvzQnQoUeLKwSbzKeebm3EHf2P07tG8kPkFOpfsTL189SiYuaCzw1VKJQJNGOp+keEcWPknRf7tBsDQDB/z4ksvsVWO8P2CD7CIhVLZSzH+xfG4GF3IWKnUJNEShjHGD5gaq6gA0BeoAPjZyjIDoSISGEf9rsA7gAC7gTdFJCIBQ051rhzaQMZJDSlCFDG4EFLla6qVqEafTd+x78o+sntlp1WRVjQt1FSThVKpUKIlDBE5CAQCGGNcse7NPVtEBt89xhjzA3D9wbrGmFzAh0AxEbltjJmGdV/v8QkeeGpgiWH9L29T4Yr1Abzf071JkYZdGHy0N3sW/QbAq36v0rlkZ3y8fJwZqVLKiZzVJVULOCoiJ+8WGOuIaUug5iPquAFexpgoIC1wNsGjTAU2LJ5Eoc1fUiHmIqdMTqKqfE6AfyBtFzUBoG7eupTNUZaWfi21VaFUKueshNEKmPxAWRXggogcfvBgETljjBkEnAJuA0tFZGlcJzbGdAQ6Avj66hTPRwk/+i8np39B+YjtAIwyLSj5dlc+Xv0Ot07fAqB54eb0Cu6lz1QopQAnJAxjjAfwMtDzgY9a83ASuVsnC9AYyA+EAtONMa+LyMQHjxWRUcAogKCgIIm/yFMGEWHFXxMJ2tGLopbr3JC0XGs9j5ArC/h5WSsA2hRtwxvF3iBX+lxOjlYplZQ441fH+sA2Eblwt8AY4wY0A8o8ok5t4LiIXLIdPwuoCDyUMNQjiBC24kdO7NtEzcuLARif5xu8K+fk2y3vczv6Nr4ZfHm35Lu8XPBlJwerlEqKnJEw4mpJ1AYOiEjII+qcAsobY9Ji7ZKqBWxJuBBTllt3ojmyfi6Bq/tRHNjnWoSN1d9g3JlpXNtwDYPhs6DPaFu8rbNDVUolYYmaMGw/8OsA7z7w0UNjGsaYnMBoEWkgIhuNMTOAbUA0sB1bt5N6DBHk8iH2j/2EsrfXclkysbrsEPZl2cfUIyMBeCHzC/xa+1dypMvh5GCVUkmdEUm53fxBQUGyZUvqbYgcmNqLIvuHAfB3htoMzR3GxehrhEeHk9YtLeNfHK9bpCql7mOM2SoiQXF9ptNfUqCYA4s4snQk+a+sBQNjC/dkZ45znDi9HC83L7qW6cpb/m85O0ylVDKjCSMFiY6xsGLSQKoe/RE/7rAoQwkmFMrJntA/4TRUy12NYbWGOTtMpVQypQkjhYg6+A9HFw+jzrUVrDe+LCv9Htvkbw5f20++jPn4ofoPFMykiwQqpZ6eJoxk7npYJFtnDKDm8R8oAszzrsXveeHQ1eEYDD9U+4GavjX14Tul1DPTnyLJ2O3zhzgx5h1qRu3kL7dADpVtwNTLM7kdepvWRVrTyq8VBTLrftpKqfihCSMZioiMYv+0rwg4MpxiYhjj15ZfLeu5c34iL2R+gR+r/0j+TPmdHaZSKoXRhJHMXNj6F5b5n1BKLjLHlGZO8fxsC19F/kz5aenXkqYvNCWte1pnh6mUSoE0YSQTN26EsnXKt1Q+MxZXE8P3heryZ/RBJPwy7Yu3p3PJzpoolFIJShNGUhcTxflZPcmx9zdqAN+lC2B+Lgs3ow9QNXdVOpToQGD2QGdHqZRKBTRhJGFnL1/lxsxPKHJuNuddXelXqDpr7hyGaPio9Ee87f821m1ElFIq4WnCSIoiwwnZMIMsyz7Dwy2SF3MV4YxHOG5Rx3nT/03eD3yfNK5pnB2lUiqV0YSRxESFX+fmT+XIFXWev9JlYXjOwpyJCSWrV1Z+rP4jpbKXcnaISqlUShNGUmGJ4dCEDylwYjKr03sy+rlynHQ/j4m5zpAaQ6jp+6ida5VSKnFowkgCzu5dR8yc9/GS0wzJ7M34LF5kSnObpnma8kmZT8jsmdnZISqllCYMZ7JcPcGBWd/hGzKdvzKk5XufXMQYwcfThwXNFpDOPZ2zQ1RKqXs0YTjJ5lXzyb76M0LdrzI6uzd/p0uLt2cW3g98nwrPV9BkoZRKchItYRhj/ICpsYoKAH2BCoCfrSwzECoigXHUzwyMBvwBAd4SkfUJF3HCkIv7ObZ7PQXWduP7rJlZlD47ANVzV+fbyt+SKU0mJ0eolFJxS7SEISIHgUAAY4wrcAaYLSKD7x5jjPkBuP6IUwwBFotIc2OMB5CsHmuOiIphzeZtFFnejDsut3k5z/PccHUh6LlyVM5VkVZFWmmrQimVpDmrS6oWcFRETt4tMNYn0FoCD00HMsZkBKoC7QFEJBKITJRI48OdW+yY+CUVQsbQLPfznHPLDMAHgR/QtnhbvNy8nBufUkrZwVkJoxUw+YGyKsAFETkcx/EFgEvAOGNMSWAr8JGIhD14oDGmI9ARwNfXN16DdpSIsH3NAgqufIM9GdLTIV8eAN4LfI/CWQpTy7eWU+NTSilHGBFJ3Atau5POAsVF5EKs8l+BIyLyQxx1goANQCUR2WiMGQLcEJE+j7tWUFCQbNmyJX5vwE6Rp7dxcVwbTntcoePzzwGQO10+2vq/RusirZ0Sk1JKPYkxZquIBMX1mTNaGPWBbQ8kCzegGVDmEXVCgBAR2Wh7PwPokaBRPiURYcnv3+F5YSRdfTMSbazJ4vOyn/NakddwdXF1coRKKfV0nJEwWvNwd1Rt4ICIhMRVQUTOG2NOG2P8bIPntYB9CRynw26sGsrpjbP4N+1JZuewznaqmrsqH5b6ED9vvyfUVkqppC1RE4YxJi1QB3j3gY8eGtMwxuQERotIA1tRF+BPW5fWMeDNBA7XbtHRMaxeNIlpIUNZ95wXkJ68GXzpU6Evwc8HOzs8pZSKF4maMEQkHPCJo7x9HGVngQax3u8A4uxXcxoROLaSLQsGstj1IOvSW6fFtizUnF4V+uBiXJwcoFJKxR990vspiQjblv7EuGPDWZXJCyPpKJ+1LD/XG46nm6ezw1NKqXinCeMphJ3YzOxZPVnudYrNab3I45abn14cip9PIWeHppRSCUYThoMmj+vM3Khl7PVJg5E0dPHrSMfyXZwdllJKJThNGHY6u3sms1f+j4npbxPl7kntzI3oXrsLOdLlcHZoSimVKDRhPEFo2B1GT+jAvDRbuJbRFe8YD6Y0nUPeLHmdHZpSSiUqTRiPcXDnJEavHcTi9FFki0xD05zN+LR6FzLphkZKqVRIE0YcrtyM4NcZrzHV5TCkh8rGl29aTyFr+gzODk0ppZxGE8YDrt66Q9PpZbjm6kKRCE+q5mnNB/W7Yl1MVymlUi9NGA/I4GGhPLnIkTYnH7YZjZubfouUUgo0YTzE3cOLgW8tdXYYSimV5OjaFUoppeyiCUMppZRdNGEopZSyiyYMpZRSdtGEoZRSyi6aMJRSStlFE4ZSSim7aMJQSillFyMizo4hwRhjLgEnn7J6VuByPIaTHOg9p3yp7X5B79lReUUkW1wfpOiE8SyMMVtEJGntIZ7A9J5TvtR2v6D3HJ+0S0oppZRdNGEopZSyiyaMRxvl7ACcQO855Utt9wt6z/FGxzCUUkrZRVsYSiml7KIJQymllF00YTzAGPOiMeagMeaIMaaHs+OJL8aYPMaYFcaY/caYvcaYj2zl3saYv40xh21/ZolVp6ft+3DQGFPPedE/PWOMqzFmuzFmvu19ir5fAGNMZmPMDGPMAdvfd4WUfN/GmK62f9N7jDGTjTGeKfF+jTFjjTEXjTF7YpU5fJ/GmDLGmN22z4YaR/afFhH9sn0BrsBRoADgAewEijk7rni6t+eB0rbXGYBDQDFgINDDVt4D+N72upjt/tMA+W3fF1dn38dT3PcnwCRgvu19ir5f2738Drxje+0BZE6p9w3kAo4DXrb304D2KfF+gapAaWBPrDKH7xPYBFQADLAIqG9vDNrCuF854IiIHBORSGAK0NjJMcULETknIttsr28C+7H+Z2uM9QcMtj+b2F43BqaIyB0ROQ4cwfr9STaMMbmBl4DRsYpT7P0CGGMyYv3BMgZARCJFJJSUfd9ugJcxxg1IC5wlBd6viKwGrj5Q7NB9GmOeBzKKyHqxZo8Jseo8kSaM++UCTsd6H2IrS1GMMfmAUsBG4DkROQfWpAJktx2WEr4Xg4HPAUusspR8v2BtHV8Cxtm64kYbY9KRQu9bRM4Ag4BTwDnguogsJYXebxwcvc9cttcPlttFE8b94urLS1Hzjo0x6YGZwMcicuNxh8ZRlmy+F8aYhsBFEdlqb5U4ypLN/cbihrXb4lcRKQWEYe2qeJRkfd+2PvvGWLtdcgLpjDGvP65KHGXJ5n4d8Kj7fKb714RxvxAgT6z3ubE2b1MEY4w71mTxp4jMshVfsDVTsf150Vae3L8XlYCXjTEnsHYt1jTGTCTl3u9dIUCIiGy0vZ+BNYGk1PuuDRwXkUsiEgXMAiqScu/3QY7eZ4jt9YPldtGEcb/NQCFjTH5jjAfQCpjn5JjihW0mxBhgv4j8GOujeUA72+t2wNxY5a2MMWmMMfmBQlgHy5IFEekpIrlFJB/Wv8flIvI6KfR+7xKR88BpY4yfragWsI+Ue9+ngPLGmLS2f+O1sI7PpdT7fZBD92nrtrppjClv+361jVXnyZw98p/UvoAGWGcQHQV6OTueeLyvylibnruAHbavBoAPsAw4bPvTO1adXrbvw0EcmEmR1L6A6vw3Syo13G8gsMX2dz0HyJKS7xv4GjgA7AH+wDozKMXdLzAZ6zhNFNaWwttPc59AkO17dRQYhm3FD3u+dGkQpZRSdtEuKaWUUnbRhKGUUsoumjCUUkrZRROGUkopu2jCUEopZRdNGEo9gTHGxxizw/Z13hhzxvb6ljFmeAJd82NjTNsnHDPFGFMoIa6vVFx0Wq1SDjDGfAXcEpFBCXgNN2Ab1tWFox9zXDXgdRHpkFCxKBWbtjCUekrGmOqx9tn4yhjzuzFmqTHmhDGmmTFmoG3fgcW2ZVnu7kWwyhiz1Riz5O6yDg+oCWwTkWhjTEFjzLZY1yxkjLm7PtYaoLYtwSiV4DRhKBV/CmJdTr0xMBFYISIlgNvAS7ak8TPQXETKAGOB/nGcpxKwFUBEjgLXjTGBts/eBMbbPrNgXba6ZALdj1L30d9MlIo/i0QkyhizG+tmXItt5buBfIAf4A/8bdvkzBXrUg8Peh7rekh3jQbeNMZ8ArzK/fs3XMS6Squ9q/Iq9dQ0YSgVf+6A9Td/Y0yU/DdAaMH6f80Ae0WkwhPOcxvwjPV+JvAlsBzYKiJXYn3maTteqQSnXVJKJZ6DQDZjTAWwLjdvjCkex3H7gRfuvhGRCGAJ8Csw7oFjCwN7EyZcpe6nCUOpRCLWbX+bA98bY3ZiXTG4YhyHLsK6zWpsf2JdbXjp3QJjzHPAbbHtuKZUQtNptUolQcaY2cDnInLY9r4bkElE+sQ6pitwQ0TGOClMlcroGIZSSVMPrIPfh23JoyDW6baxhWLd/0GpRKEtDKWUUnbRMQyllFJ20YShlFLKLpowlFJK2UUThlJKKbtowlBKKWWX/wetbPaF5kqp1gAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
    " ] diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 8884393e9..72f832766 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -53,8 +53,10 @@ module subroutine helio_step_pl(self, system, param, t, dt) end if call pl%lindrift(cb, dth, lbeg=.true.) call pl%kick(system, param, t, dth, lbeg=.true.) + if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%drift(system, param, dt) call pl%kick(system, param, t + dt, dth, lbeg=.false.) + if (param%lgr) call pl%gr_pos_kick(param, dth) call pl%lindrift(cb, dth, lbeg=.false.) call pl%vb2vh(cb) end select diff --git a/src/io/io.f90 b/src/io/io.f90 index a4a789e67..b424094eb 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -260,11 +260,8 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Determine if the GR flag is set correctly for this integrator select case(integrator) - case(WHM, RMVS) + case(WHM, RMVS, HELIO, SYMBA) write(*,*) "GR = ", self%lgr - case(HELIO, SYMBA) - write(*,*) "GR = ", self%lgr - if (self%lgr) write(*,*) "GR is still in development with this integrator and will not produce correct results." case default if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' self%lgr = .false. From f5878cb9e24987ff851ffb183eb43f02f31d0d9f Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 13:03:29 -0400 Subject: [PATCH 126/194] reran the init_cond.py on a SyMBA example case to make sure MTINY gets set --- .../symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in index f2a1422d1..a7f91ba33 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swiftest.in @@ -28,3 +28,4 @@ MU2KG 1.988409870698051e+30 DU2M 149597870700.0 TU2S 31557600.0 RHILL_PRESENT yes +MTINY 1e-12 From 845955e9f5b2a45409af01a7cf63996b2f1f65a0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 13:36:23 -0400 Subject: [PATCH 127/194] Fixed mask issue in the recursion step --- .../1pl_1tp_encounter/cb.swiftest.in | Bin 80 -> 80 bytes .../1pl_1tp_encounter/init_cond.py | 11 +- .../1pl_1tp_encounter/param.swifter.in | 4 +- .../swiftest_vs_swifter.ipynb | 106 ++++++++++-------- src/symba/symba_step.f90 | 4 + 5 files changed, 72 insertions(+), 53 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/cb.swiftest.in index 96c7f920c5e7fef09dc566576eaaa5d9558f556a..d0ae0ed15fe3ea8dd15557055a926fce3c60b59c 100644 GIT binary patch delta 20 UcmWFtm|!xIMSzC^3OIl?03^Ty9smFU delta 33 kcmWFtm|!CFz>CM;wV~IJgMonogqP|>Ijb)=*#}|+0F_t=$N&HU diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py index 86c13a50e..338b5d5a8 100755 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/init_cond.py @@ -25,6 +25,9 @@ TU2S = swiftest.YR2S DU2M = swiftest.AU2M +J2 = 0.0 #swiftest.J2Sun +J4 = 0.0 #swiftest.J4Sun + GMSun = swiftest.GMSunSI * TU2S**2 / DU2M**3 # Simple initial conditions of a circular planet with one test particle in a close encounter state @@ -90,8 +93,8 @@ print(f'OUT_TYPE REAL8') print(f'OUT_FORM XV') print(f'OUT_STAT UNKNOWN') -print(f'J2 {swiftest.J2Sun}') -print(f'J4 {swiftest.J4Sun}') +print(f'J2 {J2}') +print(f'J4 {J4}') print(f'CHK_CLOSE yes') print(f'CHK_RMIN {rmin}') print(f'CHK_RMAX {rmax}') @@ -111,8 +114,8 @@ cbfile.write_record(0) cbfile.write_record(np.double(GMSun)) cbfile.write_record(np.double(rmin)) -cbfile.write_record(np.double(swiftest.J2Sun)) -cbfile.write_record(np.double(swiftest.J4Sun)) +cbfile.write_record(np.double(J2)) +cbfile.write_record(np.double(J4)) cbfile.close() plfile = FortranFile(swiftest_pl, 'w') diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in index d1a0c9f27..853815639 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/param.swifter.in @@ -11,8 +11,8 @@ BIN_OUT bin.swifter.dat OUT_TYPE REAL8 OUT_FORM XV OUT_STAT UNKNOWN -J2 2.198e-07 -J4 -4.805e-09 +J2 0.0 +J4 0.0 CHK_CLOSE yes CHK_RMIN 0.004650467260962157 CHK_RMAX 1000.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb index 71a2c4da6..02d6b0bef 100644 --- a/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1tp_encounter/swiftest_vs_swifter.ipynb @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 1.348e-01\n", + "Reading in time 1.355e-01\n", "Creating Dataset\n", - "Successfully converted 198 output frames.\n", + "Successfully converted 199 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 11, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAEGCAYAAABYV4NmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAWF0lEQVR4nO3dfZBddZ3n8fd3kkCGIchjoEMHkzGBSXhYjL0hoIUKZipEN1GZscg4Q/CJQsSHZVg3M9bujrU1mirHXXTNSAWRShxnUg7Kg1aAiYCLhRMkPAiEGJMBJB1aiFGQrMuj3/3j3mRvOreT2337d89N8n5V3ep7zu/3O+fbN33y6d85t8+NzESSpNH2e1UXIEk6MBkwkqQiDBhJUhEGjCSpCANGklTE2KoL6KRjjz02p0yZUnUZkrRfuf/++3+ZmccNd9xBFTBTpkxh3bp1VZchSfuViPj5SMZ5ikySVIQBI0kqwoCRJBVxUF2DkaS9eeWVV+jv7+fFF1+supRKjB8/nt7eXsaNGzcq2zNgJKmuv7+fCRMmMGXKFCKi6nI6KjPZvn07/f39TJ06dVS26SkySap78cUXOeaYYw66cAGICI455phRnb0ZMJLU4GAMl51G+3s3YCRJRRgwklShc845p+n6Sy65hBtuuKHD1YwuA0aSKvSjH/2o6hKK8V1kklShww8/nB07dpCZfPzjH+fOO+9k6tSpHAifNuwMRpK6wI033sjGjRt55JFHuPbaaw+ImY0BI0ld4O6772bRokWMGTOGSZMmcd5551VdUtsMGEnqEgfaW6QNGEnqAueeey6rVq3itddeY2BggLvuuqvqktrmRX5J6gLvec97uPPOOzn99NM5+eSTeetb31p1SW0zYCSpQjt27ABqp8e+8pWvVFzN6PIUmSSpCANGklSEASNJKsKAkSQVYcBIkoowYCRJRRgwktRFtmzZwtvf/nZmzJjBqaeeype+9KU9+mQmn/jEJ5g2bRpnnHEGDzzwQAWV7pt/ByNJXWTs2LF88YtfZNasWbzwwgu86U1vYu7cucycOXNXn1tvvZVNmzaxadMm7r33Xj760Y9y7733Vlh1c5XOYCJiXkRsjIjNEbGkSXtExJfr7Q9HxKxB7WMi4sGI+F7nqpakcnp6epg1q/Zf3YQJE5gxYwZbt27drc/NN9/MxRdfTEQwZ84cnnvuOQYGBqood68qm8FExBhgGTAX6Afui4hbMvOxhm4XANPrj7OAr9a/7vRJYANwREeKlnTQ+Ox31/PY078Z1W3OnHQE/+0/nNpy/yeffJIHH3yQs846a7f1W7duZfLkybuWe3t72bp1Kz09PaNW62iocgYzG9icmY9n5svAKmDhoD4LgZVZsxY4MiJ6ACKiF3gn8LVOFi1JnbBjxw4uvPBCrr76ao44YvffoZt9GFk33om5ymswJwJbGpb72X12MlSfE4EB4Grg08CEve0kIi4FLgU46aST2ipY0sFjODON0fbKK69w4YUX8v73v5/3vve9e7T39vayZcv//6+xv7+fSZMmdbLEllQ5g2kWt4NjuWmfiHgX8Gxm3r+vnWTm8szsy8y+4447biR1SlLHZCYf+tCHmDFjBldeeWXTPgsWLGDlypVkJmvXruV1r3td150eg2pnMP3A5IblXuDpFvv8CbAgIuYD44EjIuIfMvPPC9YrScXdc889fOMb3+D000/nzDPPBOBzn/scTz31FACXXXYZ8+fPZ/Xq1UybNo3DDjuM66+/vsKKh1ZlwNwHTI+IqcBW4CLgzwb1uQW4IiJWUTt99nxmDgB/VX8QEW8DrjJcJB0I3vKWtzS9xtIoIli2bFmHKhq5ygImM1+NiCuA24ExwNczc31EXFZvvwZYDcwHNgO/BT5QVb2SpOGp9A8tM3M1tRBpXHdNw/MEPraPbfwA+EGB8iRJbfBWMZKkIgwYSVIRBowkqQgDRpJUhAEjSV3kgx/8IBMnTuS0007bte5Xv/oVc+fOZfr06cydO5df//rXu9o+//nPM23aNE455RRuv/32ptvc2/iSDBhJ6iKXXHIJt912227rli5dyvnnn8+mTZs4//zzWbp0KQCPPfYYq1atYv369dx2221cfvnlvPbaa3tsc6jxpRkwktRFzj33XI4++ujd1t18880sXrwYgMWLF3PTTTftWn/RRRdx6KGHMnXqVKZNm8aPf/zjPbY51PjS/MAxSWrm1iXwi0dGd5snnA4XDH/28Mwzz+y611hPTw/PPvssULtt/5w5c3b123nb/lbHl+YMRpL2U91+235nMJLUzAhmGqUcf/zxDAwM0NPTw8DAABMnTgRav23/UONLcwYjSV1uwYIFrFixAoAVK1awcOHCXetXrVrFSy+9xBNPPMGmTZuYPXt2y+NLM2AkqYssWrSIs88+m40bN9Lb28t1113HkiVLWLNmDdOnT2fNmjUsWbIEgFNPPZX3ve99zJw5k3nz5rFs2TLGjBkDwIc//GHWrVsHMOT40mJft4U+kPT19eXOF1ySBtuwYQMzZsyouoxKNXsNIuL+zOwb7racwUiSijBgJElFGDCS1OBgumww2Gh/7waMJNWNHz+e7du3H5Qhk5ls376d8ePHj9o2/TsYSarr7e2lv7+fbdu2VV1KJcaPH09vb++obc+AkaS6cePGMXXq1KrLOGB4ikySVIQBI0kqwoCRJBVhwEiSijBgJElFGDCSpCIMGElSEQaMJKkIA0aSVIQBI0kqwoCRJBVRacBExLyI2BgRmyNij8/wjJov19sfjohZ9fWTI+KuiNgQEesj4pOdr16StDeVBUxEjAGWARcAM4FFETFzULcLgOn1x6XAV+vrXwX+MjNnAHOAjzUZK0mqUJUzmNnA5sx8PDNfBlYBCwf1WQiszJq1wJER0ZOZA5n5AEBmvgBsAE7sZPGSpL2rMmBOBLY0LPezZ0jss09ETAHeCNw7+iVKkkaqyoCJJusGf4zcXvtExOHAt4FPZeZvmu4k4tKIWBcR6w7WDxGSpCpUGTD9wOSG5V7g6Vb7RMQ4auHyzcz8zlA7yczlmdmXmX3HHXfcqBQuSdq3KgPmPmB6REyNiEOAi4BbBvW5Bbi4/m6yOcDzmTkQEQFcB2zIzP/R2bIlSa2o7COTM/PViLgCuB0YA3w9M9dHxGX19muA1cB8YDPwW+AD9eFvBv4CeCQiHqqv++vMXN3Bb0GStBeROfiyx4Grr68v161bV3UZkrRfiYj7M7NvuOP8S35JUhEGjCSpCANGklSEASNJKsKAkSQVYcBIkoowYCRJRRgwkqQiDBhJUhEGjCSpCANGklSEASNJKsKAkSQVYcBIkoowYCRJRRgwkqQiDBhJUhEGjCSpCANGklSEASNJKsKAkSQVYcBIkoowYCRJRRgwkqQiDBhJUhEGjCSpCANGklSEASNJKsKAkSQVYcBIkoowYCRJRewzYCJiYpN1p4zGziNiXkRsjIjNEbGkSXtExJfr7Q9HxKxWx0qSqtXKDOaHEfG+nQsR8ZfAje3uOCLGAMuAC4CZwKKImDmo2wXA9PrjUuCrwxgrSarQ2Bb6vA1YHhF/ChwPbABmj8K+ZwObM/NxgIhYBSwEHmvosxBYmZkJrI2IIyOiB5jSwthRs/bvP8KE5zaU2LQkdcQLR85gzuXXdnSf+5zBZOYAcBtwNrX/2Fdm5o5R2PeJwJaG5f76ulb6tDIWgIi4NCLWRcS6bdu2tV20JKk1+5zBRMQaYAA4DegFvh4Rd2fmVW3uO5qsyxb7tDK2tjJzObAcoK+vr2mffel06kvSgaCVazC3An+dmc9l5qPAOcDzo7DvfmByw3Iv8HSLfVoZK0mqUCsBMwG4PSJ+GBEfA47JzP8+Cvu+D5geEVMj4hDgIuCWQX1uAS6uv5tsDvB8/ZRdK2MlSRVq5RrMZzPzVOBjwCTgf0fE99vdcWa+ClwB3E7tjQPfysz1EXFZRFxW77YaeBzYDFwLXL63se3WJEkaPa28i2ynZ4FfANuBPf42ZiQyczW1EGlcd03D86QWbC2NlSR1j1b+0PKjEfED4A7gWOAjmXlG6cIkSfu3VmYwrwc+lZkPFa5FknQA2WfAZKa3YZEkDZs3u5QkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUVUEjARcXRErImITfWvRw3Rb15EbIyIzRGxpGH9FyLipxHxcETcGBFHdqx4SVJLqprBLAHuyMzpwB315d1ExBhgGXABMBNYFBEz681rgNMy8wzgZ8BfdaRqSVLLqgqYhcCK+vMVwLub9JkNbM7MxzPzZWBVfRyZ+S+Z+Wq931qgt2y5kqThqipgjs/MAYD614lN+pwIbGlY7q+vG+yDwK2jXqEkqS1jS204Ir4PnNCk6TOtbqLJuhy0j88ArwLf3EsdlwKXApx00kkt7lqS1K5iAZOZ7xiqLSKeiYiezByIiB7g2Sbd+oHJDcu9wNMN21gMvAs4PzOTIWTmcmA5QF9f35D9JEmjq6pTZLcAi+vPFwM3N+lzHzA9IqZGxCHARfVxRMQ84D8DCzLztx2oV5I0TFUFzFJgbkRsAubWl4mISRGxGqB+Ef8K4HZgA/CtzFxfH/8VYAKwJiIeiohrOv0NSJL2rtgpsr3JzO3A+U3WPw3Mb1heDaxu0m9a0QIlSW3zL/klSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFWHASJKKMGAkSUUYMJKkIgwYSVIRBowkqQgDRpJUhAEjSSrCgJEkFVFJwETE0RGxJiI21b8eNUS/eRGxMSI2R8SSJu1XRURGxLHlq5YkDUdVM5glwB2ZOR24o768m4gYAywDLgBmAosiYmZD+2RgLvBURyqWJA1LVQGzEFhRf74CeHeTPrOBzZn5eGa+DKyqj9vpfwKfBrJgnZKkEaoqYI7PzAGA+teJTfqcCGxpWO6vryMiFgBbM/Mn+9pRRFwaEesiYt22bdvar1yS1JKxpTYcEd8HTmjS9JlWN9FkXUbEYfVt/HErG8nM5cBygL6+Pmc7ktQhxQImM98xVFtEPBMRPZk5EBE9wLNNuvUDkxuWe4GngTcAU4GfRMTO9Q9ExOzM/MWofQOSpLZUdYrsFmBx/fli4OYmfe4DpkfE1Ig4BLgIuCUzH8nMiZk5JTOnUAuiWYaLJHWXqgJmKTA3IjZReyfYUoCImBQRqwEy81XgCuB2YAPwrcxcX1G9kqRhKnaKbG8ycztwfpP1TwPzG5ZXA6v3sa0po12fJKl9/iW/JKkIA0aSVIQBI0kqwoCRJBVhwEiSijBgJElFGDCSpCIMGElSEQaMJKkIA0aSVIQBI0kqwoCRJBVhwEiSijBgJElFGDCSpCIMGElSEQaMJKkIA0aSVIQBI0kqwoCRJBVhwEiSijBgJElFGDCSpCIMGElSEZGZVdfQMRGxDfj5CIcfC/xyFMvpBGvunP2xbmvujAOh5tdn5nHD3chBFTDtiIh1mdlXdR3DYc2dsz/Wbc2dcTDX7CkySVIRBowkqQgDpnXLqy5gBKy5c/bHuq25Mw7amr0GI0kqwhmMJKkIA0aSVIQBA0TEvIjYGBGbI2JJk/aIiC/X2x+OiFmtju22miNickTcFREbImJ9RHyy22tuaB8TEQ9GxPf2h5oj4siIuCEiflp/vc/eD2r+j/Wfi0cj4p8iYnyX1PxHEfGvEfFSRFw1nLHdVnOVx2A7dTe0t34cZuZB/QDGAP8G/CFwCPATYOagPvOBW4EA5gD3tjq2C2vuAWbVn08AftbtNTe0Xwn8I/C9bv/ZqLetAD5cf34IcGQ31wycCDwB/H59+VvAJV1S80Tg3wN/C1w1nLFdWHMlx2C7dTe0t3wcOoOB2cDmzHw8M18GVgELB/VZCKzMmrXAkRHR0+LYrqo5Mwcy8wGAzHwB2EDtP5aurRkgInqBdwJf60CtbdccEUcA5wLXAWTmy5n5XDfXXG8bC/x+RIwFDgOe7oaaM/PZzLwPeGW4Y7ut5gqPQWjvtR72cWjA1P5htzQs97PnP/ZQfVoZW0I7Ne8SEVOANwL3jn6Je2i35quBTwO/K1RfM+3U/IfANuD6+umEr0XEH5Qsdh/17LNPZm4F/g54ChgAns/MfylY617r6cDYdozKfjt8DEL7dV/NMI5DA6Z2mmCwwe/dHqpPK2NLaKfmWmPE4cC3gU9l5m9GsbahjLjmiHgX8Gxm3j/6Ze1VO6/zWGAW8NXMfCPwf4BOXB9o53U+itpvs1OBScAfRMSfj3J9zbRzHHXzMbj3DXT+GIQ26h7JcWjA1BJ8csNyL3ueFhiqTytjS2inZiJiHLUf7G9m5ncK1tlSPS30eTOwICKepDalPy8i/qFcqfusp5U+/UB/Zu78zfQGaoFTWjs1vwN4IjO3ZeYrwHeAcwrWuq96So9tR1v7regYhPbqHv5x2IkLS938oPab5uPUfmvbedHr1EF93snuF0V/3OrYLqw5gJXA1fvL6zyoz9vo3EX+tmoGfgicUn/+N8AXurlm4CxgPbVrL0HtTQof74aaG/r+DbtfMO/aY3AvNVdyDLZb96C2lo7Djn5z3fqg9q6an1F7d8Vn6usuAy5r+IFYVm9/BOjb29hurhl4C7Up8cPAQ/XH/G6uedA2WvrB7oaagTOBdfXX+ibgqP2g5s8CPwUeBb4BHNolNZ9A7bfv3wDP1Z8fMdTYbq65ymOw3de6YRstHYfeKkaSVITXYCRJRRgwkqQiDBhJUhEGjCSpCANGklSEASONUP1uyZc3LE+KiBsK7evdEfFf99Hn7yLivBL7l0bCtylLI1S/j9T3MvO0DuzrR8CCzPzlXvq8Hrg2M/+4dD1SK5zBSCO3FHhDRDwUEV+IiCkR8ShARFwSETdFxHcj4omIuCIirqzf+HJtRBxd7/eGiLgtIu6PiB9GxB8N3klEnAy8lJm/jIgJ9e2Nq7cdERFPRsS4zPw5cExEnNDB10AakgEjjdwS4N8y88zM/E9N2k8D/ozaLdL/Fvht1m58+a/AxfU+y6ndjuVNwFXA3zfZzpuBxtu7/4Da7V4ALgK+nbV7h1Hv9+Y2vy9pVIytugDpAHZXPRBeiIjnge/W1z8CnFG/m+45wD9H7LrJ7aFNttND7db/O32N2i3TbwI+AHykoe1ZandClipnwEjlvNTw/HcNy7+jduz9HvBcZp65j+38X+B1Oxcy85766bi3AmMy89GGvuPr/aXKeYpMGrkXqH3k7Yhk7TNAnoiIPwWImn/XpOsGYNqgdSuBfwKuH7T+ZGo3qpQqZ8BII5SZ24F7IuLRiPjCCDfzfuBDEfETarfKb/Zxv3cDb4yG82jAN4GjqIUMsOszRqZRu4OzVDnfpiztByLiS8B3M/P79eU/ARZm5l809HkPMCsz/0tFZUq78RqMtH/4HLUPBCMi/hdwAbXP9Wg0Fvhih+uShuQMRpJUhNdgJElFGDCSpCIMGElSEQaMJKkIA0aSVMT/AxawhCPk7KksAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAEGCAYAAABGnrPVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAWK0lEQVR4nO3dfZBddZ3n8fd3kkCGITwT6NDB9JjAJAEWY2+IaKGCmQrRSVRmLDLOEHyiIuLDMqybGWt3xtoaTZXjLrpmpIJIJY47KRflQSvARMDFwgkSHgRCjMkAkg4tiVGQrMuj3/3j3mRvOjfdN31/9yHk/aq61fec8/2d8+2bPvn0Oef2uZGZSJJUyu91ugFJ0muLwSJJKspgkSQVZbBIkooyWCRJRY3tdAPtdMIJJ+SUKVM63YYkHVTuv//+X2bmiY3WH1LBMmXKFNavX9/pNiTpoBIRPz+Qek+FSZKKMlgkSUUZLJKkog6payySNJyXX36ZgYEBXnjhhU630hHjx4+nt7eXcePGNbUeg0WSqgYGBpgwYQJTpkwhIjrdTltlJjt37mRgYIC+vr6m1uWpMEmqeuGFFzj++OMPuVABiAiOP/74IkdrBosk1TgUQ2W3Ut+7wSJJKspgkaQOOvfcc+vOv/TSS7nhhhva3E0ZBoskddCPfvSjTrdQnO8Kk6QOOvLII9m1axeZycc//nHuvPNO+vr6OJg/3dcjFknqAjfeeCObNm3ikUce4dprrz2oj2QMFknqAnfffTeLFi1izJgxTJo0ifPPP7/TLY2awSJJXeK18lZng0WSusB5553H6tWrefXVVxkcHOSuu+7qdEuj5sV7SeoC73nPe7jzzjs588wzOe2003jrW9/a6ZZGzWCRpA7atWsXUDkN9pWvfKXD3ZThqTBJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCSpi2zdupW3v/3tTJ8+nZkzZ/KlL31pn5rM5BOf+ARTp07lrLPO4oEHHuhAp/vn37FIUhcZO3YsX/ziF5k1axbPP/88b3zjG5k7dy4zZszYU3PrrbeyefNmNm/ezL333stHP/pR7r333g52vbeOHrFExLyI2BQRWyJiaZ3lERFfri5/OCJmDVk+JiIejIjvta9rSWqdnp4eZs2q/Fc3YcIEpk+fzrZt2/aqufnmm7nkkkuICObMmcOzzz7L4OBgJ9qtq2NHLBExBlgOzAUGgPsi4pbMfKym7EJgWvVxDvDV6tfdPglsBI5qS9OSDhmf/e4GHnv6N0XXOWPSUfztn8xsuP7JJ5/kwQcf5Jxzztlr/rZt25g8efKe6d7eXrZt20ZPT0+xXpvRySOW2cCWzHw8M18CVgMLh9QsBFZlxTrgmIjoAYiIXuCdwNfa2bQktcOuXbu46KKLuPrqqznqqL1/d673IWDddGfkTl5jOQXYWjM9wN5HI/urOQUYBK4GPg1MGG4jEXEZcBnAqaee2lTDkg4dB3JkUdrLL7/MRRddxPvf/37e+9737rO8t7eXrVv//3+NAwMDTJo0qZ0tDquTRyz14nVoDNetiYh3Adsz8/6RNpKZKzKzPzP7TzzxxNH0KUltk5l86EMfYvr06Vx55ZV1axYsWMCqVavITNatW8fRRx/dNafBoLNHLAPA5JrpXuDpBmv+FFgQEfOB8cBREfFPmfkXLexXklrunnvu4Rvf+AZnnnkmZ599NgCf+9zneOqppwBYsmQJ8+fPZ82aNUydOpUjjjiC66+/voMd76uTwXIfMC0i+oBtwMXAnw+puQW4IiJWUzlN9lxmDgJ/XX0QEW8DrjJUJL0WvOUtb6l7DaVWRLB8+fI2dXTgOhYsmflKRFwB3A6MAb6emRsiYkl1+TXAGmA+sAX4LfCBTvUrSWpMR/9AMjPXUAmP2nnX1DxP4GMjrOMHwA9a0J4kaRS8pYskqSiDRZJUlMEiSSrKYJEkFWWwSFIX+eAHP8jEiRM544wz9sz71a9+xdy5c5k2bRpz587l17/+9Z5ln//855k6dSqnn346t99+e911Dje+FQwWSeoil156Kbfddtte85YtW8YFF1zA5s2bueCCC1i2bBkAjz32GKtXr2bDhg3cdtttXH755bz66qv7rHN/41vFYJGkLnLeeedx3HHH7TXv5ptvZvHixQAsXryYm266ac/8iy++mMMPP5y+vj6mTp3Kj3/8433Wub/xreIHfUlSPbcuhV88UnadJ58JFx740cIzzzyz515gPT09bN++HajcPn/OnDl76nbfPr/R8a3iEYskHaS69fb5HrFIUj2jOLJolZNOOonBwUF6enoYHBxk4sSJQOO3z9/f+FbxiEWSutyCBQtYuXIlACtXrmThwoV75q9evZoXX3yRJ554gs2bNzN79uyGx7eKwSJJXWTRokW86U1vYtOmTfT29nLdddexdOlS1q5dy7Rp01i7di1Lly4FYObMmbzvfe9jxowZzJs3j+XLlzNmzBgAPvzhD7N+/XqA/Y5vlRjp9syvJf39/bn7hZakoTZu3Mj06dM73UZH1XsNIuL+zOxvdB0esUiSijJYJElFGSySVONQujwwVKnv3WCRpKrx48ezc+fOQzJcMpOdO3cyfvz4ptfl37FIUlVvby8DAwPs2LGj0610xPjx4+nt7W16PQaLJFWNGzeOvr6+Trdx0PNUmCSpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKqqjwRIR8yJiU0RsiYh9PiszKr5cXf5wRMyqzp8cEXdFxMaI2BARn2x/95KkejoWLBExBlgOXAjMABZFxIwhZRcC06qPy4CvVue/AvxVZk4H5gAfqzNWktQBnTximQ1syczHM/MlYDWwcEjNQmBVVqwDjomInswczMwHADLzeWAjcEo7m5ck1dfJYDkF2FozPcC+4TBiTURMAd4A3Fu+RUnSgepksESdeUM/tm3Ymog4Evg28KnM/E3djURcFhHrI2L9ofrhPZLUTp0MlgFgcs10L/B0ozURMY5KqHwzM7+zv41k5orM7M/M/hNPPLFI45Kk/etksNwHTIuIvog4DLgYuGVIzS3AJdV3h80BnsvMwYgI4DpgY2b+t/a2LUkaTsc+mjgzX4mIK4DbgTHA1zNzQ0QsqS6/BlgDzAe2AL8FPlAd/mbgL4FHIuKh6ry/ycw1bfwWJEl1RObQyxqvXf39/bl+/fpOtyFJB5WIuD8z+xut9y/vJUlFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBU1YrBExMQ6804vsfGImBcRmyJiS0QsrbM8IuLL1eUPR8SsRsdKkjqjkSOWH0bE+3ZPRMRfATc2u+GIGAMsBy4EZgCLImLGkLILgWnVx2XAVw9grCSpA8Y2UPM2YEVE/BlwErARmF1g27OBLZn5OEBErAYWAo/V1CwEVmVmAusi4piI6AGmNDC2mHX/+BEmPLuxFauWpJb6+djXs/LoJcyYdBR/+ycz27LNEY9YMnMQuA14E5X/0Fdl5q4C2z4F2FozPVCd10hNI2MBiIjLImJ9RKzfsWNH001LkoY34hFLRKwFBoEzgF7g6xFxd2Ze1eS2o868bLCmkbGVmZkrgBUA/f39dWtGMufya0czTJI6biYwv83bbOQay63A32Tms5n5KHAu8FyBbQ8Ak2ume4GnG6xpZKwkqQMaCZYJwO0R8cOI+BhwfGb+1wLbvg+YFhF9EXEYcDFwy5CaW4BLqu8OmwM8Vz0118hYSVIHNHKN5bOZORP4GDAJ+N8R8f1mN5yZrwBXALdTeUPAtzJzQ0QsiYgl1bI1wOPAFuBa4PLhxjbbkySpeY28K2y37cAvgJ3APn/bMhqZuYZKeNTOu6bmeVIJtIbGSpI6r5E/kPxoRPwAuAM4AfhIZp7V6sYkSQenRo5YXgd8KjMfanEvkqTXgBGDJTO9XYokqWHehFKSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBXVkWCJiOMiYm1EbK5+PXY/dfMiYlNEbImIpTXzvxARP42IhyPixog4pm3NS5KG1akjlqXAHZk5DbijOr2XiBgDLAcuBGYAiyJiRnXxWuCMzDwL+Bnw123pWpI0ok4Fy0JgZfX5SuDddWpmA1sy8/HMfAlYXR1HZv5LZr5SrVsH9La2XUlSozoVLCdl5iBA9evEOjWnAFtrpgeq84b6IHBr8Q4lSaMytlUrjojvAyfXWfSZRldRZ14O2cZngFeAbw7Tx2XAZQCnnnpqg5uWJI1Wy4IlM9+xv2UR8UxE9GTmYET0ANvrlA0Ak2ume4Gna9axGHgXcEFmJvuRmSuAFQD9/f37rZMkldGpU2G3AIurzxcDN9epuQ+YFhF9EXEYcHF1HBExD/hPwILM/G0b+pUkNahTwbIMmBsRm4G51WkiYlJErAGoXpy/Argd2Ah8KzM3VMd/BZgArI2IhyLimnZ/A5Kk+lp2Kmw4mbkTuKDO/KeB+TXTa4A1deqmtrRBSdKo+Zf3kqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkooyWCRJRRkskqSiDBZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIkorqSLBExHERsTYiNle/HrufunkRsSkitkTE0jrLr4qIjIgTWt+1JKkRnTpiWQrckZnTgDuq03uJiDHAcuBCYAawKCJm1CyfDMwFnmpLx5KkhnQqWBYCK6vPVwLvrlMzG9iSmY9n5kvA6uq43f478GkgW9inJOkAdSpYTsrMQYDq14l1ak4BttZMD1TnERELgG2Z+ZORNhQRl0XE+ohYv2PHjuY7lyQNa2yrVhwR3wdOrrPoM42uos68jIgjquv440ZWkpkrgBUA/f39Ht1IUou1LFgy8x37WxYRz0RET2YORkQPsL1O2QAwuWa6F3gaeD3QB/wkInbPfyAiZmfmL4p9A5KkUenUqbBbgMXV54uBm+vU3AdMi4i+iDgMuBi4JTMfycyJmTklM6dQCaBZhookdYdOBcsyYG5EbKbyzq5lABExKSLWAGTmK8AVwO3ARuBbmbmhQ/1KkhrUslNhw8nMncAFdeY/DcyvmV4DrBlhXVNK9ydJGj3/8l6SVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKkog0WSVJTBIkkqymCRJBVlsEiSijJYJElFGSySpKIMFklSUQaLJKmoyMxO99A2EbED+Pkoh58A/LJgO+1gz+1hz+1hz+1Rr+fXZeaJja7gkAqWZkTE+szs73QfB8Ke28Oe28Oe26NEz54KkyQVZbBIkooyWBq3otMNjII9t4c9t4c9t0fTPXuNRZJUlEcskqSiDBZJUlEGCxAR8yJiU0RsiYildZZHRHy5uvzhiJjV6Nhu6zkiJkfEXRGxMSI2RMQnu7nfmuVjIuLBiPheO/pttueIOCYiboiIn1Zf6zcdBD3/h+rPxKMR8c8RMb5Lev6jiPjXiHgxIq46kLHd1nOn9r9meq5Z3vg+mJmH9AMYA/wb8IfAYcBPgBlDauYDtwIBzAHubXRsF/bcA8yqPp8A/KzVPTfTb83yK4H/CXyv238uqstWAh+uPj8MOKabewZOAZ4Afr86/S3g0i7peSLw74G/B646kLFd2HPb979me65Z3vA+6BELzAa2ZObjmfkSsBpYOKRmIbAqK9YBx0RET4Nju6rnzBzMzAcAMvN5YCOV/1S6sl+AiOgF3gl8rcV9Fuk5Io4CzgOuA8jMlzLz2W7uubpsLPD7ETEWOAJ4uht6zsztmXkf8PKBju22nju0/zXVMxz4PmiwVP5Rt9ZMD7DvP/T+ahoZ2wrN9LxHREwB3gDcW77FA+tlhJqrgU8Dv2tRf/U00/MfAjuA66unDr4WEX/QymZH6GfEmszcBvwD8BQwCDyXmf/Swl6H7acNY5tRZLtt3P+g+Z6v5gD2QYOlckpgqKHvwd5fTSNjW6GZnisLI44Evg18KjN/U7C3ekbdb0S8C9iemfeXb2tYzbzGY4FZwFcz8w3A/wHacf6/mdf5WCq/wfYBk4A/iIi/KNxfPc3sQ928/w2/gvbuf9BEz6PZBw2WSnJPrpnuZd9TAPuraWRsKzTTMxExjsoP9Tcz8zst7HPEXhqoeTOwICKepHL4fn5E/FPrWh2xn0ZqBoCBzNz9m+gNVIKm1Zrp+R3AE5m5IzNfBr4DnNvCXkfqp9Vjm9HUdjuw/0FzPR/4Ptjqi0bd/qDy2+XjVH5T231Ra+aQmney9wXPHzc6tgt7DmAVcPXB8BoPqXkb7bt431TPwA+B06vP/w74Qjf3DJwDbKBybSWovPng493Qc03t37H3hfCu3f+G6bnt+1+zPQ9Z1tA+2LZvrJsfVN4p8zMq75r4THXeEmBJzQ/D8uryR4D+4cZ2c8/AW6gcAj8MPFR9zO/Wfoeso6Ef6m7oGTgbWF99nW8Cjj0Iev4s8FPgUeAbwOFd0vPJVH7j/g3wbPX5Ufsb2809d2r/a/Z1rllHQ/ugt3SRJBXlNRZJUlEGiySpKINFklSUwSJJKspgkSQVZbBIo1S9g/HlNdOTIuKGFm3r3RHxX0ao+YeIOL8V25cOhG83lkapeq+n72XmGW3Y1o+ABZn5y2FqXgdcm5l/3Op+pOF4xCKN3jLg9RHxUER8ISKmRMSjABFxaUTcFBHfjYgnIuKKiLiyelPKdRFxXLXu9RFxW0TcHxE/jIg/GrqRiDgNeDEzfxkRE6rrG1dddlREPBkR4zLz58DxEXFyG18DaR8GizR6S4F/y8yzM/M/1ll+BvDnVG5Z/vfAb7NyU8p/BS6p1qygcuuUNwJXAf9YZz1vBmpvtf4DKrdmAbgY+HZW7u9Fte7NTX5fUlPGdroB6TXsrmoQPB8RzwHfrc5/BDireofbc4H/FbHn5rOH11lPD5Xb8O/2NSq3ML8J+ADwkZpl26ncnVjqGINFap0Xa57/rmb6d1T2vd8Dns3Ms0dYz/8Fjt49kZn3VE+7vRUYk5mP1tSOr9ZLHeOpMGn0nqfy8bKjkpXP4XgiIv4M9nwe/b+rU7oRmDpk3irgn4Hrh8w/jcpNJKWOMVikUcrMncA9EfFoRHxhlKt5P/ChiPgJldvW1/to3buBN0TN+TLgm8CxVMIF2PM5H1Op3FVZ6hjfbiwdBCLiS8B3M/P71ek/BRZm5l/W1LwHmJWZ/7lDbUqA11ikg8XnqHwYFxHxP4ALqXy+Rq2xwBfb3Je0D49YJElFeY1FklSUwSJJKspgkSQVZbBIkooyWCRJRf0/eWhzqnV1OZoAAAAASUVORK5CYII=\n", "text/plain": [ "
    " ] @@ -465,33 +465,41 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'vx' (time (y): 198)>\n",
    -       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
    -       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
    +       "
    <xarray.DataArray 'vx' (time (y): 199)>\n",
    +       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0., nan])\n",
            "Coordinates:\n",
            "    id        float64 100.0\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348
  • " ], "text/plain": [ - "\n", - "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", + "\n", + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., nan])\n", "Coordinates:\n", " id float64 100.0\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1335 0.1342 0.1348" + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1342 0.1348 0.1355" ] }, "execution_count": 7, diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index a44fba3b3..374fb0048 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -140,6 +140,8 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) end if do j = 1, nloops lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) + pl%lmask(:) = pl%status(:) == ACTIVE + tp%lmask(:) = tp%status(:) == ACTIVE call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then @@ -153,6 +155,8 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call tp%drift(system, param, dtl) if (lencounter) call system%recursive_step(param, t+dth,irecp) + pl%lmask(:) = pl%status(:) == ACTIVE + tp%lmask(:) = tp%status(:) == ACTIVE call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then From 479cb337965279a26a3a474e98e2381d926edba0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 15:54:03 -0400 Subject: [PATCH 128/194] Moved mask setting into implemntations. Created a level setting method for symba systems. --- .../swiftest_vs_swifter.ipynb | 2 +- .../8pl_16tp_encounters/cb.swiftest.in | 4 +- .../8pl_16tp_encounters/param.swifter.in | 4 +- .../swiftest_symba_vs_swifter_symba.ipynb | 27 ++-- src/helio/helio_coord.f90 | 8 ++ src/helio/helio_drift.f90 | 6 + src/helio/helio_gr.f90 | 12 +- src/helio/helio_kick.f90 | 10 +- src/helio/helio_step.f90 | 1 + src/modules/symba_classes.f90 | 37 +++++- src/obl/obl.f90 | 6 + src/orbel/orbel.f90 | 2 + src/rmvs/rmvs_discard.f90 | 2 + src/rmvs/rmvs_encounter_check.f90 | 2 + src/rmvs/rmvs_kick.f90 | 2 + src/rmvs/rmvs_util.f90 | 5 +- src/symba/symba_drift.f90 | 52 ++++++++ src/symba/symba_encounter_check.f90 | 10 +- src/symba/symba_kick.f90 | 10 +- src/symba/symba_setup.f90 | 6 +- src/symba/symba_step.f90 | 120 +++++++++++------- src/symba/symba_util.f90 | 5 + src/whm/whm_coord.f90 | 9 +- src/whm/whm_drift.f90 | 4 +- src/whm/whm_gr.f90 | 6 +- src/whm/whm_kick.f90 | 6 +- src/whm/whm_util.f90 | 2 + 27 files changed, 270 insertions(+), 90 deletions(-) create mode 100644 src/symba/symba_drift.f90 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index 9796e3374..dc1a9992f 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -43,7 +43,7 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.369e-03\n", + "Reading in time 6.845e-04\n", "Creating Dataset\n" ] }, diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in index 81c636655..2e8d49f62 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/cb.swiftest.in @@ -1,5 +1,5 @@ 0 0.00029591220819207774 0.004650467260962157 -4.7535806948127355e-12 --2.2473967953572827e-18 +0.0 +0.0 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in index d87472e35..f9305cfa2 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/param.swifter.in @@ -22,5 +22,5 @@ EXTRA_FORCE NO BIG_DISCARD NO CHK_CLOSE YES RHILL_PRESENT YES -J2 4.7535806948127355e-12 -J4 -2.2473967953572827e-18 +J2 0.0 +J4 0.0 diff --git a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb index c76e792f3..b348d1f81 100644 --- a/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb +++ b/examples/symba_swifter_comparison/8pl_16tp_encounters/swiftest_symba_vs_swifter_symba.ipynb @@ -104,7 +104,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAElCAYAAADnZln1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABHBUlEQVR4nO29eZxcZZX//z619JqNJQFCCGEnwEgIAVQWWQYEZVQ2HQRHHEbU0Rn9KjKoM4rOzwEdRXDUcRAFFYY4LoyAwKCAsrhg2ASEKEuUsKUJhCTdndR2fn/ceyu3qu9aXVt3nffrVa9UV93l1O3OuZ/6POc5j6gqhmEYxvQn0+kADMMwjPZgCd8wDKNHsIRvGIbRI1jCNwzD6BEs4RuGYfQIlvANwzB6BEv4PYaIXCAiV7nPF4rIRhHJdjquKETkcBFZ2ek4ID6Wdl5TEfm5iPyd+/wMEbnF996hIvJHN5a3iMh2InKHiGwQkS+2OjajO7GEP8UQkVUi8pd1r50lInelPZaq/llVZ6hquXkRpkNEVER2j9pGVe9U1b3aFVMU9bHU/z46dU1V9WpVPc730meAr7ix/C9wDvAiMEtVP9LO2IzuwRK+0dWISK7TMUxRdgYeqfv599rATEv7HUwfLOFPQ0Rkvoj8UERGROQpEfnHkO0WuQo759vvOhF5SUQeF5F3+7bNisjHReQJ1xa4V0R2ct/bW0R+6u63UkTe6tvvShH5qoj8xN3vNyKym/veHe5mD7rWw9tE5EgRWS0i/yQizwNXeK/5jrmTiPzI/XxrReQrIZ/vAhH5gYh8zz33fSKyv+/9xa4tsk5EHhGRN/nee4OI/N7d7xkROdd9vRqLiHwXWAhc78Z/XspreoGI/I+IfMc9zyMisizi93qsiDwmIq+4n1l871W/5YnIE8CuvriuAd4JnOf+/JcikhGR893f51o3jq3r/i7OFpE/A7e5r/+tiDwqIi+LyP+JyM6+86uIvNe1kV52f+f++N7t7rvBva5Lfdcn8G9VRA4WkRUisl5EXhCRi8OujZEQVbXHFHoAq4C/rHvtLOAu93kGuBf4JNCH8x//SeD17vsXAFe5zxcBCuTcn38BfA0YAJYAI8Ax7nsfBR4C9sJJNPsD2wDDwNPAu4AcsBTHOtjX3e9K4CXgYPf9q4HlvtgV2N3385FACfgc0A8Muq+tdt/PAg8CX3LPPQAcFnKtLgCKwKlAHjgXeMp9ngceBz7uXqejgQ3AXu6+zwGHu8+3Apb64lsd9vtIeU0vADYBb3A/14XAr0M+y7bAet9n+X/udfq7+r+BkLiuBP4/388fAn4NLHCv838B19R9hu+413gQeIt7vRa7v8d/Bn5Z93u8AZiDcxMcAY533zsNeAY4COdvZ3ecbxxxf6u/At7hPp8BvLrT//+m+qPjAdgj5S/M+Y+8EVjne4yxJeEfAvy5bp+PAVe4zy8gIOEDOwFlYKZvvwuBK93nK4E3B8TzNuDOutf+C/iU+/xK4HLfe28AHvP9HJTwC8BA3Wtewn+Nm0xyCa7VBfgSqJtgngMOdx/PAxnf+9cAF7jP/wy8B8fzJigW3+8jMOEnuKYXAD/zvbcPMB7yWf6m7rMIsJrGE/6juDce9+cdcG6OOd9n2NX3/k3A2XXXcgzY2fd7PMz3/v8A57vP/w/4YMBnivtbvQP4NLBtp//fTZeHWTpTk7eo6hzvAfy9772dgfmuTbFORNbhqNjtYo45H3hJVTf4XvsTsKP7fCfgiYD9dgYOqTvfGcD2vm2e9z0fw1FrUYyo6qaQ93YC/qSqpZhjeDztPVHVCk6SnO8+nnZf8/B/3lNwbk5/EpFfiMhrEp7PT9w1hYnXZkCCPfP5dZ9F/T83wM7Atb7f2aM4Nyf/38nTddtf6tv+JZybTtRn8X7PUX87UX+rZwN7Ao+JyG9F5MTUn9KowQZjph9PA0+p6h4p93sW2FpEZvoS1EKcr+LecXcDHg443y9U9dhGAw4gamDxaWChiOQSJv2dvCciksGxMJ713hORjC/pLwT+AKCqvwXeLCJ54AM4irV6rISxxl3TNDxX91kkJJ6kPA38rareXf+GiCxyn2rd9p9V1asbPNduIa+H/q2q6h+B093f28nAD0RkG1UdbSAGAxu0nY7cA6x3Bz0HxRls3U9EDoraSVWfBn4JXCgiAyLyKhyF5f0Hvxz4VxHZQxxeJSLb4Pi2e4rIO0Qk7z4OEpHFCeN9Ace7TfP5ngMuEpFhN9ZDI7Y/UEROdlXzh4DNON71b4BRnIHMvIgcCfwVsFxE+sSpa5+tqkUc7zyszDI0/gTXNA0/Afb1fZZ/pPZbVFq+DnzWG3gVkbki8uaY7T8mIvu6288WkdMSnuty4FwROdD929ndPW/k36qInCkic90b8jr3WB0rIZ4OWMKfZqhT//1XOAOET+EMoF4OzE6w++k4/u2zwLU4PvxP3fcuxlG5t+AkwG8Cg65yPQ74a3e/59ky4JqEC4Bvu1/p3xq3se/z7Y7js6/GGUcI48fu+y8D7wBOVtWiqhaANwEn4FyjrwF/o6qPufu9A1glIuuB9wJnhhz/QuCf3fjPDXg/6pomRlVfxBn8vAhYC+wBTFDnKbgUuA64RUQ24NwED4k4/7U4v9fl7jV5GOfaJYn9+8Bngf/GGRj/X2DrBH+rxwOPiMhGN96/jrD6jASIOzhiGNMOEbkAZ0A4LFkbRk9hCt8wDKNHsIRvGIbRI5ilYxiG0SOYwjcMw+gRLOEb0wYJ6CQ6XZC6Hj2G0QiW8I0phZv0RsVpAvaMiFwsbe7nLwlaOhtGN2IJ35iK7K+qM4BjgLcD747Z3jAMLOEbUxh3ktSdwH7177mtdX/lToh6TkS+IiJ9vvfj2vkGtgKW4JbO24rIDe65XhKRO912ABMQkde6fWFecf99re+9n4vIv4rI3eK0Eb5FRLYNOMZpInJv3WsfEZH/TXcFjV7DEr4xZRGRfXC6Xt4f8HYZp4XwtjgdNo+htskcwIk4LXv3B94KvN497ltwmnidDMzFualcA6CqR7j77q/OalLfAz6CM+N3Lk7jr48T0GNHnH7zPwG+jNNa+mLgJ26LCo+347SanofTMjho9u51wC517SvOBL4bsK1hVOn6hC8i3xKRNSJS37SrkWMtcVXfIyLyOxF5m++9XcRZnOOP4iyY0Rd1LKOj3CciLwPX40zFv6J+A1W9V1V/raolVV2F07L5dXWbXaSq61T1z8DtOFP8wWmLfKGqPuo2aPs3YIn4Fvyoo4jTXnhnt23DnRpc7/xG4I+q+l03rmuAx3DaC3hcoap/UNVxnFYWS+oPoqqbge/htntw+9sswulrZBihdH3Cx+njfXyTjjWG0y9lX/eYl4jIHPe9zwFfcjv3vYzT5MroTpaq6laqupuq/nNdi2MARGRP12Z53u398m84at9PWDvfJK2A/fw7zuIgt4jIkyJyfsh283HaI/uJa5cc1kr628DbXRvqHcD/uDcCwwil6xO+qt6B8x+uiojsJiI3i7PM3p0isnfCY/3BbbmKqj4LrAHmuv9pjgZ+4G76bZwVfoypy3/iqOc9VHUWjs0i0btUeRp4j3/NAVUdVNVfBm2sqhtU9SOquiuOWv+wiBwTsOmzODcTPw21S1bVX+MsFHM4jg1kdo4RS9cn/BAuA/5BVQ/E8Ti/lvYAInIwjkf6BI6fus7XX3014WrOmBrMxOnqudEVBO9LsW9cK+CalsgicqLb8lfY0ko5qI3vjTitpN8uIjnXUtyHxq2Y7wBfAUqqeleDxzB6iCk3iUNEZgCvBb7vK6rod987GfhMwG7PqOrrfcfYAUcRvVNVK/7qDB/Wc2Jqcy6OMDgPZ1D3ezjf4mJR1Wvdv7Plrm//CvBT4PvuJhfgtHQeBM7BEQdfwRm0fRn4mqr+POC4a8VZtelSnG8gjwMnuq2PG+G7wL+6D8OIZUr00hFnBZ4bVHU/EZkFrFTVHRo81izg5ziDct93XxOcdVK3V9WSOMvZXeC/SRhGt+HecNbgjGn8sdPxGN3PlLN0VHU98JT3FVsc9k+yr1t5cy3wHS/Zu8dUnCqNU92X3omzcIZhdDPvA35ryd5IStcrfBG5BjgSp8LiBeBTwG04X4l3APLAclUNsnLqj3UmTgnfI76Xz1LVB0RkV2A5sDWOBXCmVT0Y3YqIrMIZhH6LqgbNQzCMCXR9wjcMwzCaw5SzdAzDMIzG6OoqnW233VYXLVrU6TAMwzCmDPfee++Lqjo36L2uTviLFi1ixYoVnQ7DMAxjyiAi9bO5q5ilYxiG0SNYwjcMw+gRLOEbhmH0CF3t4QdRLBZZvXo1mzZt6nQooQwMDLBgwQLy+XynQzEMw6gy5RL+6tWrmTlzJosWLSK4BU5nUVXWrl3L6tWr2WWXXTodjmEYRpUpZ+ls2rSJbbbZpiuTPYCIsM0223T1NxDDMHqTKZfwga5N9h7dHp9hGL3JlLN0DMMwpgIbChtY/thyNpc3s3DWQvaYswcbixs5aPuDOhZTTyb81772tfzylxMXLzrrrLM48cQTOfXUUwP2MgzDSM5dz9zFl+//8oTXH3rnQx2IxmFKWjqTJSjZG4ZhNJNNJWcc75o3XkMu0x3auicT/owZzrrQqsoHPvAB9tlnH974xjeyZs2aDkdmGMZ0oVgpArDd0HYcv+h4APoyfZ0MqTcTvse1117LypUreeihh/jGN75hyt8wjKbhJfy+bB//8up/4aTdT6KkJTrZkr6nE/4dd9zB6aefTjabZf78+Rx9dKIlTw3DMGIplAsA5DN5hvJD7DxrZypaYVO5cyXbPZ3wwUooDcNoDZ7Cz2edGffD+WEARoujHYuppxP+EUccwfLlyymXyzz33HPcfvvtnQ7JMIxpgqfwc+IM2HoJf6w41rGYumPouEOcdNJJ3HbbbfzFX/wFe+65J6973es6HZJhGNOEYqVIX6av6iIM5YeAzir8nkz4GzduBBw75ytf+UqHozEMYzpSKBeqdg70mKUjInuJyAO+x3oR+VC7zm8YhtFOPIXvMZxzLZ1SD1g6qroSWAIgIlngGeDadp3fMAyjnRQrRfKZiQp/Y2Fjp0Lq2KDtMcATqhq69qJhGMZUJtTSKfWApVPHXwPXBL0hIueIyAoRWTEyMtLmsAzDMJpDmMLvZJVO2xO+iPQBbwK+H/S+ql6mqstUddncuXPbG5xhGEaTKJQL9GW3ePjdUKXTCYV/AnCfqr7QgXMbhmG0hfpB24xkGMwN9lzCP50QO2eq8Ld/+7fMmzeP/fbbr9OhGIbRpRTLxRoPHxxbp2cSvogMAccCP2rneZvNWWedxc0339zpMAzD6GLqFT44Cb9nZtqq6hiwTTvP2QqOOOIIVq1a1ekwDMPoAGvG1rD8seWUtFR97Ygdj2DZ9stqtiuUCwzmB2teG8oNdbRKZ0rPtP309Y/w+2fXN/WY+8yfxaf+at+mHtMwjOnDDU/ewDce+gb92X7ASey/X/t7Lt/+8prtwhS+tVYwDMOYIqwZW8Nwfphfv/3XALzr5ndRqpQmbFeoFGrKMsFJ+GvGOrfQ0pRO+KbEDcNoN2vG1jBvaF7156xkKVQKE7Yrlos1ZZnglGb2zKCtYRjGVGdkbIR5g1sSfkYylCvlCduFKXxL+FOM008/nde85jWsXLmSBQsW8M1vfrPTIRmG0SZGxkeYO7RlUmg2k6WsExN+qVKaoPCHc8O90TxtOnHNNVN6GoFhGA2iqqwZW1Ob8CVLRSsTti2UgxX+eGmcUqVELtP+9GsK3zAMIyHrNq+jWClOtHQCFH6xMnHilddeoVMq3xK+YRhGQrwKG7/Cz2VyEzx8VQ1V+NC5BmqW8A3DMBIyMu508N1uaLvqa0EKv6QlFA2sw4fONVCzhG8YhpGQlze9DMBWA1tVX8tIZoKHXywXAQJ76YAlfMMwjK5nvDQObEnc4Aza1iv8YsVJ+KbwDcMwpiie9z6Y29IjJzLh15dlmoc/tXj66ac56qijWLx4Mfvuuy+XXnppp0MyDKNNeNU1A9mB6mvZTJZKpdbSKZSdmbcTBm1znV3m0OrwU5LL5fjiF7/I0qVL2bBhAwceeCDHHnss++yzT6dDMwyjxYyXxhnMDZLNZKuvBQ3aego/rCzTLJ0pwg477MDSpUsBmDlzJosXL+aZZ57pcFSGYbSDseJYjZ0DwZZOqMLvsIc/tRX+TefD8w8195jb/wWccFGiTVetWsX999/PIYcc0twYDMPoSjyF7yfNoG1/tp+sZM3Dn2ps3LiRU045hUsuuYRZs2Z1OhzDMNrAWGmiwg8qy6wq/DpLR0Q62jFzaiv8hEq82RSLRU455RTOOOMMTj755I7EYBhG+xkrjlV9eI+gXjphCh862zGz3WvazhGRH4jIYyLyqIi8pp3nbwaqytlnn83ixYv58Ic/3OlwDMNoI4GWTiY7YQGUsIlX4FTq9ETCBy4FblbVvYH9gUfbfP5Jc/fdd/Pd736X2267jSVLlrBkyRJuvPHGTodlGEYbGCuNMZSbugq/bZaOiMwCjgDOAlDVAjBxmZgu57DDDkNVOx2GYRgdIMjSCSrL9FbACmqBPJTv3ELm7VT4uwIjwBUicr+IXC4iw/Ubicg5IrJCRFaMjIy0MTzDMIxowqp0gBqV7w3a1s+0BUfh90KVTg5YCvynqh4AjALn12+kqpep6jJVXTZ37tz6tw3DMDpGoKXjTsLyt0iuTrzKBHj4PTJouxpYraq/cX/+Ac4NwDAMo+upaIVNpU2BZZlAja0TpfCHcp0ry2xbwlfV54GnRWQv96VjgN+36/yGYRiTYVNpE4oGlmVCraUTN2g7VhzryFhgu+vw/wG4WkT6gCeBd7X5/IZhGA3hNU6rt3Q8hV/SLaWZkWWZ+WFKWqJQKdCf7W9VuIG0NeGr6gPAsnae0zAMoxl4vfDrLR2vEsffMTNO4YPTT6fdCd9aK6Rk06ZNHHzwwey///7su+++fOpTn+p0SIZhtAGvsiaoLBPqPPyIssxONlCb2q0VOkB/fz+33XYbM2bMoFgscthhh3HCCSfw6le/utOhGYbRQsIUfqCHXy6Sz+QRkQnH6eQiKKbwUyIizJgxA3B66hSLxcBfqmEY04u4hF+v8INKMqGzPfGntML/3D2f47GXHmvqMffeem/+6eB/itymXC5z4IEH8vjjj/P+97/f2iMbRg8QVlsfZOkUy8XAkkzorKVjCr8BstksDzzwAKtXr+aee+7h4Ycf7nRIhmG0GK9BWn3C9yZe1Q/ahin8Ti5zOKUVfpwSbzVz5szhyCOP5Oabb2a//fbraCyGYbQWT+HXD8QGKvxKAoVfMIXf9YyMjLBu3ToAxsfH+dnPfsbee+/d2aAMw2g5YQo/J84NoH6mrXn404DnnnuOd77znZTLZSqVCm9961s58cQTOx2WYRgtJo3CL5QLgZOuwKfwzdLpfl71qldx//33dzoMwzDqUFW+/uDXGRl3uuzO6Z/D+5e8v+qxh7F2fC2XP3Q5m8uba14/aqejOHzB4dWfQz38kNYKYQo/l8nRn+3vSFmmJXzDMKYFa8bW8LUHv8ZwfpgMGTYUN3Diriey65xdI/e7+9m7uerRq9iqf6uqWn+l8ApPvvJkTcIPU/hB3TILlULgLFuPwdxgtcyznVjCNwxjWuB1qPz4IR9nODfMh37+oeqM1yg2FjYCcO2br2WbwW0A+MCtH2DN2Jqa7aoKP5usLDPM0gGn5YJ3A2knNmhrGMa0wN+/xku2XhOzKLymaJ63Du6qVHWDqlWFL3UKP8TSiVL4+Ww+UWzNxhK+YRjTAk/N5zP5qn+eROGPFkfJSramkVnQIiWpFH4lWuHnM/lEsTUbS/iGYUwL/C2JvRr4JLbJaHGUofxQTYuU4dxwVflXjx+i8D1Pv8bDjyjL9GI0hW8YhtEggQq/nEzh++0ccBT+eGm8JomXKiVymdyE3llpJ16BYzuZwp9ClMtlDjjgAKvBN4wuoerhZ/tSKfyx4li13YGHNznKr/K9Dpj1hC1iHqnwM/mODNrGVumIyMKEx1qnqusnGc+U4dJLL2Xx4sWsX98zH9kwuhpPzfsVfhLbJEzhe+/N7JsJOCtaBfW3D1X4EYO2fdm+jlg6Scoyvw0oENUDWIErge9EHUhEVgEbgDJQUtUpufrV6tWr+clPfsInPvEJLr744k6HYxgGdQo/k8LDL41OWNQkqKNlqMIPqMOPK8vMZ/LdWYevqkfVvyYi27uLkjfCUar6YoP71vD8v/0bmx9tbnvk/sV7s/3HPx65zYc+9CE+//nPs2HDhqae2zCMxqkO2mby1WSbxMMfK44xb3BezWtBCT9M4TdalpkktmbTqIf/N02NYgpxww03MG/ePA488MBOh2IYhg9vELQv05e6LLNe4XsLlSdR+GFLHAbdHDy61sMP4c0iMgb8VFVXpthPgVtERIH/UtXL6jcQkXOAcwAWLowePohT4q3g7rvv5rrrruPGG29k06ZNrF+/njPPPJOrrrqq7bEYhrEFf1lmmolXUR6+v99NqVIKTPhemaan8EuVEhWtRFfpZPumlMI/GXgcOElELk+x36GquhQ4AXi/iBxRv4GqXqaqy1R12dy5cxsMr3VceOGFrF69mlWrVrF8+XKOPvpoS/aG0QX4yzI9OyVO4auqU6UTNmjr62hZrBQjB21LWqpu58URxpRS+Kr6AnCz+0iz37Puv2tE5FrgYOCORmIwDMPwU6PwvSqdmKRaqBQoaWlCwg/qWR+m8Os9fE+5x9XhT5leOiLyVRG50n1+XMJ9hkVkpvccOA6Y0msDHnnkkdxwww2dDsMwDGo9/GwmS1aysZaOl9A9z94jsEonTOFnXA/frdJJpPA7NNO2UQ+/ALzgPj8auCXBPtsB17qz1HLAf6tqqm8IhmEYYdQn2r5svIr2lhmsV/gD2QEykknk4XsK3xu09RJ5N860bTThjwGzRSQPJJqYpapPAvs3eD7DMIxIiuUiWclW6+JzmVzswKjn0dcnfBGZ0EAtTOHXWzqJFf5U8fCBl4Bx4KvA3c0LxzAMYwtXP3o1h+94OAtnxevK+v41UT65qnLpfZfyh5f/ADChLBMmdswsVUoM5gYnbFdfllmd8Rsz8aqilWp/nnaRysMXkTkicgVwivvSd4ApOVvWMIzuZrw0zkX3XMT1T16faPtCubb2PWpy0wtjL/DNh7/J7178HbvP2Z3d5+w+YZuB7EDNsodJFb5XrZOXiAVQUvT6aSapbi2quk5ELgIWAS8CrwJ+1IK4DMPocTx1Xd+XPoz62a1RCt/z2c876DzetNubArfJSnZij/uI1gpev3wv8XvKPwh/N8+gbw2topHvEmcDT6nq/wH3NjkewzAMYEuiT7rYd6FcqLFRomrd/atjhZHJZALbI9dTr/CTJPw0vX6aSSMJ/2XgvSKyF/Ag8ICq3t/csLqbRYsWMXPmTLLZLLlcjhUrVnQ6JMOYdkxa4Ud0pPRP0gojK9kJ/XGStFbw/o1U+ClmAjeT1AlfVS8UkVuBPwBLgCOAnkr4ALfffjvbbrttp8MwjGmLl+g3Fjcm2r4+IUctI+ifpBVGRjITLJ1AhZ+pVfiq6rzuKv8gkk4MazapE76IfAbIAg/gqPufNzkmwzCMqpWTxtLxV+lEDdomUfg5ydUk/Ng6/Eqtwq9fGctPmm6ezaQRhf9JEdkOOAA4RUR2U9V3Nz+0eO78nz/w4tPJ7v5J2XanGRz+1j0jtxERjjvuOESE97znPZxzzjlNjcEwjMYsnXqFH9Zz3t87P4ykCr/e0vGUfpTCn0oePsB7cLpd9uRM2bvvvpv58+ezZs0ajj32WPbee2+OOGJCHzjDMCaBNykqacKvH7Tty/bxyuZXQreFaIWfkUyNhx+m8KHW7/f+jVT4Kdo3N5NGE/63gPe5PXGuVtUHmhdScuKUeKuYP38+APPmzeOkk07innvusYRvGE2maumUklk6xUqxpsQxUZVOhMLPZrK1q1iFKHxwEr5Xf+8p/UiF79Xht3nQttH2yP+Ic7PIAV9uXjjdz+joaHWlq9HRUW655Rb222+/DkdlGNOPtJZOvYefpA4/qizTX4evqo7CDxnkzWayVCq1g7aJ6vCniMJ/AtgD+LGq/r8mxtP1vPDCC5x00kkAlEol3v72t3P88cd3OCrDmH54iX5zeXOiFgQTPPyIjpRJ+t34bRpPvXuLndTj9/uTlGV6NyZvsla7aDThPwI8DZwtIv+uqgc1MaauZtddd+XBBx/sdBiGMe3xK/vR4iiz+2dHbl9fhx9Vlpmk340/iceVcfpvDmnKMru+SsdlT2AEuAxnIpZhGEZT8ZdjjhXH4hN+uThh0DbM0kk08SqTXOH77Z80ZZntrtJp1MPfG2ey1bm4688ahmE0E//ygkl8/EKlMHHiVYiCTtKzPivZquUSp/D93waSlGV2SuE3mvDnAP8EnAdsalo0hmEYLjWWTik+4U9ojzxJhe8vy/QSf1SVzlTopdNowv8MzoDtSqASt7FhGEZaxopjzOqbBSRU+OWJCr9UKdXU0nukHbSN295fwpmoW2aHZtomSvgikhWR50Tk7wBUdbWq/sx9fn4rAzQMozcZLY4yb2gekKy9QrE8UeFDsIquXx0riGxmiy8fp/CDLJ1uVPiJBm1VtSwiDwO7TfaEIpIFVgDPqOqJkz2eYRjdw/rCer644os1CXrJvCWcsfiM1MfaWNzIXjP24vF1j3PFw1dw1zN3cd5B5wWuTlXRCiUtTVD44CT3/mx/zfb19k8QWckmXpg8IxluePIG3rbX21J1y/zCii9wzMJjWDBzQWQszSKNpTMEnCciK0TkOvfx4wbO+UHg0Qb26xrWrVvHqaeeyt57783ixYv51a9+1emQDKMreHjkYX70xx/x4MiDPPbSY9z97N18/cGvN3SsQrnAwlkLOWj7gxgZH+GHf/whD734UOC2m0rOUKI/sXvPN5UnDjPWr44VRFBtfViVzlE7HQXAjU/dmFjhL5m7BIC7n2nfKrFpEv5rAAGWAif6HokRkQXAG4HL0+zXbXzwgx/k+OOP57HHHuPBBx9k8eLFnQ7JMLoCLzF+4XVf4PqTrue0PU9LPFM26FgD2QG+9fpvcclRlwDhXr7XfsG/GLn3PGif+pr9IPwevqf0w24SHz3oo8zpn0NFK4mqdESELx/tNCnwN2hrNWnq8HdpwvkuwansmRm2gYicg1vquXBh/MLF7Wb9+vXccccdXHnllQD09fXR1xf9h2MYvUJ9shvOD1OsFCfUyCehXCmTyWSqx4HwhO+97k/4nvUTtE99o7Ug/LX1Xh1+lGrPSAZVTaTw/e93ZcJX1T9N5kQiciKwRlXvFZEjI85zGc6ELpYtW6ZRx7z9ystY86cnJxPWBObtvCtHnRU+teDJJ59k7ty5vOtd7+LBBx/kwAMP5NJLL2V4eDh0H8PoFeonHfkT9ZzsnFTHqmil5sYB4YO3XlL3+/uTVfiBtfURg7wZyVChksjDh4lLI7aDRssyG+FQ4E0isgpYDhwtIle18fxNoVQqcd999/G+972P+++/n+HhYS666KJOh2UYXUF9W4GhnKuyE9TR11PWcjVpxh0nSOEP58JvEmHLFfrxN0SrVumEePgAGRyFn6R5mnd86FKFP1lU9WPAxwBchX+uqp45mWNGKfFWsWDBAhYsWMAhhxwCwKmnnmoJ3zBcohR+GipaQdFqgh3MDZKRTLiH7yZ1L8nHnbu+hDOIoEHbKIUvIlQ0vcL3t2BuNakVvoj8VSsCmSpsv/327LTTTqxcuRKAW2+9lX322afDURlGdxDk4UPyZQo96pOmiDCUG4q1dAI9/IBvBfVtGILwL3HoJeWogVjvBqHEN0/ztofuV/ifBa6fzEnddXB/PpljdJL/+I//4IwzzqBQKLDrrrtyxRVXdDokw+gK6gcsJ6PwoVZRD+WHwgdtS+EefqilEzNoG6jwYxK+qlZvDlHN0/zHaqeH30jCj/4UPcCSJUtYsWJFp8MwjK6jXplHVcpEHqcy0RYZzg/HWjoz8jOqr1V9/5AqHf/qWEH4e+lUFX6CQdskZZng3BDq181tNY0M2kZWzhiG0bt4dsZkFX6Qoh7ODccO2voVfjaTZTA3GF6lE+Ph5zI5ZyxBNbHCr2iFitteTBJo44xkutvDNwzDCKNemVcrZRKuS+sRpJKH88ORHr43sOtnKBdsAxXKhURlmeDcfLw6/MjJVEhNHX7UtwEP/+SudmAJ3zCMphE2aNuowvcn8EgPvzhaM2DrEXaTKFVK8WWZPo/dK8+MtXR8M23jqnS8bbrd0nmh6VEYhjEt8OwML9nls3nymXzjg7Z1Cj/Kww9L+IFVOglm2voVflwvHW/7mrLMBOk1J7nuVviqemwrAjEMY+rjKeGkg61heBOd/Io60tIpjVYHaf2EfStIMvHK65tTrpSr8XitHoJoSOFnMm1dyNwsHcMwmka9wofoRB16nACF30xLp1ApJJp4BbUKP3bQ1q3SESS2LNM7Xlcr/F5n5cqVLFmypPqYNWsWl1xySafDMoyuoKpuSea9hxHk4Q/nhilUCoGLhoRaOrngbxfFcrzC987tV+1RLZX9g7ZxJZn+c3T7xCtE5MOqerH7fC93qcOeYK+99uKBBx4AoFwus+OOO3LSSSd1NijD6BKqVTqZ2kSdtpdOkC3in0g1u392zfajxdHAhVHCbjZJFH619YFusXQSlWVqJZGd4x2vawdtRWSOiFwBnCYify8ihwE9u8Thrbfeym677cbOO+/c6VAMoysIaiswnB/m0bWP8sHbPsgdq+9IdJyg/vNhFT///eh/8+cNfw63dOpKQlU1WZVOZkuvmyT9cRpN+PWWzvce+x6fuOsTifZPSyqFr6rrgHeJyBuB54HjgB+1IK5ErLv+CQrPNra4Qhh984eZ81fJVnJcvnw5p59+elPPbxhTmWrzNN+ko2N2PoaR8RHueuYuspksRyw4IvFx6ssyYWLCv/KRKwE4bMfDJhynP9vP5vLmmtc2FDcABN4g/NSUZSawdPxVOkkTfpCl89CLD/Gb536TaP+0NOrhvw6nPPPVQE9W7RQKBa677jpOO+20TodiGKkpVUrcsuqWps/yDJp0dNqep/HDN/2QvbfeO7GXHzRo67VCGC+N12w7VhrjbXu9jWMWHjPhONlMtjpb1mNkbASA7Ya2i4yhZuJVUksH51xJPfxcJletbPJ/nribUaM02h55DvBPOKtXnd20aNIGkVCJt4KbbrqJpUuXst120X80htGN3P707XzkFx/hffu/j79f8vdNO27QoK1HmsHbQIXvll3WJ/ywCh1/HIpWv3W8MOZMJZo7NDcyBr/CT9Qe2R20LWs5UYUOOJ/Pm8XrEfV5JkujCv8zwI/dwdr21RR1Eddcc43ZOcaUpVh2Kl2u+n1z1yCK8rrT1OMHefiepeMvsyyUC5QqpfCEH9CC2FP48wbnRcbgJfySlhK3R/bsnzRVOvUeftgAdDNoKOGr6mpV/Zn7vOcGbcfGxvjpT3/KySef3OlQDKMhNhY3Ao6f/dzG55p23KjVntLU4wfdODxLxz8IG9QH34+nyGssnXEn4W87tG1kDF6lUaXiKHxBEg/aJlX4QVU6o8XRmoVcmklDCV9EvioiV7rPj2tqRFOAoaEh1q5dy+zZs+M3NowuxEv4AC+Ov9i043qJMSjhDeWGas4bRVBZZpClE5fwPRvHn1TXjK1hZt/M2PbI/rLMspZjm6F5K16lUfjeGIOfseIYM/pmhOwxORq1dAqAt3r40U2KxTCMNrGxsCXxvlJ4pWnHjRqw9BS+X22HEdS7ZjDvKvxiCoUfsMjIyNhIrJ1Tv2+5Uo5N4lnJVmfapqrDrxs4D2sT0QwaTfhjwGwRyQMLk+wgIgMico+IPCgij4jIpxs8t2EYk2RDYUP1+frN65t23KgBy+H8MCUtUagUEh0H4i0d73mYBeKfLeuxZnxN7IAt1E280lKiBU28QdvJlGV246DtS8ATwFeBuxPusxk4WlX3B5YAx4vIqxs8v2EYk2BjcWM1ga4vNC/hR9kZaVa/CmpHnM/k6cv01Vg63jeVsEHOwIQ/toZ5Q/EK3z/gW9FKrKWTIVMtAW104lXcIPRkaXSm7SnuS98BliXZVx2875F592GrZxlGB9hY2MgOwzsA8Mrm5lk6UXZGmt74YdU+g/nBWkunFG3pBFXpvLL5Feb0z4mNwW/plCqlyNbI3rnSTrzKZmoHbYNW7momqWfaishFwCLgReBVpJhpKyJZ4F5gd+CrqjphOpmInAOcA7BwYSK3yDCMlGwobmCrga0YHB1susKPS/hJKnXC+s8P5YZqFL53rLiE76noilYYL40nSqieoi9VSomSeCODthnJVEtkIX5MYrI0YumcDeyqqveq6hWqen3SHVW1rKpLgAXAwSKyX8A2l6nqMlVdNnduvM9mGEZ6NhY2MjM/k1l9s9qn8HNNUPi5wVRlmfUJf1NpE0CiQVH/vuVKfJVOhkxDg7Z+S6cbE/7LwHtF5BIReZeIHJD2AG5Pnp8Dxzdw/o7zpS99iX333Zf99tuP008/nU2bNnU6JMNIxcbiRmb0zWB2/+ymKvwoJZzKww9ZRGQoNxSY8MMUe32VjrdvkoRfX5YZZ+lkM9lqe+RGu2XGDUJPlkZWvLoQeDdwAfAUEN8JCRCRuSIyx30+CPwl8Fja83eaZ555hi9/+cusWLGChx9+mHK5zPLlyzsdlmGkYkNhAzPyM9qr8D0PP0Gr5LAFRwbzg4wXay2dvkxfaOfLeoXv7euVeEbhKXrPl4+tw2eLpdNowu8qDx9ARD4DZIEHgAdU9ecJd90B+Lbr42eA/1HVG9KevxsolUqMj4+Tz+cZGxtj/vz5nQ7JMBKjqowWR5nZN5PZ/bP50/o/Ne3YUf51Kg+/Ety7Zig3xJqxNdWf40oY6wdtG1L4lXKiOvxG2iPXl2W22tJJnfBV9ZMi8kmcpH2KiOymqu9OsN/vgNT2TxQ33XQTzz//fDMPyfbbb88JJ5wQ+v6OO+7Iueeey8KFCxkcHOS4447juON6brKxMYUZL41T1jLD+WFm9c1q+qBtVB0+pLN06pNs/aDtaCm674yXeL3JXt6+cbNs/ftWZ9omqcMnXR1+NpOt6ZYZNwg9WRqtw/8WsBjYBvha88Lpfl5++WV+/OMf89RTT/Hss88yOjrKVVc1twGVYbQSb9KVp/CbOfEqicJvallmcZQZ+fA2BBMUvrtvoiqd+pm2cYO2kqFcKVMhRWuFEEunaxS+yz/itFfIAZeS0MdvNlFKvFX87Gc/Y5dddsGrIDr55JP55S9/yZlnntn2WAyjEbx+Np6Hv6m8iYvuuYjzD57YB3G8NM6n7v4U64vhN4W37fk2jlp4FBDt4ecyOfqz/YksnSiFXzPTNmQtWw9v/3qF38igbZLWCopSqSRvntZuS6dRhf8EMIDTIrkjyb5TLFy4kF//+teMjTk9QW699VYWL17c6bAMIzHVhN83g9fOfy0AVz96deBiKE++8iQ3rbqJ1RtWs37z+gmPFc+v4CdP/aS6fZydUV9WGUZ1wZE6VT2YG2S8NF5N4HGthL3EW+/hJ7J03G6Z5UrC1greoG1Khe8vy9xU3kQuk4tcWWsyNHrUR4CngbNF5N9V9aAmxtTVHHLIIZx66qksXbqUXC7HAQccwDnnnNPpsAwjMX4Vue+2+3LusnP5woovMFYaY2bfzJptvUlBHzv4Yxy646ETjnXKdafUTByKW+1pIDdQrYWPIrQsMz9EWcsUKgX6s/2MFkdZMHNB6HEmlGU2YOmUtUylkqC1gr89Mo0p/EK5QF8menH1ydBowt8Npx7/MvffnuLTn/40n/609X4zpib1A4P++vgJCb/iJPOwssd8Jl/TDC1utaeB7MCENWaDCCvLHMgOAE55pWcPJanSqZZlNjBoWy3LTFClo6qJ/H6P+iUOi5Ui+Wz04uqTodGE/7Sq3iYiOwBrYrc2DKNrqCp8d3KP92+Qt14oO8m8LxusOvuyfdWbAjhLCbZS4XtxeDeZuFbC9Qnfs3S8G0cU3kSrai+dGJtFRJw1bUnePK1+icNWK/xGPfzjRWQB8HXgS02MxzCMFlM/uSeqeiaJwvdbOuVKtMLvz/azqRyf8IOWOPTHUSgXUNXECt9fpTOQHUikwL19S5qsl47XLbOs5cA1fcPO4ffwi5Vi6LVuBo0m/DlsWcQ8/vtZk0mygEIn6fb4jN6mOn2/3tIJmAHrKfwwmyGfzVe3geiyTEiu8MPKMv0Kf7w0jqKpLZ2ks1irM20rlWTtkcXXHjnT2EzbYrkY+m2qGTRjEfOJQ/stZGBggLVr13ZtUlVV1q5dy8BA/FdGw+gEo8VRspKlP9sPJFP4YTZDX6bW0qkQPct0IDuQSOGHlWV6ybBYLiYqYQyydJL49/59y1pO3x45YWrNZmpXvCpWii2r0IGEHr7bDmE18C+qermqrnZ/bvsi5gsWLGD16tWMjIy087SpGBgYYMGC8MoBw+gkXimjZ71EtTyIVfgBg7ZRyW7SCt+98RTKhUR9Z+qrdMZL44kTfn0dfqyl4w7aplrTtn4BlEqhpQo/UcJX1bKIPIxTndNR8vk8u+yyS6fDMIwpS33/mUkp/GzfhLLMKDsjsYcfUqXj3XgKlcKWxU8iOktOUPjFseSWTt1M26SDtpPppVMst9bDT/PdYQg4T0SOBZ51X1NVfXPzwzIMo1WMFcdqkqRX5dLooG0ahT+YG2RzKUFZZsVR1PUDwH6F7yXxtM3TGrF0EpVlkr55WlcqfJfXuP8udR9gSxQaxpSjXuEP5gbJSCY44bvqPaos05sVC9GtFSC5wg87TtXDrxSr9fzDfelaK2w9sHXs+WFLhVDS9siZTAMJ313iUFUREYqVYmRvoMmSJuGbj2IY04D6DpMiMqFHjYen3iMVfn2VTkRi9Dx8L8GFEaao/YO23o0jytKpb60Q107ZT7Uss1JK1h65AYXvt5yyknWqdPo7qPBFxFtYNlDN+95fp6rNa7tnGEZLGCuOMXewdvnQofxQpKUT5l/ns/naKh2tRFazDOYGUbTaGiGM0ISf2VKWmaRKp6rw3fS1fvN6ZvXNCt0+aN+KVhL10qnOtE3THtl3jizZrphp+22cZB/VHEKBK4HvNCEmwzBaSJDKHc4PByb8QrlAPpMPVeOewvcUexJLB5y1ZaMSflilS3XQtpws4VcVvruIyYbiBmb1J0v4IoIgTi+dBHX4/kHbNFU64Nzg8uSr17tVxCZ8VT2qZWc3DKPtjBYntiMYzg0HlmUWK9ETgfoyfdVFP3KSi034Azlnfsqm0iZm988O3a5cKQdW+9QrfEEiB2H9CtpbB2B2X/h5J+yfyW7ph59ixauk7ZH9CR+cz9WNM20Nw5iCeO0IZvTVDgzGKfww/Iob4tsjez1s4hqoxXn4nsL3zycIouqRU6mu7JVU4YM7EzZhe2SvOinJzaE+Pi/hd+tM29SIyE4icruIPCoij4jIB9t1bsMwHAqVAiUtTbBBhvJDga0VipViZDMv7z3Px0/SHhmoWaYwiDBbxD9oO1YaixywBV8S1nJ1sfY0Ct+rk0/aWgGc3jtpqnSAasfMbirLnCwl4COqep+IzATuFZGfqurv2xiDYfQ01dmp9ZZOPsTSKUcPInrq30v4ce2RPd8+icIPLMuss3TiJlF5tlClMgmFr47/n6S1AjjXIu2grdcxs1QpTQ9LR1WfU9X73OcbgEeBHdt1fsMwYLQQPNAZaunEeMp+xQ3xzdM8vz2uvULYcbxqoUK5wObS5uo3hjA8hV9j6SSs0vHOV6qUHEsnwaAtbJk0loT6mcCtHrTtiIcvIouAA4DfBLx3joisEJEV3dwvxzCmItV2BAkTfpzCryZgt14/bsCyWqUTM/mqVAm2RUSEvkwfhUqBosa3IfAP2lYtnYjB4nq85nBJkri/br+RssxyxZnR28qyzLYnfBGZAfwQ+FBQ3b6qXqaqy1R1mbdQuGEYzSGs4dhwfphipVgziQpcTznKw0+p8P1VOlFUtBJa++/170myKEnV0tHGFH4+m2dzeTOKxls6bPHwE5dlZrZU6cT1LWoGbU34IpLHSfZXq+qP2nluwzAIrV0Pa6AWV5ZZXZDEp/CbVaUTdpy+bB+FciFZwseX8DevZzA3mGpQNJ/JV29OSQdtGyrLrJRj+xY1g3ZW6QjwTeBRVb24Xec1DGML1fVs66pbwhqoxXVv9Pe2gQRlmSmqdMKO4zVsK1aKiQdSy1rmlcIrE9bsjaMv27cl4Seow/dopCwzbjnJZtBOhX8o8A7gaBF5wH28oY3nN4yepxGFn6RKx0tWSWfaxir8iFp2v8KP87s9Va6qrN+8PpV/D87n825OcUncr+ob8fDbofDbVpapqncR3Z7BMIwWE+XhAxMaqMVVjbSqSieqO6U3kJpkFSphS/O0VwqvpPLvwVX45XSWTv3zKGo8/JjOpM3AZtoaRg8RVaUDIR5+xCBifR1+nML3to9T+FE3jjQevl9Br9u0jq36t4rcPijepArfvw5A2rLMaefhG4bRecaKY/Rn+yckyupC5nUJv1AuJLN0Eg7aigj92f4J1UD1RI0FeAunJ0n4ns1S0Qovb36ZrQZSJvxsPrGHP1lLp9qKusPdMg3DmCaE9YMPW9c2VuG7yclv6cQlu75sX8O9dIAtdfgJFvyuzmStlFi3eR1z+udEbl9PPpOv3gRjxwt88aZW+FqmXC5Xz9kqTOEbRg8R1CkTtlTtBA7aRnn4vlYHEF+lA87AbaJB2zAP31eHH5ccvVhe3vwyFa0kXu2qeq5MX/WaRLVz9p8LklfpeGMQ/kFb8/ANw2gKY8WxSIUfZOlEtkfOpmueBiSydKK+KXgKP1EdvnuMteNrARqydLxOlt4cgjAasXS8iWGlSql6TUzhG4bRFEZLwZZOPpt37ItSOoVfX5YZ1zwNklk6UYO2fg8/aWuFtZsaS/h+OytOeTdUpRNQljltZtoahtFZotZ0re+Yqaqxg7ZeEvQWMleao/Cj2hN4VTpJPHzv5uMp/LSWjv+GEteoTXxV541MvPLGQaZVLx3DMDpHmKUDExuolbWMoukUfqX1Cj+NpVNV+J6lk7Is06/q03j4knDKkX/FK1P4hmE0lSiFX7+QeZKp/kF1+EkU/mR76RTLRUoab+l469K+OP4i0ICH7zt+XML3f+64SVr1+9SUZZqHbxhGM4haNKR+XdskE4FEhFwmt6W1AsnKMmPr8COqdPKZfHVGcJzCB0d5K8pwfjh1BYzfXolL+P5vNkkVvjdoW660x9KxOnzD6BEqWnGWBYywdLye8arKx+78GBBvMXitDlQ1UR1+f6afzZVahf/b53/Lf9z/H9WFQJ7Z+Ax7bLVH8Pl8llDShF/Wcmo7B2o/e+xiK5Moyyxr2RS+YRjNw2sRELYO7EBuoNo3ZnN5M3c+cycAB+9wcORxvaoZRYH4CpX+3MRB2188/Qt+N/I7hnJDDOWGWDpvKSfsckLw/j6lHddLB7Yk3/qF25OQRuH7WyskuRH5tytpqS29dEzhG0aPsLGwEZjYOM3DU+qwZSLVR5d9lF1m7xJ53OqqUG69eiZGRwZ5+KOlUeb0z+Gy4y6L/Rz+hJjE/vCslkYGQ/37pLF0ktoy1TGQcrF6zW3ilWEYkyascZpHPpuvqsw0ajOfyVOsFKt2TNyAZVBZZtRgcj3+CVBJlLSn8JOqbj+NDtomvbn4J65Z8zTDMJpGdfGTsITvLiwCyQZsPbyqGS/hN9JLJ6pctJ7+XDpLp6rwG1DO3j65TC7xIuaQPGn7F2Uvlp0FXZJO2moES/iG0SOELX7i4a+eSaPwc5kchUphS8JvwNLZWNwYajUF7e8/dxye8m4k4XvHj1P3UHujS2rp1Cv8VlbogCV8w+gZwhY/8fCsGSBVxUhftq/G0kmi8EuVEuVKufpaKoXvS75J4vPiacQq8RJyooTvS6dJz+WfuBa32EwzaOeatt8SkTUi8nC7zmkYxhaqCj+kSsezZmDLpKskijOfcap0kiZ8L3l6NxUvtrC46vF7+GkSfiODtt7x4xqnQa2lk/TbhBdTseIM2k6bhA9cCRzfxvMZhuEjiYdf0lLq9VU9hV+t0kma8Mu1CT+xpZNLZ+lUFX4DdomXuJMk8BpLJ2HizmayZCRT9fBbWaEDbUz4qnoH8FK7zmcYRi1xVTp+PzlJWwWPfCZfM2gbN+nIO6bfxx8rjTEjn6xOPq2HPxlLp6rwYyZd+c8D6cYL+jKOxTXdFH4iROQcEVkhIitGRkY6HY5hTBtGi6MIUl1IvB5/TXgqhe82M/MSflzzNC9hewm/XCkzXhpvyMNPM2jbcg+/AYXvbes1g5s2Cj8pqnqZqi5T1WVz587tdDiGMW3wBkbDErJ/fdo0nRu9+v20Ct/7FuH1xUlq6aStw696+A0kU++apE34acYLvOs3rQZtDcPoLHE+uX992jSNvDyFmnjQNlOr8OPKReupmWnb4iqdNAnf3zAtzXiBd/2sLNMwjKYRN5vVvz5tdZp/EoXvlnM2OmgbN5hcj99PT6LwvUQ8mYlXaT38NDcXb9B7Wil8EbkG+BWwl4isFpGz23VuwzDc5Q0jSh8Dp/knUJzehC3VZM3T6gdt0yr8tB6+981jMgo/yc2iprVCipuLV9ZarBRbuvgJtLF5mqqe3q5zGYYxkbjJTTWNvFIsqN2owq8mfLd6aCjXGg/fi2tSCj9lHX6jCn92/+zUMabBLB3D6BHiPPwghZ8kSXoTtjyFn3bQNq3C9yf5vMQnVm+93VZ7+JOp0vEqo1qt8C3hG0aPEOfh+xt5TUbhpy3LTOvhp21D7MU1mYlXaQdtky5xCFuuX7FSnD4evmEYnSXO0vFP80+j8PPZPGUt8w+3/QMQr/C95Hn+nefz9IanY3v8RJHI0nF79kymtYJ/dm8YjXa59BaQKZatSscwjCaRtCzTSz6QfOIVOMsSDmQH2H/u/pHbzxuax8HbO6toPTTyUGpLx0+S9sglbdzS6cv28f4l7+e4nY+L3bbRhO8tINOTM20Nw2g+3opKkVU6dQo/aW92f5K68PALmTsUPWEym8ny2cM+CzgDtqPFUTKSSTQwWk8qhd/gLNb37v/e0PV1/TSs8N06/EK50HszbQ3DaD5JVLR/pm2hXEjd0x2S2zJeHGPFMWdh9Vz4DOAoUnn4rVbPjSp8d9DbBm0Nw2gKcY3TwFelU043gOjfLqkt45VgjhZHU3XKrCeJpeMp/Nb7440r/GKlaB6+YRjNIcnAaLUOP6Wf7Ff4SXvaZzNZBnOD1YTfiH/vHSeOyXj4aWjkGwpsWfKxpCVT+IZhTJ4kpY/+Qds0fnIjCh8clT9aHE212tVkaLk/3qClk8vkqjdkU/iGYUyaNB5+2ppwf5JKY80M54cZK45NytJJQzd7+OOlcaANMbb06IZhdAVVSyeifYF/Bmya1ZcaVfjD+WFGS6NsLG5MvPjJZGi5XTKJKp2g563AEr5h9ABewp/RF55Y68syG/Hwk5RJegzlzdKB2rhaHWPbmqcZhtE5vEVGogZV/eurpinLbFSVDueHGRkbYbQ0mrhxmse3j/82j697PNU+LR+0pbFB23YqfEv4htEDJJ3N6q2vmqYmvFGrZDg/zKriqoaqdJZut5Sl2y1NtU/LB0QnMdO2+twmXhmGMVlGi6PkM/nYpFed9ZmiLLPRRDqcH2bd5nWUKqW2WDrdOmjrv37m4RuGMWmSqmhvfdU0g7YNK/zcMOsL64HGGqelpVs9fH+SN4VvGMakSTowWrO+agMzbdPgj6enFb4vrjSD3o1gCd8weoCkte7e6ktpFtRu1NLxx9OOhN/qZNrooG1Nlc50mmkrIseLyEoReVxEzm/nuQ2jl4lbz9bDW181zYLaTVH4CVsydDNNqcOfLjNtRSQLfBU4AdgHOF1E9mnX+Q2jl0lq6fgVfmIPv0Hf2R9POzz8VtOUOvwWK3zx1qFsNSLyGuACVX29+/PHAFT1wrB9li1bpitWrEh9rm+c93k2tfa6GYZhtIyhgnD25z/a0L4icq+qLgt6r52Wzo7A076fV7uv1SAi54jIChFZMTIy0rbgDMMwpjvtnHgVNKIx4euFql4GXAaOwm/kRO/+/HmN7GYYhjGtaafCXw3s5Pt5AfBsG89vGIbR07Qz4f8W2ENEdhGRPuCvgevaeH7DMIyepm2WjqqWROQDwP8BWeBbqvpIu85vGIbR67S1eZqq3gjc2M5zGoZhGA4209YwDKNHsIRvGIbRI1jCNwzD6BEs4RuGYfQIbWut0AgiMgL8qcHdtwVebGI4rWAqxAgWZzOZCjGCxdlM2h3jzqo6N+iNrk74k0FEVoT1k+gWpkKMYHE2k6kQI1iczaSbYjRLxzAMo0ewhG8YhtEjTOeEf1mnA0jAVIgRLM5mMhViBIuzmXRNjNPWwzcMwzBqmc4K3zAMw/BhCd8wDKNHmHYJv9sWSheRVSLykIg8ICIr3Ne2FpGfisgf3X+38m3/MTf2lSLy+hbG9S0RWSMiD/teSx2XiBzofr7HReTLIhK00E0zY7xARJ5xr+cDIvKGDse4k4jcLiKPisgjIvJB9/Vuu5ZhcXbb9RwQkXtE5EE3zk+7r3fN9YyIsauuZSCqOm0eOG2XnwB2BfqAB4F9OhzTKmDbutc+D5zvPj8f+Jz7fB835n5gF/ezZFsU1xHAUuDhycQF3AO8BmdFs5uAE1oc4wXAuQHbdirGHYCl7vOZwB/cWLrtWobF2W3XU4AZ7vM88Bvg1d10PSNi7KprGfSYbgr/YOBxVX1SVQvAcuDNHY4piDcD33affxt4i+/15aq6WVWfAh7H+UxNR1XvAF6aTFwisgMwS1V/pc5f73d8+7QqxjA6FeNzqnqf+3wD8CjOWs3ddi3D4gyjU3Gqqm50f8y7D6WLrmdEjGF05FoGMd0SfqKF0tuMAreIyL0ico772naq+hw4/xGBee7rnY4/bVw7us/rX281HxCR37mWj/fVvuMxisgi4AAcxde117IuTuiy6ykiWRF5AFgD/FRVu+56hsQIXXYt65luCT/RQult5lBVXQqcALxfRI6I2LYb44fwuDoR738CuwFLgOeAL7qvdzRGEZkB/BD4kKquj9o0JJ5Oxdl111NVy6q6BGfd64NFZL+IzTsSZ0iMXXct65luCb/rFkpX1Wfdf9cA1+JYNC+4X+dw/13jbt7p+NPGtdp9Xv96y1DVF9z/bBXgG2yxvDoWo4jkcZLo1ar6I/flrruWQXF24/X0UNV1wM+B4+nC61kfYzdfS4/plvC7aqF0ERkWkZnec+A44GE3pne6m70T+LH7/Drgr0WkX0R2AfbAGdRpF6nicr9abxCRV7vVBX/j26cleP/pXU7CuZ4di9E95jeBR1X1Yt9bXXUtw+Lswus5V0TmuM8Hgb8EHqOLrmdYjN12LQNp5YhwJx7AG3AqEJ4APtHhWHbFGZ1/EHjEiwfYBrgV+KP779a+fT7hxr6SFo7YA9fgfO0s4iiNsxuJC1iG84f9BPAV3NnbLYzxu8BDwO9w/iPt0OEYD8P5Gv474AH38YYuvJZhcXbb9XwVcL8bz8PAJxv9P9OqOCNi7KprGfSw1gqGYRg9wnSzdAzDMIwQLOEbhmH0CJbwDcMwegRL+IZhGD2CJXzDMIwewRK+0ROIyBwR+Xvfz/NF5ActOtdbROSTIe9tdP+dKyI3t+L8hhGGJXyjV5gDVBO+qj6rqqe26FznAV+L2kBVR4DnROTQFsVgGBOwhG/0ChcBu7l9yv9dRBaJ22dfRM4Skf8VketF5CkR+YCIfFhE7heRX4vI1u52u4nIzW4jvDtFZO/6k4jInsBmVX3R/XkXEfmViPxWRP61bvP/Bc5o6ac2DB+W8I1e4XzgCVVdoqofDXh/P+DtOP1PPguMqeoBwK9wpryDsxj1P6jqgcC5BKv4Q4H7fD9fCvynqh4EPF+37Qrg8AY/j2GkJtfpAAyjS7hdnT7xG0TkFeB69/WHgFe5XSZfC3zftyhRf8BxdgBGfD8fCpziPv8u8Dnfe2uA+c0J3zDisYRvGA6bfc8rvp8rOP9PMsA6dVriRjEOzK57Lax/yYC7vWG0BbN0jF5hA87Sfg2hTu/4p0TkNHC6T4rI/gGbPgrs7vv5bpyurTDRr9+TLR0VDaPlWMI3egJVXQvcLSIPi8i/N3iYM4CzRcTrfhq0fOYdwAGyxff5IM7CN79lovI/CvhJg7EYRmqsW6ZhNBkRuRS4XlV/FrPdHcCbVfXl9kRm9Dqm8A2j+fwbMBS1gYjMBS62ZG+0E1P4hmEYPYIpfMMwjB7BEr5hGEaPYAnfMAyjR7CEbxiG0SNYwjcMw+gR/n91QLDU7CZfmAAAAABJRU5ErkJggg==\n", "text/plain": [ "
    " ] @@ -130,7 +130,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAElCAYAAAD3KtVsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA5OElEQVR4nO3de3Rcdbn/8fcntyYtpaVpC73SchFaEEqprQgieASL4kIuIgVFFK145KhHUdHfWSD6U1B+XkBUrAgIKD3noGjVcgdPkcuhBVpohWIphYYCLemdJE1m5vn9sfekO5OZySSdyZ5kntdaszKz93fPPNlt8s339nxlZjjnnHM9qYo7AOeccwODVxjOOecK4hWGc865gniF4ZxzriBeYTjnnCuIVxjOOecK4hWG6zVJ35J0W/h8sqSdkqrjjisfSe+WtLqfP9MkHbSH77FK0gnFiajbe+f8d5S0r6QlknZI+qECN0naIumJUsTjyp9XGBVI0jpJ78s4doGkv/f2vczsFTPby8ySxYuwdwr5xWxmD5vZIf0VU7GY2WFm9jfo+gu+BJ+T+e84H3gT2NvMvgIcB5wETDSz2aWIwZU/rzDcoCepJu4YBqD9gX/Y7pW9+wPrzOyt3r6R3//BwysMl5Wk8ZJ+L2mTpJckfSFHuSnhX/g1kesWSdosaY2kz0TKVkv6pqQXw66OJyVNCs8dKum+8LrVks6OXHezpJ9J+mt43f9KOjA8tyQstiLsUvmopBMkNUn6uqTXgZvSxyLvOUnSH8Lvr1nSdTnuQaukUZFjR0l6U1Jt+PpTkp4Lu2rukbR/jvs0QtIt4ee9LOk/JFVFzn8mfJ8dkv4haWZ4fJ2k90maC3wT+Gj4fa6Q9BFJT2Z8zlck/TFHDFMl/U/4GfcBo7P9O0q6GfgE8LXwsz4L3AAcE76+IrzmVEnLJW2V9KikIyLvty68/88Ab4Xv+86w3NYw/hMi5f8m6TuSHgnju1dSNL7jIteul3RBeHyIpP8n6RVJb0i6XlJDeG60pL+E12yW9HD0nrs+MDN/VNgDWAe8L+PYBcDfw+dVwJPAZUAdcACwFnh/eP5bwG3h8ymAATXh6/8Bfg7UAzOATcC/hOe+CjwLHAIIOBJoBIYB64FPAjXATILukMPC624GNgOzw/O/BRZGYjfgoMjrE4AE8H1gCNAQHmsKz1cDK4Afh59dDxyX4149CHwm8vpq4Prw+YeBNcC0MK7/AB7NFhdwC/AnYHh4z14ALgzPfQR4FXhHeF8OAvbP/LeK3vfw9ZDwvkyLHHsaODPH9/IY8KPwuuOBHXn+HW8G/m+2/x/h65nARmBOeD8/EcY6JBL3cmBSeP8nAM3ABwj+f50Uvh4Tlv8b8CLwtrD834CrwnOTw1jnAbUE/2dmhOd+AiwCRoX39s/AleG5K4Hrw2tqgXcDivvnbyA/Yg/AHzH8owc/zDuBrZFHC7srjDnAKxnXfAO4KXze+Ysr+osm/OWQBIZHrrsSuDl8vho4LUs8HwUezjj2S+Dy8PnNwA2Rcx8Ano+8zlZhtAP1GcfSFcYxBBVZTQH36tPAg+FzEVRsx4ev7yL8pR++rgrv4/7RuAh+oe4CpkfKfhb4W/j8HuCLef6tslYY4bFfAN8Nnx8GbCH8pZ1RbjJBJToscux32f4dI/c8X4XxC+A7GZ+xGnhPJO5PRc59Hbg1o/w9wCfC538D/iNy7l+BuyP/9+7M8j0JeAs4MHLsGOCl8Pm3CSrpgzKv9UffHt48q1wfNrOR6QfBD2ja/sD4sCm/VdJWgu6QfXt4z/HAZjPbETn2MsFflxBUKC9muW5/YE7G550H7Bcp83rkeQuwVw+xbDKzthznJgEvm1mih/cAuIOgK2Y8wV/lBjwcifuaSMybCX6JTch4j9EELbWXI8cKuS+F+A1wriQBHwf+y8x2ZSk3HthiXccgXs5SrlD7A1/J+DebFH5O2vqM8h/JKH8cMC5SJte/ca77MwYYCjwZec+7w+MQtAbXAPdKWivp0t5/my7KB6NcNusJ/ko7uJfXbQBGSRoeqTQmE3S3pN/3QGBlls/7HzM7qa8BZ5EvDfN6YLKkmp4qDTPbKule4GyCrqfbLfzzNXyf75rZb3uI5U2gg3AgOTyW7b70pNv3ZGaPS2on6G45N3xk8xqwj6RhkUpjcrb3LFD6e/9ugfGuJ2hhfCZX4R4+K9vMrDeBVoKuy1czT4b/B79CULEdBjwkaamZPdCHGBw+6O2yewLYHg5aNigYrD5c0jvyXWRm64FHgSsl1YeDoBcSjDlAMHD6HUkHK3CEpEbgL8DbJH1cUm34eIekaQXG+wbBOEtvvr/XgKskDQtjPTZP+d8B5wNnhs/Trge+Ef4ySg9sfyTzYgumqv4X8F1JwxUMjH8ZSE+RvQG4RNLR4X05SNkHz98ApmQZuL0FuA5ImFnWqdFm9jKwDLhCUp2k44AP5fmee/Ir4CJJc8KYh0n6oKThOcrfBnxI0vvD/0/1CiYiTCzgs34LvE/S2eHgeaOkGWaWCuP4saSxAJImSHp/+PzU8F4K2E7QXRrb9O/BwCsM1034C+5DBIPWLxH8JXcDMKKAy+cR9IdvAO4kGIe4Lzz3I4JfnPcS/AD/GmgI/xI8GTgnvO51dg9YF+JbwG/Cbomzeyoc+f4OAl4BmgjGUXJZBBwMvGFmKyLvc2cY50JJ2wlaTqfkeI9/I+hvXwv8naDiuTF8n/8Gvhse2wH8kWAQN9N/h1+bJT0VOX4rcHj4NZ9zCcanNgOXE1Q0fWJmy4DPEFRUWwi6fi7IU349cBpB1+YmglbDVyngd5CZvUIwbvWVMPblBBMmIBgbWQM8Hv4b3E8wqQKCf7P7CcbrHgN+buGaFtc32t26ds4NROE00o3ATDP7Z9zxuMHLWxjODXyfA5Z6ZeFKzQe9nRvAJK0jmJn14XgjcZXAu6Scc84VxLuknHPOFcQrDOdCypLFd7BQRs4v5/rCKwxXUcJfmm8pSKL3qqQfqZ/38lAR9slwLg5eYbhKdKSZ7QX8C8HahL6sPnau4niF4SqWmT1PkBfq8MxzkmZLeixcDPiapOsk1UXOm6SLJP1TQWrzn4UritPns6Y9V/Z07AWn4Zb0LklLJW0Lv74rci5vivBIuV6lRXcuzSsMV7EkTSfIwfR0ltNJ4N8JEgceQ9Aa+deMMqcSpCQ/kiDXVDolxYcJVjSfQZAI72HgdgAzOz689kgLdrj7T4IVzE1h2X3Da7tNX1SwL8dfgWsJUnz/CPhrmF4l7VyCNPFjCRIeXpLle1sETM1IvfIxel4p7ircoK8wJN0oaaOkzIR3fXmvGeFfnaskPSPpo5FzFyvYMMiy/VXnyspTkrYQ7J1wA3BTZgEze9LMHjezhJmtI0i3/p6MYleZ2dYwdcVDBKlUIEhdfqWZPRcmN/weMCNHfigIEhOOI0iL3mHBdrLZ5rt/EPinmd0axnU78Dxdc0LdZGYvmFkrQRqWGZlvEmaz/U+CSoIwF9YUgpxezuU06CsMgrz+c4v0Xi3A+WZ2WPieP5E0Mjz3CPA+9ixltOsfM81sHzM70Mz+I0xi14Wkt4XdRK+HOYq+R2SHulCudNyFpj1PKzQN93i6//+KpknPF1OmQtOiO9dp0FcYZraE4Ae2k6QDJd2tYIvQhyUdWuB7vZBOv2BmGwjy94wJXz8d/iXqBodfEPz1frCZ7U3QTaT8l3RaD3w2ut+ImTWY2aPZCpvZDjP7ipkdQNBa+LKkf8lSdANBZRQVTZNeMDN7nGCTqXRadO+Ocj0a9BVGDguAfzOzown6eH/e2zeQNJugj7ivG9+48jacIKPuzvAPis/14tqe0p53ScfeizTciwnSwJ8bpvn+KDCdvncl9ZgW3bmoilvEI2kv4F3Af0cmtQwJz51BsK1jplfN7P2R9xhH8BfZJ7J1Z7hB4RKCPyy+RjAo/p/Aewu50MzuDP+fLQzHLbYB97E7Pfm3CNKxNwDzCbqUriNorW4hRxpuM2uWdCpwDUELaA1wqpm92cfv8VbgO+HDuR5VRC4pSVOAv5jZ4ZL2Blab2bgeLsv1XnsT7D98ZbiPQeb5dcCsPfghdq5feFp011sV1yVlZtuBl9JdBAoc2cNlhGXrCDYFuiVbZeHcAONp0V2vDPoKQ9LtBLttHSKpSdKFwHnAhZJWAKsIdgIrxNnA8cAFkpaHjxnh53xBUhMwEXhG0g3F/l6cK5awJfxFgjUgzhWkIrqknHPO7blB38JwzjlXHIN6ltTo0aNtypQpcYfhnHMDxpNPPvmmmY3Jdm5QVxhTpkxh2bJlcYfhnHMDhqSc2Sq8S8o551xBvMJwzjlXEK8wnHPOFWRQj2Fk09HRQVNTE21tbXGHklN9fT0TJ06ktrY27lCcc65TxVUYTU1NDB8+nClTphDJJVU2zIzm5maampqYOnVq3OE451yniuuSamtro7GxsSwrCwBJNDY2lnULyDlXmfqtwpA0SdJD4T7HqyR9MUsZSbo23LnuGUkzI+fmSlodnsu1wUyhsezJ5SVX7vE55ypTf7YwEsBXzGwa8E7g8+GeylGnAAeHj/kEKZyRVA38LDw/HZiX5VrnnKsoyVSSW1bdwo0rb6Qj2VHyz+u3CsPMXjOzp8LnO4Dn6L5l5WkEmWAt3BFsZLj3xGxgjZmtNbN2YCGFJwwsune9611Zj19wwQXccccd/RyNc65SPb/lea5edjU/fvLHLH1jack/L5YxjHB/iqOA/804NYFge8u0pvBYruPZ3nu+pGWSlm3atKloMUc9+mjWnTadc65fvdmye9ud13a+VvLP6/cKI9yJ7PfAl8K9KbqcznKJ5Tne/aDZAjObZWazxozJmg5lj+21117pz+Liiy9m+vTpfPCDH2Tjxo0l+TznnMtmc9vmzuevvVX6CqNfp9VKqiWoLH5rZn/IUqQJmBR5PZFg4/u6HMdjdeedd7J69WqeffZZ3njjDaZPn86nPvWpuMNyzlWI5rZmAEYOGdkvFUZ/zpIS8GvgOTP7UY5ii4Dzw9lS7wS2mdlrwFLgYElTw13vzgnLxmrJkiXMmzeP6upqxo8fz3vfW9CWz845VxTNrc0MrRnK1BFTef2t10v+ef3ZwjgW+DjwrKTl4bFvApMBzOx6YDHwAYLN7VuAT4bnEpIuBu4BqoEbzWxVP8aek0+Bdc7FpbmtmVH1o9hv2H6sfHNlyT+v3yoMM/s72cciomUM+HyOc4sJKpSycfzxx/PLX/6S888/n40bN/LQQw9x7rnnxh2Wc65CbG7bTGNDI+OGjeP+l+8nZSmqVLqOo4pLDVJMp59+Og8++CBvf/vbedvb3sZ73vOeuENyzlWQ5tZmJg2fxLhh4+hIddDc2syYoaWZ7ANeYfTJzp07gaA76rrrros5GudcpdrctpkZY2cwpiGoJJrbSlthVFwuKeecGwySqSRbd21lVP0o9h6yNwDbdm0r6Wd6heGccwPQtvZtpCzFqPpRjBgyIjjmFYZzzrlM7cl2AIZUD2FEXVhhtHuF4ZxzLkPSkgBUq9pbGM4553JLpVIA1FTVUF9TT311Pdt3ZWZbKi6vMJxzbgBKWAIIWhgAew/Z27ukBqNPfepTjB07lsMPPzzuUJxzA1QyFXZJVQUVxoghI7xLajC64IILuPvuu+MOwzk3gEXHMABG1HmFMSgdf/zxjBo1Ku4wnHMDWGaX1IghI0reJVXRK72v+PMq/rGhuINE08fvzeUfOqyo7+mcc5nSg95duqTe9BaGc865DOkuqRoFf/ePqBtR8llSFd3C8JaAc26gSqSCLqmqquDv/r2H7E1bso22RBv1NfUl+UxvYTjn3ACUOeg9vHY4ADs7dpbsM73CiMG8efM45phjWL16NRMnTuTXv/513CE55waYzi6pqqCjqKG2AYDWjtaSfWa/dUlJuhE4FdhoZt0WIEj6KnBeJK5pwBgz2yxpHbADSAIJM5vVP1GXxu233x53CM65Aa5zHUbYwmioCSqMlkRLyT6zP1sYNwNzc500s6vNbIaZzQC+AfyPmW2OFDkxPD+gKwvnnCuGzC6poTVDAWhNlK6F0W8VhpktATb3WDAwD/A/w51zLofMld6DrYVREElDCVoiv48cNuBeSU9Kmt/D9fMlLZO0bNOmTaUM1TnnYpPZwkhXGIOihdELHwIeyeiOOtbMZgKnAJ+XdHyui81sgZnNMrNZY8aUbqtC55yLU2eFEbYwhtYOoi6pXjiHjO4oM9sQft0I3AnMjiEu55wrG+l1GBXbwpA0AngP8KfIsWGShqefAycDK+OJ0DnnykOuLqmWjkEwhiHpduAx4BBJTZIulHSRpIsixU4H7jWztyLH9gX+LmkF8ATwVzMbsKle169fz4knnsi0adM47LDDuOaaa+IOyTk3AKVs9wZK0D8tjH5bh2Fm8wooczPB9NvosbXAkaWJqv/V1NTwwx/+kJkzZ7Jjxw6OPvpoTjrpJKZPnx53aM65ASSzS6qmqoa6qrrK6ZKqBOPGjWPmzJkADB8+nGnTpvHqq6/GHJVzbqDJHPSGYLV3KbukKjr5IHddCq8/W9z33O/tcMpVBRVdt24dTz/9NHPmzCluDM65QS9zpTcE3VLewhiEdu7cyZlnnslPfvIT9t5777jDcc4NMJmD3hCs9h4UYxhlqcCWQLF1dHRw5plnct5553HGGWfEEoNzbmDL2iXlLYzBxcy48MILmTZtGl/+8pfjDsc5N0Clu6TSGyhBUGFUVGqQwe6RRx7h1ltv5cEHH2TGjBnMmDGDxYsXxx2Wc26ASe/pXaXdv8aH1nqX1KBy3HHHYWZxh+GcG+DSLYxoheFdUs4557pJWYoa1SCp81hDTWmn1XqF4ZxzA1DCEl0GvKH0s6S8wnDOuQEomUp26Y4C75JyzjmXRdKSXWZIAdRV19GR6ijZOKlXGM45NwAlU8luXVLpRITpNRrF5hWGc84NQElLdlnlDbtXfacTExabVxj9rK2tjdmzZ3PkkUdy2GGHcfnll8cdknNuAMpWYXgLY5AZMmQIDz74ICtWrGD58uXcfffdPP7443GH5ZyL0e9f+D2PvPpIr65JpLrPkkpXGAO+hSHpRkkbJWXdLU/SCZK2SVoePi6LnJsrabWkNZIu7a+YS0ESe+21FxDklOro6Ogyj9o5V3l+vuLnLHx+Ya+uSVmqewtDpa0w+nOl983AdcAteco8bGanRg9IqgZ+BpwENAFLJS0ys3/saUDff+L7PL/5+T19my4OHXUoX5/99bxlkskkRx99NGvWrOHzn/+8pzd3roKZGZvbNtPc1tyr65KpZGeLIi3d4hjwLQwzWwJs7sOls4E1ZrbWzNqBhcBpRQ2un1VXV7N8+XKampp44oknWLnStyh3rlJtb99OIpVgc1vvfj0mLNHvYxjllkvqmHDv7g3AJWa2CpgArI+UaQKK8id5Ty2BUhs5ciQnnHACd999N4cffnissTjn4pFuWTS3NmNmBXdRJ1NJqqq6/s1fSbOkngL2N7MjgZ8CfwyPZ7t7OVelSJovaZmkZZs2bSp+lHto06ZNbN26FYDW1lbuv/9+Dj300HiDcs7FZnNr0LJoS7Zxxz/v4IZnb2Br29Yer8u2cK+2qhbYncm22MqmhWFm2yPPF0v6uaTRBC2KSZGiEwlaILneZwGwAGDWrFlllxb2tdde4xOf+ATJZJJUKsXZZ5/Nqaee2vOFzrlBKTp28e3Hvg0EOaHOnXZu3uuyrsMo8RhG2VQYkvYD3jAzkzSboPXTDGwFDpY0FXgVOAfIfyfL2BFHHMHTTz8ddxjOuTKRbezizdY3e7wu60rvsMWRTn1ebP1WYUi6HTgBGC2pCbgcqAUws+uBs4DPSUoArcA5FiRESUi6GLgHqAZuDMc2nHNuwGtu7T47qpAB8EHdwjCzeT2cv45g2m22c4sB35bOOTfobG7bTJWqSFkKgIP3ObigKbb5Fu75Sm/nnBuEmlubmTR89zBtY31j50B4PvkW7nWkOoobZMgrDOeci9HWXVsZO3QsAHP2m0NjQ2NBLYyk9X+22rIZ9HbOuUq0K7mLfWr34eGPPkxDbQPXPnVtQWMYiVT3hXuxj2FImlzge22NTo11zjnXs45UB7VVtYysHwnAqPpRtCZaaeloYWjt0JzX5c1WG+Msqd8QLJTLt/zQCHJF5csT5SKSySSzZs1iwoQJ/OUvf4k7HOdcTNqT7dRV13W+bmxoBIL1GfkqjJSluuWSij35oJmdmHlM0n5m9npJIqoQ11xzDdOmTWP7dm+UOVfJ0i2MtFH1o4Dug+GZsnVJdaY3L9FK774Oep9f1CgqTFNTE3/961/59Kc/HXcozrmYdaQ6srYwehrHSFqSKvVvLqm+DnqfJqkFuM/MVhczoP70+ve+x67nipvefMi0Q9nvm9/MW+ZLX/oSP/jBD9ixY0dRP9s5N/B0JLu2MBrrd3dJ5ZMtvXm5rsM4A1gDnC7phiLGM+j95S9/YezYsRx99NFxh+KcKwO5uqR6WouRb9C7rFoYZvYGcHf4GLB6agmUwiOPPMKiRYtYvHgxbW1tbN++nY997GPcdttt/R6Lcy5+7cl2aqt3Vxh11XUMrx3ecwsjzzqMskpvLulnkm4On59c1IgGuSuvvJKmpibWrVvHwoULee973+uVhXMVysy6tTAgGMfocQwjlSWXVJnuh9EOrA2fv7dIsTjnXEVJWALDqKuq63J8VP2orEkJM6/t7x33+lphtAAjJNUChS7scxlOOOEEX4PhXAXrSAY5n6JdUkBB6UGypTcv11lSmwlSkP8MeKR44TjnXOVIJwnM1sLoqUsqZancO+6VQ5eUpJGSbgLODA/dAswqelTOOVcB0hVGtzGM+ka27dqWN+tswrqnN+/MJVUOW7Sa2VZJVwFTgDeBI4A/lCAu55wb9NqT7QBdFu7B7sV7W9q2dGayzZRMdV+4V6UqqlRVHi2M0IXAAWb2pJndZGZ/LuQiSTdK2ihpZY7z50l6Jnw8KunIyLl1kp6VtFzSsj7E7JxzZSfdgshcgBdND5JNylIY1q1LCoJxjHLaonULcJGkQ4AVwHIzK2ST6psJdtTLlaDwJeA9ZrZF0inAAmBO5PyJZtbzRrfOOTdApAe9M1sYw+uGA7CzY2fW69Itk8zBcggqn7IZ9DazKyU9ALwAzACOB3qsMMxsiaQpec4/Gnn5ODCxt7E559xA0p4Kf/FnjGGkZzult23N1JpoBaChpqHbuRrVlM8GSpK+DVQDywlaF38rckwQdHvdFXltwL2SDPilmS3IE998YD7A5MnlOeN3ypQpDB8+nOrqampqali2zHvZnKtEuQa904PXubqWWhItAAyt6Z7+vKaqpmRbtPalhXGZpMsIxj/OlHSgmX2mWAFJOpGgwjgucvhYM9sgaSxwn6TnzWxJjvgWEHRnMWvWLCtWXMX20EMPMXr06LjDcM7FKNegd+d6ihyznVo7whZGbfcWRnVVddkt3LsRmAY0Aj8vVjCSjgBuAE4zs87RHjPbEH7dCNwJzC7WZzrnXFx6amH01CWVq4VRNmMYoS8QpAepAa4hGMfYI+FWsH8APm5mL0SODwOqzGxH+Pxk4Nt7+nkAD//XC7y5PvugUl+NnrQX7z77bXnLSOLkk09GEp/97GeZP39+UWNwzg0MuQa907OfcnVJ5RvDKLdZUgAvAgcDfzKzfy/kAkm3AycAoyU1AZcDtQBmdj1wGWGLRRJAwsxmAfsCd4bHaoDfmdmAzpL7yCOPMH78eDZu3MhJJ53EoYceyvHH73Gd65wbYHK1MNLrK3J1SaXHMLJVGLVVtWXXwlgFrAculHS1mb2jpwvMbF4P5z8NdNuCzszWAkd2v2LP9dQSKJXx48cDMHbsWE4//XSeeOIJrzCcq0C5psf2NOidr0uqWtVlt0XrgQSVzQLgk8ULZ/B76623Onfae+utt7j33ns5/PDDY47KOReHXC2Mzi6pHIPXeafVluEYxnoze1DSOGBjMQMa7N544w1OP/10ABKJBOeeey5z586NOSrnXBxyJR/sbGH0ocIo5SypvlYYcyW9QJCt9mWCQXBXgAMOOIAVK1bEHYZzrgzk7JJSD+swOsIxjCzTakvZwuhrl9RI4OvA14BdRYvGOecqSM4WhnpuYVSrutt1EK70LrNZUt8GDjWz1ZJKE5lzzg1ynWMYOQa9c7UUWhOtNNQ0EM4e7aKUK70LbmFEs8eaWZOZ3R8+v7QUgTnn3GDXueNeH3JJZRu/gKDCKIeV3k+Hqce/JmlSSaJxzrkK0p5qp0Y13fa16Glv7paOlpwVRrWqy2IM44fAMOAq4CVJD0n6VEmics65CtCR7Miaorxz4V6eLqmhtd3XYECZtDDM7KtmdiDBlqw3EKQDyZk11jnnXH7tqfZu3VFQ2DqMfF1SsbcwJDVK+jTwPYLFeiJY7e16aevWrZx11lkceuihTJs2jcceeyzukJxzMehIdWStMHpah9GSyN0lVaPyWLj3OkEFswW4CbjNzP5ekqgGuS9+8YvMnTuXO+64g/b2dlpaWuIOyTkXg45kR7fEgxB0SQnlTQ2y79B9s56rrirdGEZvKow7gduAu8ysNHO2KsD27dtZsmQJN998MwB1dXXU1XX/D+OcG/xydUlBmHW2j11Ssa/0NrOzSxJBjB66eQEbX15b1Pccu/8BnHhB7nTla9euZcyYMXzyk59kxYoVHH300VxzzTUMGzasqHE458pfIpXIXWFU5U5Tnq/CKJdZUq4IEokETz31FJ/73Od4+umnGTZsGFdddVXcYTnnYpBrlhTkb2Hkm1Z71NijOGn/k4oWY1Rf9vT+kJn9uRTB9Ld8LYFSmThxIhMnTmTOnDkAnHXWWV5hOFehEpboXKSXKVcSwZSlaEu25ZxWe9pBp3HaQacVNc60vrQwvtuXD5J0o6SNklbmOC9J10paEy4QnBk5N1fS6vDcgF5Zvt9++zFp0iRWr14NwAMPPMD06dNjjso5F4dEKtG5SC9Trq6ltkQbkD1Tban1JZdU9+QlhbkZuA64Jcf5Uwh28TsYmAP8ApgjqZogK+5JQBOwVNIiM/tHH+OI3U9/+lPOO+882tvbOeCAA7jpppviDsk5F4OkJfNWGNlaGPl22yu1vlQY1pcPMrMlkqbkKXIacIuZGfC4pJHhfhtTgDXhzntIWhiWHbAVxowZM1i2bFncYTjnYpZIJbJmnIWgSypbLqnWjtx7YZRaOQ16T6DrQsCm8Fiu4845N6AlU7lbGLkW4KVbGLnGMEqpnCqMbF1dlud49jeR5ktaJmnZpk2bihacc84VW0eqo3NVd6Zcg975dtsrtb5UGG8UPYpAExDNgjsR2JDneFZmtsDMZpnZrDFjxpQkUOecK4akJTvzRmWqVvZ1GHGOYfS6wjCz0kzwhUXA+eFsqXcC28zsNWApcLCkqZLqgHPCss45N6AlUoncLYwcg97pFsbQmv7vkurrjnu9Jul24ARgtKQm4HKgFsDMrgcWAx8A1gAtBAkOMbOEpIuBe4Bq4EYzW9VfcTvnXKnknSWVY6V3nF1S/VZhmNm8Hs4b8Pkc5xYTVCjOOTdoJFKJ/F1Sg2AMA0lfjjw/pHjhDH6rV69mxowZnY+9996bn/zkJ3GH5ZyLQY8L9yzLLKmOcAyjtsxbGJJGAj8GDpXUBjwDXEjYfeR6dsghh7B8+XIAkskkEyZM4PTTT483KOdcLPKOYQz0Likz2wp8UtL7gTeBI4A/lCCuivDAAw9w4IEHsv/++8cdinMuBj3Nksq6cC/RSm1Vbc4st6XU1zGMDjN7UtIGYGMxA+pPW//8Iu0b3irqe9aNH8bIDx1YUNmFCxcyb17eoR3n3CCWr0sq11ar+VKbl1pfF+7NlTQRuJ6gi8r1Unt7O4sWLeIjH/lI3KE452KSb5ZUlaqy55LKk9q81PrawhgJfB34GvDpokXTzwptCZTCXXfdxcyZM9l33+zbLDrnBr+OVEf+9OY5xjDiSAsCfa8wvg0cYmarJZVmL8BB7vbbb/fuKOcqXE+5pHJNqx1oXVLfAD4ePn+oSLFUjJaWFu677z7OOOOMuENxzsUkmUpiWK9Xerck4uuS6muF0Q6kN8M+sUixVIyhQ4fS3NzMiBEj4g7FOReTdGXQ2z29B2ILowUYIakWmFzEeJxzriKkZ0DlHMPIs9J7oFUYlwMvEuyE99viheOcc5UhvYo7by6pLBVGR7KDIdVDShpbLn0d9P6Cmf0IPDWIc871RUEtjCxdUh2pjpyVTKn1JTXIL4D9w9QgKwim1XpqEOec64V0ZZB34V6WXFIdqY5YVnlDH1KDhKnJlwD/CxyJpwZxzrleS7cw8i7cy9LCSKQSA6PCCDUDFwGHELQwmooakXPOVYAexzByDHrH2SXVlx33rgI+A3wLeAl4d5FjGvR+/OMfc9hhh3H44Yczb9482tra4g7JOdfPehrDqKnKvnAvzi6pXlcYkr4NnAacBLxqZtf24tq5klZLWiPp0iznvyppefhYKSkpaVR4bp2kZ8Nzy3obd7l49dVXufbaa1m2bBkrV64kmUyycOHCuMNyzvWznsYwsg16m1nQJVU9QLqkzOwySfsCRwFnSjrQzD7T03WSqgmm4Z5E0I21VNIiM/tH5L2vBq4Oy38I+Hcz2xx5mxPN7M3exlxuEokEra2t1NbW0tLSwvjx4+MOyTnXzzq7pHqx415P15RaXz/1s8AvzezuXlwzG1hjZmsBJC0kaKn8I0f5ecDtfYyvIHfddRevv/56Ud9zv/3245RTTsl5fsKECVxyySVMnjyZhoYGTj75ZE4++eSixuCcK389tjCyrPTuSHYAxNbC6OvCvRuBz0m6WtKMAq+ZAKyPvG4Kj3UjaSgwF/h95LAB90p6UtL8XB8iab6kZZKWbdq0qcDQ+s+WLVv405/+xEsvvcSGDRt46623uO222+IOyznXzzpSwS//3uSSGqgtjC8Q5JOqAa4Fji/gGmU5ZjnKfgh4JKM76lgz2yBpLHCfpOfNbEm3NzRbACwAmDVrVq73B8jbEiiV+++/n6lTpzJmzBgAzjjjDB599FE+9rGP9Xsszrn4pCuDfC0Mw0hZiioFf9sP1BbGi0A98CczK6SygKBFMSnyeiKwIUfZc8jojjKzDeHXjcCdBF1cA87kyZN5/PHHaWlpwcx44IEHmDZtWtxhOef6WSErvYEu3VLpawbMLKnQKuBB4EJJSwu8ZilwsKSpkuoIKoVFmYUkjQDeA/wpcmyYpOHp58DJwMo+xh6rOXPmcNZZZzFz5kze/va3k0qlmD8/Zw+bc26QSlcEObPVhhVGdLV3uhtrQKQGiTgQ2ELQ9bOlkAvMLCHpYuAeoBq40cxWSbooPH99WPR04F4zi262vS9wp6R0zL/r5YB7Wbniiiu44oor4g7DORejnhbupY+nLNV5LF1hDKSV3gDrzexBSeOAjYVeZGaLgcUZx67PeH0zcHPGsbUEaUicc25QKLRLKl0u+nygdUnNlTQRuB74cRHjcc65ilBILimgy0ypuLuk+lphjAS+DnwN2FW0aPqJWd7JU7Er9/icc3suXRHkmlabrhSig95xd0kVXGFIinYJfZtghtRqoHuykzJWX19Pc3Nz2f5SNjOam5upr6+POxTnXAl1di8p/6B3tIXRec0ASA3ytKSVwG3A7WZ2P4CZdcsJVc4mTpxIU1MT5bioL62+vp6JEyfGHYZzroQ6xzByLdyr6l5hdHZJDYCFez8EzgCuAr4n6WHgVjO7sSSRlUhtbS1Tp06NOwznXIUrJL055FiHUe4L98zsq2Z2IDALuIFgdfeCUgXmnHODWboiyJfeHLrOkkqv9C77dRiSGgnWSJwFnEiQ6uOVEsXlnHODWk+zpOqrg3HM1mRr57G4B717U029TtAi2QLcBNxmZn8vSVTOOTfI9ZRLamjtUABaOlo6j8W9DqM3FcadBAPed5lZR4nicc65itDTmoqGmgYAWhPdWxhl2yUlaXL49JLw67gwRUemrWa2vViBOefcYNbTGEa+CqOcWxi/YXca8qw1RXj+ZuCWIsTknHODXnqWVG8qjLLvkjKzE/sjEOecqyTJVJIa1ZCjxybrGEbcXVJ9TQ3inHNuDyRSiby/+MuxS8orDOeci0HCEjlXeUMwrVYoe5dUuS/cc845Vzw9tTAk0VDTkH2WVEypQbzCcM65GCRTyZwD3mkNNQ20JLquw6ipyj3uUWr9WmFImitptaQ1krolLZR0gqRtkpaHj8sKvdY55waSHe07GF43PG+Zbi2MZEds4xfQ9x33ek1SNfAz4CSgCVgqaZGZ/SOj6MNmdmofr3XOuQGhua2ZUfWj8pZpqG2gtaNrl1RcM6Sgf1sYs4E1ZrbWzNqBhcBp/XCtc86Vnc1tm2msb8xbZmjN0G6D3nG2MPqzwpgArI+8bgqPZTpG0gpJd0k6rJfXImm+pGWSlpXznhfOucrW3FpACyNjDKOSWhjZRmkyt717CtjfzI4Efgr8sRfXBgfNFpjZLDObNWbMmL7G6pxzJZNIJdi6ayuNDflbGNlmSVVKC6MJmBR5PRHYEC1gZtvNbGf4fDFQK2l0Idc659xAsXXXVgzrsYUxtLZyu6SWAgdLmiqpDjgHWBQtIGk/hfPFJM0O42su5FrnnBsomlubAfrUwoizS6rfPtnMEpIuBu4BqoEbzWyVpIvC89cTbM70OUkJoBU4x8wMyHptf8XunHPF1NwWVBgFjWFk5JKqiGm10NnNtDjj2PWR59cB1xV6rXPODUSdLYwCZ0mZGZKCLqmY0oKAr/R2zrmiW9W8it+s+g1rt63lgVce4LfP/ZZtu7Zx77p7SVmKzW2bARjV0HMLwzB2JXcBYZdUTGlBoJ9bGM45Vwl+8MQPeGrjUzzx+hMsaVoCwIqNK7hr3V3ccsotbNu1jSpVMbw2/0rv+ppgX++2RBv1NfUkUgnqqutKHn8u3sJwzrki29GxA4DVm1d3HtvwVjCxc0f7DjpSHdRV1fWYEyo9XpFOOtiRrJx1GM45VxHS6TzeaHmj81i6G6ol0VLw9Nh0mXRa87gHvb3CcM65IotOhU1LD3S3drQWPD02XSbdwqikdRjOOVcRouk8Mo+1JloLbimkZ0R1dklVUGoQ55wb9MyMtkQbYxp2pyYa3TC683m6S6qQX/y18i4p55wbtNqSbRjGhL2C/Kh71e7FyCEjO8+3JlqDfS0KWE+R2cLwLinnnBtE0iuzJw6fCASruYfWDO0835suqXQrJNrCqIjUIM45VwnSA96Thgf5UhsbGqmrqutyvuAuqcxptZWUGsQ55wa7dIWR7pJqrG/sbCFA0AIpeNA7XWEkI11SnhrEOecGh3SFsU/9PgyvHc7ohtE01DR0Od/bCiNhkS6pGFODeIXhnHNFlJ4+O7RmKNe+91oufPuFDK3tOoZRaJdU5zqMZAfJVJKUpWJtYXiXlHPOFVF6lXdDbQOHNQa7TGe2MFKW6nIsl+gYRrqV4WMYzjk3SKS7pKIVQvR5S6KFGtX0apZUR6qjcxyjYqbVSporabWkNZIuzXL+PEnPhI9HJR0ZObdO0rOSlkta1p9xO+dcoaJdUmldWhi9SA0SzSWVHjiviGm1kqqBnwEnEezRvVTSIjP7R6TYS8B7zGyLpFOABcCcyPkTzezN/orZOed6K1sLI3MMo7qqutepQdJTayulhTEbWGNma82sHVgInBYtYGaPmtmW8OXjwMR+jM855/ZYusLI2cIIB70LGbxOz4iqxApjArA+8ropPJbLhcBdkdcG3CvpSUnzc10kab6kZZKWbdq0aY8Cds653mpNtAZjFJEKIV1hVKua1kQr7cn2wrqkqsurS6o/K4xsO4VY1oLSiQQVxtcjh481s5nAKcDnJR2f7VozW2Bms8xs1pgxY7IVcc65kmnpaOk2Ayr9elT9KAxjZ8fO3i3cq8AWRhMwKfJ6IrAhs5CkI4AbgNPMrDl93Mw2hF83AncSdHE551xZaU200lDbtcJId0+Nqh/VWabXs6QqrMJYChwsaaqkOuAcYFG0gKTJwB+Aj5vZC5HjwyQNTz8HTgZW9lvkzjlXgKfeeIo719yZs4XR2NDYeayQrqUqVVGtajqSHZ1dUhWRGsTMEsDFwD3Ac8B/mdkqSRdJuigsdhnQCPw8Y/rsvsDfJa0AngD+amZ391fszjlXiN89/zsATph4QpfjU0dM5ZhxxzBn3O5Jn4W2FGqqakikEp0tjDhTg/TrJ5vZYmBxxrHrI88/DXw6y3VrgSMzjzvnXDl5ZfsrHDfhOC55xyVdju9VtxcLTl7AkqYlnccKrTBqq2qDld6V1MJwzrnBzMxYv2M9k4dPzlkm2lVV6GyndIWRXuldKbOknHNu0Nqyaws7O3Yyee/cFUZ0AV9fu6QqZdDbOecGrVe2vwLs3jgpmz1pYXR2SXmF4ZxzA9v6HcG65HxdUtHV3wWPYVTXdplW611Szjk3wL207SWqVd2501420RZGoYPXNfIuKeecG1SWb1rOIaMOyVsRRFsYBXdJVXuXlHPODRodyQ6e3fQsM8fOzFuutrq2cx1FwYPeqimbLinfQMk554D129ezsXVj5+sRdSM4aJ+DCrr2uc3P0ZZs46ixR/VYtqGmgR0dO3o1hlEuXVJeYTjnKl5HsoMz/3xmZ2rytHvOvIfxe43v8fqVbwaZio4c0/P64obaoMLo1SypSksN4pxz5aq5rZnWRCvnTz+fX538Ky6ZFazU3rCzW37UrDa1bqJGNYwZ2nOG7PQ4Rp9Tg3iXlHPOxWdz22YAZu47k3eOeyf7DNmny/FCrt+nfh+q1PPf4OmZUr1NDVIOuaS8heGcq3jNrcFOCo31QTbZdFbZ5rbmnNdkXh/NRJtPusLoS2qQKlVRXVVd0HWl4BWGc67ipVsS6Qpj5JCRCBXcwmhube68tifpvTJ62yWVSCViHfAGrzCcc66zJZFuJdRU1bBP/T6dLY+ebG7b3Lk5Uk86xzAKHLyOdkl5heGcczHb3LqZ+ur6LiuxR9WPKqiFYWY0t/WhS6rAsYiaqt3rMOIc8AavMJxzrvMXvqTOY431jQW1MFoSLexK7iq4hdE56N2LFkZFdklJmitptaQ1ki7Ncl6Srg3PPyNpZqHXOudcX2XrUiq0hdE5YF5gC6O302qjyQcrpsKQVA38DDgFmA7MkzQ9o9gpwMHhYz7wi15c65xzfZJt0LqxobGgWVKd4x+FDnr3cpZUNPlg3F1SMrP++SDpGOBbZvb+8PU3AMzsykiZXwJ/M7Pbw9ergROAKT1dm82sWbNs2bJl+Ypk9auv/YC2ul5f5pxzZWFou7jwB1/t07WSnjSzWdnO9WeX1ARgfeR1U3iskDKFXAuApPmSlklatmnTpj0O2jnnXKA/2zfKciyzeZOrTCHXBgfNFgALIGhh9CbAtM/84Gt9ucw55wa1/qwwmoDo3oUTgcxELbnK1BVwrXPOuRLqzy6ppcDBkqZKqgPOARZllFkEnB/OlnonsM3MXivwWueccyXUby0MM0tIuhi4B6gGbjSzVZIuCs9fDywGPgCsAVqAT+a7tr9id84514+zpOLQ11lSzjlXqcpllpRzzrkBzCsM55xzBfEKwznnXEG8wnDOOVeQQT3oLWkT8HIfLx8NvFnEcEphIMQIHmcxDYQYweMspv6OcX8zy7o5+aCuMPaEpGW5ZgqUi4EQI3icxTQQYgSPs5jKKUbvknLOOVcQrzCcc84VxCuM3BbEHUABBkKM4HEW00CIETzOYiqbGH0MwznnXEG8heGcc64gXmE455wriFcYGSTNlbRa0hpJl5ZBPOskPStpuaRl4bFRku6T9M/w6z6R8t8IY18t6f0ljOtGSRslrYwc63Vcko4Ov781kq6VlG2zrGLG+C1Jr4b3c7mkD8Qc4yRJD0l6TtIqSV8Mj5fbvcwVZ7ndz3pJT0haEcZ5RXi8bO5nnhjL6l5mZWb+CB8EqdNfBA4g2LRpBTA95pjWAaMzjv0AuDR8finw/fD59DDmIcDU8HupLlFcxwMzgZV7EhfwBHAMwa6KdwGnlDjGbwGXZCkbV4zjgJnh8+HAC2Es5XYvc8VZbvdTwF7h81rgf4F3ltP9zBNjWd3LbA9vYXQ1G1hjZmvNrB1YCJwWc0zZnAb8Jnz+G+DDkeMLzWyXmb1EsK/I7FIEYGZLgM17EpekccDeZvaYBf/7b4lcU6oYc4krxtfM7Knw+Q7gOYL96svtXuaKM5e44jQz2xm+rA0fRhndzzwx5hLLvczGK4yuJgDrI6+byP9D0R8MuFfSk5Lmh8f2tWAnQsKvY8Pjccff27gmhM8zj5faxZKeCbus0l0TsccoaQpwFMFfnGV7LzPihDK7n5KqJS0HNgL3mVnZ3c8cMUKZ3ctMXmF0la3/L+55x8ea2UzgFODzko7PU7Yc44fcccUR7y+AA4EZwGvAD8PjscYoaS/g98CXzGx7vqI54okrzrK7n2aWNLMZwESCv8QPz1M8ljhzxFh29zKTVxhdNQGTIq8nAhtiigUAM9sQft0I3EnQxfRG2Bwl/LoxLB53/L2Nqyl8nnm8ZMzsjfCHNQX8it1ddrHFKKmW4Jfwb83sD+HhsruX2eIsx/uZZmZbgb8BcynD+5kZYznfyzSvMLpaChwsaaqkOuAcYFFcwUgaJml4+jlwMrAyjOkTYbFPAH8Kny8CzpE0RNJU4GCCQbH+0qu4wq6BHZLeGc7uOD9yTUmkf2mETie4n7HFGL7nr4HnzOxHkVNldS9zxVmG93OMpJHh8wbgfcDzlNH9zBVjud3LrEo5oj4QH8AHCGaAvAj8n5hjOYBgdsQKYFU6HqAReAD4Z/h1VOSa/xPGvpoSzpgAbidoNncQ/KVzYV/iAmYR/GC8CFxHmH2ghDHeCjwLPEPwgzgu5hiPI+hGeAZYHj4+UIb3Mlec5XY/jwCeDuNZCVzW15+ZUsWZJ8ayupfZHp4axDnnXEG8S8o551xBvMJwzjlXEK8wnHPOFcQrDOeccwXxCsM551xBvMJwrgCSRkr618jr8ZLuKNFnfVjSZTnO7Qy/jpF0dyk+37lcvMJwrjAjgc4Kw8w2mNlZJfqsrwE/z1fAzDYBr0k6tkQxONeNVxjOFeYq4MBwn4KrJU1RuM+GpAsk/VHSnyW9JOliSV+W9LSkxyWNCssdKOnuMJHkw5IOzfwQSW8DdpnZm+HrqZIek7RU0ncyiv8ROK+k37VzEV5hOFeYS4EXzWyGmX01y/nDgXMJ8v98F2gxs6OAxwhSNgAsAP7NzI4GLiF7K+JY4KnI62uAX5jZO4DXM8ouA97dx+/HuV6riTsA5waJhyzYJ2KHpG3An8PjzwJHhFle3wX8d2RTtCFZ3mccsCny+ljgzPD5rcD3I+c2AuOLE75zPfMKw7ni2BV5noq8ThH8nFUBWy1IaZ1PKzAi41iu/D31YXnn+oV3STlXmB0EW5P2iQV7R7wk6SMQZH+VdGSWos8BB0VeP0KQNRm6j1e8jd0ZTZ0rOa8wnCuAmTUDj0haKenqPr7NecCFktLZh7Nt/7sEOEq7+62+SLBx1lK6tzxOBP7ax1ic6zXPVutcmZF0DfBnM7u/h3JLgNPMbEv/ROYqnbcwnCs/3wOG5isgaQzwI68sXH/yFoZzzrmCeAvDOedcQbzCcM45VxCvMJxzzhXEKwznnHMF8QrDOedcQf4/6jwaOcf+lLQAAAAASUVORK5CYII=\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": "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\n", "text/plain": [ "
    " ] @@ -587,18 +587,19 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
    <xarray.DataArray 'px' ()>\n",
    -       "array(0.)\n",
    +       "
    <xarray.DataArray 'px' (id: 16)>\n",
    +       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
            "Coordinates:\n",
    -       "    id       int64 101\n",
    -       "    time     float64 22.0
    " + " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", + " time float64 110.0
    " ], "text/plain": [ - "\n", - "array(0.)\n", + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", "Coordinates:\n", - " id int64 101\n", - " time float64 22.0" + " * id (id) int64 101 102 103 104 105 106 107 ... 111 112 113 114 115 116\n", + " time float64 110.0" ] }, "execution_count": 13, @@ -607,7 +608,7 @@ } ], "source": [ - "swiftdiff['px'].sel(id=101).isel(time=2)" + "swiftdiff['px'].sel(id=tpidx).isel(time=10)" ] }, { diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index 0c545d5ed..0e58a3ab6 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -16,6 +16,8 @@ module subroutine helio_coord_vb2vh_pl(self, cb) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) do i = 1, NDIM cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vb(i, 1:npl)) / cb%Gmass @@ -39,6 +41,8 @@ module subroutine helio_coord_vb2vh_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) where (tp%lmask(1:ntp)) tp%vh(1, 1:ntp) = tp%vb(1, 1:ntp) - vbcb(1) @@ -66,6 +70,8 @@ module subroutine helio_coord_vh2vb_pl(self, cb) integer(I4B) :: i real(DP) :: msys + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) msys = cb%Gmass + sum(pl%Gmass(1:npl)) do i = 1, NDIM @@ -90,6 +96,8 @@ module subroutine helio_coord_vh2vb_tp(self, vbcb) class(helio_tp), intent(inout) :: self !! Helio massive body object real(DP), dimension(:), intent(in) :: vbcb !! Barycentric velocity of the central body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) where (tp%lmask(1:ntp)) tp%vb(1, 1:ntp) = tp%vh(1, 1:ntp) + vbcb(1) diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index afbf08ace..e2a55e458 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -21,6 +21,8 @@ module subroutine helio_drift_body(self, system, param, dt) integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag real(DP), dimension(:), allocatable :: dtp, mu + if (self%nbody == 0) return + associate(n => self%nbody) allocate(iflag(n)) iflag(:) = 0 @@ -90,6 +92,8 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) if (npl == 0) return pt(1) = sum(pl%Gmass(1:npl) * pl%vb(1,1:npl), self%lmask(1:npl)) @@ -128,6 +132,8 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) if (ntp == 0) return if (lbeg) then diff --git a/src/helio/helio_gr.f90 b/src/helio/helio_gr.f90 index 4ec16d464..4902c45b8 100644 --- a/src/helio/helio_gr.f90 +++ b/src/helio/helio_gr.f90 @@ -19,8 +19,9 @@ module subroutine helio_gr_kick_getacch_pl(self, param) real(DP), dimension(:, :), allocatable :: aj real(DP) :: beta, rjmag4 + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) - if (npl == 0) return call gr_kick_getacch(pl%mu, pl%xh, pl%lmask, npl, param%inv_c2, pl%agr) pl%ah(:,1:npl) = pl%ah(:,1:npl) + pl%agr(:,1:npl) end associate @@ -44,8 +45,9 @@ module subroutine helio_gr_kick_getacch_tp(self, param) integer(I4B) :: i real(DP) :: rjmag4, beta + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp == 0) return call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) end associate @@ -69,8 +71,9 @@ module pure subroutine helio_gr_p4_pl(self, param, dt) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) - if (npl == 0) return do concurrent(i = 1:npl, pl%lmask(i)) call gr_p4_pos_kick(param, pl%xh(:, i), pl%vb(:, i), dt) end do @@ -94,8 +97,9 @@ module pure subroutine helio_gr_p4_tp(self, param, dt) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp == 0) return do concurrent(i = 1:ntp, tp%lmask(i)) call gr_p4_pos_kick(param, tp%xh(:, i), tp%vb(:, i), dt) end do diff --git a/src/helio/helio_kick.f90 b/src/helio/helio_kick.f90 index 9e47b62af..eebd17f53 100644 --- a/src/helio/helio_kick.f90 +++ b/src/helio/helio_kick.f90 @@ -17,6 +17,8 @@ module subroutine helio_kick_getacch_pl(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current simulation time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + if (self%nbody == 0) return + associate(cb => system%cb, pl => self, npl => self%nbody) call pl%accel_int() if (param%loblatecb) then @@ -58,6 +60,8 @@ module subroutine helio_kick_getacch_tp(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + if (self%nbody == 0) return + associate(tp => self, cb => system%cb, pl => system%pl, npl => system%pl%nbody) system%lbeg = lbeg if (system%lbeg) then @@ -92,8 +96,9 @@ module subroutine helio_kick_vb_pl(self, system, param, t, dt, lbeg) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) - if (npl ==0) return pl%ah(:,:) = 0.0_DP call pl%accel(system, param, t, lbeg) if (lbeg) then @@ -128,8 +133,9 @@ module subroutine helio_kick_vb_tp(self, system, param, t, dt, lbeg) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp ==0) return tp%ah(:,:) = 0.0_DP call tp%accel(system, param, t, lbeg) do concurrent(i = 1:ntp, tp%lmask(i)) diff --git a/src/helio/helio_step.f90 b/src/helio/helio_step.f90 index 72f832766..039884596 100644 --- a/src/helio/helio_step.f90 +++ b/src/helio/helio_step.f90 @@ -43,6 +43,7 @@ module subroutine helio_step_pl(self, system, param, t, dt) real(DP) :: dth !! Half step size if (self%nbody == 0) return + associate(pl => self) select type(cb => system%cb) class is (helio_cb) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index e4a2c8938..ff2f08dc5 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -87,6 +87,7 @@ module symba_classes type(symba_particle_info), dimension(:), allocatable :: info contains procedure :: discard => symba_discard_pl !! Process massive body discards + procedure :: drift => symba_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle @@ -103,6 +104,7 @@ module symba_classes integer(I4B), dimension(:), allocatable :: levelg !! level at which this particle should be moved integer(I4B), dimension(:), allocatable :: levelm !! deepest encounter level achieved this time step contains + procedure :: drift => symba_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle @@ -154,12 +156,14 @@ module symba_classes class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure + integer(I4B) :: irec !! System recursion level contains - procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps - procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step - procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system - procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary - procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step + procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps + procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step + procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure :: set_recur_levels => symba_step_set_recur_levels_system !! Sets recursion levels of bodies and encounter lists to the current system level + procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary + procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system interface @@ -193,6 +197,24 @@ module subroutine symba_discard_pl(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_discard_pl + module subroutine symba_drift_pl(self, system, param, dt) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + end subroutine symba_drift_pl + + module subroutine symba_drift_tp(self, system, param, dt) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + end subroutine symba_drift_tp + module pure elemental subroutine symba_encounter_check_one(xr, yr, zr, vxr, vyr, vzr, rhill1, rhill2, dt, irec, lencounter, lvdotr) implicit none real(DP), intent(in) :: xr, yr, zr, vxr, vyr, vzr @@ -365,6 +387,11 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system + module subroutine symba_step_set_recur_levels_system(self) + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system objec + end subroutine symba_step_set_recur_levels_system + module recursive subroutine symba_step_recur_system(self, param, t, ireci) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 01d108373..91b20b62b 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -17,6 +17,8 @@ module subroutine obl_acc_body(self, system) integer(I4B) :: i real(DP) :: r2, irh, rinv2, t0, t1, t2, t3, fac1, fac2 + if (self%nbody == 0) return + associate(n => self%nbody, cb => system%cb) self%aobl(:,:) = 0.0_DP do concurrent(i = 1:n, self%lmask(i)) @@ -52,6 +54,8 @@ module subroutine obl_acc_pl(self, system) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, cb => system%cb) call obl_acc_body(pl, system) do i = 1, NDIM @@ -83,6 +87,8 @@ module subroutine obl_acc_tp(self, system) real(DP), dimension(NDIM) :: aoblcb integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, cb => system%cb) call obl_acc_body(tp, system) if (system%lbeg) then diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index ab6596e5a..f1ab88825 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -14,6 +14,7 @@ module subroutine orbel_el2xv_vec(self, cb) integer(I4B) :: i if (self%nbody == 0) return + call self%set_mu(cb) do i = 1, self%nbody call orbel_el2xv(self%mu(i), self%a(i), self%e(i), self%inc(i), self%capom(i), & @@ -875,6 +876,7 @@ module subroutine orbel_xv2el_vec(self, cb) integer(I4B) :: i if (self%nbody == 0) return + call self%set_mu(cb) if (.not.allocated(self%a)) allocate(self%a(self%nbody)) if (.not.allocated(self%e)) allocate(self%e(self%nbody)) diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 7eeaeb6dd..551cdab92 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -17,6 +17,8 @@ module subroutine rmvs_discard_tp(self, system, param) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, pl => system%pl, t => param%t) do i = 1, ntp associate(iplperP => tp%plperP(i)) diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 6406db4b0..e4c441472 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -23,6 +23,8 @@ module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) real(DP), dimension(system%pl%nbody) :: r2crit logical :: lflag + if (self%nbody == 0) return + select type(pl => system%pl) class is (rmvs_pl) associate(tp => self, ntp => self%nbody, npl => pl%nbody, rts => system%rts) diff --git a/src/rmvs/rmvs_kick.f90 b/src/rmvs/rmvs_kick.f90 index b340ff3da..018ada8f3 100644 --- a/src/rmvs/rmvs_kick.f90 +++ b/src/rmvs/rmvs_kick.f90 @@ -23,6 +23,8 @@ module subroutine rmvs_kick_getacch_tp(self, system, param, t, lbeg) real(DP) :: GMcb_original integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, ipleP => self%ipleP, inner_index => self%index) select type(system) class is (rmvs_nbody_system) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 65122881c..27b6bd4b3 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -161,6 +161,8 @@ module subroutine rmvs_util_sort_rearrange_pl(self, ind) class(rmvs_pl), allocatable :: pl_sorted !! Temporary holder for sorted body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) @@ -188,6 +190,8 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) ! Internals class(rmvs_tp), allocatable :: tp_sorted !! Temporary holder for sorted body + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) call util_sort_rearrange_tp(tp,ind) allocate(tp_sorted, source=self) @@ -219,7 +223,6 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) associate(keeps => self) select type(discards) class is (rmvs_pl) - discards%nenc(:) = pack(keeps%nenc(:), lspill_list(:)) if (count(.not.lspill_list(:)) > 0) then keeps%nenc(:) = pack(keeps%nenc(:), .not. lspill_list(:)) diff --git a/src/symba/symba_drift.f90 b/src/symba/symba_drift.f90 new file mode 100644 index 000000000..ac06cbb6a --- /dev/null +++ b/src/symba/symba_drift.f90 @@ -0,0 +1,52 @@ + submodule (symba_classes) s_symba_drift + use swiftest +contains + + module subroutine symba_drift_pl(self, system, param, dt) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a symba_pl structure + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + + if (self%nbody == 0) return + + select type(system) + class is (symba_nbody_system) + self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + call helio_drift_body(self, system, param, dt) + self%lmask(:) = self%status(:) == ACTIVE + end select + + return + end subroutine symba_drift_pl + + + module subroutine symba_drift_tp(self, system, param, dt) + !! author: David A. Minton + !! + !! Wrapper function used to call the body drift routine from a symba_pl structure + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! Helio massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: dt !! Stepsize + + if (self%nbody == 0) return + + select type(system) + class is (symba_nbody_system) + self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + call helio_drift_body(self, system, param, dt) + self%lmask(:) = self%status(:) == ACTIVE + end select + + return + end subroutine symba_drift_tp + +end submodule s_symba_drift diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 8e3105a2e..ce3855e02 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -19,7 +19,9 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc integer(I8B) :: k real(DP), dimension(NDIM) :: xr, vr logical, dimension(:), allocatable :: lencounter, loc_lvdotr - + + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, nplpl => self%nplpl) allocate(lencounter(nplpl), loc_lvdotr(nplpl)) lencounter(:) = .false. @@ -72,12 +74,14 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan lany_encounter = .false. if (self%nenc == 0) return + select type(self) class is (symba_plplenc) isplpl = .true. class is (symba_pltpenc) isplpl = .false. end select + select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) @@ -141,7 +145,9 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc integer(I4B) :: i, j real(DP), dimension(NDIM) :: xr, vr logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr - + + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, pl => system%pl, npl => system%pl%nbody) allocate(lencounter(ntp, npl), loc_lvdotr(ntp, npl)) lencounter(:,:) = .false. diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index d3e2cba89..975288462 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -21,6 +21,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) real(DP) :: irij3, rji2, rlim2, faci, facj real(DP), dimension(NDIM) :: dx + if (self%nbody == 0) return select type(system) class is (symba_nbody_system) associate(pl => self, cb => system%cb, plplenc_list => system%plplenc_list, nplplenc => system%plplenc_list%nenc) @@ -62,7 +63,8 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) integer(I4B) :: k real(DP) :: rji2, fac, rlim2 real(DP), dimension(NDIM) :: dx - + + if (self%nbody == 0) return select type(system) class is (symba_nbody_system) associate(tp => self, cb => system%cb, pl => system%pl, pltpenc_list => system%pltpenc_list, npltpenc => system%pltpenc_list%nenc) @@ -109,6 +111,8 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) real(DP), dimension(NDIM) :: dx logical :: isplpl, lgoodlevel + if (self%nenc == 0) return + select type(self) class is (symba_plplenc) isplpl = .true. @@ -119,6 +123,10 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) + + if (pl%nbody > 0) pl%lmask(:) = pl%status(:) == ACTIVE + if (tp%nbody > 0) tp%lmask(:) = tp%status(:) == ACTIVE + irm1 = irec - 1 if (sgn < 0) then irecl = irec - 1 diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index b147293dd..e240be778 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -20,8 +20,8 @@ module subroutine symba_setup_initialize_system(self, param) call whm_setup_initialize_system(system, param) call system%mergeadd_list%setup(1, param) call system%mergesub_list%setup(1, param) - call system%pltpenc_list%setup(1) - call system%plplenc_list%setup(1) + call system%pltpenc_list%setup(0) + call system%plplenc_list%setup(0) select type(pl => system%pl) class is (symba_pl) call pl%sort("mass", ascending=.false.) @@ -57,6 +57,7 @@ module subroutine symba_setup_pl(self, n, param) allocate(self%lcollision(n)) allocate(self%lencounter(n)) + allocate(self%lmtiny(n)) allocate(self%nplenc(n)) allocate(self%ntpenc(n)) allocate(self%levelg(n)) @@ -69,6 +70,7 @@ module subroutine symba_setup_pl(self, n, param) self%lcollision(:) = .false. self%lencounter(:) = .false. + self%lmtiny(:) = .false. self%nplenc(:) = 0 self%ntpenc(:) = 0 self%levelg(:) = -1 diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 374fb0048..73319033c 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -65,28 +65,23 @@ module subroutine symba_step_interp_system(self, param, t, dt) class is (symba_tp) select type(cb => system%cb) class is (symba_cb) + system%irec = -1 call pl%vh2vb(cb) - pl%lmask(:) = pl%status(:) == ACTIVE - call pl%lindrift(cb, dth, lbeg=.true.) + call pl%lindrift(cb, dth, lbeg=.true.) call pl%kick(system, param, t, dth, lbeg=.true.) - pl%lmask(:) = pl%status(:) == ACTIVE .and. pl%levelg(:) == -1 call pl%drift(system, param, dt) call tp%vh2vb(vbcb = -cb%ptbeg) - tp%lmask(:) = tp%status(:) == ACTIVE call tp%lindrift(cb, dth, lbeg=.true.) call tp%kick(system, param, t, dth, lbeg=.true.) - tp%lmask(:) = tp%status(:) == ACTIVE .and. tp%levelg(:) == -1 call tp%drift(system, param, dt) call system%recursive_step(param, t, 0) - pl%lmask(:) = pl%status(:) == ACTIVE call pl%kick(system, param, t, dth, lbeg=.false.) call pl%vb2vh(cb) call pl%lindrift(cb, dth, lbeg=.false.) - tp%lmask(:) = tp%status(:) == ACTIVE call tp%kick(system, param, t, dth, lbeg=.false.) call tp%vb2vh(vbcb = -cb%ptend) call tp%lindrift(cb, dth, lbeg=.false.) @@ -99,6 +94,49 @@ module subroutine symba_step_interp_system(self, param, t, dt) end subroutine symba_step_interp_system + module subroutine symba_step_set_recur_levels_system(self) + !! author: David A. Minton + !! + !! Resets pl, tp,and encounter structures at the start of a new step + !! + implicit none + ! Arguments + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + ! Internals + integer(I4B) :: i, irecp + + associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) + select type(pl => self%pl) + class is (symba_pl) + select type(tp => self%tp) + class is (symba_tp) + associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & + plind2 => plplenc_list%index2(1:plplenc_list%nenc), & + plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & + tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) + + irecp = system%irec + 1 + + do i = 1, plplenc_list%nenc + if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = system%irec + if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = system%irec + end do + do i = 1, pltpenc_list%nenc + if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = system%irec + if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = system%irec + end do + end associate + + where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = system%irec + where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = system%irec + end select + end select + end associate + + return + end subroutine symba_step_set_recur_levels_system + + module recursive subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! @@ -124,6 +162,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) class is (symba_pl) select type(tp => self%tp) class is (symba_tp) + system%irec = ireci dtl = param%dt / (NTENC**ireci) dth = 0.5_DP * dtl IF (dtl / param%dt < VSMALL) THEN @@ -140,8 +179,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) end if do j = 1, nloops lencounter = plplenc_list%encounter_check(system, dtl, irecp) .or. pltpenc_list%encounter_check(system, dtl, irecp) - pl%lmask(:) = pl%status(:) == ACTIVE - tp%lmask(:) = tp%status(:) == ACTIVE + call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then @@ -149,39 +187,26 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call pltpenc_list%kick(system, dth, irecp, -1) end if - pl%lmask(:) = pl%status(:) == ACTIVE .and. pl%levelg(:) == ireci - tp%lmask(:) = tp%status(:) == ACTIVE .and. tp%levelg(:) == ireci call pl%drift(system, param, dtl) call tp%drift(system, param, dtl) + if (lencounter) call system%recursive_step(param, t+dth,irecp) + system%irec = ireci - pl%lmask(:) = pl%status(:) == ACTIVE - tp%lmask(:) = tp%status(:) == ACTIVE call plplenc_list%kick(system, dth, irecp, 1) call pltpenc_list%kick(system, dth, irecp, 1) if (ireci /= 0) then call plplenc_list%kick(system, dth, irecp, -1) call pltpenc_list%kick(system, dth, irecp, -1) end if + if (param%lclose) then call plplenc_list%collision_check(system, param, t+dtl, dtl, ireci) call pltpenc_list%collision_check(system, param, t+dtl, dtl, ireci) end if - associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & - plind2 => plplenc_list%index2(1:plplenc_list%nenc), & - plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & - tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) - do i = 1, plplenc_list%nenc - if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = ireci - if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = ireci - end do - do i = 1, pltpenc_list%nenc - if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = ireci - if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = ireci - end do - end associate - where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci - where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci + + call self%set_recur_levels() + end do end select end select @@ -207,25 +232,28 @@ module subroutine symba_step_reset_system(self) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - pl%lcollision(:) = .false. - pl%kin(:)%parent = [(i, i=1, pl%nbody)] - pl%kin(:)%nchild = 0 - do i = 1, pl%nbody - if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) - end do - pl%nplenc(:) = 0 - pl%ntpenc(:) = 0 - pl%levelg(:) = 0 - pl%levelm(:) = 0 - pl%lencounter = .false. - pl%lcollision = .false. - - tp%nplenc(:) = 0 - tp%levelg(:) = 0 - tp%levelm(:) = 0 - - plplenc_list%nenc = 0 + if (pl%nbody > 0) then + pl%lcollision(:) = .false. + pl%kin(:)%parent = [(i, i=1, pl%nbody)] + pl%kin(:)%nchild = 0 + do i = 1, pl%nbody + if (allocated(pl%kin(i)%child)) deallocate(pl%kin(i)%child) + end do + pl%nplenc(:) = 0 + pl%ntpenc(:) = 0 + pl%levelg(:) = 0 + pl%levelm(:) = 0 + pl%lencounter = .false. + pl%lcollision = .false. + plplenc_list%nenc = 0 + end if + + if (tp%nbody > 0) then + tp%nplenc(:) = 0 + tp%levelg(:) = 0 + tp%levelm(:) = 0 pltpenc_list%nenc = 0 + end if mergeadd_list%nbody = 0 mergesub_list%nbody = 0 diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c97913e05..10fb36a2d 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -89,6 +89,8 @@ module subroutine symba_util_sort_pl(self, sortby, ascending) integer(I4B), dimension(self%nbody) :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -137,6 +139,8 @@ module subroutine symba_util_sort_tp(self, sortby, ascending) integer(I4B), dimension(self%nbody) :: ind integer(I4B) :: direction + if (self%nbody == 0) return + if (ascending) then direction = 1 else @@ -181,6 +185,7 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) allocate(pl_sorted, source=self) pl%lcollision(1:npl) = pl_sorted%lcollision(ind(1:npl)) pl%lencounter(1:npl) = pl_sorted%lencounter(ind(1:npl)) + pl%lmtiny(1:npl) = pl_sorted%lmtiny(ind(1:npl)) pl%nplenc(1:npl) = pl_sorted%nplenc(ind(1:npl)) pl%ntpenc(1:npl) = pl_sorted%ntpenc(ind(1:npl)) pl%levelg(1:npl) = pl_sorted%levelg(ind(1:npl)) diff --git a/src/whm/whm_coord.f90 b/src/whm/whm_coord.f90 index 23f1c11d7..e7aa63e1f 100644 --- a/src/whm/whm_coord.f90 +++ b/src/whm/whm_coord.f90 @@ -20,9 +20,10 @@ module subroutine whm_coord_h2j_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumx, sumv, cap, capv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, eta => self%eta, xh => self%xh, vh => self%vh, & xj => self%xj, vj => self%vj) - if (npl == 0) return xj(:, 1) = xh(:, 1) vj(:, 1) = vh(:, 1) sumx(:) = 0.0_DP @@ -60,9 +61,10 @@ module subroutine whm_coord_j2h_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumx, sumv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, eta => self%eta, xh => self%xh, vh => self%vh, & xj => self%xj, vj => self%vj) - if (npl == 0) return xh(:, 1) = xj(:, 1) vh(:, 1) = vj(:, 1) sumx(:) = 0.0_DP @@ -97,8 +99,9 @@ module subroutine whm_coord_vh2vj_pl(self, cb) integer(I4B) :: i real(DP), dimension(NDIM) :: sumv, capv + if (self%nbody == 0) return + associate(npl => self%nbody, GMpl => self%Gmass, vh => self%vh, vj => self%vj, eta => self%eta) - if (npl == 0) return vj(:, 1) = vh(:, 1) sumv(:) = 0.0_DP do i = 2, npl diff --git a/src/whm/whm_drift.f90 b/src/whm/whm_drift.f90 index fc4584ec2..f68fcaeb7 100644 --- a/src/whm/whm_drift.f90 +++ b/src/whm/whm_drift.f90 @@ -19,9 +19,9 @@ module subroutine whm_drift_pl(self, system, param, dt) integer(I4B) :: i integer(I4B), dimension(:), allocatable :: iflag - associate(pl => self, npl => self%nbody) - if (npl == 0) return + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) allocate(iflag(npl)) iflag(:) = 0 call drift_all(pl%muj, pl%xj, pl%vj, npl, param, dt, pl%lmask, iflag) diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index 2816562a9..bfba5c6a2 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -19,8 +19,9 @@ module subroutine whm_gr_kick_getacch_pl(self, param) real(DP), dimension(:, :), allocatable :: aj real(DP) :: beta, rjmag4 + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody, inv_c2 => param%inv_c2) - if (npl == 0) return call gr_kick_getacch(pl%muj, pl%xj, pl%lmask, npl, param%inv_c2, pl%agr) suma(:) = 0.0_DP pl%ah(:, 1) = pl%ah(:, 1) + pl%agr(:, 1) @@ -49,8 +50,9 @@ module subroutine whm_gr_kick_getacch_tp(self, param) integer(I4B) :: i real(DP) :: rjmag4, beta + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody, inv_c2 => param%inv_c2) - if (ntp == 0) return call gr_kick_getacch(tp%mu, tp%xh, tp%lmask, ntp, param%inv_c2, tp%agr) tp%ah(:,1:ntp) = tp%ah(:,1:ntp) + tp%agr(:,1:ntp) end associate diff --git a/src/whm/whm_kick.f90 b/src/whm/whm_kick.f90 index 07944c807..2da00c332 100644 --- a/src/whm/whm_kick.f90 +++ b/src/whm/whm_kick.f90 @@ -20,8 +20,9 @@ module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) integer(I4B) :: i real(DP), dimension(NDIM) :: ah0 + if (self%nbody == 0) return + associate(cb => system%cb, pl => self, npl => self%nbody) - if (npl == 0) return call pl%set_ir3() ah0(:) = whm_kick_getacch_ah0(pl%Gmass(2:npl), pl%xh(:,2:npl), npl-1) @@ -249,8 +250,9 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) ! Internals integer(I4B) :: i + if (self%nbody == 0) return + associate(tp => self, ntp => self%nbody) - if (ntp == 0) return if (tp%lfirst) then where(tp%lmask(1:ntp)) tp%ah(1,1:ntp) = 0.0_DP diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index e8815a8ea..779480b3f 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -171,6 +171,8 @@ module subroutine whm_util_sort_rearrange_pl(self, ind) class(whm_pl), allocatable :: pl_sorted !! Temporary holder for sorted body integer(I4B) :: i + if (self%nbody == 0) return + associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) From 48b55cd96eb881484d35b826153dd4a42f946ae4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 16:36:01 -0400 Subject: [PATCH 129/194] Fixed memory allocation issues with empty encounter lists --- src/symba/symba_encounter_check.f90 | 31 ++++++++++++++++++----------- src/symba/symba_util.f90 | 16 +++++++++++---- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index ce3855e02..1a9d8c68f 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -17,6 +17,7 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals integer(I8B) :: k + integer(I4B) :: nenc real(DP), dimension(NDIM) :: xr, vr logical, dimension(:), allocatable :: lencounter, loc_lvdotr @@ -34,17 +35,20 @@ module function symba_encounter_check_pl(self, system, dt, irec) result(lany_enc end associate end do - lany_encounter = any(lencounter(:)) + nenc = count(lencounter(:)) + lany_encounter = nenc > 0 if (lany_encounter) then - associate(plplenc_list => system%plplenc_list, nenc => system%plplenc_list%nenc) - call plplenc_list%resize(count(lencounter(:))) - plplenc_list%status(1:nenc) = ACTIVE - plplenc_list%level(1:nenc) = irec + associate(plplenc_list => system%plplenc_list) + call plplenc_list%resize(nenc) plplenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(:), lencounter(:)) plplenc_list%index1(1:nenc) = pack(pl%k_plpl(1,:), lencounter(:)) plplenc_list%index2(1:nenc) = pack(pl%k_plpl(2,:), lencounter(:)) - pl%lencounter(plplenc_list%index1(1:nenc)) = .true. - pl%lencounter(plplenc_list%index2(1:nenc)) = .true. + do k = 1, nenc + plplenc_list%status(k) = ACTIVE + plplenc_list%level(k) = irec + pl%lencounter(plplenc_list%index1(k)) = .true. + pl%lencounter(plplenc_list%index2(k)) = .true. + end do end associate end if end associate @@ -142,7 +146,7 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 - integer(I4B) :: i, j + integer(I4B) :: i, j, k,nenc real(DP), dimension(NDIM) :: xr, vr logical, dimension(:,:), allocatable :: lencounter, loc_lvdotr @@ -160,10 +164,11 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc end do end do - lany_encounter = any(lencounter(:,:)) + nenc = count(lencounter(:,:)) + lany_encounter = nenc > 0 if (lany_encounter) then - associate(pltpenc_list => system%pltpenc_list, nenc => system%pltpenc_list%nenc) - call pltpenc_list%resize(count(lencounter(:,:))) + associate(pltpenc_list => system%pltpenc_list) + call pltpenc_list%resize(nenc) pltpenc_list%status(1:nenc) = ACTIVE pltpenc_list%level(1:nenc) = irec pltpenc_list%lvdotr(1:nenc) = pack(loc_lvdotr(:,:), lencounter(:,:)) @@ -172,7 +177,9 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc select type(pl) class is (symba_pl) pl%lencounter(:) = .false. - pl%lencounter(pltpenc_list%index1(1:nenc)) = .true. + do k = 1, nenc + pl%lencounter(pltpenc_list%index1(k)) = .true. + end do end select end associate end if diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 10fb36a2d..7a6f17cbf 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -59,13 +59,21 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) ! Internals class(symba_pltpenc), allocatable :: enc_temp integer(I4B) :: nold + logical :: lmalloc - nold = size(self%status) + lmalloc = allocated(self%status) + if (lmalloc) then + nold = size(self%status) + else + nold = 0 + end if if (nrequested > nold) then - allocate(enc_temp, source=self) + if (lmalloc) allocate(enc_temp, source=self) call self%setup(2 * nrequested) - call self%copy(enc_temp) - deallocate(enc_temp) + if (lmalloc) then + call self%copy(enc_temp) + deallocate(enc_temp) + end if else self%status(nrequested+1:nold) = INACTIVE end if From 9e0e208376c463feda8f2b7a21c32274b2a64363 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 16:43:33 -0400 Subject: [PATCH 130/194] Fixed additional memory errors when there are 0 of one kind of body in the system --- Makefile.Defines | 8 ++++---- src/discard/discard.f90 | 11 +++++++++-- src/modules/symba_classes.f90 | 5 +++-- src/symba/symba_step.f90 | 22 ++++++++++++---------- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 291f2c604..1346f4b09 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -FORTRAN = ifort +#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/discard/discard.f90 b/src/discard/discard.f90 index 95d4ca4b4..292e52c38 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -8,13 +8,19 @@ module subroutine discard_system(self, param) !! Calls the discard methods for each body class and then the write method if any discards were detected !! implicit none + ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + logical :: lany_discards associate(system => self, tp => self%tp, pl => self%pl) - call tp%discard(system, param) + lany_discards = .false. call pl%discard(system, param) - if (any(tp%ldiscard(:) .or. any(pl%ldiscard(:)))) call system%write_discard(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) end associate return @@ -31,6 +37,7 @@ module subroutine discard_pl(self, system, param) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + self%ldiscard(:) = .false. return diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index ff2f08dc5..fb5f6ec06 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -387,9 +387,10 @@ module subroutine symba_step_interp_system(self, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine symba_step_interp_system - module subroutine symba_step_set_recur_levels_system(self) + module subroutine symba_step_set_recur_levels_system(self, ireci) implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system objec + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system objec + integer(I4B), intent(in) :: ireci !! Input recursion level end subroutine symba_step_set_recur_levels_system module recursive subroutine symba_step_recur_system(self, param, t, ireci) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index 73319033c..c34f9fb0c 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -94,14 +94,15 @@ module subroutine symba_step_interp_system(self, param, t, dt) end subroutine symba_step_interp_system - module subroutine symba_step_set_recur_levels_system(self) + module subroutine symba_step_set_recur_levels_system(self, ireci) !! author: David A. Minton !! !! Resets pl, tp,and encounter structures at the start of a new step !! implicit none ! Arguments - class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + integer(I4B), intent(in) :: ireci !! Input recursion level ! Internals integer(I4B) :: i, irecp @@ -115,20 +116,21 @@ module subroutine symba_step_set_recur_levels_system(self) plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) - irecp = system%irec + 1 + irecp = ireci + 1 do i = 1, plplenc_list%nenc - if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = system%irec - if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = system%irec + if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = ireci + if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = ireci end do do i = 1, pltpenc_list%nenc - if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = system%irec - if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = system%irec + if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = ireci + if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = ireci end do end associate - where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = system%irec - where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = system%irec + if (plplenc_list%nenc > 0) where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci + if (pltpenc_list%nenc > 0) where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci + system%irec = ireci end select end select end associate @@ -205,7 +207,7 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) call pltpenc_list%collision_check(system, param, t+dtl, dtl, ireci) end if - call self%set_recur_levels() + call self%set_recur_levels(ireci) end do end select From a11e8c8a62a9ae98ed2cdf057be470cd144bf61e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 16:59:24 -0400 Subject: [PATCH 131/194] Fixed memory dissues with the recursion level code --- Makefile.Defines | 2 +- .../1pl_1pl_encounter/init_cond.py | 2 +- .../1pl_1pl_encounter/param.swifter.in | 2 +- .../1pl_1pl_encounter/param.swiftest.in | 2 +- src/symba/symba_collision.f90 | 4 ++ src/symba/symba_step.f90 | 40 +++++++++++-------- 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 1346f4b09..70069bb71 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -71,7 +71,7 @@ GWARNINGS = -Wall -Warray-bounds -Wimplicit-interface -Wextra -Warray-temporari #AR = xiar FORTRAN = gfortran -FFLAGS = -ffree-line-length-none $(GDEBUG) #$(GMEM) +FFLAGS = -ffree-line-length-none $(GDEBUG) $(GMEM) AR = ar # DO NOT include in CFLAGS the "-c" option to compile object only diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py index eeb2791d0..f63022624 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -31,7 +31,7 @@ # Simulation start, stop, and output cadence times t_0 = 0 # simulation start time deltaT = 0.25 * swiftest.JD2S / TU2S # simulation step size -end_sim = deltaT #0.15 +end_sim = 0.15 t_print = deltaT #output interval to print results iout = int(np.ceil(t_print / deltaT)) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in index 037d91c09..853815639 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swifter.in @@ -1,6 +1,6 @@ ! Swifter input file generated using init_cond.py T0 0 -TSTOP 0.0006844626967830253 +TSTOP 0.15 DT 0.0006844626967830253 PL_IN pl.swifter.in TP_IN tp.swifter.in 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 3e8f808ce..a7f91ba33 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -1,6 +1,6 @@ ! Swiftest input file generated using init_cond.py T0 0 -TSTOP 0.0006844626967830253 +TSTOP 0.15 DT 0.0006844626967830253 CB_IN cb.swiftest.in PL_IN pl.swiftest.in diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index d307fa7a2..133190dc2 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -19,6 +19,8 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec real(DP), intent(in) :: t !! current time real(DP), intent(in) :: dt !! step size integer(I4B), intent(in) :: irec !! Current recursion level + + return end subroutine symba_collision_check_plplenc @@ -43,6 +45,8 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec real(DP), dimension(NDIM) :: xr, vr integer(I4B) :: k + if (self%nenc == 0) return + select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index c34f9fb0c..e8badd577 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -99,38 +99,44 @@ module subroutine symba_step_set_recur_levels_system(self, ireci) !! !! Resets pl, tp,and encounter structures at the start of a new step !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_step_recur.f90 + !! Adapted from Hal Levison's Swift routine symba5_step_recur.f implicit none ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object integer(I4B), intent(in) :: ireci !! Input recursion level ! Internals - integer(I4B) :: i, irecp + integer(I4B) :: k, irecp associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) select type(pl => self%pl) class is (symba_pl) select type(tp => self%tp) class is (symba_tp) - associate (plind1 => plplenc_list%index1(1:plplenc_list%nenc), & - plind2 => plplenc_list%index2(1:plplenc_list%nenc), & - plind3 => pltpenc_list%index1(1:pltpenc_list%nenc), & - tpind => pltpenc_list%index2(1:pltpenc_list%nenc)) - - irecp = ireci + 1 + irecp = ireci + 1 - do i = 1, plplenc_list%nenc - if (pl%levelg(plind1(i)) == irecp) pl%levelg(plind1(i)) = ireci - if (pl%levelg(plind2(i)) == irecp) pl%levelg(plind2(i)) = ireci + if (plplenc_list%nenc > 0) then + do k = 1, plplenc_list%nenc + associate(i => plplenc_list%index1(k), j => plplenc_list%index2(k)) + if (pl%levelg(i) == irecp) pl%levelg(i) = ireci + if (pl%levelg(j) == irecp) pl%levelg(j) = ireci + end associate end do - do i = 1, pltpenc_list%nenc - if (pl%levelg(plind3(i)) == irecp) pl%levelg(plind3(i)) = ireci - if (tp%levelg(tpind(i)) == irecp) tp%levelg(tpind(i)) = ireci + where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(1:plplenc_list%nenc) = ireci + end if + + if (pltpenc_list%nenc > 0) then + do k = 1, pltpenc_list%nenc + associate(i => pltpenc_list%index1(k), j => pltpenc_list%index2(k)) + if (pl%levelg(i) == irecp) pl%levelg(i) = ireci + if (tp%levelg(j) == irecp) tp%levelg(j) = ireci + end associate end do - end associate + where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(1:pltpenc_list%nenc) = ireci + end if - if (plplenc_list%nenc > 0) where(plplenc_list%level(1:plplenc_list%nenc) == irecp) plplenc_list%level(:) = ireci - if (pltpenc_list%nenc > 0) where(pltpenc_list%level(1:pltpenc_list%nenc) == irecp) pltpenc_list%level(:) = ireci system%irec = ireci + end select end select end associate @@ -223,6 +229,8 @@ module subroutine symba_step_reset_system(self) !! !! Resets pl, tp,and encounter structures at the start of a new step !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_step.f90 + !! Adapted from Hal Levison's Swift routine symba5_step.f implicit none ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object From f0744543fc607cb7e1a78269dc185ecf20b4be10 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 17:00:37 -0400 Subject: [PATCH 132/194] Switched to ifort flags --- Makefile.Defines | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 70069bb71..291f2c604 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -#FORTRAN = ifort +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 From 472e1fee71ea1afd6cff195d56384a15636d85f7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 17:21:15 -0400 Subject: [PATCH 133/194] Fixed concurrent loop issue when there is nothing that meets the criteria for checking encounters --- .../1pl_1pl_encounter/swiftest_vs_swifter.ipynb | 2 +- src/symba/symba_encounter_check.f90 | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index dc1a9992f..57dd1934a 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -43,7 +43,7 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 6.845e-04\n", + "Reading in time 1.506e-01\n", "Creating Dataset\n" ] }, diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index 1a9d8c68f..baa2dc5f5 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -75,6 +75,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan real(DP), dimension(NDIM) :: xr, vr logical :: lencounter, isplpl real(DP) :: rlim2, rji2 + logical, dimension(:), allocatable :: lencmask lany_encounter = .false. if (self%nenc == 0) return @@ -90,7 +91,10 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - do concurrent(i = 1:self%nenc, self%status(i) == ACTIVE .and. self%level(i) == irec - 1) + allocate(lencmask(self%nenc)) + lencmask(:) = (self%status(1:self%nenc) == ACTIVE) .and. (self%level(:) == irec - 1) + if (.not.any(lencmask(:))) return + do concurrent(i = 1:self%nenc, lencmask(i)) associate(index_i => self%index1(i), index_j => self%index2(i)) if (isplpl) then xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) From 445a8cc3d36060f21f5a7c643d77209f1620858c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 17:26:36 -0400 Subject: [PATCH 134/194] Rearranged encounter check loop --- src/symba/symba_encounter_check.f90 | 42 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index baa2dc5f5..c65981beb 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -71,7 +71,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan integer(I4B), intent(in) :: irec !! Current recursion level logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - integer(I4B) :: i + integer(I4B) :: k real(DP), dimension(NDIM) :: xr, vr logical :: lencounter, isplpl real(DP) :: rlim2, rji2 @@ -93,41 +93,41 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan class is (symba_tp) allocate(lencmask(self%nenc)) lencmask(:) = (self%status(1:self%nenc) == ACTIVE) .and. (self%level(:) == irec - 1) - if (.not.any(lencmask(:))) return - do concurrent(i = 1:self%nenc, lencmask(i)) - associate(index_i => self%index1(i), index_j => self%index2(i)) + if (.not.any(lencmask(:))) return + associate(ind1 => self%index1, ind2 => self%index2) + do concurrent(k = 1:self%nenc, lencmask(k)) if (isplpl) then - xr(:) = pl%xh(:,index_j) - pl%xh(:,index_i) - vr(:) = pl%vb(:,index_j) - pl%vb(:,index_i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), pl%rhill(index_j), dt, irec, lencounter, self%lvdotr(i)) + xr(:) = pl%xh(:,ind2(k)) - pl%xh(:,ind1(k)) + vr(:) = pl%vb(:,ind2(k)) - pl%vb(:,ind1(k)) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(ind1(k)), pl%rhill(ind2(k)), dt, irec, lencounter, self%lvdotr(k)) else - xr(:) = tp%xh(:,index_j) - pl%xh(:,index_i) - vr(:) = tp%vb(:,index_j) - pl%vb(:,index_i) - call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(index_i), 0.0_DP, dt, irec, lencounter, self%lvdotr(i)) + xr(:) = tp%xh(:,ind2(k)) - pl%xh(:,ind1(k)) + vr(:) = tp%vb(:,ind2(k)) - pl%vb(:,ind1(k)) + call symba_encounter_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%rhill(ind1(k)), 0.0_DP, dt, irec, lencounter, self%lvdotr(k)) end if if (lencounter) then if (isplpl) then - rlim2 = (pl%radius(index_i) + pl%radius(index_j))**2 + rlim2 = (pl%radius(ind1(k)) + pl%radius(ind2(k)))**2 else - rlim2 = (pl%radius(index_i))**2 + rlim2 = (pl%radius(ind1(k)))**2 end if rji2 = dot_product(xr(:), xr(:))! Check to see if these are physically overlapping bodies first, which we should ignore if (rji2 > rlim2) then lany_encounter = .true. - pl%levelg(index_i) = irec - pl%levelm(index_i) = MAX(irec, pl%levelm(index_i)) + pl%levelg(ind1(k)) = irec + pl%levelm(ind1(k)) = MAX(irec, pl%levelm(ind1(k))) if (isplpl) then - pl%levelg(index_j) = irec - pl%levelm(index_j) = MAX(irec, pl%levelm(index_j)) + pl%levelg(ind2(k)) = irec + pl%levelm(ind2(k)) = MAX(irec, pl%levelm(ind2(k))) else - tp%levelg(index_j) = irec - tp%levelm(index_j) = MAX(irec, tp%levelm(index_j)) + tp%levelg(ind2(k)) = irec + tp%levelm(ind2(k)) = MAX(irec, tp%levelm(ind2(k))) end if - self%level(i) = irec + self%level(k) = irec end if end if - end associate - end do + end do + end associate end select end select From c2ca5ce6fd20093758aabcc4be6345a27f325128 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Fri, 30 Jul 2021 17:28:00 -0400 Subject: [PATCH 135/194] Fixed index range --- src/symba/symba_encounter_check.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index c65981beb..808ee2347 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -92,7 +92,7 @@ module function symba_encounter_check_pltpenc(self, system, dt, irec) result(lan select type(tp => system%tp) class is (symba_tp) allocate(lencmask(self%nenc)) - lencmask(:) = (self%status(1:self%nenc) == ACTIVE) .and. (self%level(:) == irec - 1) + lencmask(:) = (self%status(1:self%nenc) == ACTIVE) .and. (self%level(1:self%nenc) == irec - 1) if (.not.any(lencmask(:))) return associate(ind1 => self%index1, ind2 => self%index2) do concurrent(k = 1:self%nenc, lencmask(k)) From 8f771a134fafc0def1050f7a19b0418981da7f24 Mon Sep 17 00:00:00 2001 From: David Minton Date: Fri, 30 Jul 2021 22:59:20 -0400 Subject: [PATCH 136/194] Fixed plid in example --- .../1pl_1pl_encounter/cb.swiftest.in | Bin 80 -> 53 bytes .../1pl_1pl_encounter/init_cond.py | 2 +- .../1pl_1pl_encounter/param.swiftest.in | 2 +- .../1pl_1pl_encounter/pl.swifter.in | 2 +- .../1pl_1pl_encounter/pl.swiftest.in | Bin 248 -> 228 bytes .../1pl_1pl_encounter/tp.swiftest.in | Bin 16 -> 2 bytes .../tests/bin2xr/swiftest/bin2xr_swiftest.py | 5 +- .../tests/bin2xr/swiftest/param.swiftest.in | 62 +++++++++--------- .../tests/bin2xr/swiftest/pl.swiftest.in | Bin 1088 -> 256 bytes .../tests/bin2xr/swiftest/tp.swiftest.in | Bin 125 -> 16 bytes 10 files changed, 36 insertions(+), 37 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in index d0ae0ed15fe3ea8dd15557055a926fce3c60b59c..4c5d870405c9daad1d597cb1d3f2bd78a1b2227e 100644 GIT binary patch literal 53 wcmW;Axe)*$3rbo3*74~+Eq5}gct*a?m%+)WyI1?iYw*UYD literal 80 ncmd;JKmZOP6NHU2HoW29>+AsI-}OJ>6US3*597mhVB-S-U7iOf 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 f63022624..7600320c2 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -132,7 +132,7 @@ plfile = FortranFile(swiftest_pl, 'w') plfile.write_record(npl) -plfile.write_record(plid1) +plfile.write_record(np.array([plid1, plid2])) plfile.write_record(np.vstack([p_pl1[0],p_pl2[0]])) plfile.write_record(np.vstack([p_pl1[1],p_pl2[1]])) plfile.write_record(np.vstack([p_pl1[2],p_pl2[2]])) 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 a7f91ba33..1866557b2 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -5,7 +5,7 @@ DT 0.0006844626967830253 CB_IN cb.swiftest.in PL_IN pl.swiftest.in TP_IN tp.swiftest.in -IN_TYPE REAL8 +IN_TYPE ASCII ISTEP_OUT 1 ISTEP_DUMP 1 BIN_OUT bin.swiftest.dat diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in index 9f0548fc1..0eb21018b 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in @@ -1,5 +1,5 @@ 3 ! Planet input file generated using init_cond.py -1 39.476926408897625196 +1 39.47692640889762629 0.0 0.0 0.0 0.0 0.0 0.0 2 0.00012002693582795244940133 0.010044724833237892 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in index 51f9195316f75ec269d86d78c9046aaa2d16dab0..19c6d6e3a2436162bb5984e0ecb1cb9352cb223f 100644 GIT binary patch literal 228 zcmZ9Gxe)^~30`5m% zX0lVQ37Yye{^|yd{X~mu+c^*|K`` Ygvg?I8#T=l^4}PjYzRwv=DU9V0CM9iPyhe` literal 248 zcmd;JU|?VZVi4efVr0GmSO!FVu-A;~KlD}OgFQ$LAr4mn79&SoLf0kax1yv&qwR7r zUM5KgLgq{PMDyJ*lehmPxLQ_Dd5axP{puz5sv(nF?6>HD&rRBu2zRHD`Gi8o5H|Z` N5_L__Z6AZx0{}Ng9lHPk diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in index 64bf92f74a457d2f4bc42798493db15cc3ab1008..573541ac9702dd3969c9bc859d2b91ec1f7e6e56 100644 GIT binary patch literal 2 JcmXru0ssJP06PEx literal 16 Ncmd;JKmZOP6953P01*HH diff --git a/python/swiftest/tests/bin2xr/swiftest/bin2xr_swiftest.py b/python/swiftest/tests/bin2xr/swiftest/bin2xr_swiftest.py index 9a377876a..0a430c654 100644 --- a/python/swiftest/tests/bin2xr/swiftest/bin2xr_swiftest.py +++ b/python/swiftest/tests/bin2xr/swiftest/bin2xr_swiftest.py @@ -1,5 +1,4 @@ import swiftest -import swiftest.io as swio -param_file = "param.swiftest.in" sim = swiftest.Simulation(param_file="param.swiftest.in") -ds = swio.swiftest2xr(sim.param) \ No newline at end of file +sim.bin2xr() +sim.ds \ No newline at end of file diff --git a/python/swiftest/tests/bin2xr/swiftest/param.swiftest.in b/python/swiftest/tests/bin2xr/swiftest/param.swiftest.in index 6a9e599f9..a7f91ba33 100644 --- a/python/swiftest/tests/bin2xr/swiftest/param.swiftest.in +++ b/python/swiftest/tests/bin2xr/swiftest/param.swiftest.in @@ -1,31 +1,31 @@ -! VERSION Swiftest parameter file converted from Swift -BIG_DISCARD NO -BIN_OUT bin.dat -CB_IN cb.swiftest.in -CHK_CLOSE YES -CHK_QMIN 0.00468 -CHK_QMIN_COORD HELIO -CHK_QMIN_RANGE 4.68e-03 100.0 -CHK_RMAX 100.0 -CHK_RMIN 0.00468 -DT 5.0 -DU2M 149597870700.0 -ENC_OUT enc.dat -ENERGY NO -EXTRA_FORCE NO -FRAGMENTATION NO -GR NO -ISTEP_DUMP 7305000 -ISTEP_OUT 7305000 -MU2KG 1.988409870698051e+30 -OUT_FORM EL -OUT_STAT UNKNOWN -PL_IN pl.swiftest.in -ROTATION NO -T0 0.0 -TIDES NO -TP_IN tp.swiftest.in -TSTOP 365250000000.0 -TU2S 86400 -YARKOVSKY NO -YORP NO +! Swiftest input file generated using init_cond.py +T0 0 +TSTOP 0.15 +DT 0.0006844626967830253 +CB_IN cb.swiftest.in +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +IN_TYPE REAL8 +ISTEP_OUT 1 +ISTEP_DUMP 1 +BIN_OUT bin.swiftest.dat +OUT_TYPE REAL8 +OUT_FORM XV +OUT_STAT REPLACE +CHK_CLOSE yes +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN 0.004650467260962157 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swiftest.dat +EXTRA_FORCE no +BIG_DISCARD no +ROTATION no +GR no +MU2KG 1.988409870698051e+30 +DU2M 149597870700.0 +TU2S 31557600.0 +RHILL_PRESENT yes +MTINY 1e-12 diff --git a/python/swiftest/tests/bin2xr/swiftest/pl.swiftest.in b/python/swiftest/tests/bin2xr/swiftest/pl.swiftest.in index b7814ac98f87d48e50fd91844e705b4b7a167c93..d8da7a92a44b1e9caa3907ead959cdec31e066cc 100644 GIT binary patch literal 256 zcmd;JU|?VZVi4c}VgVqA@l!y8KmZa0VF>tOuNl*S=&QyDdsK0lJi2<~#U*rILVhbs zIyBlY7vp7;bRcBDlutC@{W5v`KZ2`e<&?MB!PKu_Vy_x9sl|Sa{`cIZU5Rja3YkwR SWDH@mKPFMv^xXC_SUmurogOa$ literal 1088 zcmXw&%dz7?2u1gbLJ3&K{}a&UpTeA${WdO{YT$A%^ksKEtCrD`|30dhKIJk#ZT~)! z*GC==X&dR?3W>;@ScI?0W_Ojl?TLxGM`muTE8l*dm}<+;SkB1I*85V3^>&8Ow2b_s zmS*FWRqA)<<##_8RJB;t$rX=8qQT}*UF#s&v{oE}KP8spBPyA#WqG3{P@)s+U1L#t z)QO~ex^?ziG0rbtTuOsX^Bu9TW`eC?QlXtp>=pMsyDh5zC(p{$++g{GSCa{~*_E*} zlx$6xS57tI(EFp0Cek(lY#!ER*Fi7Z=E5A&%ocz2Tolbd=B20jZBO8#F$cqx=%F)L z-uq;1daAzO+G8zH|H;z_6Dc886p{K3&wSgafx#a2wT2IcC%^C4eBm{+tW`~M)7Xro zm`TcZ3cs_mPYhsSLK@ggKwDR#8T~WrXzg#k=mrSZ9iLBgkw&aWJI@!V5^i+Dfa8fW zDX<%3jw}8mV?oNvV1alJyjKDA3YW(%;H%4G<$37Ndaq4?9cvtA!FKfg|BXqzsjBU( zo)G+uX1~A_bJvqK(9_7l`SPR7i<9b^#BmsWt(34;g%rF8!13zxSxpXLlx=X*UtCJZ zE@0>i8GX&I59zVzDu1##tYLl2E{!LgRfYn0niZ^+Kkf7$TUllLqYK_@6KDUpOM9Uk jZM+vnFw-xasX@?w;s(!88)XStCM7FmK{Q=Mo%=r**G~~CO8#k)xIAbWog)* mw4%gy*{=&~ZwoOMx-ra$h;ABL&fIbCZY-=O<8Jjn$n^pDZy1IE From a935642316ed921dfd02b25ea6982cbf1a838c3a Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 06:25:14 -0400 Subject: [PATCH 137/194] Moved associated index variables outside of loops (the new version of ifort doesn't play nicely with associate blocks inside of do concurrent, apparently --- src/symba/symba_collision.f90 | 25 ++++++----- src/symba/symba_kick.f90 | 81 ++++++++++++++++------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 133190dc2..2eaa521ee 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -41,7 +41,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec real(DP), intent(in) :: dt !! step size integer(I4B), intent(in) :: irec !! Current recursion level ! Internals - logical, dimension(:), allocatable :: lcollision, mask + logical, dimension(:), allocatable :: lcollision, lmask real(DP), dimension(NDIM) :: xr, vr integer(I4B) :: k @@ -51,16 +51,20 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1(1:self%nenc), tpind => self%index2(1:self%nenc)) - allocate(lcollision(npltpenc), mask(npltpenc)) - mask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) .and. (pl%levelg(plind) >= irec) .and. (tp%levelg(tpind) >= irec)) + associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1, tpind => self%index2 ) + allocate(lmask(npltpenc)) + lmask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) & + .and. (pl%levelg(plind(1:npltpenc)) >= irec) & + .and. (tp%levelg(tpind(1:npltpenc)) >= irec)) + if (.not.any(lmask(:))) return + + allocate(lcollision(npltpenc)) lcollision(:) = .false. - do concurrent(k = 1:npltpenc, mask(k)) - associate(i => plind(k), j => tpind(k)) - xr(:) = pl%xh(:, i) - tp%xh(:, j) - vr(:) = pl%vb(:, i) - tp%vb(:, j) - lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(i), pl%radius(i), dt, pltpenc_list%lvdotr(k)) - end associate + + do concurrent(k = 1:npltpenc, lmask(k)) + xr(:) = pl%xh(:, plind(k)) - tp%xh(:, tpind(k)) + vr(:) = pl%vb(:, plind(k)) - tp%vb(:, tpind(k)) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(plind(k)), pl%radius(plind(k)), dt, pltpenc_list%lvdotr(k)) end do if (any(lcollision(:))) then @@ -69,6 +73,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec tp%status(tpind(1:npltpenc)) = DISCARDED_PLR tp%ldiscard(tpind(1:npltpenc)) = .true. end where + do k = 1, npltpenc if (pltpenc_list%status(k) /= COLLISION) cycle write(*,*) 'Test particle ',tp%id(tpind(k)), ' collided with massive body ',pl%id(plind(k)), ' at time ',t diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 975288462..aebb6bb2b 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -123,38 +123,37 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) + associate(ind1 => self%index1, ind2 => self%index2) + if (pl%nbody > 0) pl%lmask(:) = pl%status(:) == ACTIVE + if (tp%nbody > 0) tp%lmask(:) = tp%status(:) == ACTIVE - if (pl%nbody > 0) pl%lmask(:) = pl%status(:) == ACTIVE - if (tp%nbody > 0) tp%lmask(:) = tp%status(:) == ACTIVE - - irm1 = irec - 1 - if (sgn < 0) then - irecl = irec - 1 - else - irecl = irec - end if - do k = 1, self%nenc - associate(i => self%index1(k), j => self%index2(k)) + irm1 = irec - 1 + if (sgn < 0) then + irecl = irec - 1 + else + irecl = irec + end if + do k = 1, self%nenc if (isplpl) then - pl%ah(:,i) = 0.0_DP - pl%ah(:,j) = 0.0_DP + pl%ah(:,ind1(k)) = 0.0_DP + pl%ah(:,ind2(k)) = 0.0_DP else - tp%ah(:,j) = 0.0_DP + tp%ah(:,ind2(k)) = 0.0_DP end if if (isplpl) then - lgoodlevel = (pl%levelg(i) >= irm1) .and. (pl%levelg(j) >= irm1) + lgoodlevel = (pl%levelg(ind1(k)) >= irm1) .and. (pl%levelg(ind2(k)) >= irm1) else - lgoodlevel = (pl%levelg(i) >= irm1) .and. (tp%levelg(j) >= irm1) + lgoodlevel = (pl%levelg(ind1(k)) >= irm1) .and. (tp%levelg(ind2(k)) >= irm1) end if if ((self%status(k) == ACTIVE) .and. lgoodlevel) then if (isplpl) then - ri = ((pl%rhill(i) + pl%rhill(j))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + ri = ((pl%rhill(ind1(k)) + pl%rhill(ind2(k)))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) - dx(:) = pl%xh(:,j) - pl%xh(:,i) + dx(:) = pl%xh(:,ind2(k)) - pl%xh(:,ind1(k)) else - ri = ((pl%rhill(i))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) + ri = ((pl%rhill(ind1(k)))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) - dx(:) = tp%xh(:,j) - pl%xh(:,i) + dx(:) = tp%xh(:,ind2(k)) - pl%xh(:,ind1(k)) end if r2 = dot_product(dx(:), dx(:)) if (r2 < rim1) then @@ -168,34 +167,30 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) ir3 = 1.0_DP / (r2 * sqrt(r2)) fac = ir3 end if - faci = fac * pl%Gmass(i) + faci = fac * pl%Gmass(ind1(k)) if (isplpl) then - facj = fac * pl%Gmass(j) - pl%ah(:,i) = pl%ah(:,i) + facj*dx(:) - pl%ah(:,j) = pl%ah(:,j) - faci*dx(:) + facj = fac * pl%Gmass(ind2(k)) + pl%ah(:,ind1(k)) = pl%ah(:,ind1(k)) + facj * dx(:) + pl%ah(:,ind2(k)) = pl%ah(:,ind2(k)) - faci * dx(:) else - tp%ah(:,j) = tp%ah(:,j) - faci*dx(:) + tp%ah(:,ind2(k)) = tp%ah(:,ind2(k)) - faci * dx(:) end if end if - end associate - end do - if (isplpl) then - do k = 1, self%nenc - associate(i => self%index1(k), j => self%index2(k)) - pl%vb(:,i) = pl%vb(:,i) + sgn * dt * pl%ah(:,i) - pl%vb(:,j) = pl%vb(:,j) + sgn * dt * pl%ah(:,j) - pl%ah(:,i) = 0.0_DP - pl%ah(:,j) = 0.0_DP - end associate end do - else - where(tp%lmask(self%index2(1:self%nenc))) - tp%vb(1,self%index2(:)) = tp%vb(1,self%index2(:)) + sgn * dt * tp%ah(1,self%index2(:)) - tp%vb(2,self%index2(:)) = tp%vb(2,self%index2(:)) + sgn * dt * tp%ah(2,self%index2(:)) - tp%vb(3,self%index2(:)) = tp%vb(3,self%index2(:)) + sgn * dt * tp%ah(3,self%index2(:)) - end where - tp%ah(:,self%index2(1:self%nenc)) = 0.0_DP - end if + if (isplpl) then + do k = 1, self%nenc + pl%vb(:,ind1(k)) = pl%vb(:,ind1(k)) + sgn * dt * pl%ah(:,ind1(k)) + pl%vb(:,ind2(k)) = pl%vb(:,ind2(k)) + sgn * dt * pl%ah(:,ind2(k)) + pl%ah(:,ind1(k)) = 0.0_DP + pl%ah(:,ind1(k)) = 0.0_DP + end do + else + do k = 1, self%nenc + tp%vb(:,ind2(k)) = tp%vb(:,ind2(k)) + sgn * dt * tp%ah(:,ind2(k)) + tp%ah(:,ind2(k)) = 0.0_DP + end do + end if + end associate end select end select From 2e06f9391157b2d87cf2798b9cbe0027621898e2 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Sat, 31 Jul 2021 06:57:05 -0400 Subject: [PATCH 138/194] Started adding collisional family code for pl-pl mergers before they shut down the clusters for maintenence --- .../swiftest_vs_swifter.ipynb | 483 +++++++++++++++++- src/symba/symba_collision.f90 | 50 +- 2 files changed, 505 insertions(+), 28 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index 57dd1934a..34c978f58 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -21,9 +21,9 @@ "output_type": "stream", "text": [ "Reading Swifter file param.swifter.in\n", - "Reading in time 6.845e-04\n", + "Reading in time 1.506e-01\n", "Creating Dataset\n", - "Successfully converted 2 output frames.\n", + "Successfully converted 221 output frames.\n", "Swifter simulation data stored as xarray DataSet .ds\n" ] } @@ -44,25 +44,9 @@ "text": [ "Reading Swiftest file param.swiftest.in\n", "Reading in time 1.506e-01\n", - "Creating Dataset\n" - ] - }, - { - "ename": "MergeError", - "evalue": "conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mMergeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mswiftestsim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswiftest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSimulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam_file\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"param.swiftest.in\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mswiftestsim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/simulation_class.py\u001b[0m in \u001b[0;36mbin2xr\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mbin2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swiftest\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 137\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mswiftest2xr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparam\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 138\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Swiftest simulation data stored as xarray DataSet .ds'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcodename\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Swifter\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/git/swiftest/python/swiftest/swiftest/io.py\u001b[0m in \u001b[0;36mswiftest2xr\u001b[0;34m(param)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mtpds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtpda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'vec'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\nCreating Dataset'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombine_by_coords\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcbds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtpds\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Successfully converted {ds.sizes['time']} output frames.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/combine.py\u001b[0m in \u001b[0;36mcombine_by_coords\u001b[0;34m(datasets, compat, data_vars, coords, fill_value, join, combine_attrs)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m )\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge\u001b[0;34m(objects, compat, join, fill_value, combine_attrs)\u001b[0m\n\u001b[1;32m 893\u001b[0m \u001b[0mjoin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 895\u001b[0;31m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 896\u001b[0m )\n\u001b[1;32m 897\u001b[0m \u001b[0mmerged\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_construct_direct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mmerge_result\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_asdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_core\u001b[0;34m(objects, compat, join, combine_attrs, priority_arg, explicit_coords, indexes, fill_value)\u001b[0m\n\u001b[1;32m 625\u001b[0m \u001b[0mprioritized\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_priority_vars_and_indexes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maligned\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority_arg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 626\u001b[0m variables, out_indexes = merge_collected(\n\u001b[0;32m--> 627\u001b[0;31m \u001b[0mcollected\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprioritized\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcombine_attrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcombine_attrs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 628\u001b[0m )\n\u001b[1;32m 629\u001b[0m \u001b[0massert_unique_multiindex_level_names\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvariables\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36mmerge_collected\u001b[0;34m(grouped, prioritized, compat, combine_attrs)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0mvariables\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mvariable\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvariable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0melements_list\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 234\u001b[0;31m \u001b[0mmerged_vars\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munique_variable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvariables\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 235\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mMergeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcompat\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"minimal\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.conda/envs/cent7/2020.02-py37/swiftestOOF/lib/python3.7/site-packages/xarray/core/merge.py\u001b[0m in \u001b[0;36munique_variable\u001b[0;34m(name, variables, compat, equals)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mequals\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m raise MergeError(\n\u001b[0;32m--> 142\u001b[0;31m \u001b[0;34mf\"conflicting values for variable {name!r} on objects to be combined. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 143\u001b[0m \u001b[0;34m\"You can skip this check by specifying compat='override'.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 144\u001b[0m )\n", - "\u001b[0;31mMergeError\u001b[0m: conflicting values for variable 'Mass' on objects to be combined. You can skip this check by specifying compat='override'." + "Creating Dataset\n", + "Successfully converted 221 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" ] } ], @@ -73,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -82,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -91,18 +75,463 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "swiftdiff['vx'].plot.line(x=\"time (y)\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'vx' (time (y): 221)>\n",
    +       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    +       "        0.,  0., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n",
    +       "       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n",
    +       "Coordinates:\n",
    +       "    id        float64 100.0\n",
    +       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
    " + ], + "text/plain": [ + "\n", + "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n", + "Coordinates:\n", + " id float64 100.0\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "swiftdiff['vx'].sel(id=100)" ] diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 2eaa521ee..bdf83a595 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -19,6 +19,54 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec real(DP), intent(in) :: t !! current time real(DP), intent(in) :: dt !! step size integer(I4B), intent(in) :: irec !! Current recursion level + ! Internals + logical, dimension(:), allocatable :: lcollision, lmask + real(DP), dimension(NDIM) :: xr, vr + integer(I4B) :: k + real(DP) :: rlim, mtot + + if (self%nenc == 0) return + + select type(pl => system%pl) + class is (symba_pl) + select type(tp => system%tp) + class is (symba_tp) + associate(plplenc_list => self, nplplenc => self%nenc, ind1 => self%index1, ind2 => self%index2) + allocate(lmask(nplplenc)) + lmask(:) = ((plplenc_list%status(1:nplplenc) == ACTIVE) & + .and. (pl%levelg(ind1(1:nplplenc)) >= irec) & + .and. (pl%levelg(ind2(1:nplplenc)) >= irec)) + if (.not.any(lmask(:))) return + + allocate(lcollision(nplplenc)) + lcollision(:) = .false. + + do concurrent(k = 1:nplplenc, lmask(k)) + 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, plplenc_list%lvdotr(k)) + end do + + if (any(lcollision(:))) then + do k = 1, nplplenc + if (plplenc_list%status(k) /= COLLISION) cycle + plplenc_list%status(k) = COLLISION + plplenc_list%xh1(:,k) = pl%xh(:,ind1(k)) + plplenc_list%vb1(:,k) = pl%vb(:,ind1(k)) + plplenc_list%xh2(:,k) = pl%xh(:,ind2(k)) + plplenc_list%vb2(:,k) = pl%vb(:,ind2(k)) + if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call plplenc_list%make_family(system) + pl%lcollision(ind1(k)) = .true. + pl%lcollision(ind2(k)) = .true. + end do + end if + end associate + end select + end select + + return return end subroutine symba_collision_check_plplenc @@ -51,7 +99,7 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1, tpind => self%index2 ) + associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1, tpind => self%index2) allocate(lmask(npltpenc)) lmask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) & .and. (pl%levelg(plind(1:npltpenc)) >= irec) & From 2389b26b4322a014cf5fa6202e48390c4f6bef8e Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 07:11:04 -0400 Subject: [PATCH 139/194] Added make_family method to the pl type in symba --- src/modules/symba_classes.f90 | 21 ++++++--- src/symba/symba_collision.f90 | 84 +++++++++++++++++++++-------------- 2 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index fb5f6ec06..2b131ef76 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -86,13 +86,14 @@ module symba_classes type(symba_kinship), dimension(:), allocatable :: kin !! Array of merger relationship structures that can account for multiple pairwise mergers in a single step type(symba_particle_info), dimension(:), allocatable :: info contains - procedure :: discard => symba_discard_pl !! Process massive body discards - procedure :: drift => symba_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level - procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other - procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle - procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen - procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: make_family => symba_collision_make_family_pl !! When a single body is involved in more than one collision in a single step, it becomes part of a family + procedure :: discard => symba_discard_pl !! Process massive body discards + procedure :: drift => symba_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level + procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other + procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen + procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl !******************************************************************************************************************************** @@ -189,6 +190,12 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_plplenc + module subroutine symba_collision_make_family_pl(self,idx) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), dimension(2), intent(in) :: idx !! Array holding the indices of the two bodies involved in the collision + end subroutine symba_collision_make_family_pl + module subroutine symba_discard_pl(self, system, param) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index bdf83a595..c15e5df81 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -29,41 +29,38 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec select type(pl => system%pl) class is (symba_pl) - select type(tp => system%tp) - class is (symba_tp) - associate(plplenc_list => self, nplplenc => self%nenc, ind1 => self%index1, ind2 => self%index2) - allocate(lmask(nplplenc)) - lmask(:) = ((plplenc_list%status(1:nplplenc) == ACTIVE) & - .and. (pl%levelg(ind1(1:nplplenc)) >= irec) & - .and. (pl%levelg(ind2(1:nplplenc)) >= irec)) - if (.not.any(lmask(:))) return - - allocate(lcollision(nplplenc)) - lcollision(:) = .false. - - do concurrent(k = 1:nplplenc, lmask(k)) - 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, plplenc_list%lvdotr(k)) + associate(plplenc_list => self, nplplenc => self%nenc, ind1 => self%index1, ind2 => self%index2) + allocate(lmask(nplplenc)) + lmask(:) = ((plplenc_list%status(1:nplplenc) == ACTIVE) & + .and. (pl%levelg(ind1(1:nplplenc)) >= irec) & + .and. (pl%levelg(ind2(1:nplplenc)) >= irec)) + if (.not.any(lmask(:))) return + + allocate(lcollision(nplplenc)) + lcollision(:) = .false. + + do concurrent(k = 1:nplplenc, lmask(k)) + 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, plplenc_list%lvdotr(k)) + end do + + if (any(lcollision(:))) then + do k = 1, nplplenc + if (plplenc_list%status(k) /= COLLISION) cycle + plplenc_list%status(k) = COLLISION + plplenc_list%xh1(:,k) = pl%xh(:,ind1(k)) + plplenc_list%vb1(:,k) = pl%vb(:,ind1(k)) + plplenc_list%xh2(:,k) = pl%xh(:,ind2(k)) + plplenc_list%vb2(:,k) = pl%vb(:,ind2(k)) + if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call pl%make_family([ind1(k),ind2(k)]) + pl%lcollision(ind1(k)) = .true. + pl%lcollision(ind2(k)) = .true. end do - - if (any(lcollision(:))) then - do k = 1, nplplenc - if (plplenc_list%status(k) /= COLLISION) cycle - plplenc_list%status(k) = COLLISION - plplenc_list%xh1(:,k) = pl%xh(:,ind1(k)) - plplenc_list%vb1(:,k) = pl%vb(:,ind1(k)) - plplenc_list%xh2(:,k) = pl%xh(:,ind2(k)) - plplenc_list%vb2(:,k) = pl%vb(:,ind2(k)) - if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call plplenc_list%make_family(system) - pl%lcollision(ind1(k)) = .true. - pl%lcollision(ind2(k)) = .true. - end do - end if - end associate - end select + end if + end associate end select return @@ -177,4 +174,23 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt return end function symba_collision_check_one + module subroutine symba_collision_make_family_pl(self, idx) + !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton + !! + !! When a single body is involved in more than one collision in a single step, it becomes part of a family. + !! The largest body involved in a multi-body collision is the "parent" and all bodies that collide with it are its "children," + !! including those that collide with the children. + !! + !! Adapted from David E. Kaufmann's Swifter routine symba_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routine symba5_merge.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), dimension(2), intent(in) :: idx !! Array holding the indices of the two bodies involved in the collision + ! Internals + + return + end subroutine symba_collision_make_family_pl + end submodule s_symba_collision \ No newline at end of file From e19e6baa63fdb44177a75b0ae9fec57d94a59747 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 07:20:42 -0400 Subject: [PATCH 140/194] Added family creation code from the Fragmentation branch --- src/symba/symba_collision.f90 | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index c15e5df81..d601e853a 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -189,6 +189,48 @@ module subroutine symba_collision_make_family_pl(self, idx) class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(2), intent(in) :: idx !! Array holding the indices of the two bodies involved in the collision ! Internals + integer(I4B) :: i, j, index_parent, index_child, p1, p2 + integer(I4B) :: nchild_inherit, nchild_orig, nchild_new + integer(I4B), dimension(:), allocatable :: temp + + associate(pl => self) + p1 = pl%kin(idx(1))%parent + 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 + index_parent = p1 + index_child = p2 + else + index_parent = p2 + index_child = p1 + end if + + ! Expand the child array (or create it if necessary) and copy over the previous lists of children + nchild_orig = pl%kin(index_parent)%nchild + nchild_inherit = pl%kin(index_child)%nchild + nchild_new = nchild_orig + nchild_inherit + 1 + allocate(temp(nchild_new)) + + if (nchild_orig > 0) temp(1:nchild_orig) = pl%kin(index_parent)%child(1:nchild_orig) + ! Find out if the child body has any children of its own. The new parent wil inherit these children + if (nchild_inherit > 0) then + temp(nchild_orig+1:nchild_orig+nchild_inherit) = pl%kin(index_child)%child(1:nchild_inherit) + do i = 1, nchild_inherit + j = pl%kin(index_child)%child(i) + ! Set the childrens' parent to the new parent + pl%kin(j)%parent = index_parent + end do + end if + if (allocated(pl%kin(index_child)%child)) deallocate(pl%kin(index_child)%child) + pl%kin(index_child)%nchild = 0 + ! Add the new child to its parent + pl%kin(index_child)%parent = index_parent + temp(nchild_new) = index_child + ! Save the new child array to the parent + pl%kin(index_parent)%nchild = nchild_new + call move_alloc(from=temp, to=pl%kin(index_parent)%child) + end associate return end subroutine symba_collision_make_family_pl From 19b6a87d54a138ecf99d71d9332e9f61cb9b433e Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 07:53:39 -0400 Subject: [PATCH 141/194] Added copy and resize methods to swiftest_body Changed the setup method so that it deallocates previously allocated arrays, and started the process of adding copy and resize methods --- src/modules/swiftest_classes.f90 | 16 +++++++++++++ src/rmvs/rmvs_setup.f90 | 6 +++++ src/setup/setup.f90 | 31 +++++++++++++++++++++++++ src/symba/symba_setup.f90 | 22 ++++++++++++++++++ src/util/util_copy.f90 | 19 +++++++++++++++ src/util/util_resize.f90 | 40 ++++++++++++++++++++++++++++++++ src/util/util_spill_and_fill.f90 | 2 +- src/whm/whm_setup.f90 | 6 +++++ 8 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/util/util_copy.f90 create mode 100644 src/util/util_resize.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 913d678eb..64a6e8778 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -164,7 +164,9 @@ module swiftest_classes procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets + procedure :: copy => util_copy_body !! Copies elements from one structure to another procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods @@ -757,6 +759,13 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_cb), intent(in) :: cb !! Swiftest central body object end subroutine util_coord_h2b_tp + module subroutine util_copy_body(self, source, param) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to copy + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine util_copy_body + module subroutine util_exit(code) implicit none integer(I4B), intent(in) :: code !! Failure exit code @@ -790,6 +799,13 @@ module subroutine util_peri_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine util_peri_tp + module subroutine util_resize_body(self, nrequested, param) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: nrequested !! New size neded + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine util_resize_body + module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 778ba3714..92043e0fe 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -147,10 +147,16 @@ module subroutine rmvs_setup_tp(self, n, param) call setup_tp(self, n, param) if (n <= 0) return + if (allocated(self%lperi)) deallocate(self%lperi) + if (allocated(self%plperP)) deallocate(self%plperP) + if (allocated(self%plencP)) deallocate(self%plencP) + allocate(self%lperi(n)) allocate(self%plperP(n)) allocate(self%plencP(n)) + if (self%lplanetocentric) then + if (allocated(self%xheliocentric)) deallocate(self%xheliocentric) allocate(self%xheliocentric(NDIM, n)) end if diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 50da6ce1c..f1e44f19c 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -110,6 +110,19 @@ module subroutine setup_body(self, n, param) if (n <= 0) return self%lfirst = .true. + if (allocated(self%id)) deallocate(self%id) + if (allocated(self%name)) deallocate(self%name) + if (allocated(self%status)) deallocate(self%status) + if (allocated(self%ldiscard)) deallocate(self%ldiscard) + if (allocated(self%xh)) deallocate(self%xh) + if (allocated(self%vh)) deallocate(self%vh) + if (allocated(self%xb)) deallocate(self%xb) + if (allocated(self%vb)) deallocate(self%vb) + if (allocated(self%ah)) deallocate(self%ah) + if (allocated(self%ir3h)) deallocate(self%ir3h) + if (allocated(self%mu)) deallocate(self%mu) + if (allocated(self%lmask)) deallocate(self%lmask) + allocate(self%id(n)) allocate(self%name(n)) allocate(self%status(n)) @@ -137,14 +150,17 @@ module subroutine setup_body(self, n, param) self%mu(:) = 0.0_DP if (param%loblatecb) then + if (allocated(self%aobl)) deallocate(self%aobl) allocate(self%aobl(NDIM, n)) self%aobl(:,:) = 0.0_DP end if if (param%ltides) then + if (allocated(self%atide)) deallocate(self%lmask) allocate(self%atide(NDIM, n)) self%atide(:,:) = 0.0_DP end if if (param%lgr) then + if (allocated(self%agr)) deallocate(self%lmask) allocate(self%agr(NDIM, n)) self%agr(:,:) = 0.0_DP end if @@ -169,6 +185,10 @@ module subroutine setup_pl(self, n, param) call setup_body(self, n, param) if (n <= 0) return + if (allocated(self%mass)) deallocate(self%mass) + if (allocated(self%Gmass)) deallocate(self%Gmass) + if (allocated(self%rhill)) deallocate(self%rhill) + allocate(self%mass(n)) allocate(self%Gmass(n)) allocate(self%rhill(n)) @@ -180,6 +200,8 @@ module subroutine setup_pl(self, n, param) self%nplpl = 0 if (param%lclose) then + if (allocated(self%radius)) deallocate(self%radius) + if (allocated(self%density)) deallocate(self%density) allocate(self%radius(n)) allocate(self%density(n)) self%radius(:) = 0.0_DP @@ -187,6 +209,8 @@ module subroutine setup_pl(self, n, param) end if if (param%lrotation) then + if (allocated(self%rot)) deallocate(self%rhill) + if (allocated(self%Ip)) deallocate(self%rhill) allocate(self%rot(NDIM, n)) allocate(self%Ip(NDIM, n)) self%rot(:,:) = 0.0_DP @@ -194,6 +218,9 @@ module subroutine setup_pl(self, n, param) end if if (param%ltides) then + if (allocated(self%k2)) deallocate(self%rhill) + if (allocated(self%Q)) deallocate(self%rhill) + if (allocated(self%tlag)) deallocate(self%rhill) allocate(self%k2(n)) allocate(self%Q(n)) allocate(self%tlag(n)) @@ -222,6 +249,10 @@ module subroutine setup_tp(self, n, param) call setup_body(self, n, param) if (n <= 0) return + if (allocated(self%isperi)) deallocate(self%isperi) + if (allocated(self%peri)) deallocate(self%peri) + if (allocated(self%atp)) deallocate(self%atp) + allocate(self%isperi(n)) allocate(self%peri(n)) allocate(self%atp(n)) diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index e240be778..dab92f3ca 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -55,6 +55,19 @@ module subroutine symba_setup_pl(self, n, param) call setup_pl(self, n, param) if (n <= 0) return + if (allocated(self%lcollision)) deallocate(self%lcollision) + if (allocated(self%lencounter)) deallocate(self%lencounter) + if (allocated(self%lmtiny)) deallocate(self%lmtiny) + if (allocated(self%nplenc)) deallocate(self%nplenc) + if (allocated(self%ntpenc)) deallocate(self%ntpenc) + if (allocated(self%levelg)) deallocate(self%levelg) + if (allocated(self%levelm)) deallocate(self%levelm) + if (allocated(self%isperi)) deallocate(self%isperi) + if (allocated(self%peri)) deallocate(self%peri) + if (allocated(self%atp)) deallocate(self%atp) + if (allocated(self%kin)) deallocate(self%kin) + if (allocated(self%info)) deallocate(self%info) + allocate(self%lcollision(n)) allocate(self%lencounter(n)) allocate(self%lmtiny(n)) @@ -102,11 +115,13 @@ module subroutine symba_setup_pltpenc(self, n) if (allocated(self%level)) deallocate(self%level) if (allocated(self%index1)) deallocate(self%index1) if (allocated(self%index2)) deallocate(self%index2) + allocate(self%lvdotr(n)) allocate(self%status(n)) allocate(self%level(n)) allocate(self%index1(n)) allocate(self%index2(n)) + self%lvdotr(:) = .false. self%status(:) = INACTIVE self%level(:) = -1 @@ -134,10 +149,12 @@ module subroutine symba_setup_plplenc(self, n) if (allocated(self%xh2)) deallocate(self%xh2) if (allocated(self%vb1)) deallocate(self%vb1) if (allocated(self%vb2)) deallocate(self%vb2) + allocate(self%xh1(NDIM,n)) allocate(self%xh2(NDIM,n)) allocate(self%vb1(NDIM,n)) allocate(self%vb2(NDIM,n)) + self%xh1(:,:) = 0.0_DP self%xh2(:,:) = 0.0_DP self%vb1(:,:) = 0.0_DP @@ -163,9 +180,14 @@ module subroutine symba_setup_tp(self, n, param) call setup_tp(self, n, param) if (n <= 0) return + if (allocated(self%nplenc)) deallocate(self%nplenc) + if (allocated(self%levelg)) deallocate(self%levelg) + if (allocated(self%levelm)) deallocate(self%levelm) + allocate(self%nplenc(n)) allocate(self%levelg(n)) allocate(self%levelm(n)) + self%nplenc(:) = 0 self%levelg(:) = -1 self%levelm(:) = -1 diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 new file mode 100644 index 000000000..fcbd0d5da --- /dev/null +++ b/src/util/util_copy.f90 @@ -0,0 +1,19 @@ +submodule (swiftest_classes) s_util_copy + use swiftest +contains + + module subroutine util_copy_body(self, source, param) + !! author: David A. Minton + !! + !! Non-destructively copy components from one Swiftest body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to copy + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + return + end subroutine util_copy_body + +end submodule s_util_copy \ No newline at end of file diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 new file mode 100644 index 000000000..cde0428d4 --- /dev/null +++ b/src/util/util_resize.f90 @@ -0,0 +1,40 @@ +submodule (swiftest_classes) s_util_resize + use swiftest +contains + + module subroutine util_resize_body(self, nrequested, param) + !! author: David A. Minton + !! + !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: nrequested !! New size neded + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + class(swiftest_body), allocatable :: temp + integer(I4B) :: nold + logical :: lmalloc + + lmalloc = allocated(self%status) + if (lmalloc) then + nold = size(self%status) + else + nold = 0 + end if + if (nrequested > nold) then + if (lmalloc) allocate(temp, source=self) + call self%setup(nrequested, param) + if (lmalloc) then + call self%copy(temp, param) + deallocate(temp) + end if + else + self%status(nrequested+1:nold) = INACTIVE + end if + self%nbody = nrequested + + return + end subroutine util_resize_body + +end submodule s_util_resize \ No newline at end of file diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 index 8ea85f654..89f8bb095 100644 --- a/src/util/util_spill_and_fill.f90 +++ b/src/util/util_spill_and_fill.f90 @@ -231,7 +231,7 @@ module subroutine util_spill_pl(self, discards, lspill_list) ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards ! Internals integer(I4B) :: i diff --git a/src/whm/whm_setup.f90 b/src/whm/whm_setup.f90 index 0de03ec2c..cbf36cc90 100644 --- a/src/whm/whm_setup.f90 +++ b/src/whm/whm_setup.f90 @@ -18,6 +18,12 @@ module subroutine whm_setup_pl(self, n, param) call setup_pl(self, n, param) if (n <= 0) return + if (allocated(self%eta)) deallocate(self%eta) + if (allocated(self%muj)) deallocate(self%muj) + if (allocated(self%xj)) deallocate(self%xj) + if (allocated(self%vj)) deallocate(self%vj) + if (allocated(self%ir3j)) deallocate(self%ir3j) + allocate(self%eta(n)) allocate(self%muj(n)) allocate(self%xj(NDIM, n)) From 4bd3487366201dc1cf9698cd78ab3766bfa8f848 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 08:14:44 -0400 Subject: [PATCH 142/194] Added templates for append and copy_into methods --- src/modules/swiftest_classes.f90 | 22 ++++++++++++++++------ src/util/util_append.f90 | 24 ++++++++++++++++++++++++ src/util/util_copy.f90 | 24 ++++++++++++++++++------ src/util/util_resize.f90 | 2 +- 4 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 src/util/util_append.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 64a6e8778..ac7639bc4 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -164,7 +164,8 @@ module swiftest_classes procedure :: xv2el => orbel_xv2el_vec !! Convert position and velocity vectors to orbital elements procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets - procedure :: copy => util_copy_body !! Copies elements from one structure to another + procedure :: append => util_append_body !! Appends elements from one structure to another + procedure :: copy_into => util_copy_into_body !! Copies elements from one Swiftest body object to another. procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) @@ -735,6 +736,14 @@ module subroutine user_kick_getacch_body(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine user_kick_getacch_body + module subroutine util_append_body(self, source, param, lmask) + implicit none + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to append + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + end subroutine util_append_body + module subroutine util_coord_b2h_pl(self, cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object @@ -759,12 +768,13 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_cb), intent(in) :: cb !! Swiftest central body object end subroutine util_coord_h2b_tp - module subroutine util_copy_body(self, source, param) + module subroutine util_copy_into_body(self, source, param, lmask) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(in) :: source !! Source object to copy - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - end subroutine util_copy_body + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to append + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + end subroutine util_copy_into_body module subroutine util_exit(code) implicit none diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 new file mode 100644 index 000000000..3541ed8e3 --- /dev/null +++ b/src/util/util_append.f90 @@ -0,0 +1,24 @@ +submodule (swiftest_classes) s_util_append + use swiftest +contains + + module subroutine util_append_body(self, source, param, lmask) + !! author: David A. Minton + !! + !! Append components from one Swiftest body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to append + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + + associate(nold => self%nbody, nnew => source%nbody) + if (nnew > size(self%status)) call self%resize(nnew, param) + + end associate + return + end subroutine util_append_body + +end submodule s_util_append \ No newline at end of file diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index fcbd0d5da..4d85e7f0c 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -2,18 +2,30 @@ use swiftest contains - module subroutine util_copy_body(self, source, param) + module subroutine util_copy_into_body(self, source, param, lmask) !! author: David A. Minton !! - !! Non-destructively copy components from one Swiftest body object to another. + !! Copies elements from one Swiftest body object to another. !! This method will automatically resize the destination body if it is too small implicit none ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(in) :: source !! Source object to copy - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_body), intent(inout) :: self !! Swiftest body object + class(swiftest_body), intent(in) :: source !! Source object to append + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + ! Internals + integer(I4B) :: nnew + if (present(lmask)) then + nnew = count(lmask) + else + nnew = size(source%status) + end if + associate(nold => self%nbody) + if (nnew > size(self%status)) call self%resize(nnew, param) + + end associate return - end subroutine util_copy_body + end subroutine util_copy_into_body end submodule s_util_copy \ No newline at end of file diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index cde0428d4..986053546 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -26,7 +26,7 @@ module subroutine util_resize_body(self, nrequested, param) if (lmalloc) allocate(temp, source=self) call self%setup(nrequested, param) if (lmalloc) then - call self%copy(temp, param) + call self%copy_into(temp, param) deallocate(temp) end if else From 8cd8464eb9ca20104b66062938d2a41902571185 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 10:28:35 -0400 Subject: [PATCH 143/194] Refactored fill and spill routines into copy submodule and added a specialized copy method that uses a fill operation --- src/modules/rmvs_classes.f90 | 30 +- src/modules/swiftest_classes.f90 | 56 ++-- src/modules/whm_classes.f90 | 18 +- src/rmvs/rmvs_util.f90 | 28 +- src/util/util_append.f90 | 4 +- src/util/util_copy.f90 | 512 ++++++++++++++++++++++++++++++- src/util/util_spill_and_fill.f90 | 506 ------------------------------ src/whm/whm_util.f90 | 14 +- 8 files changed, 581 insertions(+), 587 deletions(-) delete mode 100644 src/util/util_spill_and_fill.f90 diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 88e3ee217..945b96ce2 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -53,7 +53,7 @@ module rmvs_classes !! RMVS test particle class type, extends(whm_tp) :: rmvs_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as rmvs_setup_tp and rmvs_util_spill_tp + !! component list, such as rmvs_setup_tp and rmvs_util_copy_spill_tp ! encounter steps) logical, dimension(:), allocatable :: lperi !! planetocentric pericenter passage flag (persistent for a full rmvs time step) over a full RMVS time step) integer(I4B), dimension(:), allocatable :: plperP !! index of planet associated with pericenter distance peri (persistent over a full RMVS time step) @@ -71,10 +71,10 @@ module rmvs_classes procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => rmvs_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => rmvs_util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -94,8 +94,8 @@ module rmvs_classes procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) - procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: fill => rmvs_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: spill => rmvs_util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface @@ -154,21 +154,21 @@ module subroutine rmvs_setup_tp(self, n, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parametere end subroutine rmvs_setup_tp - module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object + class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_fill_pl + end subroutine rmvs_util_copy_fill_pl - module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_tp), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object + class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_fill_tp + end subroutine rmvs_util_copy_fill_tp module subroutine rmvs_util_sort_pl(self, sortby, ascending) implicit none @@ -196,21 +196,21 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine rmvs_util_sort_rearrange_tp - module subroutine rmvs_util_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_copy_spill_pl(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_util_spill_pl + end subroutine rmvs_util_copy_spill_pl - module subroutine rmvs_util_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_copy_spill_tp(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_util_spill_tp + end subroutine rmvs_util_copy_spill_tp module subroutine rmvs_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index ac7639bc4..5ec4fc7dc 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -145,7 +145,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_body and util_spill + !! component list, such as setup_body and util_copy_spill contains procedure(abstract_discard_body), deferred :: discard procedure(abstract_kick_body), deferred :: kick @@ -166,12 +166,12 @@ module swiftest_classes procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure :: append => util_append_body !! Appends elements from one structure to another procedure :: copy_into => util_copy_into_body !! Copies elements from one Swiftest body object to another. - procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_copy_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -196,7 +196,7 @@ module swiftest_classes integer(I4B), dimension(:,:), allocatable :: k_plpl !! Index array used to convert flattened the body-body comparison upper triangular matrix integer(I8B) :: nplpl !! Number of body-body comparisons in the flattened upper triangular matrix !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_pl and util_spill_pl + !! component list, such as setup_pl and util_copy_spill_pl contains ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators @@ -208,13 +208,13 @@ module swiftest_classes procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body procedure :: sort => util_sort_pl !! Sorts body arrays by a sortable component procedure :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** @@ -227,7 +227,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: peri !! Perihelion distance real(DP), dimension(:), allocatable :: atp !! Semimajor axis following perihelion passage !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_tp and util_spill_tp + !! component list, such as setup_tp and util_copy_spill_tp contains ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators @@ -237,12 +237,12 @@ module swiftest_classes procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -736,12 +736,12 @@ module subroutine user_kick_getacch_body(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine user_kick_getacch_body - module subroutine util_append_body(self, source, param, lmask) + module subroutine util_append_body(self, source, param, 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_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_body module subroutine util_coord_b2h_pl(self, cb) @@ -768,12 +768,12 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_cb), intent(in) :: cb !! Swiftest central body object end subroutine util_coord_h2b_tp - module subroutine util_copy_into_body(self, source, param, lmask) + module subroutine util_copy_into_body(self, source, param, 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_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_copy_into_body module subroutine util_exit(code) @@ -781,26 +781,26 @@ module subroutine util_exit(code) integer(I4B), intent(in) :: code !! Failure exit code end subroutine util_exit - module subroutine util_fill_body(self, inserts, lfill_list) + module subroutine util_copy_fill_body(self, inserts, lfill_list) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_fill_body + end subroutine util_copy_fill_body - module subroutine util_fill_pl(self, inserts, lfill_list) + module subroutine util_copy_fill_pl(self, inserts, lfill_list) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_fill_pl + end subroutine util_copy_fill_pl - module subroutine util_fill_tp(self, inserts, lfill_list) + module subroutine util_copy_fill_tp(self, inserts, lfill_list) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_fill_tp + end subroutine util_copy_fill_tp module subroutine util_peri_tp(self, system, param) implicit none @@ -934,26 +934,26 @@ module subroutine util_sort_tp(self, sortby, ascending) logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine util_sort_tp - module subroutine util_spill_body(self, discards, lspill_list) + module subroutine util_copy_spill_body(self, discards, lspill_list) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_spill_body + end subroutine util_copy_spill_body - module subroutine util_spill_pl(self, discards, lspill_list) + module subroutine util_copy_spill_pl(self, discards, lspill_list) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_spill_pl + end subroutine util_copy_spill_pl - module subroutine util_spill_tp(self, discards, lspill_list) + module subroutine util_copy_spill_tp(self, discards, lspill_list) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_spill_tp + end subroutine util_copy_spill_tp module subroutine util_valid(pl, tp) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 5509a3afe..d64354c08 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -28,13 +28,13 @@ module whm_classes real(DP), dimension(:), allocatable :: muj !! Jacobi mu: GMcb * eta(i) / eta(i - 1) real(DP), dimension(:), allocatable :: ir3j !! Third term of heliocentric acceleration !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_setup_pl and whm_util_spill_pl + !! component list, such as whm_setup_pl and whm_util_copy_spill_pl contains procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => whm_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction @@ -45,7 +45,7 @@ module whm_classes procedure :: sort => whm_util_sort_pl !! Sort a WHM massive body object in-place. procedure :: rearrange => whm_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: step => whm_step_pl !! Steps the body forward one stepsize - procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => whm_util_copy_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -55,7 +55,7 @@ module whm_classes !! WHM test particle class type, extends(swiftest_tp) :: whm_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_util_spill_tp + !! component list, such as whm_util_copy_spill_tp contains procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles @@ -106,13 +106,13 @@ module subroutine whm_drift_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_drift_pl - module subroutine whm_util_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(inout) :: inserts !! inserted object + class(swiftest_body), intent(in) :: inserts !! inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine whm_util_fill_pl + end subroutine whm_util_copy_fill_pl !> Get heliocentric accelration of massive bodies module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) @@ -249,13 +249,13 @@ module subroutine whm_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_step_tp - module subroutine whm_util_spill_pl(self, discards, lspill_list) + module subroutine whm_util_copy_spill_pl(self, discards, lspill_list) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine whm_util_spill_pl + end subroutine whm_util_copy_spill_pl !> Steps the Swiftest nbody system forward in time one stepsize module subroutine whm_step_system(self, param, t, dt) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 27b6bd4b3..863033c17 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS massive body structure into an old one. @@ -11,7 +11,7 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) implicit none ! Arguments class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: inserts !! Inserted object + class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps ! Internals integer(I4B) :: i @@ -23,17 +23,17 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) keeps%nenc(:) = unpack(keeps%nenc(:), .not.lfill_list(:), keeps%nenc(:)) keeps%nenc(:) = unpack(inserts%nenc(:), lfill_list(:), keeps%nenc(:)) - call whm_util_fill_pl(keeps, inserts, lfill_list) + call whm_util_copy_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select end associate return - end subroutine rmvs_util_fill_pl + end subroutine rmvs_util_copy_fill_pl - module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS test particle structure into an old one. @@ -42,7 +42,7 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) implicit none ! Arguments class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - class(swiftest_body), intent(inout) :: inserts !! Inserted object + class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps associate(keeps => self) @@ -58,14 +58,14 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) keeps%plencP(:) = unpack(keeps%plencP(:), .not.lfill_list(:), keeps%plencP(:)) keeps%plencP(:) = unpack(inserts%plencP(:), lfill_list(:), keeps%plencP(:)) - call util_fill_tp(keeps, inserts, lfill_list) + call util_copy_fill_tp(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' end select end associate return - end subroutine rmvs_util_fill_tp + end subroutine rmvs_util_copy_fill_tp module subroutine rmvs_util_sort_pl(self, sortby, ascending) !! author: David A. Minton @@ -206,7 +206,7 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) end subroutine rmvs_util_sort_rearrange_tp - module subroutine rmvs_util_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_copy_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -227,17 +227,17 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list) if (count(.not.lspill_list(:)) > 0) then keeps%nenc(:) = pack(keeps%nenc(:), .not. lspill_list(:)) end if - call whm_util_spill_pl(keeps, discards, lspill_list) + call whm_util_copy_spill_pl(keeps, discards, lspill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select end associate return - end subroutine rmvs_util_spill_pl + end subroutine rmvs_util_copy_spill_pl - module subroutine rmvs_util_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_copy_spill_tp(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -263,13 +263,13 @@ module subroutine rmvs_util_spill_tp(self, discards, lspill_list) keeps%plencP(:) = pack(keeps%plencP(:), .not. lspill_list(:)) end if - call util_spill_tp(keeps, discards, lspill_list) + call util_copy_spill_tp(keeps, discards, lspill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_tp' end select end associate return - end subroutine rmvs_util_spill_tp + end subroutine rmvs_util_copy_spill_tp end submodule s_rmvs_util diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 3541ed8e3..3a5b3ba81 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine util_append_body(self, source, param, lmask) + module subroutine util_append_body(self, source, param, lsource_mask) !! author: David A. Minton !! !! Append components from one Swiftest body object to another. @@ -12,7 +12,7 @@ module subroutine util_append_body(self, source, param, lmask) class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to associate(nold => self%nbody, nnew => source%nbody) if (nnew > size(self%status)) call self%resize(nnew, param) diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 4d85e7f0c..ad3c111c4 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -2,7 +2,250 @@ use swiftest contains - module subroutine util_copy_into_body(self, source, param, lmask) + module subroutine util_copy_fill_body(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest generic particle structure into an old one. + !! This is the inverse of a fill operation. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Spill all the common components + associate(keeps => self) + keeps%id(:) = unpack(keeps%id(:), .not.lfill_list(:), keeps%id(:)) + keeps%id(:) = unpack(inserts%id(:), lfill_list(:), keeps%id(:)) + + keeps%name(:) = unpack(keeps%name(:), .not.lfill_list(:), keeps%name(:)) + keeps%name(:) = unpack(inserts%name(:), lfill_list(:), keeps%name(:)) + + keeps%status(:) = unpack(keeps%status(:), .not.lfill_list(:), keeps%status(:)) + keeps%status(:) = unpack(inserts%status(:), lfill_list(:), keeps%status(:)) + + keeps%ldiscard(:) = unpack(keeps%ldiscard(:), .not.lfill_list(:), keeps%ldiscard(:)) + keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) + + keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) + keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) + + keeps%lmask(:) = unpack(keeps%lmask(:), .not.lfill_list(:), keeps%ldiscard(:)) + keeps%lmask(:) = unpack(inserts%lmask(:), lfill_list(:), keeps%ldiscard(:)) + + do i = 1, NDIM + keeps%xh(i, :) = unpack(keeps%xh(i, :), .not.lfill_list(:), keeps%xh(i, :)) + keeps%xh(i, :) = unpack(inserts%xh(i, :), lfill_list(:), keeps%xh(i, :)) + + keeps%vh(i, :) = unpack(keeps%vh(i, :), .not.lfill_list(:), keeps%vh(i, :)) + keeps%vh(i, :) = unpack(inserts%vh(i, :), lfill_list(:), keeps%vh(i, :)) + + keeps%xb(i, :) = unpack(keeps%xb(i, :), .not.lfill_list(:), keeps%xb(i, :)) + keeps%xb(i, :) = unpack(inserts%xb(i, :), lfill_list(:), keeps%xb(i, :)) + + keeps%vb(i, :) = unpack(keeps%vb(i, :), .not.lfill_list(:), keeps%vb(i, :)) + keeps%vb(i, :) = unpack(inserts%vb(i, :), lfill_list(:), keeps%vb(i, :)) + + keeps%ah(i, :) = unpack(keeps%ah(i, :), .not.lfill_list(:), keeps%ah(i, :)) + keeps%ah(i, :) = unpack(inserts%ah(i, :), lfill_list(:), keeps%ah(i, :)) + end do + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) + keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) + end do + end if + + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) + keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) + end do + end if + + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) + keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) + end do + end if + + if (allocated(keeps%a)) then + keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) + keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) + end if + + if (allocated(keeps%e)) then + keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) + keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) + end if + + if (allocated(keeps%inc)) then + keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) + keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) + end if + + if (allocated(keeps%capom)) then + keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) + keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) + end if + + if (allocated(keeps%omega)) then + keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) + keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) + end if + + if (allocated(keeps%capm)) then + keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) + keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) + end if + + ! This is the base class, so will be the last to be called in the cascade. + keeps%nbody = size(keeps%id(:)) + end associate + + return + end subroutine util_copy_fill_body + + + module subroutine util_copy_fill_pl(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest massive body structure into an old one. + !! This is the inverse of a fill operation. + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals + integer(I4B) :: i + + associate(keeps => self) + + select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components + class is (swiftest_pl) + !> Spill components specific to the massive body class + keeps%mass(:) = unpack(keeps%mass(:),.not.lfill_list(:), keeps%mass(:)) + keeps%mass(:) = unpack(inserts%mass(:),lfill_list(:), keeps%mass(:)) + + keeps%Gmass(:) = unpack(keeps%Gmass(:),.not.lfill_list(:), keeps%Gmass(:)) + keeps%Gmass(:) = unpack(inserts%Gmass(:),lfill_list(:), keeps%Gmass(:)) + + keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) + keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) + + if (allocated(keeps%radius) .and. allocated(inserts%radius)) then + keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) + keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) + end if + + if (allocated(keeps%density) .and. allocated(inserts%density)) then + keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) + keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) + end if + + if (allocated(keeps%k2) .and. allocated(inserts%k2)) then + keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) + keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) + end if + + if (allocated(keeps%Q) .and. allocated(inserts%Q)) then + keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) + keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) + end if + + if (allocated(keeps%tlag) .and. allocated(inserts%tlag)) then + keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) + keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) + end if + + if (allocated(keeps%xbeg) .and. allocated(inserts%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i, :) = unpack(keeps%xbeg(i, :), .not.lfill_list(:), keeps%xbeg(i, :)) + keeps%xbeg(i, :) = unpack(inserts%xbeg(i, :), lfill_list(:), keeps%xbeg(i, :)) + end do + end if + + if (allocated(keeps%xend) .and. allocated(inserts%xend)) then + do i = 1, NDIM + keeps%xend(i, :) = unpack(keeps%xend(i, :), .not.lfill_list(:), keeps%xend(i, :)) + keeps%xend(i, :) = unpack(inserts%xend(i, :), lfill_list(:), keeps%xend(i, :)) + end do + end if + + if (allocated(keeps%vbeg) .and. allocated(inserts%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i, :) = unpack(keeps%vbeg(i, :), .not.lfill_list(:), keeps%vbeg(i, :)) + keeps%vbeg(i, :) = unpack(inserts%vbeg(i, :), lfill_list(:), keeps%vbeg(i, :)) + end do + end if + + if (allocated(keeps%Ip) .and. allocated(inserts%Ip)) then + do i = 1, NDIM + keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) + keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) + end do + end if + + if (allocated(keeps%rot) .and. allocated(inserts%rot)) then + do i = 1, NDIM + keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) + keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) + end do + end if + + keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) + + call util_copy_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' + end select + end associate + + return + end subroutine util_copy_fill_pl + + + module subroutine util_copy_fill_tp(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest test particle structure into an old one. + !! This is the inverse of a fill operation. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + associate(keeps => self) + select type(inserts) + class is (swiftest_tp) + !> Spill components specific to the test particle class + keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) + keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) + + keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) + keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) + + keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) + keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + + call util_copy_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' + end select + end associate + + return + end subroutine util_copy_fill_tp + + + module subroutine util_copy_into_body(self, source, param, lsource_mask) !! author: David A. Minton !! !! Copies elements from one Swiftest body object to another. @@ -12,20 +255,277 @@ module subroutine util_copy_into_body(self, source, param, lmask) class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lmask !! Logical mask indicating which elements to append to + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to ! Internals - integer(I4B) :: nnew + integer(I4B) :: i,nnew + logical, dimension(:), allocatable :: lfill_list - if (present(lmask)) then - nnew = count(lmask) + if (present(lsource_mask)) then + nnew = count(lsource_mask) else nnew = size(source%status) end if + allocate(lfill_list(size(self%status))) + lfill_list = .false. + lfill_list(1:nnew) = .true. associate(nold => self%nbody) if (nnew > size(self%status)) call self%resize(nnew, param) - + call self%fill(source, lfill_list) end associate return end subroutine util_copy_into_body + + module subroutine util_copy_spill_body(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest generic particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Spill all the common components + associate(keeps => self) + discards%id(:) = pack(keeps%id(:), lspill_list(:)) + discards%name(:) = pack(keeps%name(:), lspill_list(:)) + discards%status(:) = pack(keeps%status(:), lspill_list(:)) + discards%mu(:) = pack(keeps%mu(:), lspill_list(:)) + discards%lmask(:) = pack(keeps%lmask(:), lspill_list(:)) + do i = 1, NDIM + discards%xh(i, :) = pack(keeps%xh(i, :), lspill_list(:)) + discards%vh(i, :) = pack(keeps%vh(i, :), lspill_list(:)) + discards%xb(i, :) = pack(keeps%xb(i, :), lspill_list(:)) + discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) + discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) + end do + + if (allocated(keeps%a)) discards%a(:) = pack(keeps%a(:), lspill_list(:)) + if (allocated(keeps%e)) discards%e(:) = pack(keeps%e(:), lspill_list(:)) + if (allocated(keeps%capom)) discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) + if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) + if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) + + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%agr)) then + do i = 1, NDIM + discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) + end do + end if + if (allocated(keeps%atide)) then + do i = 1, NDIM + discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) + end do + end if + + if (count(.not.lspill_list(:)) > 0) then + keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) + keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) + keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) + keeps%mu(:) = pack(keeps%mu(:), .not. lspill_list(:)) + keeps%lmask(:) = pack(keeps%lmask(:), .not. lspill_list(:)) + + do i = 1, NDIM + keeps%xh(i, :) = pack(keeps%xh(i, :), .not. lspill_list(:)) + keeps%vh(i, :) = pack(keeps%vh(i, :), .not. lspill_list(:)) + keeps%xb(i, :) = pack(keeps%xb(i, :), .not. lspill_list(:)) + keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) + keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) + end do + + if (allocated(keeps%a)) keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) + if (allocated(keeps%e)) keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) + if (allocated(keeps%inc)) keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) + if (allocated(keeps%capom)) keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) + if (allocated(keeps%omega)) keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) + if (allocated(keeps%capm)) keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) + + if (allocated(keeps%aobl)) then + do i = 1, NDIM + keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%agr)) then + do i = 1, NDIM + keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%atide)) then + do i = 1, NDIM + keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) + end do + end if + + end if + ! This is the base class, so will be the last to be called in the cascade. + ! Therefore we need to set the nbody values for both the keeps and discareds + discards%nbody = count(lspill_list(:)) + keeps%nbody = count(.not.lspill_list(:)) + if (allocated(keeps%ldiscard)) deallocate(keeps%ldiscard) + if (allocated(discards%ldiscard)) deallocate(discards%ldiscard) + allocate(keeps%ldiscard(keeps%nbody)) + allocate(discards%ldiscard(discards%nbody)) + keeps%ldiscard = .false. + discards%ldiscard = .true. + + end associate + + return + end subroutine util_copy_spill_body + + + module subroutine util_copy_spill_pl(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest massive body structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + + associate(keeps => self) + + select type (discards) ! The standard requires us to select the type of both arguments in order to access all the components + class is (swiftest_pl) + !> Spill components specific to the massive body class + discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) + discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) + discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) + + if (allocated(keeps%radius)) discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) + if (allocated(keeps%density)) discards%density(:) = pack(keeps%density(:), lspill_list(:)) + if (allocated(keeps%k2)) discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) + if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) + if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) + + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + discards%xbeg(i, :) = pack(keeps%xbeg(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + discards%xend(i, :) = pack(keeps%xend(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + discards%vbeg(i, :) = pack(keeps%vbeg(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + discards%rot(i, :) = pack(keeps%rot(i, :), lspill_list(:)) + end do + end if + + if (count(.not.lspill_list(:)) > 0) then + keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) + keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) + keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) + if (allocated(keeps%radius)) keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) + if (allocated(keeps%density)) keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) + if (allocated(keeps%k2)) keeps%k2(:) = pack(keeps%k2(:), .not. lspill_list(:)) + if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) + if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) + + if (allocated(keeps%xbeg)) then + do i = 1, NDIM + keeps%xbeg(i,:) = pack(keeps%xbeg(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%xend)) then + do i = 1, NDIM + keeps%xend(i,:) = pack(keeps%xend(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%vbeg)) then + do i = 1, NDIM + keeps%vbeg(i,:) = pack(keeps%vbeg(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%Ip)) then + do i = 1, NDIM + keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) + end do + end if + + if (allocated(keeps%rot)) then + do i = 1, NDIM + keeps%rot(i,:) = pack(keeps%rot(i,:), .not. lspill_list(:)) + end do + end if + + end if + + call util_copy_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' + end select + end associate + + return + end subroutine util_copy_spill_pl + + + module subroutine util_copy_spill_tp(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest test particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse + + associate(keeps => self, ntp => self%nbody) + select type(discards) + class is (swiftest_tp) + !> Spill components specific to the test particle class + discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) + discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) + discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + if (count(.not.lspill_list(:)) > 0) then + keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) + keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) + keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) + end if + call util_copy_spill_body(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' + end select + end associate + + return + end subroutine util_copy_spill_tp + end submodule s_util_copy \ No newline at end of file diff --git a/src/util/util_spill_and_fill.f90 b/src/util/util_spill_and_fill.f90 deleted file mode 100644 index 89f8bb095..000000000 --- a/src/util/util_spill_and_fill.f90 +++ /dev/null @@ -1,506 +0,0 @@ -submodule (swiftest_classes) s_util_spill_and_fill - use swiftest -contains - - module subroutine util_spill_body(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest generic particle structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - - ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps - !> Spill all the common components - associate(keeps => self) - discards%id(:) = pack(keeps%id(:), lspill_list(:)) - discards%name(:) = pack(keeps%name(:), lspill_list(:)) - discards%status(:) = pack(keeps%status(:), lspill_list(:)) - discards%mu(:) = pack(keeps%mu(:), lspill_list(:)) - discards%lmask(:) = pack(keeps%lmask(:), lspill_list(:)) - do i = 1, NDIM - discards%xh(i, :) = pack(keeps%xh(i, :), lspill_list(:)) - discards%vh(i, :) = pack(keeps%vh(i, :), lspill_list(:)) - discards%xb(i, :) = pack(keeps%xb(i, :), lspill_list(:)) - discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) - discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) - end do - - if (allocated(keeps%a)) discards%a(:) = pack(keeps%a(:), lspill_list(:)) - if (allocated(keeps%e)) discards%e(:) = pack(keeps%e(:), lspill_list(:)) - if (allocated(keeps%capom)) discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) - if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) - if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) - - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) - end do - end if - if (allocated(keeps%agr)) then - do i = 1, NDIM - discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) - end do - end if - if (allocated(keeps%atide)) then - do i = 1, NDIM - discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) - end do - end if - - if (count(.not.lspill_list(:)) > 0) then - keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) - keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) - keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) - keeps%mu(:) = pack(keeps%mu(:), .not. lspill_list(:)) - keeps%lmask(:) = pack(keeps%lmask(:), .not. lspill_list(:)) - - do i = 1, NDIM - keeps%xh(i, :) = pack(keeps%xh(i, :), .not. lspill_list(:)) - keeps%vh(i, :) = pack(keeps%vh(i, :), .not. lspill_list(:)) - keeps%xb(i, :) = pack(keeps%xb(i, :), .not. lspill_list(:)) - keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) - keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) - end do - - if (allocated(keeps%a)) keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) - if (allocated(keeps%e)) keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) - if (allocated(keeps%inc)) keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) - if (allocated(keeps%capom)) keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) - if (allocated(keeps%omega)) keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) - if (allocated(keeps%capm)) keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%agr)) then - do i = 1, NDIM - keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%atide)) then - do i = 1, NDIM - keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) - end do - end if - - end if - ! This is the base class, so will be the last to be called in the cascade. - ! Therefore we need to set the nbody values for both the keeps and discareds - discards%nbody = count(lspill_list(:)) - keeps%nbody = count(.not.lspill_list(:)) - if (allocated(keeps%ldiscard)) deallocate(keeps%ldiscard) - if (allocated(discards%ldiscard)) deallocate(discards%ldiscard) - allocate(keeps%ldiscard(keeps%nbody)) - allocate(discards%ldiscard(discards%nbody)) - keeps%ldiscard = .false. - discards%ldiscard = .true. - - end associate - - return - end subroutine util_spill_body - - - module subroutine util_fill_body(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest generic particle structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - class(swiftest_body), intent(inout) :: inserts !! Insertted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! internals - integer(I4B) :: i - - ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps - !> Spill all the common components - associate(keeps => self) - keeps%id(:) = unpack(keeps%id(:), .not.lfill_list(:), keeps%id(:)) - keeps%id(:) = unpack(inserts%id(:), lfill_list(:), keeps%id(:)) - - keeps%name(:) = unpack(keeps%name(:), .not.lfill_list(:), keeps%name(:)) - keeps%name(:) = unpack(inserts%name(:), lfill_list(:), keeps%name(:)) - - keeps%status(:) = unpack(keeps%status(:), .not.lfill_list(:), keeps%status(:)) - keeps%status(:) = unpack(inserts%status(:), lfill_list(:), keeps%status(:)) - - keeps%ldiscard(:) = unpack(keeps%ldiscard(:), .not.lfill_list(:), keeps%ldiscard(:)) - keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) - - keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) - keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) - - keeps%lmask(:) = unpack(keeps%lmask(:), .not.lfill_list(:), keeps%ldiscard(:)) - keeps%lmask(:) = unpack(inserts%lmask(:), lfill_list(:), keeps%ldiscard(:)) - - do i = 1, NDIM - keeps%xh(i, :) = unpack(keeps%xh(i, :), .not.lfill_list(:), keeps%xh(i, :)) - keeps%xh(i, :) = unpack(inserts%xh(i, :), lfill_list(:), keeps%xh(i, :)) - - keeps%vh(i, :) = unpack(keeps%vh(i, :), .not.lfill_list(:), keeps%vh(i, :)) - keeps%vh(i, :) = unpack(inserts%vh(i, :), lfill_list(:), keeps%vh(i, :)) - - keeps%xb(i, :) = unpack(keeps%xb(i, :), .not.lfill_list(:), keeps%xb(i, :)) - keeps%xb(i, :) = unpack(inserts%xb(i, :), lfill_list(:), keeps%xb(i, :)) - - keeps%vb(i, :) = unpack(keeps%vb(i, :), .not.lfill_list(:), keeps%vb(i, :)) - keeps%vb(i, :) = unpack(inserts%vb(i, :), lfill_list(:), keeps%vb(i, :)) - - keeps%ah(i, :) = unpack(keeps%ah(i, :), .not.lfill_list(:), keeps%ah(i, :)) - keeps%ah(i, :) = unpack(inserts%ah(i, :), lfill_list(:), keeps%ah(i, :)) - end do - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) - keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) - end do - end if - - if (allocated(keeps%agr)) then - do i = 1, NDIM - keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) - keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) - end do - end if - - if (allocated(keeps%atide)) then - do i = 1, NDIM - keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) - keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) - end do - end if - - if (allocated(keeps%a)) then - keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) - keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) - end if - - if (allocated(keeps%e)) then - keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) - keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) - end if - - if (allocated(keeps%inc)) then - keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) - keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) - end if - - if (allocated(keeps%capom)) then - keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) - keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) - end if - - if (allocated(keeps%omega)) then - keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) - keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) - end if - - if (allocated(keeps%capm)) then - keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) - keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) - end if - - ! This is the base class, so will be the last to be called in the cascade. - keeps%nbody = size(keeps%id(:)) - end associate - - return - end subroutine util_fill_body - - - module subroutine util_spill_pl(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest massive body structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - - associate(keeps => self) - - select type (discards) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) - discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) - discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) - - if (allocated(keeps%radius)) discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) - if (allocated(keeps%density)) discards%density(:) = pack(keeps%density(:), lspill_list(:)) - if (allocated(keeps%k2)) discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) - if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) - if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) - - if (allocated(keeps%xbeg)) then - do i = 1, NDIM - discards%xbeg(i, :) = pack(keeps%xbeg(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%xend)) then - do i = 1, NDIM - discards%xend(i, :) = pack(keeps%xend(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%vbeg)) then - do i = 1, NDIM - discards%vbeg(i, :) = pack(keeps%vbeg(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%Ip)) then - do i = 1, NDIM - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%rot)) then - do i = 1, NDIM - discards%rot(i, :) = pack(keeps%rot(i, :), lspill_list(:)) - end do - end if - - if (count(.not.lspill_list(:)) > 0) then - keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) - keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) - keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) - if (allocated(keeps%radius)) keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) - if (allocated(keeps%density)) keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) - if (allocated(keeps%k2)) keeps%k2(:) = pack(keeps%k2(:), .not. lspill_list(:)) - if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) - if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) - - if (allocated(keeps%xbeg)) then - do i = 1, NDIM - keeps%xbeg(i,:) = pack(keeps%xbeg(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%xend)) then - do i = 1, NDIM - keeps%xend(i,:) = pack(keeps%xend(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%vbeg)) then - do i = 1, NDIM - keeps%vbeg(i,:) = pack(keeps%vbeg(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%Ip)) then - do i = 1, NDIM - keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%rot)) then - do i = 1, NDIM - keeps%rot(i,:) = pack(keeps%rot(i,:), .not. lspill_list(:)) - end do - end if - - end if - - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' - end select - end associate - - return - end subroutine util_spill_pl - - - module subroutine util_fill_pl(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest massive body structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i - - associate(keeps => self) - - select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - keeps%mass(:) = unpack(keeps%mass(:),.not.lfill_list(:), keeps%mass(:)) - keeps%mass(:) = unpack(inserts%mass(:),lfill_list(:), keeps%mass(:)) - - keeps%Gmass(:) = unpack(keeps%Gmass(:),.not.lfill_list(:), keeps%Gmass(:)) - keeps%Gmass(:) = unpack(inserts%Gmass(:),lfill_list(:), keeps%Gmass(:)) - - keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) - keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - - if (allocated(keeps%radius) .and. allocated(inserts%radius)) then - keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) - keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) - end if - - if (allocated(keeps%density) .and. allocated(inserts%density)) then - keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) - keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) - end if - - if (allocated(keeps%k2) .and. allocated(inserts%k2)) then - keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) - keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) - end if - - if (allocated(keeps%Q) .and. allocated(inserts%Q)) then - keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) - keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) - end if - - if (allocated(keeps%tlag) .and. allocated(inserts%tlag)) then - keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) - keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) - end if - - if (allocated(keeps%xbeg) .and. allocated(inserts%xbeg)) then - do i = 1, NDIM - keeps%xbeg(i, :) = unpack(keeps%xbeg(i, :), .not.lfill_list(:), keeps%xbeg(i, :)) - keeps%xbeg(i, :) = unpack(inserts%xbeg(i, :), lfill_list(:), keeps%xbeg(i, :)) - end do - end if - - if (allocated(keeps%xend) .and. allocated(inserts%xend)) then - do i = 1, NDIM - keeps%xend(i, :) = unpack(keeps%xend(i, :), .not.lfill_list(:), keeps%xend(i, :)) - keeps%xend(i, :) = unpack(inserts%xend(i, :), lfill_list(:), keeps%xend(i, :)) - end do - end if - - if (allocated(keeps%vbeg) .and. allocated(inserts%vbeg)) then - do i = 1, NDIM - keeps%vbeg(i, :) = unpack(keeps%vbeg(i, :), .not.lfill_list(:), keeps%vbeg(i, :)) - keeps%vbeg(i, :) = unpack(inserts%vbeg(i, :), lfill_list(:), keeps%vbeg(i, :)) - end do - end if - - if (allocated(keeps%Ip) .and. allocated(inserts%Ip)) then - do i = 1, NDIM - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) - end do - end if - - if (allocated(keeps%rot) .and. allocated(inserts%rot)) then - do i = 1, NDIM - keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) - keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) - end do - end if - - keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' - end select - end associate - - return - end subroutine util_fill_pl - - - module subroutine util_spill_tp(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest test particle structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse - - associate(keeps => self, ntp => self%nbody) - select type(discards) - class is (swiftest_tp) - !> Spill components specific to the test particle class - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - end if - call util_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' - end select - end associate - - return - end subroutine util_spill_tp - - - module subroutine util_fill_tp(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest test particle structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_body), intent(inout) :: inserts !! Swiftest body object to be inserted - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - - associate(keeps => self) - select type(inserts) - class is (swiftest_tp) - !> Spill components specific to the test particle class - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) - - call util_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' - end select - end associate - - return - end subroutine util_fill_tp - -end submodule s_util_spill_and_fill - - - - - - diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 779480b3f..aaad01e84 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_util_spill_pl(self, discards, lspill_list) + module subroutine whm_util_copy_spill_pl(self, discards, lspill_list) !! author: David A. Minton !! !! Move spilled (discarded) WHM test particle structure from active list to discard list @@ -35,17 +35,17 @@ module subroutine whm_util_spill_pl(self, discards, lspill_list) keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) end do end if - call util_spill_pl(keeps, discards, lspill_list) + call util_copy_spill_pl(keeps, discards, lspill_list) class default write(*,*) 'Error! spill method called for incompatible return type on whm_pl' end select end associate return - end subroutine whm_util_spill_pl + end subroutine whm_util_copy_spill_pl - module subroutine whm_util_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new WHM test particle structure into an old one. @@ -55,7 +55,7 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) implicit none ! Arguments class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(inout) :: inserts !! inserted object + class(swiftest_body), intent(in) :: inserts !! inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps ! Internals integer(I4B) :: i @@ -80,14 +80,14 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) keeps%vj(i, :) = unpack(keeps%vj(i, :), .not.lfill_list(:), keeps%vj(i, :)) keeps%vj(i, :) = unpack(inserts%vj(i, :), lfill_list(:), keeps%vj(i, :)) end do - call util_fill_pl(keeps, inserts, lfill_list) + call util_copy_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on whm_pl' end select end associate return - end subroutine whm_util_fill_pl + end subroutine whm_util_copy_fill_pl module subroutine whm_util_set_ir3j(self) From fc45a69416e851f2e1065f53c49992bb5f8778e1 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 16:26:52 -0400 Subject: [PATCH 144/194] Added fill method to SyMBA --- src/modules/rmvs_classes.f90 | 4 +- src/modules/swiftest_classes.f90 | 6 +-- src/modules/symba_classes.f90 | 18 +++++++ src/modules/whm_classes.f90 | 2 +- src/symba/symba_util.f90 | 93 ++++++++++++++++++++++++++++++++ src/util/util_copy.f90 | 1 - 6 files changed, 117 insertions(+), 7 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 945b96ce2..64a0a5875 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -71,7 +71,7 @@ module rmvs_classes procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure :: fill => rmvs_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => rmvs_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: spill => rmvs_util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) @@ -94,7 +94,7 @@ module rmvs_classes procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: fill => rmvs_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => rmvs_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: spill => rmvs_util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 5ec4fc7dc..3711e5295 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -166,7 +166,7 @@ module swiftest_classes procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure :: append => util_append_body !! Appends elements from one structure to another procedure :: copy_into => util_copy_into_body !! Copies elements from one Swiftest body object to another. - procedure :: fill => util_copy_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen @@ -208,7 +208,7 @@ module swiftest_classes procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body @@ -237,7 +237,7 @@ module swiftest_classes procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 2b131ef76..6a878520a 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -92,6 +92,7 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: fill => symba_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_pl @@ -109,6 +110,7 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure :: fill => symba_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods end type symba_tp @@ -414,6 +416,22 @@ module subroutine symba_step_reset_system(self) class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object end subroutine symba_step_reset_system + module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine symba_util_copy_fill_pl + + module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine symba_util_copy_fill_tp + module subroutine symba_util_copy_pltpenc(self, source) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index d64354c08..4dd7f646a 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -34,7 +34,7 @@ module whm_classes procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure :: fill => whm_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the MERGE intrinsic) + procedure :: fill => whm_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 7a6f17cbf..b8dbbd49a 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,6 +2,99 @@ use swiftest contains + module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new SyMBA test particle structure into an old one. + !! This is the inverse of a fill operation. + !! + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA masive body object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + associate(keeps => self) + select type(inserts) + class is (symba_pl) + keeps%lcollision(:) = unpack(keeps%lcollision(:), .not.lfill_list(:), keeps%lcollision(:)) + keeps%lcollision(:) = unpack(inserts%lcollision(:), lfill_list(:), keeps%lcollision(:)) + + keeps%lencounter(:) = unpack(keeps%lencounter(:), .not.lfill_list(:), keeps%lencounter(:)) + keeps%lencounter(:) = unpack(inserts%lencounter(:), lfill_list(:), keeps%lencounter(:)) + + keeps%lmtiny(:) = unpack(keeps%lmtiny(:), .not.lfill_list(:), keeps%lmtiny(:)) + keeps%lmtiny(:) = unpack(inserts%lmtiny(:), lfill_list(:), keeps%lmtiny(:)) + + keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) + keeps%nplenc(:) = unpack(inserts%nplenc(:), lfill_list(:), keeps%nplenc(:)) + + keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) + keeps%ntpenc(:) = unpack(inserts%ntpenc(:), lfill_list(:), keeps%ntpenc(:)) + + keeps%levelg(:) = unpack(keeps%levelg(:), .not.lfill_list(:), keeps%levelg(:)) + keeps%levelg(:) = unpack(inserts%levelg(:), lfill_list(:), keeps%levelg(:)) + + keeps%levelm(:) = unpack(keeps%levelm(:), .not.lfill_list(:), keeps%levelm(:)) + keeps%levelm(:) = unpack(inserts%levelm(:), lfill_list(:), keeps%levelm(:)) + + keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) + keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) + + keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) + keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) + + keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) + keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + + keeps%kin(:) = unpack(keeps%kin(:), .not.lfill_list(:), keeps%kin(:)) + keeps%kin(:) = unpack(inserts%kin(:), lfill_list(:), keeps%kin(:)) + + keeps%info(:) = unpack(keeps%info(:), .not.lfill_list(:), keeps%info(:)) + keeps%info(:) = unpack(inserts%info(:), lfill_list(:), keeps%info(:)) + + call util_copy_fill_pl(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on symba_pl' + end select + end associate + + return + end subroutine symba_util_copy_fill_pl + + module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new SyMBA test particle structure into an old one. + !! This is the inverse of a fill operation. + !! + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + associate(keeps => self) + select type(inserts) + class is (symba_tp) + keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) + keeps%nplenc(:) = unpack(inserts%nplenc(:), lfill_list(:), keeps%nplenc(:)) + + keeps%levelg(:) = unpack(keeps%levelg(:), .not.lfill_list(:), keeps%levelg(:)) + keeps%levelg(:) = unpack(inserts%levelg(:), lfill_list(:), keeps%levelg(:)) + + keeps%levelm(:) = unpack(keeps%levelm(:), .not.lfill_list(:), keeps%levelm(:)) + keeps%levelm(:) = unpack(inserts%levelm(:), lfill_list(:), keeps%levelm(:)) + + call util_copy_fill_tp(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on symba_tp' + end select + end associate + + return + end subroutine symba_util_copy_fill_tp + module subroutine symba_util_copy_pltpenc(self, source) !! author: David A. Minton !! diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index ad3c111c4..3a4b1e9f6 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -311,7 +311,6 @@ module subroutine util_copy_spill_body(self, discards, lspill_list) if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) - if (allocated(keeps%aobl)) then do i = 1, NDIM discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) From d48cc7851ff9bb543a2309244d182a5320621d6e Mon Sep 17 00:00:00 2001 From: David Minton Date: Sat, 31 Jul 2021 19:44:06 -0400 Subject: [PATCH 145/194] Added spill methods to SyMBA --- src/modules/symba_classes.f90 | 18 +++++++ src/symba/symba_util.f90 | 95 +++++++++++++++++++++++++++++++++++ src/util/util_copy.f90 | 1 - 3 files changed, 113 insertions(+), 1 deletion(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 6a878520a..0080b1e07 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -95,6 +95,7 @@ module symba_classes procedure :: fill => symba_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => symba_util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_pl !******************************************************************************************************************************** @@ -113,6 +114,7 @@ module symba_classes procedure :: fill => symba_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => symba_util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_tp !******************************************************************************************************************************** @@ -450,6 +452,22 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B), intent(in) :: nrequested !! New size of list needed end subroutine symba_util_resize_pltpenc + module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + end subroutine symba_util_copy_spill_pl + + module subroutine symba_util_copy_spill_tp(self, discards, lspill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + end subroutine symba_util_copy_spill_tp + module subroutine symba_util_sort_pl(self, sortby, ascending) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index b8dbbd49a..7d65665f8 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -140,6 +140,7 @@ module subroutine symba_util_copy_plplenc(self, source) return end subroutine symba_util_copy_plplenc + module subroutine symba_util_resize_pltpenc(self, nrequested) !! author: David A. Minton !! @@ -332,4 +333,98 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) return end subroutine symba_util_sort_rearrange_tp + + module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) SyMBA massive body particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Spill all the common components + associate(keeps => self) + select type(discards) + class is (symba_pl) + discards%lcollision(:) = pack(keeps%lcollision(:), lspill_list(:)) + discards%lencounter(:) = pack(keeps%lencounter(:), lspill_list(:)) + discards%lmtiny(:) = pack(keeps%lmtiny(:), lspill_list(:)) + discards%nplenc(:) = pack(keeps%nplenc(:), lspill_list(:)) + discards%ntpenc(:) = pack(keeps%ntpenc(:), lspill_list(:)) + discards%levelg(:) = pack(keeps%levelg(:), lspill_list(:)) + discards%levelm(:) = pack(keeps%levelm(:), lspill_list(:)) + discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) + discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) + discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + discards%info(:) = pack(keeps%info(:), lspill_list(:)) + discards%kin(:) = pack(keeps%kin(:), lspill_list(:)) + + if (count(.not.lspill_list(:)) > 0) then + keeps%lcollision(:) = pack(keeps%lcollision(:), .not. lspill_list(:)) + keeps%lencounter(:) = pack(keeps%lencounter(:), .not. lspill_list(:)) + keeps%lmtiny(:) = pack(keeps%lmtiny(:), .not. lspill_list(:)) + keeps%nplenc(:) = pack(keeps%nplenc(:), .not. lspill_list(:)) + keeps%ntpenc(:) = pack(keeps%ntpenc(:), .not. lspill_list(:)) + keeps%levelg(:) = pack(keeps%levelg(:), .not. lspill_list(:)) + keeps%levelm(:) = pack(keeps%levelm(:), .not. lspill_list(:)) + keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) + keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) + keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) + keeps%info(:) = pack(keeps%info(:), .not. lspill_list(:)) + keeps%kin(:) = pack(keeps%kin(:), .not. lspill_list(:)) + end if + + call util_copy_spill_pl(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on symba_pl' + end select + end associate + + return + end subroutine symba_util_copy_spill_pl + + + module subroutine symba_util_copy_spill_tp(self, discards, lspill_list) + !! author: David A. Minton + !! + !! Move spilled (discarded) SyMBA test particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + ! Internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Spill all the common components + associate(keeps => self) + select type(discards) + class is (symba_pl) + discards%nplenc(:) = pack(keeps%nplenc(:), lspill_list(:)) + discards%levelg(:) = pack(keeps%levelg(:), lspill_list(:)) + discards%levelm(:) = pack(keeps%levelm(:), lspill_list(:)) + + if (count(.not.lspill_list(:)) > 0) then + keeps%nplenc(:) = pack(keeps%nplenc(:), .not. lspill_list(:)) + keeps%levelg(:) = pack(keeps%levelg(:), .not. lspill_list(:)) + keeps%levelm(:) = pack(keeps%levelm(:), .not. lspill_list(:)) + end if + + call util_copy_spill_tp(keeps, discards, lspill_list) + class default + write(*,*) 'Error! spill method called for incompatible return type on symba_pl' + end select + end associate + + return + end subroutine symba_util_copy_spill_tp + end submodule s_symba_util \ No newline at end of file diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 3a4b1e9f6..261a490fd 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -378,7 +378,6 @@ module subroutine util_copy_spill_body(self, discards, lspill_list) allocate(discards%ldiscard(discards%nbody)) keeps%ldiscard = .false. discards%ldiscard = .true. - end associate return From ba91ddb83bb757caa5117f026129fec43df18e4b Mon Sep 17 00:00:00 2001 From: David Minton Date: Sun, 1 Aug 2021 15:25:04 -0400 Subject: [PATCH 146/194] Consolidated fill operations into a set of simple array subroutines that helps simplify the implementations a lot --- src/modules/swiftest_classes.f90 | 41 +++++- src/rmvs/rmvs_util.f90 | 18 +-- src/symba/symba_util.f90 | 50 ++----- src/util/util_copy.f90 | 243 ------------------------------- src/util/util_fill.f90 | 218 +++++++++++++++++++++++++++ src/whm/whm_util.f90 | 23 +-- 6 files changed, 284 insertions(+), 309 deletions(-) create mode 100644 src/util/util_fill.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 3711e5295..c8d05850f 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -85,7 +85,7 @@ module swiftest_classes !******************************************************************************************************************************** !> A concrete lass for the central body in a Swiftest simulation type, abstract, extends(swiftest_base) :: swiftest_cb - character(len=STRMAX) :: name !! Non-unique name + character(len=STRMAX) :: name !! Non-unique name integer(I4B) :: id = 0 !! External identifier (unique) real(DP) :: mass = 0.0_DP !! Central body mass (units MU) real(DP) :: Gmass = 0.0_DP !! Central mass gravitational term G * mass (units GU * MU) @@ -801,7 +801,46 @@ module subroutine util_copy_fill_tp(self, inserts, lfill_list) class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_copy_fill_tp + end interface + + interface util_fill + module subroutine util_fill_arr_char_string(keeps, inserts, lfill_list) + implicit none + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine util_fill_arr_char_string + + module subroutine util_fill_arr_DP(keeps, inserts, lfill_list) + implicit none + real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine util_fill_arr_DP + + module subroutine util_fill_arr_DPvec(keeps, inserts, lfill_list) + implicit none + real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine util_fill_arr_DPvec + module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) + implicit none + integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine util_fill_arr_I4B + + module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) + implicit none + logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + logical, dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine util_fill_arr_logical + end interface + + interface module subroutine util_peri_tp(self, system, param) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 863033c17..90949e593 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -20,9 +20,10 @@ module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) select type(inserts) class is (rmvs_pl) - keeps%nenc(:) = unpack(keeps%nenc(:), .not.lfill_list(:), keeps%nenc(:)) - keeps%nenc(:) = unpack(inserts%nenc(:), lfill_list(:), keeps%nenc(:)) - + call util_fill(keeps%nenc, inserts%nenc, lfill_list) + call util_fill(keeps%tpenc1P, inserts%tpenc1P, lfill_list) + call util_fill(keeps%plind, inserts%plind, lfill_list) + call whm_util_copy_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' @@ -49,14 +50,9 @@ module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) select type(inserts) class is (rmvs_tp) - keeps%lperi(:) = unpack(keeps%lperi(:), .not.lfill_list(:), keeps%lperi(:)) - keeps%lperi(:) = unpack(inserts%lperi(:), lfill_list(:), keeps%lperi(:)) - - keeps%plperP(:) = unpack(keeps%plperP(:), .not.lfill_list(:), keeps%plperP(:)) - keeps%plperP(:) = unpack(inserts%plperP(:), lfill_list(:), keeps%plperP(:)) - - keeps%plencP(:) = unpack(keeps%plencP(:), .not.lfill_list(:), keeps%plencP(:)) - keeps%plencP(:) = unpack(inserts%plencP(:), lfill_list(:), keeps%plencP(:)) + call util_fill(keeps%lperi, inserts%lperi, lfill_list) + call util_fill(keeps%plperP, inserts%plperP, lfill_list) + call util_fill(keeps%plencP, inserts%plencP, lfill_list) call util_copy_fill_tp(keeps, inserts, lfill_list) class default diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 7d65665f8..96781555c 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -17,35 +17,16 @@ module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) associate(keeps => self) select type(inserts) class is (symba_pl) - keeps%lcollision(:) = unpack(keeps%lcollision(:), .not.lfill_list(:), keeps%lcollision(:)) - keeps%lcollision(:) = unpack(inserts%lcollision(:), lfill_list(:), keeps%lcollision(:)) - - keeps%lencounter(:) = unpack(keeps%lencounter(:), .not.lfill_list(:), keeps%lencounter(:)) - keeps%lencounter(:) = unpack(inserts%lencounter(:), lfill_list(:), keeps%lencounter(:)) - - keeps%lmtiny(:) = unpack(keeps%lmtiny(:), .not.lfill_list(:), keeps%lmtiny(:)) - keeps%lmtiny(:) = unpack(inserts%lmtiny(:), lfill_list(:), keeps%lmtiny(:)) - - keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) - keeps%nplenc(:) = unpack(inserts%nplenc(:), lfill_list(:), keeps%nplenc(:)) - - keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) - keeps%ntpenc(:) = unpack(inserts%ntpenc(:), lfill_list(:), keeps%ntpenc(:)) - - keeps%levelg(:) = unpack(keeps%levelg(:), .not.lfill_list(:), keeps%levelg(:)) - keeps%levelg(:) = unpack(inserts%levelg(:), lfill_list(:), keeps%levelg(:)) - - keeps%levelm(:) = unpack(keeps%levelm(:), .not.lfill_list(:), keeps%levelm(:)) - keeps%levelm(:) = unpack(inserts%levelm(:), lfill_list(:), keeps%levelm(:)) - - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) + call util_fill(keeps%lcollision, inserts%lcollision, lfill_list) + call util_fill(keeps%lencounter, inserts%lencounter, lfill_list) + call util_fill(keeps%lmtiny, inserts%lmtiny, lfill_list) + call util_fill(keeps%nplenc, inserts%nplenc, lfill_list) + call util_fill(keeps%ntpenc, inserts%ntpenc, lfill_list) + call util_fill(keeps%levelg, inserts%levelg, lfill_list) + call util_fill(keeps%levelm, inserts%levelm, lfill_list) + call util_fill(keeps%isperi, inserts%isperi, lfill_list) + call util_fill(keeps%peri, inserts%peri, lfill_list) + call util_fill(keeps%atp, inserts%atp, lfill_list) keeps%kin(:) = unpack(keeps%kin(:), .not.lfill_list(:), keeps%kin(:)) keeps%kin(:) = unpack(inserts%kin(:), lfill_list(:), keeps%kin(:)) @@ -77,14 +58,9 @@ module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) associate(keeps => self) select type(inserts) class is (symba_tp) - keeps%nplenc(:) = unpack(keeps%nplenc(:), .not.lfill_list(:), keeps%nplenc(:)) - keeps%nplenc(:) = unpack(inserts%nplenc(:), lfill_list(:), keeps%nplenc(:)) - - keeps%levelg(:) = unpack(keeps%levelg(:), .not.lfill_list(:), keeps%levelg(:)) - keeps%levelg(:) = unpack(inserts%levelg(:), lfill_list(:), keeps%levelg(:)) - - keeps%levelm(:) = unpack(keeps%levelm(:), .not.lfill_list(:), keeps%levelm(:)) - keeps%levelm(:) = unpack(inserts%levelm(:), lfill_list(:), keeps%levelm(:)) + 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_copy_fill_tp(keeps, inserts, lfill_list) class default diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 261a490fd..60cf568b4 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -2,249 +2,6 @@ use swiftest contains - module subroutine util_copy_fill_body(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest generic particle structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - class(swiftest_body), intent(in) :: inserts !! Inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! internals - integer(I4B) :: i - - ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps - !> Spill all the common components - associate(keeps => self) - keeps%id(:) = unpack(keeps%id(:), .not.lfill_list(:), keeps%id(:)) - keeps%id(:) = unpack(inserts%id(:), lfill_list(:), keeps%id(:)) - - keeps%name(:) = unpack(keeps%name(:), .not.lfill_list(:), keeps%name(:)) - keeps%name(:) = unpack(inserts%name(:), lfill_list(:), keeps%name(:)) - - keeps%status(:) = unpack(keeps%status(:), .not.lfill_list(:), keeps%status(:)) - keeps%status(:) = unpack(inserts%status(:), lfill_list(:), keeps%status(:)) - - keeps%ldiscard(:) = unpack(keeps%ldiscard(:), .not.lfill_list(:), keeps%ldiscard(:)) - keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) - - keeps%mu(:) = unpack(keeps%mu(:), .not.lfill_list(:), keeps%mu(:)) - keeps%mu(:) = unpack(inserts%mu(:), lfill_list(:), keeps%mu(:)) - - keeps%lmask(:) = unpack(keeps%lmask(:), .not.lfill_list(:), keeps%ldiscard(:)) - keeps%lmask(:) = unpack(inserts%lmask(:), lfill_list(:), keeps%ldiscard(:)) - - do i = 1, NDIM - keeps%xh(i, :) = unpack(keeps%xh(i, :), .not.lfill_list(:), keeps%xh(i, :)) - keeps%xh(i, :) = unpack(inserts%xh(i, :), lfill_list(:), keeps%xh(i, :)) - - keeps%vh(i, :) = unpack(keeps%vh(i, :), .not.lfill_list(:), keeps%vh(i, :)) - keeps%vh(i, :) = unpack(inserts%vh(i, :), lfill_list(:), keeps%vh(i, :)) - - keeps%xb(i, :) = unpack(keeps%xb(i, :), .not.lfill_list(:), keeps%xb(i, :)) - keeps%xb(i, :) = unpack(inserts%xb(i, :), lfill_list(:), keeps%xb(i, :)) - - keeps%vb(i, :) = unpack(keeps%vb(i, :), .not.lfill_list(:), keeps%vb(i, :)) - keeps%vb(i, :) = unpack(inserts%vb(i, :), lfill_list(:), keeps%vb(i, :)) - - keeps%ah(i, :) = unpack(keeps%ah(i, :), .not.lfill_list(:), keeps%ah(i, :)) - keeps%ah(i, :) = unpack(inserts%ah(i, :), lfill_list(:), keeps%ah(i, :)) - end do - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - keeps%aobl(i, :) = unpack(keeps%aobl(i, :), .not.lfill_list(:), keeps%aobl(i, :)) - keeps%aobl(i, :) = unpack(inserts%aobl(i, :), lfill_list(:), keeps%aobl(i, :)) - end do - end if - - if (allocated(keeps%agr)) then - do i = 1, NDIM - keeps%agr(i, :) = unpack(keeps%agr(i, :), .not.lfill_list(:), keeps%agr(i, :)) - keeps%agr(i, :) = unpack(inserts%agr(i, :), lfill_list(:), keeps%agr(i, :)) - end do - end if - - if (allocated(keeps%atide)) then - do i = 1, NDIM - keeps%atide(i, :) = unpack(keeps%atide(i, :), .not.lfill_list(:), keeps%atide(i, :)) - keeps%atide(i, :) = unpack(inserts%atide(i, :), lfill_list(:), keeps%atide(i, :)) - end do - end if - - if (allocated(keeps%a)) then - keeps%a(:) = unpack(keeps%a(:), .not.lfill_list(:), keeps%a(:)) - keeps%a(:) = unpack(inserts%a(:), lfill_list(:), keeps%a(:)) - end if - - if (allocated(keeps%e)) then - keeps%e(:) = unpack(keeps%e(:), .not.lfill_list(:), keeps%e(:)) - keeps%e(:) = unpack(inserts%e(:), lfill_list(:), keeps%e(:)) - end if - - if (allocated(keeps%inc)) then - keeps%inc(:) = unpack(keeps%inc(:), .not.lfill_list(:), keeps%inc(:)) - keeps%inc(:) = unpack(inserts%inc(:), lfill_list(:), keeps%inc(:)) - end if - - if (allocated(keeps%capom)) then - keeps%capom(:) = unpack(keeps%capom(:),.not.lfill_list(:), keeps%capom(:)) - keeps%capom(:) = unpack(inserts%capom(:),lfill_list(:), keeps%capom(:)) - end if - - if (allocated(keeps%omega)) then - keeps%omega(:) = unpack(keeps%omega(:),.not.lfill_list(:), keeps%omega(:)) - keeps%omega(:) = unpack(inserts%omega(:),lfill_list(:), keeps%omega(:)) - end if - - if (allocated(keeps%capm)) then - keeps%capm(:) = unpack(keeps%capm(:), .not.lfill_list(:), keeps%capm(:)) - keeps%capm(:) = unpack(inserts%capm(:), lfill_list(:), keeps%capm(:)) - end if - - ! This is the base class, so will be the last to be called in the cascade. - keeps%nbody = size(keeps%id(:)) - end associate - - return - end subroutine util_copy_fill_body - - - module subroutine util_copy_fill_pl(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest massive body structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i - - associate(keeps => self) - - select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - keeps%mass(:) = unpack(keeps%mass(:),.not.lfill_list(:), keeps%mass(:)) - keeps%mass(:) = unpack(inserts%mass(:),lfill_list(:), keeps%mass(:)) - - keeps%Gmass(:) = unpack(keeps%Gmass(:),.not.lfill_list(:), keeps%Gmass(:)) - keeps%Gmass(:) = unpack(inserts%Gmass(:),lfill_list(:), keeps%Gmass(:)) - - keeps%rhill(:) = unpack(keeps%rhill(:),.not.lfill_list(:), keeps%rhill(:)) - keeps%rhill(:) = unpack(inserts%rhill(:),lfill_list(:), keeps%rhill(:)) - - if (allocated(keeps%radius) .and. allocated(inserts%radius)) then - keeps%radius(:) = unpack(keeps%radius(:),.not.lfill_list(:), keeps%radius(:)) - keeps%radius(:) = unpack(inserts%radius(:),lfill_list(:), keeps%radius(:)) - end if - - if (allocated(keeps%density) .and. allocated(inserts%density)) then - keeps%density(:) = unpack(keeps%density(:),.not.lfill_list(:), keeps%density(:)) - keeps%density(:) = unpack(inserts%density(:),lfill_list(:), keeps%density(:)) - end if - - if (allocated(keeps%k2) .and. allocated(inserts%k2)) then - keeps%k2(:) = unpack(keeps%k2(:),.not.lfill_list(:), keeps%k2(:)) - keeps%k2(:) = unpack(inserts%k2(:),lfill_list(:), keeps%k2(:)) - end if - - if (allocated(keeps%Q) .and. allocated(inserts%Q)) then - keeps%Q(:) = unpack(keeps%Q(:),.not.lfill_list(:), keeps%Q(:)) - keeps%Q(:) = unpack(inserts%Q(:),lfill_list(:), keeps%Q(:)) - end if - - if (allocated(keeps%tlag) .and. allocated(inserts%tlag)) then - keeps%tlag(:) = unpack(keeps%tlag(:),.not.lfill_list(:), keeps%tlag(:)) - keeps%tlag(:) = unpack(inserts%tlag(:),lfill_list(:), keeps%tlag(:)) - end if - - if (allocated(keeps%xbeg) .and. allocated(inserts%xbeg)) then - do i = 1, NDIM - keeps%xbeg(i, :) = unpack(keeps%xbeg(i, :), .not.lfill_list(:), keeps%xbeg(i, :)) - keeps%xbeg(i, :) = unpack(inserts%xbeg(i, :), lfill_list(:), keeps%xbeg(i, :)) - end do - end if - - if (allocated(keeps%xend) .and. allocated(inserts%xend)) then - do i = 1, NDIM - keeps%xend(i, :) = unpack(keeps%xend(i, :), .not.lfill_list(:), keeps%xend(i, :)) - keeps%xend(i, :) = unpack(inserts%xend(i, :), lfill_list(:), keeps%xend(i, :)) - end do - end if - - if (allocated(keeps%vbeg) .and. allocated(inserts%vbeg)) then - do i = 1, NDIM - keeps%vbeg(i, :) = unpack(keeps%vbeg(i, :), .not.lfill_list(:), keeps%vbeg(i, :)) - keeps%vbeg(i, :) = unpack(inserts%vbeg(i, :), lfill_list(:), keeps%vbeg(i, :)) - end do - end if - - if (allocated(keeps%Ip) .and. allocated(inserts%Ip)) then - do i = 1, NDIM - keeps%Ip(i, :) = unpack(keeps%Ip(i, :), .not.lfill_list(:), keeps%Ip(i, :)) - keeps%Ip(i, :) = unpack(inserts%Ip(i, :), lfill_list(:), keeps%Ip(i, :)) - end do - end if - - if (allocated(keeps%rot) .and. allocated(inserts%rot)) then - do i = 1, NDIM - keeps%rot(i, :) = unpack(keeps%rot(i, :), .not.lfill_list(:), keeps%rot(i, :)) - keeps%rot(i, :) = unpack(inserts%rot(i, :), lfill_list(:), keeps%rot(i, :)) - end do - end if - - keeps%ldiscard(:) = unpack(inserts%ldiscard(:), lfill_list(:), keeps%ldiscard(:)) - - call util_copy_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' - end select - end associate - - return - end subroutine util_copy_fill_pl - - - module subroutine util_copy_fill_tp(self, inserts, lfill_list) - !! author: David A. Minton - !! - !! Insert new Swiftest test particle structure into an old one. - !! This is the inverse of a fill operation. - implicit none - ! Arguments - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - - associate(keeps => self) - select type(inserts) - class is (swiftest_tp) - !> Spill components specific to the test particle class - keeps%isperi(:) = unpack(keeps%isperi(:), .not.lfill_list(:), keeps%isperi(:)) - keeps%isperi(:) = unpack(inserts%isperi(:), lfill_list(:), keeps%isperi(:)) - - keeps%peri(:) = unpack(keeps%peri(:), .not.lfill_list(:), keeps%peri(:)) - keeps%peri(:) = unpack(inserts%peri(:), lfill_list(:), keeps%peri(:)) - - keeps%atp(:) = unpack(keeps%atp(:), .not.lfill_list(:), keeps%atp(:)) - keeps%atp(:) = unpack(inserts%atp(:), lfill_list(:), keeps%atp(:)) - - call util_copy_fill_body(keeps, inserts, lfill_list) - class default - write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' - end select - end associate - - return - end subroutine util_copy_fill_tp - - module subroutine util_copy_into_body(self, source, param, lsource_mask) !! author: David A. Minton !! diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 new file mode 100644 index 000000000..47981c038 --- /dev/null +++ b/src/util/util_fill.f90 @@ -0,0 +1,218 @@ +submodule (swiftest_classes) s_util_fill + use swiftest +contains + + module subroutine util_fill_arr_char_string(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of type character strings + !! This is the inverse of a spill operation + implicit none + ! Arguments + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine util_fill_arr_char_string + + module subroutine util_fill_arr_DP(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of type DP + !! This is the inverse of a spill operation + implicit none + ! Arguments + real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine util_fill_arr_DP + + module subroutine util_fill_arr_DPvec(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of DP vectors with shape (NDIM, n) + !! This is the inverse of a spill operation + implicit none + ! Arguments + real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals + integer(I4B) :: i + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + do i = 1, NDIM + keeps(i,:) = unpack(keeps(i,:), .not.lfill_list(:), keeps(i,:)) + keeps(i,:) = unpack(inserts(i,:), lfill_list(:), keeps(i,:)) + end do + + return + end subroutine util_fill_arr_DPvec + + module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of type I4B + !! This is the inverse of a spill operation + implicit none + ! Arguments + integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine util_fill_arr_I4B + + module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of logicals + !! This is the inverse of a spill operation + implicit none + ! Arguments + logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + logical, dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine util_fill_arr_logical + + + module subroutine util_copy_fill_body(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest generic particle structure into an old one. + !! This is the inverse of a spill operation. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_body), intent(in) :: inserts !! Inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Fill all the common components + associate(keeps => self) + call util_fill(keeps%id, inserts%id, lfill_list) + call util_fill(keeps%name, inserts%name, lfill_list) + call util_fill(keeps%status, inserts%status, lfill_list) + call util_fill(keeps%ldiscard, inserts%ldiscard, lfill_list) + call util_fill(keeps%mu, inserts%mu, lfill_list) + call util_fill(keeps%xh, inserts%xh, lfill_list) + call util_fill(keeps%vh, inserts%vh, lfill_list) + call util_fill(keeps%xb, inserts%xb, lfill_list) + call util_fill(keeps%vb, inserts%vb, lfill_list) + call util_fill(keeps%ah, inserts%ah, lfill_list) + call util_fill(keeps%aobl, inserts%aobl, lfill_list) + call util_fill(keeps%agr, inserts%agr, lfill_list) + call util_fill(keeps%atide, inserts%atide, lfill_list) + call util_fill(keeps%a, inserts%a, lfill_list) + call util_fill(keeps%e, inserts%e, lfill_list) + call util_fill(keeps%inc, inserts%inc, lfill_list) + call util_fill(keeps%capom, inserts%capom, lfill_list) + call util_fill(keeps%omega, inserts%omega, lfill_list) + call util_fill(keeps%capm, inserts%capm, lfill_list) + + ! This is the base class, so will be the last to be called in the cascade. + keeps%nbody = size(keeps%id(:)) + end associate + + return + end subroutine util_copy_fill_body + + + module subroutine util_copy_fill_pl(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest massive body structure into an old one. + !! This is the inverse of a spill operation. + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + ! Internals + integer(I4B) :: i + + associate(keeps => self) + + select type (inserts) ! The standard requires us to select the type of both arguments in order to access all the components + class is (swiftest_pl) + !> Fill components specific to the massive body class + call util_fill(keeps%mass, inserts%mass, lfill_list) + call util_fill(keeps%Gmass, inserts%Gmass, lfill_list) + call util_fill(keeps%rhill, inserts%rhill, lfill_list) + call util_fill(keeps%radius, inserts%radius, lfill_list) + call util_fill(keeps%density, inserts%density, lfill_list) + call util_fill(keeps%k2, inserts%k2, lfill_list) + call util_fill(keeps%Q, inserts%Q, lfill_list) + call util_fill(keeps%tlag, inserts%tlag, lfill_list) + call util_fill(keeps%xbeg, inserts%xbeg, lfill_list) + call util_fill(keeps%vbeg, inserts%vbeg, lfill_list) + call util_fill(keeps%Ip, inserts%Ip, lfill_list) + call util_fill(keeps%rot, inserts%rot, lfill_list) + + call util_copy_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' + end select + end associate + + return + end subroutine util_copy_fill_pl + + + module subroutine util_copy_fill_tp(self, inserts, lfill_list) + !! author: David A. Minton + !! + !! Insert new Swiftest test particle structure into an old one. + !! This is the inverse of a fill operation. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + associate(keeps => self) + select type(inserts) + class is (swiftest_tp) + !> Spill components specific to the test particle class + call util_fill(keeps%isperi, inserts%isperi, lfill_list) + call util_fill(keeps%peri, inserts%peri, lfill_list) + call util_fill(keeps%atp, inserts%atp, lfill_list) + + call util_copy_fill_body(keeps, inserts, lfill_list) + class default + write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' + end select + end associate + + return + end subroutine util_copy_fill_tp + +end submodule s_util_fill \ No newline at end of file diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index aaad01e84..ab5461f2d 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -63,23 +63,12 @@ module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) associate(keeps => self) select type(inserts) class is (whm_pl) - keeps%eta(:) = unpack(keeps%eta(:), .not.lfill_list(:), keeps%eta(:)) - keeps%eta(:) = unpack(inserts%eta(:), lfill_list(:), keeps%eta(:)) - - keeps%muj(:) = unpack(keeps%muj(:), .not.lfill_list(:), keeps%muj(:)) - keeps%muj(:) = unpack(inserts%muj(:), lfill_list(:), keeps%muj(:)) - - keeps%ir3j(:) = unpack(keeps%ir3j(:), .not.lfill_list(:), keeps%ir3j(:)) - keeps%ir3j(:) = unpack(inserts%ir3j(:), lfill_list(:), keeps%ir3j(:)) - - - do i = 1, NDIM - keeps%xj(i, :) = unpack(keeps%xj(i, :), .not.lfill_list(:), keeps%xj(i, :)) - keeps%xj(i, :) = unpack(inserts%xj(i, :), lfill_list(:), keeps%xj(i, :)) - - keeps%vj(i, :) = unpack(keeps%vj(i, :), .not.lfill_list(:), keeps%vj(i, :)) - keeps%vj(i, :) = unpack(inserts%vj(i, :), lfill_list(:), keeps%vj(i, :)) - end do + call util_fill(keeps%eta, inserts%eta, lfill_list) + call util_fill(keeps%muj, inserts%muj, lfill_list) + call util_fill(keeps%ir3j, inserts%ir3j, lfill_list) + call util_fill(keeps%xj, inserts%xj, lfill_list) + call util_fill(keeps%vj, inserts%vj, lfill_list) + call util_copy_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on whm_pl' From 0d2b22d6f0f926520fb4ae344610aa4db81de5b0 Mon Sep 17 00:00:00 2001 From: David Minton Date: Sun, 1 Aug 2021 20:32:31 -0400 Subject: [PATCH 147/194] Rewrote fill and spill methods with generic interface for simplicity --- src/discard/discard.f90 | 2 +- src/modules/rmvs_classes.f90 | 40 ++--- src/modules/swiftest_classes.f90 | 101 ++++++++---- src/modules/symba_classes.f90 | 38 ++--- src/modules/whm_classes.f90 | 17 +- src/rmvs/rmvs_util.f90 | 52 +++--- src/symba/symba_util.f90 | 83 +++++----- src/util/util_copy.f90 | 251 ---------------------------- src/util/util_fill.f90 | 27 ++-- src/util/util_spill.f90 | 269 +++++++++++++++++++++++++++++++ src/whm/whm_util.f90 | 36 ++--- 11 files changed, 481 insertions(+), 435 deletions(-) create mode 100644 src/util/util_spill.f90 diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 292e52c38..0c84c9e88 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -69,7 +69,7 @@ module subroutine discard_tp(self, system, param) end if if (param%qmin >= 0.0_DP .and. ntp > 0) call discard_peri_tp(tp, system, param) if (param%lclose .and. ntp > 0) call discard_pl_tp(tp, system, param) - if (any(tp%ldiscard)) call tp%spill(system%tp_discards, tp%ldiscard) + if (any(tp%ldiscard)) call tp%spill(system%tp_discards, tp%ldiscard, ldestructive=.true.) end associate return diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 64a0a5875..4c3bac64f 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -53,7 +53,7 @@ module rmvs_classes !! RMVS test particle class type, extends(whm_tp) :: rmvs_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as rmvs_setup_tp and rmvs_util_copy_spill_tp + !! component list, such as rmvs_setup_tp and rmvs_util_spill_tp ! encounter steps) logical, dimension(:), allocatable :: lperi !! planetocentric pericenter passage flag (persistent for a full rmvs time step) over a full RMVS time step) integer(I4B), dimension(:), allocatable :: plperP !! index of planet associated with pericenter distance peri (persistent over a full RMVS time step) @@ -71,10 +71,10 @@ module rmvs_classes procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles - procedure :: fill => rmvs_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => rmvs_util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_tp !******************************************************************************************************************************** @@ -94,8 +94,8 @@ module rmvs_classes procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: fill => rmvs_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) - procedure :: spill => rmvs_util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl interface @@ -154,21 +154,21 @@ module subroutine rmvs_setup_tp(self, n, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parametere end subroutine rmvs_setup_tp - module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_copy_fill_pl + end subroutine rmvs_util_fill_pl - module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(rmvs_tp), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine rmvs_util_copy_fill_tp + end subroutine rmvs_util_fill_tp module subroutine rmvs_util_sort_pl(self, sortby, ascending) implicit none @@ -196,21 +196,23 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine rmvs_util_sort_rearrange_tp - module subroutine rmvs_util_copy_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_spill_pl(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none - class(rmvs_pl), intent(inout) :: self !! RMVS massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_util_copy_spill_pl + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine rmvs_util_spill_pl - module subroutine rmvs_util_copy_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_spill_tp(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none - class(rmvs_tp), intent(inout) :: self !! RMVS test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine rmvs_util_copy_spill_tp + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine rmvs_util_spill_tp module subroutine rmvs_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index c8d05850f..be342756e 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -145,7 +145,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_body and util_copy_spill + !! component list, such as setup_body and util_spill contains procedure(abstract_discard_body), deferred :: discard procedure(abstract_kick_body), deferred :: kick @@ -166,12 +166,12 @@ module swiftest_classes procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure :: append => util_append_body !! Appends elements from one structure to another procedure :: copy_into => util_copy_into_body !! Copies elements from one Swiftest body object to another. - procedure :: fill => util_copy_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) procedure :: sort => util_sort_body !! Sorts body arrays by a sortable componen procedure :: rearrange => util_sort_rearrange_body !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_copy_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_spill_body !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_body !******************************************************************************************************************************** @@ -196,7 +196,7 @@ module swiftest_classes integer(I4B), dimension(:,:), allocatable :: k_plpl !! Index array used to convert flattened the body-body comparison upper triangular matrix integer(I8B) :: nplpl !! Number of body-body comparisons in the flattened upper triangular matrix !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_pl and util_copy_spill_pl + !! component list, such as setup_pl and util_spill_pl contains ! Massive body-specific concrete methods ! These are concrete because they are the same implemenation for all integrators @@ -208,13 +208,13 @@ module swiftest_classes procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body procedure :: sort => util_sort_pl !! Sorts body arrays by a sortable component procedure :: rearrange => util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_pl !******************************************************************************************************************************** @@ -227,7 +227,7 @@ module swiftest_classes real(DP), dimension(:), allocatable :: peri !! Perihelion distance real(DP), dimension(:), allocatable :: atp !! Semimajor axis following perihelion passage !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the - !! component list, such as setup_tp and util_copy_spill_tp + !! component list, such as setup_tp and util_spill_tp contains ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators @@ -237,12 +237,12 @@ module swiftest_classes procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -781,61 +781,61 @@ module subroutine util_exit(code) integer(I4B), intent(in) :: code !! Failure exit code end subroutine util_exit - module subroutine util_copy_fill_body(self, inserts, lfill_list) + module subroutine util_fill_body(self, inserts, lfill_list) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_copy_fill_body + end subroutine util_fill_body - module subroutine util_copy_fill_pl(self, inserts, lfill_list) + module subroutine util_fill_pl(self, inserts, lfill_list) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_copy_fill_pl + end subroutine util_fill_pl - module subroutine util_copy_fill_tp(self, inserts, lfill_list) + module subroutine util_fill_tp(self, inserts, lfill_list) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine util_copy_fill_tp + end subroutine util_fill_tp end interface interface util_fill module subroutine util_fill_arr_char_string(keeps, inserts, lfill_list) implicit none character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_arr_char_string module subroutine util_fill_arr_DP(keeps, inserts, lfill_list) implicit none real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_arr_DP module subroutine util_fill_arr_DPvec(keeps, inserts, lfill_list) implicit none real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep - real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_arr_DPvec module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) implicit none integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_arr_I4B module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) implicit none logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - logical, dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine util_fill_arr_logical end interface @@ -972,27 +972,74 @@ module subroutine util_sort_tp(self, sortby, ascending) character(*), intent(in) :: sortby !! Sorting attribute logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order end subroutine util_sort_tp - - module subroutine util_copy_spill_body(self, discards, lspill_list) + end interface + + interface util_spill + module subroutine util_spill_arr_char_string(keeps, discards, lspill_list, ldestructive) + implicit none + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_arr_char_string + + module subroutine util_spill_arr_DP(keeps, discards, lspill_list, ldestructive) + implicit none + real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_arr_DP + + module subroutine util_spill_arr_DPvec(keeps, discards, lspill_list, ldestructive) + implicit none + real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:,:), allocatable, intent(inout) :: discards !! Array discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_arr_DPvec + + module subroutine util_spill_arr_I4B(keeps, discards, lspill_list, ldestructive) + implicit none + integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + integer(I4B), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_arr_I4B + + module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestructive) + implicit none + logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + logical, dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_arr_logical + end interface + + interface + module subroutine util_spill_body(self, discards, lspill_list, ldestructive) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_copy_spill_body + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_body - module subroutine util_copy_spill_pl(self, discards, lspill_list) + module subroutine util_spill_pl(self, discards, lspill_list, ldestructive) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_copy_spill_pl + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine util_spill_pl - module subroutine util_copy_spill_tp(self, discards, lspill_list) + module subroutine util_spill_tp(self, discards, lspill_list, ldestructive) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine util_copy_spill_tp + 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) implicit none diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 0080b1e07..f0cf9e00d 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -92,10 +92,10 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle - procedure :: fill => symba_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => symba_util_copy_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => symba_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_pl !******************************************************************************************************************************** @@ -111,10 +111,10 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle - procedure :: fill => symba_util_copy_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => symba_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => symba_util_copy_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => symba_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_tp !******************************************************************************************************************************** @@ -418,21 +418,21 @@ module subroutine symba_step_reset_system(self) class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object end subroutine symba_step_reset_system - module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine symba_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine symba_util_copy_fill_pl + end subroutine symba_util_fill_pl - module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) + module subroutine symba_util_fill_tp(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine symba_util_copy_fill_tp + end subroutine symba_util_fill_tp module subroutine symba_util_copy_pltpenc(self, source) implicit none @@ -452,21 +452,23 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) integer(I4B), intent(in) :: nrequested !! New size of list needed end subroutine symba_util_resize_pltpenc - module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) + module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine symba_util_copy_spill_pl + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_pl - module subroutine symba_util_copy_spill_tp(self, discards, lspill_list) + module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine symba_util_copy_spill_tp + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_tp module subroutine symba_util_sort_pl(self, sortby, ascending) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 4dd7f646a..626c0a974 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -28,13 +28,13 @@ module whm_classes real(DP), dimension(:), allocatable :: muj !! Jacobi mu: GMcb * eta(i) / eta(i - 1) real(DP), dimension(:), allocatable :: ir3j !! Third term of heliocentric acceleration !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_setup_pl and whm_util_copy_spill_pl + !! component list, such as whm_setup_pl and whm_util_spill_pl contains procedure :: h2j => whm_coord_h2j_pl !! Convert position and velcoity vectors from heliocentric to Jacobi coordinates procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure :: fill => whm_util_copy_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction @@ -45,7 +45,7 @@ module whm_classes procedure :: sort => whm_util_sort_pl !! Sort a WHM massive body object in-place. procedure :: rearrange => whm_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: step => whm_step_pl !! Steps the body forward one stepsize - procedure :: spill => whm_util_copy_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type whm_pl !******************************************************************************************************************************** @@ -55,7 +55,7 @@ module whm_classes !! WHM test particle class type, extends(swiftest_tp) :: whm_tp !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the - !! component list, such as whm_util_copy_spill_tp + !! component list, such as whm_util_spill_tp contains procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles @@ -106,13 +106,13 @@ module subroutine whm_drift_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_drift_pl - module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(in) :: inserts !! inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine whm_util_copy_fill_pl + end subroutine whm_util_fill_pl !> Get heliocentric accelration of massive bodies module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) @@ -249,13 +249,14 @@ module subroutine whm_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_step_tp - module subroutine whm_util_copy_spill_pl(self, discards, lspill_list) + module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - end subroutine whm_util_copy_spill_pl + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine whm_util_spill_pl !> Steps the Swiftest nbody system forward in time one stepsize module subroutine whm_step_system(self, param, t, dt) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 90949e593..e9804bff6 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS massive body structure into an old one. @@ -24,17 +24,17 @@ module subroutine rmvs_util_copy_fill_pl(self, inserts, lfill_list) call util_fill(keeps%tpenc1P, inserts%tpenc1P, lfill_list) call util_fill(keeps%plind, inserts%plind, lfill_list) - call whm_util_copy_fill_pl(keeps, inserts, lfill_list) + call whm_util_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select end associate return - end subroutine rmvs_util_copy_fill_pl + end subroutine rmvs_util_fill_pl - module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) + module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new RMVS test particle structure into an old one. @@ -54,14 +54,14 @@ module subroutine rmvs_util_copy_fill_tp(self, inserts, lfill_list) call util_fill(keeps%plperP, inserts%plperP, lfill_list) call util_fill(keeps%plencP, inserts%plencP, lfill_list) - call util_copy_fill_tp(keeps, inserts, lfill_list) + call util_fill_tp(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' end select end associate return - end subroutine rmvs_util_copy_fill_tp + end subroutine rmvs_util_fill_tp module subroutine rmvs_util_sort_pl(self, sortby, ascending) !! author: David A. Minton @@ -202,7 +202,7 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) end subroutine rmvs_util_sort_rearrange_tp - module subroutine rmvs_util_copy_spill_pl(self, discards, lspill_list) + module subroutine rmvs_util_spill_pl(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -210,30 +210,30 @@ module subroutine rmvs_util_copy_spill_pl(self, discards, lspill_list) !! Adapted from David E. Kaufmann's Swifter routine discard_discard_spill.f90 implicit none ! Arguments - class(rmvs_pl), intent(inout) :: self !! RMVS massive body body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + class(rmvs_pl), intent(inout) :: self !! RMVS massive body body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: i associate(keeps => self) select type(discards) class is (rmvs_pl) - discards%nenc(:) = pack(keeps%nenc(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%nenc(:) = pack(keeps%nenc(:), .not. lspill_list(:)) - end if - call whm_util_copy_spill_pl(keeps, discards, lspill_list) + call util_spill(keeps%nenc, discards%nenc, lspill_list, ldestructive) + call util_spill(keeps%tpenc1P, discards%tpenc1P, lspill_list, ldestructive) + call util_spill(keeps%plind, discards%plind, lspill_list, ldestructive) + call whm_util_spill_pl(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' end select end associate return - end subroutine rmvs_util_copy_spill_pl + end subroutine rmvs_util_spill_pl - module subroutine rmvs_util_copy_spill_tp(self, discards, lspill_list) + module subroutine rmvs_util_spill_tp(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! !! Move spilled (discarded) RMVS test particle structure from active list to discard list @@ -244,28 +244,24 @@ module subroutine rmvs_util_copy_spill_tp(self, discards, lspill_list) class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: i associate(keeps => self) select type(discards) class is (rmvs_tp) - discards%lperi(:) = pack(keeps%lperi(:), lspill_list(:)) - discards%plperP(:) = pack(keeps%plperP(:), lspill_list(:)) - discards%plencP(:) = pack(keeps%plencP(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%lperi(:) = pack(keeps%lperi(:), .not. lspill_list(:)) - keeps%plperP(:) = pack(keeps%plperP(:), .not. lspill_list(:)) - keeps%plencP(:) = pack(keeps%plencP(:), .not. lspill_list(:)) - end if - - call util_copy_spill_tp(keeps, discards, lspill_list) + call util_spill(keeps%lperi, discards%lperi, lspill_list, ldestructive) + call util_spill(keeps%plperP, discards%plperP, lspill_list, ldestructive) + call util_spill(keeps%plencP, discards%plencP, lspill_list, ldestructive) + + call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_tp' end select end associate return - end subroutine rmvs_util_copy_spill_tp + end subroutine rmvs_util_spill_tp end submodule s_rmvs_util diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 96781555c..8c9a0a1d7 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine symba_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new SyMBA test particle structure into an old one. @@ -34,16 +34,16 @@ module subroutine symba_util_copy_fill_pl(self, inserts, lfill_list) keeps%info(:) = unpack(keeps%info(:), .not.lfill_list(:), keeps%info(:)) keeps%info(:) = unpack(inserts%info(:), lfill_list(:), keeps%info(:)) - call util_copy_fill_pl(keeps, inserts, lfill_list) + call util_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on symba_pl' end select end associate return - end subroutine symba_util_copy_fill_pl + end subroutine symba_util_fill_pl - module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) + module subroutine symba_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new SyMBA test particle structure into an old one. @@ -62,14 +62,14 @@ module subroutine symba_util_copy_fill_tp(self, inserts, lfill_list) call util_fill(keeps%levelg, inserts%levelg, lfill_list) call util_fill(keeps%levelm, inserts%levelm, lfill_list) - call util_copy_fill_tp(keeps, inserts, lfill_list) + call util_fill_tp(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on symba_tp' end select end associate return - end subroutine symba_util_copy_fill_tp + end subroutine symba_util_fill_tp module subroutine symba_util_copy_pltpenc(self, source) !! author: David A. Minton @@ -310,7 +310,7 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) end subroutine symba_util_sort_rearrange_tp - module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) + module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! !! Move spilled (discarded) SyMBA massive body particle structure from active list to discard list @@ -320,6 +320,7 @@ module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list ! Internals integer(I4B) :: i @@ -328,54 +329,48 @@ module subroutine symba_util_copy_spill_pl(self, discards, lspill_list) associate(keeps => self) select type(discards) class is (symba_pl) - discards%lcollision(:) = pack(keeps%lcollision(:), lspill_list(:)) - discards%lencounter(:) = pack(keeps%lencounter(:), lspill_list(:)) - discards%lmtiny(:) = pack(keeps%lmtiny(:), lspill_list(:)) - discards%nplenc(:) = pack(keeps%nplenc(:), lspill_list(:)) - discards%ntpenc(:) = pack(keeps%ntpenc(:), lspill_list(:)) - discards%levelg(:) = pack(keeps%levelg(:), lspill_list(:)) - discards%levelm(:) = pack(keeps%levelm(:), lspill_list(:)) - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) + + call util_spill(keeps%lcollision, discards%lcollision, lspill_list, ldestructive) + call util_spill(keeps%lencounter, discards%lencounter, lspill_list, ldestructive) + call util_spill(keeps%lmtiny, discards%lmtiny, lspill_list, ldestructive) + call util_spill(keeps%nplenc, discards%nplenc, lspill_list, ldestructive) + call util_spill(keeps%ntpenc, discards%ntpenc, 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%isperi, discards%isperi, lspill_list, ldestructive) + call util_spill(keeps%peri, discards%peri, lspill_list, ldestructive) + call util_spill(keeps%atp, discards%atp, lspill_list, ldestructive) discards%info(:) = pack(keeps%info(:), lspill_list(:)) discards%kin(:) = pack(keeps%kin(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%lcollision(:) = pack(keeps%lcollision(:), .not. lspill_list(:)) - keeps%lencounter(:) = pack(keeps%lencounter(:), .not. lspill_list(:)) - keeps%lmtiny(:) = pack(keeps%lmtiny(:), .not. lspill_list(:)) - keeps%nplenc(:) = pack(keeps%nplenc(:), .not. lspill_list(:)) - keeps%ntpenc(:) = pack(keeps%ntpenc(:), .not. lspill_list(:)) - keeps%levelg(:) = pack(keeps%levelg(:), .not. lspill_list(:)) - keeps%levelm(:) = pack(keeps%levelm(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%info(:) = pack(keeps%info(:), .not. lspill_list(:)) - keeps%kin(:) = pack(keeps%kin(:), .not. lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps%info(:) = pack(keeps%info(:), .not. lspill_list(:)) + keeps%kin(:) = pack(keeps%kin(:), .not. lspill_list(:)) + end if end if - call util_copy_spill_pl(keeps, discards, lspill_list) + call util_spill_pl(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on symba_pl' end select end associate return - end subroutine symba_util_copy_spill_pl + end subroutine symba_util_spill_pl - module subroutine symba_util_copy_spill_tp(self, discards, lspill_list) + module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! !! Move spilled (discarded) SyMBA test particle structure from active list to discard list !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 implicit none ! Arguments - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list ! Internals integer(I4B) :: i @@ -384,23 +379,17 @@ module subroutine symba_util_copy_spill_tp(self, discards, lspill_list) associate(keeps => self) select type(discards) class is (symba_pl) - discards%nplenc(:) = pack(keeps%nplenc(:), lspill_list(:)) - discards%levelg(:) = pack(keeps%levelg(:), lspill_list(:)) - discards%levelm(:) = pack(keeps%levelm(:), lspill_list(:)) - - if (count(.not.lspill_list(:)) > 0) then - keeps%nplenc(:) = pack(keeps%nplenc(:), .not. lspill_list(:)) - keeps%levelg(:) = pack(keeps%levelg(:), .not. lspill_list(:)) - keeps%levelm(:) = pack(keeps%levelm(:), .not. lspill_list(:)) - end if + 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_copy_spill_tp(keeps, discards, lspill_list) + call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on symba_pl' end select end associate return - end subroutine symba_util_copy_spill_tp + end subroutine symba_util_spill_tp end submodule s_symba_util \ No newline at end of file diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 60cf568b4..bc8cdcf43 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -32,255 +32,4 @@ module subroutine util_copy_into_body(self, source, param, lsource_mask) return end subroutine util_copy_into_body - - module subroutine util_copy_spill_body(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest generic particle structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest generic body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - - ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps - !> Spill all the common components - associate(keeps => self) - discards%id(:) = pack(keeps%id(:), lspill_list(:)) - discards%name(:) = pack(keeps%name(:), lspill_list(:)) - discards%status(:) = pack(keeps%status(:), lspill_list(:)) - discards%mu(:) = pack(keeps%mu(:), lspill_list(:)) - discards%lmask(:) = pack(keeps%lmask(:), lspill_list(:)) - do i = 1, NDIM - discards%xh(i, :) = pack(keeps%xh(i, :), lspill_list(:)) - discards%vh(i, :) = pack(keeps%vh(i, :), lspill_list(:)) - discards%xb(i, :) = pack(keeps%xb(i, :), lspill_list(:)) - discards%vb(i, :) = pack(keeps%vb(i, :), lspill_list(:)) - discards%ah(i, :) = pack(keeps%ah(i, :), lspill_list(:)) - end do - - if (allocated(keeps%a)) discards%a(:) = pack(keeps%a(:), lspill_list(:)) - if (allocated(keeps%e)) discards%e(:) = pack(keeps%e(:), lspill_list(:)) - if (allocated(keeps%capom)) discards%capom(:) = pack(keeps%capom(:), lspill_list(:)) - if (allocated(keeps%omega)) discards%omega(:) = pack(keeps%omega(:), lspill_list(:)) - if (allocated(keeps%capm)) discards%capm(:) = pack(keeps%capm(:), lspill_list(:)) - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - discards%aobl(i, :) = pack(keeps%aobl(i, :), lspill_list(:)) - end do - end if - if (allocated(keeps%agr)) then - do i = 1, NDIM - discards%agr(i, :) = pack(keeps%agr(i, :), lspill_list(:)) - end do - end if - if (allocated(keeps%atide)) then - do i = 1, NDIM - discards%atide(i, :) = pack(keeps%atide(i, :), lspill_list(:)) - end do - end if - - if (count(.not.lspill_list(:)) > 0) then - keeps%id(:) = pack(keeps%id(:), .not. lspill_list(:)) - keeps%name(:) = pack(keeps%name(:), .not. lspill_list(:)) - keeps%status(:) = pack(keeps%status(:), .not. lspill_list(:)) - keeps%mu(:) = pack(keeps%mu(:), .not. lspill_list(:)) - keeps%lmask(:) = pack(keeps%lmask(:), .not. lspill_list(:)) - - do i = 1, NDIM - keeps%xh(i, :) = pack(keeps%xh(i, :), .not. lspill_list(:)) - keeps%vh(i, :) = pack(keeps%vh(i, :), .not. lspill_list(:)) - keeps%xb(i, :) = pack(keeps%xb(i, :), .not. lspill_list(:)) - keeps%vb(i, :) = pack(keeps%vb(i, :), .not. lspill_list(:)) - keeps%ah(i, :) = pack(keeps%ah(i, :), .not. lspill_list(:)) - end do - - if (allocated(keeps%a)) keeps%a(:) = pack(keeps%a(:), .not. lspill_list(:)) - if (allocated(keeps%e)) keeps%e(:) = pack(keeps%e(:), .not. lspill_list(:)) - if (allocated(keeps%inc)) keeps%inc(:) = pack(keeps%inc(:), .not. lspill_list(:)) - if (allocated(keeps%capom)) keeps%capom(:) = pack(keeps%capom(:), .not. lspill_list(:)) - if (allocated(keeps%omega)) keeps%omega(:) = pack(keeps%omega(:), .not. lspill_list(:)) - if (allocated(keeps%capm)) keeps%capm(:) = pack(keeps%capm(:), .not. lspill_list(:)) - - if (allocated(keeps%aobl)) then - do i = 1, NDIM - keeps%aobl(i, :) = pack(keeps%aobl(i, :), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%agr)) then - do i = 1, NDIM - keeps%agr(i, :) = pack(keeps%agr(i, :), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%atide)) then - do i = 1, NDIM - keeps%atide(i, :) = pack(keeps%atide(i, :), .not. lspill_list(:)) - end do - end if - - end if - ! This is the base class, so will be the last to be called in the cascade. - ! Therefore we need to set the nbody values for both the keeps and discareds - discards%nbody = count(lspill_list(:)) - keeps%nbody = count(.not.lspill_list(:)) - if (allocated(keeps%ldiscard)) deallocate(keeps%ldiscard) - if (allocated(discards%ldiscard)) deallocate(discards%ldiscard) - allocate(keeps%ldiscard(keeps%nbody)) - allocate(discards%ldiscard(discards%nbody)) - keeps%ldiscard = .false. - discards%ldiscard = .true. - end associate - - return - end subroutine util_copy_spill_body - - - module subroutine util_copy_spill_pl(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest massive body structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - ! Internals - integer(I4B) :: i - - associate(keeps => self) - - select type (discards) ! The standard requires us to select the type of both arguments in order to access all the components - class is (swiftest_pl) - !> Spill components specific to the massive body class - discards%mass(:) = pack(keeps%mass(:), lspill_list(:)) - discards%Gmass(:) = pack(keeps%Gmass(:), lspill_list(:)) - discards%rhill(:) = pack(keeps%rhill(:), lspill_list(:)) - - if (allocated(keeps%radius)) discards%radius(:) = pack(keeps%radius(:), lspill_list(:)) - if (allocated(keeps%density)) discards%density(:) = pack(keeps%density(:), lspill_list(:)) - if (allocated(keeps%k2)) discards%k2(:) = pack(keeps%k2(:), lspill_list(:)) - if (allocated(keeps%Q)) discards%Q(:) = pack(keeps%Q(:), lspill_list(:)) - if (allocated(keeps%tlag)) discards%tlag(:) = pack(keeps%tlag(:), lspill_list(:)) - - if (allocated(keeps%xbeg)) then - do i = 1, NDIM - discards%xbeg(i, :) = pack(keeps%xbeg(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%xend)) then - do i = 1, NDIM - discards%xend(i, :) = pack(keeps%xend(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%vbeg)) then - do i = 1, NDIM - discards%vbeg(i, :) = pack(keeps%vbeg(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%Ip)) then - do i = 1, NDIM - discards%Ip(i, :) = pack(keeps%Ip(i, :), lspill_list(:)) - end do - end if - - if (allocated(keeps%rot)) then - do i = 1, NDIM - discards%rot(i, :) = pack(keeps%rot(i, :), lspill_list(:)) - end do - end if - - if (count(.not.lspill_list(:)) > 0) then - keeps%mass(:) = pack(keeps%mass(:), .not. lspill_list(:)) - keeps%Gmass(:) = pack(keeps%Gmass(:), .not. lspill_list(:)) - keeps%rhill(:) = pack(keeps%rhill(:), .not. lspill_list(:)) - if (allocated(keeps%radius)) keeps%radius(:) = pack(keeps%radius(:), .not. lspill_list(:)) - if (allocated(keeps%density)) keeps%density(:) = pack(keeps%density(:), .not. lspill_list(:)) - if (allocated(keeps%k2)) keeps%k2(:) = pack(keeps%k2(:), .not. lspill_list(:)) - if (allocated(keeps%Q)) keeps%Q(:) = pack(keeps%Q(:), .not. lspill_list(:)) - if (allocated(keeps%tlag)) keeps%tlag(:) = pack(keeps%tlag(:), .not. lspill_list(:)) - - if (allocated(keeps%xbeg)) then - do i = 1, NDIM - keeps%xbeg(i,:) = pack(keeps%xbeg(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%xend)) then - do i = 1, NDIM - keeps%xend(i,:) = pack(keeps%xend(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%vbeg)) then - do i = 1, NDIM - keeps%vbeg(i,:) = pack(keeps%vbeg(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%Ip)) then - do i = 1, NDIM - keeps%Ip(i,:) = pack(keeps%Ip(i,:), .not. lspill_list(:)) - end do - end if - - if (allocated(keeps%rot)) then - do i = 1, NDIM - keeps%rot(i,:) = pack(keeps%rot(i,:), .not. lspill_list(:)) - end do - end if - - end if - - call util_copy_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' - end select - end associate - - return - end subroutine util_copy_spill_pl - - - module subroutine util_copy_spill_tp(self, discards, lspill_list) - !! author: David A. Minton - !! - !! Move spilled (discarded) Swiftest test particle structure from active list to discard list - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 - implicit none - ! Arguments - class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse - - associate(keeps => self, ntp => self%nbody) - select type(discards) - class is (swiftest_tp) - !> Spill components specific to the test particle class - discards%isperi(:) = pack(keeps%isperi(:), lspill_list(:)) - discards%peri(:) = pack(keeps%peri(:), lspill_list(:)) - discards%atp(:) = pack(keeps%atp(:), lspill_list(:)) - if (count(.not.lspill_list(:)) > 0) then - keeps%atp(:) = pack(keeps%atp(:), .not. lspill_list(:)) - keeps%peri(:) = pack(keeps%peri(:), .not. lspill_list(:)) - keeps%isperi(:) = pack(keeps%isperi(:), .not. lspill_list(:)) - end if - call util_copy_spill_body(keeps, discards, lspill_list) - class default - write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' - end select - end associate - - return - end subroutine util_copy_spill_tp - end submodule s_util_copy \ No newline at end of file diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index 47981c038..4a5a70311 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -10,7 +10,7 @@ module subroutine util_fill_arr_char_string(keeps, inserts, lfill_list) implicit none ! Arguments character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + character(len=STRMAX), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps if (.not.allocated(keeps) .or. .not.allocated(inserts)) return @@ -29,7 +29,7 @@ module subroutine util_fill_arr_DP(keeps, inserts, lfill_list) implicit none ! Arguments real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + real(DP), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps if (.not.allocated(keeps) .or. .not.allocated(inserts)) return @@ -48,7 +48,7 @@ module subroutine util_fill_arr_DPvec(keeps, inserts, lfill_list) implicit none ! Arguments real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep - real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + real(DP), dimension(:,:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps ! Internals integer(I4B) :: i @@ -71,7 +71,7 @@ module subroutine util_fill_arr_I4B(keeps, inserts, lfill_list) implicit none ! Arguments integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + integer(I4B), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps if (.not.allocated(keeps) .or. .not.allocated(inserts)) return @@ -90,7 +90,7 @@ module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) implicit none ! Arguments logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep - logical, dimension(:), allocatable, intent(in) :: inserts !! Array of arrays to insert into keep + logical, dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps if (.not.allocated(keeps) .or. .not.allocated(inserts)) return @@ -102,7 +102,7 @@ module subroutine util_fill_arr_logical(keeps, inserts, lfill_list) end subroutine util_fill_arr_logical - module subroutine util_copy_fill_body(self, inserts, lfill_list) + module subroutine util_fill_body(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new Swiftest generic particle structure into an old one. @@ -122,6 +122,7 @@ module subroutine util_copy_fill_body(self, inserts, lfill_list) call util_fill(keeps%name, inserts%name, lfill_list) call util_fill(keeps%status, inserts%status, lfill_list) call util_fill(keeps%ldiscard, inserts%ldiscard, lfill_list) + call util_fill(keeps%lmask, inserts%lmask, lfill_list) call util_fill(keeps%mu, inserts%mu, lfill_list) call util_fill(keeps%xh, inserts%xh, lfill_list) call util_fill(keeps%vh, inserts%vh, lfill_list) @@ -143,10 +144,10 @@ module subroutine util_copy_fill_body(self, inserts, lfill_list) end associate return - end subroutine util_copy_fill_body + end subroutine util_fill_body - module subroutine util_copy_fill_pl(self, inserts, lfill_list) + module subroutine util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new Swiftest massive body structure into an old one. @@ -177,17 +178,17 @@ module subroutine util_copy_fill_pl(self, inserts, lfill_list) call util_fill(keeps%Ip, inserts%Ip, lfill_list) call util_fill(keeps%rot, inserts%rot, lfill_list) - call util_copy_fill_body(keeps, inserts, lfill_list) + call util_fill_body(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on swiftest_pl' end select end associate return - end subroutine util_copy_fill_pl + end subroutine util_fill_pl - module subroutine util_copy_fill_tp(self, inserts, lfill_list) + module subroutine util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new Swiftest test particle structure into an old one. @@ -206,13 +207,13 @@ module subroutine util_copy_fill_tp(self, inserts, lfill_list) call util_fill(keeps%peri, inserts%peri, lfill_list) call util_fill(keeps%atp, inserts%atp, lfill_list) - call util_copy_fill_body(keeps, inserts, lfill_list) + call util_fill_body(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on swiftest_tp' end select end associate return - end subroutine util_copy_fill_tp + end subroutine util_fill_tp end submodule s_util_fill \ No newline at end of file diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 new file mode 100644 index 000000000..5f942854a --- /dev/null +++ b/src/util/util_spill.f90 @@ -0,0 +1,269 @@ +submodule (swiftest_classes) s_util_spill + use swiftest +contains + + module subroutine util_spill_arr_char_string(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of type character strings + !! This is the inverse of a spill operation + implicit none + ! Arguments + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine util_spill_arr_char_string + + module subroutine util_spill_arr_DP(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of type DP + !! This is the inverse of a spill operation + implicit none + ! Arguments + real(DP), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine util_spill_arr_DP + + module subroutine util_spill_arr_DPvec(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of DP vectors with shape (NDIM, n) + !! This is the inverse of a spill operation + implicit none + ! Arguments + real(DP), dimension(:,:), allocatable, intent(inout) :: keeps !! Array of values to keep + real(DP), dimension(:,:), allocatable, intent(inout) :: discards !! Array discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + ! Internals + integer(I4B) :: i + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(NDIM, count(lspill_list(:)))) + + do i = 1, NDIM + discards(i,:) = pack(keeps(i,:), lspill_list(:)) + end do + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + do i = 1, NDIM + keeps(i,:) = pack(keeps(i,:), .not. lspill_list(:)) + end do + end if + end if + + return + end subroutine util_spill_arr_DPvec + + module subroutine util_spill_arr_I4B(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of type I4B + !! This is the inverse of a spill operation + implicit none + ! Arguments + integer(I4B), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + integer(I4B), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine util_spill_arr_I4B + + module subroutine util_spill_arr_logical(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of logicals + !! This is the inverse of a spill operation + implicit none + ! Arguments + logical, dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + logical, dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or no + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine util_spill_arr_logical + + + module subroutine util_spill_body(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest generic particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest generic body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + ! Internals + integer(I4B) :: i + + ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps + !> Spill all the common components + associate(keeps => self) + call util_spill(keeps%id, discards%id, lspill_list, ldestructive) + call util_spill(keeps%name, discards%name, lspill_list, ldestructive) + call util_spill(keeps%status, discards%status, lspill_list, ldestructive) + call util_spill(keeps%lmask, discards%lmask, lspill_list, ldestructive) + call util_spill(keeps%mu, discards%mu, lspill_list, ldestructive) + call util_spill(keeps%xh, discards%xh, lspill_list, ldestructive) + call util_spill(keeps%vh, discards%vh, lspill_list, ldestructive) + call util_spill(keeps%xb, discards%xb, lspill_list, ldestructive) + call util_spill(keeps%vb, discards%vb, lspill_list, ldestructive) + call util_spill(keeps%ah, discards%ah, lspill_list, ldestructive) + call util_spill(keeps%aobl, discards%aobl, lspill_list, ldestructive) + call util_spill(keeps%agr, discards%agr, lspill_list, ldestructive) + call util_spill(keeps%atide, discards%atide, lspill_list, ldestructive) + call util_spill(keeps%a, discards%a, lspill_list, ldestructive) + call util_spill(keeps%e, discards%e, lspill_list, ldestructive) + call util_spill(keeps%inc, discards%inc, lspill_list, ldestructive) + call util_spill(keeps%capom, discards%capom, lspill_list, ldestructive) + call util_spill(keeps%omega, discards%omega, lspill_list, ldestructive) + call util_spill(keeps%capm, discards%capm, 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(:)) + if (allocated(keeps%ldiscard)) deallocate(keeps%ldiscard) + if (allocated(discards%ldiscard)) deallocate(discards%ldiscard) + allocate(keeps%ldiscard(keeps%nbody)) + allocate(discards%ldiscard(discards%nbody)) + keeps%ldiscard = .false. + discards%ldiscard = .true. + end associate + + return + end subroutine util_spill_body + + + module subroutine util_spill_pl(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest massive body structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + ! Internals + integer(I4B) :: i + + associate(keeps => self) + + select type (discards) ! The standard requires us to select the type of both arguments in order to access all the components + class is (swiftest_pl) + !> Spill components specific to the massive body class + call util_spill(keeps%mass, discards%mass, lspill_list, ldestructive) + call util_spill(keeps%Gmass, discards%Gmass, lspill_list, ldestructive) + call util_spill(keeps%rhill, discards%rhill, lspill_list, ldestructive) + call util_spill(keeps%radius, discards%radius, lspill_list, ldestructive) + call util_spill(keeps%density, discards%density, lspill_list, ldestructive) + call util_spill(keeps%k2, discards%k2, lspill_list, ldestructive) + call util_spill(keeps%Q, discards%Q, lspill_list, ldestructive) + call util_spill(keeps%tlag, discards%tlag, lspill_list, ldestructive) + call util_spill(keeps%xbeg, discards%xbeg, lspill_list, ldestructive) + call util_spill(keeps%vbeg, discards%vbeg, lspill_list, ldestructive) + call util_spill(keeps%Ip, discards%Ip, lspill_list, ldestructive) + call util_spill(keeps%rot, discards%rot, lspill_list, ldestructive) + + call util_spill_body(keeps, discards, lspill_list, ldestructive) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_pl' + end select + end associate + + return + end subroutine util_spill_pl + + + module subroutine util_spill_tp(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest test particle structure from active list to discard list + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardse + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + + associate(keeps => self, ntp => self%nbody) + select type(discards) + class is (swiftest_tp) + !> Spill components specific to the test particle class + call util_spill(keeps%isperi, discards%isperi, lspill_list, ldestructive) + call util_spill(keeps%peri, discards%peri, lspill_list, ldestructive) + call util_spill(keeps%atp, discards%atp, lspill_list, ldestructive) + + call util_spill_body(keeps, discards, lspill_list, ldestructive) + class default + write(*,*) 'Error! spill method called for incompatible return type on swiftest_tp' + end select + end associate + + return + end subroutine util_spill_tp + +end submodule s_util_spill \ No newline at end of file diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index ab5461f2d..dbcd9c916 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -2,7 +2,7 @@ use swiftest contains - module subroutine whm_util_copy_spill_pl(self, discards, lspill_list) + module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! !! Move spilled (discarded) WHM test particle structure from active list to discard list @@ -13,39 +13,29 @@ module subroutine whm_util_copy_spill_pl(self, discards, lspill_list) class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not ! Internals integer(I4B) :: i associate(keeps => self) select type(discards) class is (whm_pl) - discards%eta(:) = pack(keeps%eta(:), lspill_list(:)) - discards%muj(:) = pack(keeps%muj(:), lspill_list(:)) - discards%ir3j(:) = pack(keeps%ir3j(:), lspill_list(:)) - do i = 1, NDIM - discards%xj(i, :) = pack(keeps%xj(i, :), lspill_list(:)) - discards%vj(i, :) = pack(keeps%vj(i, :), lspill_list(:)) - end do - - if (count(.not.lspill_list(:)) > 0) then - keeps%eta(:) = pack(keeps%eta(:), .not. lspill_list(:)) - keeps%muj(:) = pack(keeps%muj(:), .not. lspill_list(:)) - keeps%ir3j(:) = pack(keeps%ir3j(:), .not. lspill_list(:)) - do i = 1, NDIM - keeps%xj(i, :) = pack(keeps%xj(i, :), .not. lspill_list(:)) - keeps%vj(i, :) = pack(keeps%vj(i, :), .not. lspill_list(:)) - end do - end if - call util_copy_spill_pl(keeps, discards, lspill_list) + call util_spill(keeps%eta, discards%eta, lspill_list, ldestructive) + call util_spill(keeps%muj, discards%muj, lspill_list, ldestructive) + call util_spill(keeps%ir3j, discards%ir3j, lspill_list, ldestructive) + call util_spill(keeps%xj, discards%xj, lspill_list, ldestructive) + call util_spill(keeps%vj, discards%vj, lspill_list, ldestructive) + + call util_spill_pl(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on whm_pl' end select end associate return - end subroutine whm_util_copy_spill_pl + end subroutine whm_util_spill_pl - module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) + module subroutine whm_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! !! Insert new WHM test particle structure into an old one. @@ -69,14 +59,14 @@ module subroutine whm_util_copy_fill_pl(self, inserts, lfill_list) call util_fill(keeps%xj, inserts%xj, lfill_list) call util_fill(keeps%vj, inserts%vj, lfill_list) - call util_copy_fill_pl(keeps, inserts, lfill_list) + call util_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! fill method called for incompatible return type on whm_pl' end select end associate return - end subroutine whm_util_copy_fill_pl + end subroutine whm_util_fill_pl module subroutine whm_util_set_ir3j(self) From be0055534896a2efca42e575eed103e37554e28d Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 06:21:39 -0400 Subject: [PATCH 148/194] Added info and kinship types to the fill and spill interfaces --- src/modules/symba_classes.f90 | 97 +++++++++++----- src/symba/symba_util.f90 | 208 ++++++++++++++++++++++++---------- 2 files changed, 214 insertions(+), 91 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index f0cf9e00d..eb6a74482 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -418,6 +418,36 @@ module subroutine symba_step_reset_system(self) class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object end subroutine symba_step_reset_system + module subroutine symba_util_copy_pltpenc(self, source) + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + end subroutine symba_util_copy_pltpenc + + module subroutine symba_util_copy_plplenc(self, source) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + end subroutine symba_util_copy_plplenc + end interface + + interface util_fill + module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) + implicit none + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_particle_info), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine symba_util_fill_arr_char_info + + module subroutine symba_util_fill_arr_char_kin(keeps, inserts, lfill_list) + implicit none + type(symba_kinship), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_kinship), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine symba_util_fill_arr_char_kin + end interface + + interface module subroutine symba_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none @@ -434,42 +464,12 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine symba_util_fill_tp - module subroutine symba_util_copy_pltpenc(self, source) - implicit none - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into - end subroutine symba_util_copy_pltpenc - - module subroutine symba_util_copy_plplenc(self, source) - implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into - end subroutine symba_util_copy_plplenc - module subroutine symba_util_resize_pltpenc(self, nrequested) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list integer(I4B), intent(in) :: nrequested !! New size of list needed end subroutine symba_util_resize_pltpenc - module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) - use swiftest_classes, only : swiftest_body - implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - end subroutine symba_util_spill_pl - - module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) - use swiftest_classes, only : swiftest_body - implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - end subroutine symba_util_spill_tp - module subroutine symba_util_sort_pl(self, sortby, ascending) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object @@ -495,7 +495,44 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) class(symba_tp), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) end subroutine symba_util_sort_rearrange_tp + end interface + + interface util_spill + module subroutine symba_util_spill_arr_info(keeps, discards, lspill_list, ldestructive) + implicit none + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_arr_info + + module subroutine symba_util_spill_arr_kin(keeps, discards, lspill_list, ldestructive) + implicit none + type(symba_kinship), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_kinship), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_arr_kin + end interface + interface + module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_pl + + module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) + use swiftest_classes, only : swiftest_body + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + end subroutine symba_util_spill_tp end interface end module symba_classes \ No newline at end of file diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 8c9a0a1d7..d1d7fc59e 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,6 +2,92 @@ use swiftest contains + module subroutine symba_util_copy_pltpenc(self, source) + !! author: David A. Minton + !! + !! Copies elements from the source encounter list into self. + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + + associate(n => source%nenc) + self%nenc = n + self%lvdotr(1:n) = source%lvdotr(1:n) + self%status(1:n) = source%status(1:n) + self%level(1:n) = source%level(1:n) + self%index1(1:n) = source%index1(1:n) + self%index2(1:n) = source%index2(1:n) + end associate + + return + end subroutine symba_util_copy_pltpenc + + + module subroutine symba_util_copy_plplenc(self, source) + !! author: David A. Minton + !! + !! Copies elements from the source encounter list into self. + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_pltpenc), intent(in) :: source !! Source object to copy into + + call symba_util_copy_pltpenc(self, source) + associate(n => source%nenc) + select type(source) + class is (symba_plplenc) + self%xh1(:,1:n) = source%xh1(:,1:n) + self%xh2(:,1:n) = source%xh2(:,1:n) + self%vb1(:,1:n) = source%vb1(:,1:n) + self%vb2(:,1:n) = source%vb2(:,1:n) + end select + end associate + + return + end subroutine symba_util_copy_plplenc + + + module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of particle origin information types + !! This is the inverse of a spill operation + implicit none + ! Arguments + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_particle_info), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine symba_util_fill_arr_char_info + + + module subroutine symba_util_fill_arr_char_kin(keeps, inserts, lfill_list) + !! author: David A. Minton + !! + !! Performs a fill operation on a single array of particle kinship types + !! This is the inverse of a spill operation + implicit none + ! Arguments + type(symba_kinship), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_kinship), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + + if (.not.allocated(keeps) .or. .not.allocated(inserts)) return + + keeps(:) = unpack(keeps(:), .not.lfill_list(:), keeps(:)) + keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) + + return + end subroutine symba_util_fill_arr_char_kin + + module subroutine symba_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -27,12 +113,8 @@ module subroutine symba_util_fill_pl(self, inserts, lfill_list) call util_fill(keeps%isperi, inserts%isperi, lfill_list) call util_fill(keeps%peri, inserts%peri, lfill_list) call util_fill(keeps%atp, inserts%atp, lfill_list) - - keeps%kin(:) = unpack(keeps%kin(:), .not.lfill_list(:), keeps%kin(:)) - keeps%kin(:) = unpack(inserts%kin(:), lfill_list(:), keeps%kin(:)) - - keeps%info(:) = unpack(keeps%info(:), .not.lfill_list(:), keeps%info(:)) - keeps%info(:) = unpack(inserts%info(:), lfill_list(:), keeps%info(:)) + call util_fill(keeps%kin, inserts%kin, lfill_list) + call util_fill(keeps%info, inserts%info, lfill_list) call util_fill_pl(keeps, inserts, lfill_list) class default @@ -43,6 +125,7 @@ module subroutine symba_util_fill_pl(self, inserts, lfill_list) return end subroutine symba_util_fill_pl + module subroutine symba_util_fill_tp(self, inserts, lfill_list) !! author: David A. Minton !! @@ -71,51 +154,6 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) return end subroutine symba_util_fill_tp - module subroutine symba_util_copy_pltpenc(self, source) - !! author: David A. Minton - !! - !! Copies elements from the source encounter list into self. - implicit none - ! Arguments - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into - - associate(n => source%nenc) - self%nenc = n - self%lvdotr(1:n) = source%lvdotr(1:n) - self%status(1:n) = source%status(1:n) - self%level(1:n) = source%level(1:n) - self%index1(1:n) = source%index1(1:n) - self%index2(1:n) = source%index2(1:n) - end associate - - return - end subroutine symba_util_copy_pltpenc - - - module subroutine symba_util_copy_plplenc(self, source) - !! author: David A. Minton - !! - !! Copies elements from the source encounter list into self. - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into - - call symba_util_copy_pltpenc(self, source) - associate(n => source%nenc) - select type(source) - class is (symba_plplenc) - self%xh1(:,1:n) = source%xh1(:,1:n) - self%xh2(:,1:n) = source%xh2(:,1:n) - self%vb1(:,1:n) = source%vb1(:,1:n) - self%vb2(:,1:n) = source%vb2(:,1:n) - end select - end associate - - return - end subroutine symba_util_copy_plplenc - module subroutine symba_util_resize_pltpenc(self, nrequested) !! author: David A. Minton @@ -310,6 +348,62 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) end subroutine symba_util_sort_rearrange_tp + module subroutine symba_util_spill_arr_info(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of particle origin information types + !! This is the inverse of a spill operation + implicit none + ! Arguments + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine symba_util_spill_arr_info + + + module subroutine symba_util_spill_arr_kin(keeps, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Performs a spill operation on a single array of particle kinships + !! This is the inverse of a spill operation + implicit none + ! Arguments + type(symba_kinship), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep + type(symba_kinship), dimension(:), allocatable, intent(inout) :: discards !! Array of discards + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discardss + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + + if (.not.allocated(keeps) .or. count(lspill_list(:)) == 0) return + if (.not.allocated(discards)) allocate(discards(count(lspill_list(:)))) + + discards(:) = pack(keeps(:), lspill_list(:)) + if (ldestructive) then + if (count(.not.lspill_list(:)) > 0) then + keeps(:) = pack(keeps(:), .not. lspill_list(:)) + else + deallocate(keeps) + end if + end if + + return + end subroutine symba_util_spill_arr_kin + + module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! @@ -329,7 +423,6 @@ module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) associate(keeps => self) select type(discards) class is (symba_pl) - call util_spill(keeps%lcollision, discards%lcollision, lspill_list, ldestructive) call util_spill(keeps%lencounter, discards%lencounter, lspill_list, ldestructive) call util_spill(keeps%lmtiny, discards%lmtiny, lspill_list, ldestructive) @@ -340,15 +433,8 @@ module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) call util_spill(keeps%isperi, discards%isperi, lspill_list, ldestructive) call util_spill(keeps%peri, discards%peri, lspill_list, ldestructive) call util_spill(keeps%atp, discards%atp, lspill_list, ldestructive) - discards%info(:) = pack(keeps%info(:), lspill_list(:)) - discards%kin(:) = pack(keeps%kin(:), lspill_list(:)) - - if (ldestructive) then - if (count(.not.lspill_list(:)) > 0) then - keeps%info(:) = pack(keeps%info(:), .not. lspill_list(:)) - keeps%kin(:) = pack(keeps%kin(:), .not. lspill_list(:)) - end if - end if + call util_spill(keeps%info, discards%info, lspill_list, ldestructive) + call util_spill(keeps%kin, discards%kin, lspill_list, ldestructive) call util_spill_pl(keeps, discards, lspill_list, ldestructive) class default From 27af16a6be03e66135dc2a75f27544a56b53f270 Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 06:34:43 -0400 Subject: [PATCH 149/194] Corrected problem with the rmvs_pl rearrange code and added allocation checks to each component in the rearrange implementation --- src/rmvs/rmvs_util.f90 | 18 ++++++------- src/symba/symba_util.f90 | 40 +++++++++++++++-------------- src/util/util_sort.f90 | 55 ++++++++++++++++++++-------------------- src/whm/whm_util.f90 | 10 ++++---- 4 files changed, 61 insertions(+), 62 deletions(-) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index e9804bff6..2f7e5f374 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -49,7 +49,6 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) associate(keeps => self) select type(inserts) class is (rmvs_tp) - call util_fill(keeps%lperi, inserts%lperi, lfill_list) call util_fill(keeps%plperP, inserts%plperP, lfill_list) call util_fill(keeps%plencP, inserts%plencP, lfill_list) @@ -162,11 +161,9 @@ module subroutine rmvs_util_sort_rearrange_pl(self, ind) associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) - pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) - pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) - pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) - pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) - pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + if (allocated(pl%nenc)) pl%nenc(1:npl) = pl_sorted%nenc(ind(1:npl)) + if (allocated(pl%tpenc1P)) pl%tpenc1P(1:npl) = pl_sorted%tpenc1P(ind(1:npl)) + if (allocated(pl%plind)) pl%plind(1:npl) = pl_sorted%plind(ind(1:npl)) deallocate(pl_sorted) end associate @@ -191,10 +188,10 @@ module subroutine rmvs_util_sort_rearrange_tp(self, ind) associate(tp => self, ntp => self%nbody) call util_sort_rearrange_tp(tp,ind) allocate(tp_sorted, source=self) - tp%lperi(1:ntp) = tp_sorted%lperi(ind(1:ntp)) - tp%plperP(1:ntp) = tp_sorted%plperP(ind(1:ntp)) - tp%plencP(1:ntp) = tp_sorted%plencP(ind(1:ntp)) - tp%xheliocentric(:,1:ntp) = tp_sorted%xheliocentric(:,ind(1:ntp)) + if (allocated(tp%lperi)) tp%lperi(1:ntp) = tp_sorted%lperi(ind(1:ntp)) + if (allocated(tp%plperP)) tp%plperP(1:ntp) = tp_sorted%plperP(ind(1:ntp)) + if (allocated(tp%plencP)) tp%plencP(1:ntp) = tp_sorted%plencP(ind(1:ntp)) + if (allocated(tp%xheliocentric)) tp%xheliocentric(:,1:ntp) = tp_sorted%xheliocentric(:,ind(1:ntp)) deallocate(tp_sorted) end associate @@ -223,6 +220,7 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list, ldestructive) call util_spill(keeps%nenc, discards%nenc, lspill_list, ldestructive) call util_spill(keeps%tpenc1P, discards%tpenc1P, lspill_list, ldestructive) call util_spill(keeps%plind, discards%plind, lspill_list, ldestructive) + call whm_util_spill_pl(keeps, discards, lspill_list, ldestructive) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index d1d7fc59e..70941555d 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -299,23 +299,25 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) - pl%lcollision(1:npl) = pl_sorted%lcollision(ind(1:npl)) - pl%lencounter(1:npl) = pl_sorted%lencounter(ind(1:npl)) - pl%lmtiny(1:npl) = pl_sorted%lmtiny(ind(1:npl)) - pl%nplenc(1:npl) = pl_sorted%nplenc(ind(1:npl)) - pl%ntpenc(1:npl) = pl_sorted%ntpenc(ind(1:npl)) - pl%levelg(1:npl) = pl_sorted%levelg(ind(1:npl)) - pl%levelm(1:npl) = pl_sorted%levelm(ind(1:npl)) - pl%isperi(1:npl) = pl_sorted%isperi(ind(1:npl)) - pl%peri(1:npl) = pl_sorted%peri(ind(1:npl)) - pl%atp(1:npl) = pl_sorted%atp(ind(1:npl)) - pl%info(1:npl) = pl_sorted%info(ind(1:npl)) - pl%kin(1:npl) = pl_sorted%kin(ind(1:npl)) - do i = 1, npl - do j = 1, pl%kin(i)%nchild - pl%kin(i)%child(j) = ind(pl%kin(i)%child(j)) + if (allocated(pl%lcollision)) pl%lcollision(1:npl) = pl_sorted%lcollision(ind(1:npl)) + if (allocated(pl%lencounter)) pl%lencounter(1:npl) = pl_sorted%lencounter(ind(1:npl)) + if (allocated(pl%lmtiny)) pl%lmtiny(1:npl) = pl_sorted%lmtiny(ind(1:npl)) + if (allocated(pl%nplenc)) pl%nplenc(1:npl) = pl_sorted%nplenc(ind(1:npl)) + if (allocated(pl%ntpenc)) pl%ntpenc(1:npl) = pl_sorted%ntpenc(ind(1:npl)) + if (allocated(pl%levelg)) pl%levelg(1:npl) = pl_sorted%levelg(ind(1:npl)) + if (allocated(pl%levelm)) pl%levelm(1:npl) = pl_sorted%levelm(ind(1:npl)) + if (allocated(pl%isperi)) pl%isperi(1:npl) = pl_sorted%isperi(ind(1:npl)) + if (allocated(pl%peri)) pl%peri(1:npl) = pl_sorted%peri(ind(1:npl)) + if (allocated(pl%atp)) pl%atp(1:npl) = pl_sorted%atp(ind(1:npl)) + if (allocated(pl%info)) pl%info(1:npl) = pl_sorted%info(ind(1:npl)) + if (allocated(pl%kin)) then + pl%kin(1:npl) = pl_sorted%kin(ind(1:npl)) + do i = 1, npl + do j = 1, pl%kin(i)%nchild + pl%kin(i)%child(j) = ind(pl%kin(i)%child(j)) + end do end do - end do + end if deallocate(pl_sorted) end associate @@ -338,9 +340,9 @@ module subroutine symba_util_sort_rearrange_tp(self, ind) associate(tp => self, ntp => self%nbody) call util_sort_rearrange_tp(tp,ind) allocate(tp_sorted, source=self) - tp%nplenc(1:ntp) = tp_sorted%nplenc(ind(1:ntp)) - tp%levelg(1:ntp) = tp_sorted%levelg(ind(1:ntp)) - tp%levelm(1:ntp) = tp_sorted%levelm(ind(1:ntp)) + 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)) deallocate(tp_sorted) end associate diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 59f44c003..752e78ab7 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -161,28 +161,27 @@ module subroutine util_sort_rearrange_body(self, ind) associate(n => self%nbody) allocate(body_sorted, source=self) - self%id(1:n) = body_sorted%id(ind(1:n)) - self%name(1:n) = body_sorted%name(ind(1:n)) - self%status(1:n) = body_sorted%status(ind(1:n)) - self%ldiscard(1:n) = body_sorted%ldiscard(ind(1:n)) - self%xh(:,1:n) = body_sorted%xh(:,ind(1:n)) - self%vh(:,1:n) = body_sorted%vh(:,ind(1:n)) - self%xb(:,1:n) = body_sorted%xb(:,ind(1:n)) - self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) - self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) - self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) - self%mu(1:n) = body_sorted%mu(ind(1:n)) - self%lmask(1:n) = body_sorted%lmask(ind(1:n)) - - if (allocated(self%a)) self%a(1:n) = body_sorted%a(ind(1:n)) - if (allocated(self%e)) self%e(1:n) = body_sorted%e(ind(1:n)) - if (allocated(self%inc)) self%inc(1:n) = body_sorted%inc(ind(1:n)) - if (allocated(self%capom)) self%capom(1:n) = body_sorted%capom(ind(1:n)) - if (allocated(self%omega)) self%omega(1:n) = body_sorted%omega(ind(1:n)) - if (allocated(self%capm)) self%capm(1:n) = body_sorted%capm(ind(1:n)) - if (allocated(self%aobl)) self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) - if (allocated(self%atide)) self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) - if (allocated(self%agr)) self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) + if (allocated(self%id)) self%id(1:n) = body_sorted%id(ind(1:n)) + if (allocated(self%name)) self%name(1:n) = body_sorted%name(ind(1:n)) + if (allocated(self%status)) self%status(1:n) = body_sorted%status(ind(1:n)) + if (allocated(self%ldiscard)) self%ldiscard(1:n) = body_sorted%ldiscard(ind(1:n)) + if (allocated(self%xh)) self%xh(:,1:n) = body_sorted%xh(:,ind(1:n)) + if (allocated(self%vh)) self%vh(:,1:n) = body_sorted%vh(:,ind(1:n)) + if (allocated(self%xb)) self%xb(:,1:n) = body_sorted%xb(:,ind(1:n)) + if (allocated(self%vb)) self%vb(:,1:n) = body_sorted%vb(:,ind(1:n)) + if (allocated(self%ah)) self%ah(:,1:n) = body_sorted%ah(:,ind(1:n)) + if (allocated(self%ir3h)) self%ir3h(1:n) = body_sorted%ir3h(ind(1:n)) + if (allocated(self%mu)) self%mu(1:n) = body_sorted%mu(ind(1:n)) + if (allocated(self%lmask)) self%lmask(1:n) = body_sorted%lmask(ind(1:n)) + if (allocated(self%a)) self%a(1:n) = body_sorted%a(ind(1:n)) + if (allocated(self%e)) self%e(1:n) = body_sorted%e(ind(1:n)) + if (allocated(self%inc)) self%inc(1:n) = body_sorted%inc(ind(1:n)) + if (allocated(self%capom)) self%capom(1:n) = body_sorted%capom(ind(1:n)) + if (allocated(self%omega)) self%omega(1:n) = body_sorted%omega(ind(1:n)) + if (allocated(self%capm)) self%capm(1:n) = body_sorted%capm(ind(1:n)) + if (allocated(self%aobl)) self%aobl(:,1:n) = body_sorted%aobl(:,ind(1:n)) + if (allocated(self%atide)) self%atide(:,1:n) = body_sorted%atide(:,ind(1:n)) + if (allocated(self%agr)) self%agr(:,1:n) = body_sorted%agr(:,ind(1:n)) deallocate(body_sorted) end associate @@ -204,9 +203,9 @@ module subroutine util_sort_rearrange_pl(self, ind) associate(pl => self, npl => self%nbody) call util_sort_rearrange_body(pl,ind) allocate(pl_sorted, source=self) - pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) - pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) - pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) + if (allocated(pl%mass)) pl%mass(1:npl) = pl_sorted%mass(ind(1:npl)) + if (allocated(pl%Gmass)) pl%Gmass(1:npl) = pl_sorted%Gmass(ind(1:npl)) + if (allocated(pl%rhill)) pl%rhill(1:npl) = pl_sorted%rhill(ind(1:npl)) if (allocated(pl%xbeg)) pl%xbeg(:,1:npl) = pl_sorted%xbeg(:,ind(1:npl)) if (allocated(pl%xend)) pl%xend(:,1:npl) = pl_sorted%xend(:,ind(1:npl)) if (allocated(pl%vbeg)) pl%vbeg(:,1:npl) = pl_sorted%vbeg(:,ind(1:npl)) @@ -240,9 +239,9 @@ module subroutine util_sort_rearrange_tp(self, ind) associate(tp => self, ntp => self%nbody) call util_sort_rearrange_body(tp,ind) allocate(tp_sorted, source=self) - tp%isperi(1:ntp) = tp_sorted%isperi(ind(1:ntp)) - tp%peri(1:ntp) = tp_sorted%peri(ind(1:ntp)) - tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) + if (allocated(tp%isperi)) tp%isperi(1:ntp) = tp_sorted%isperi(ind(1:ntp)) + if (allocated(tp%peri)) tp%peri(1:ntp) = tp_sorted%peri(ind(1:ntp)) + if (allocated(tp%atp)) tp%atp(1:ntp) = tp_sorted%atp(ind(1:ntp)) deallocate(tp_sorted) end associate diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index dbcd9c916..deb5dde5a 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -155,11 +155,11 @@ module subroutine whm_util_sort_rearrange_pl(self, ind) associate(pl => self, npl => self%nbody) call util_sort_rearrange_pl(pl,ind) allocate(pl_sorted, source=self) - pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) - pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) - pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) - pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) - pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) + if (allocated(pl%eta)) pl%eta(1:npl) = pl_sorted%eta(ind(1:npl)) + if (allocated(pl%xj)) pl%xj(:,1:npl) = pl_sorted%xj(:,ind(1:npl)) + if (allocated(pl%vj)) pl%vj(:,1:npl) = pl_sorted%vj(:,ind(1:npl)) + if (allocated(pl%muj)) pl%muj(1:npl) = pl_sorted%muj(ind(1:npl)) + if (allocated(pl%ir3j)) pl%ir3j(1:npl) = pl_sorted%ir3j(ind(1:npl)) deallocate(pl_sorted) end associate From ff9578934a8fbb3d6b7d3245c090a1a331b10cff Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 08:07:25 -0400 Subject: [PATCH 150/194] Added generic resize methods to all body types --- src/modules/rmvs_classes.f90 | 16 +- src/modules/swiftest_classes.f90 | 59 ++++++- src/modules/symba_classes.f90 | 58 +++++-- src/modules/whm_classes.f90 | 90 ++++++----- src/rmvs/rmvs_util.f90 | 46 ++++++ src/symba/symba_util.f90 | 131 +++++++++++++++- src/util/util_append.f90 | 2 +- src/util/util_copy.f90 | 2 +- src/util/util_resize.f90 | 262 ++++++++++++++++++++++++++++--- src/whm/whm_util.f90 | 21 +++ 10 files changed, 592 insertions(+), 95 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 4c3bac64f..49794b1ef 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -72,6 +72,7 @@ module rmvs_classes !! if the test particle is undergoing a close encounter or not procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => rmvs_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: spill => rmvs_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) @@ -92,9 +93,10 @@ module rmvs_classes logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => rmvs_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => rmvs_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: spill => rmvs_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type rmvs_pl @@ -170,6 +172,18 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine rmvs_util_fill_tp + module subroutine rmvs_util_resize_pl(self, nnew) + implicit none + class(rmvs_pl), intent(inout) :: self !! RMVS massive body object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine rmvs_util_resize_pl + + module subroutine rmvs_util_resize_tp(self, nnew) + implicit none + class(rmvs_tp), intent(inout) :: self !! RMVS test particle object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine rmvs_util_resize_tp + module subroutine rmvs_util_sort_pl(self, sortby, ascending) implicit none class(rmvs_pl), intent(inout) :: self !! RMVS massive body object diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index be342756e..00802f3fa 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -127,6 +127,8 @@ module swiftest_classes integer(I4B), dimension(:), allocatable :: id !! External identifier (unique) integer(I4B), dimension(:), allocatable :: status !! An integrator-specific status indicator logical, dimension(:), allocatable :: ldiscard !! Body should be discarded + logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) + real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) real(DP), dimension(:,:), allocatable :: xh !! Heliocentric position real(DP), dimension(:,:), allocatable :: vh !! Heliocentric velocity real(DP), dimension(:,:), allocatable :: xb !! Barycentric position @@ -142,8 +144,6 @@ module swiftest_classes real(DP), dimension(:), allocatable :: capom !! Longitude of ascending node real(DP), dimension(:), allocatable :: omega !! Argument of pericenter real(DP), dimension(:), allocatable :: capm !! Mean anomaly - real(DP), dimension(:), allocatable :: mu !! G * (Mcb + [m]) - logical, dimension(:), allocatable :: lmask !! Logical mask used to select a subset of bodies when performing certain operations (drift, kick, accel, etc.) !! Note to developers: If you add components to this class, be sure to update methods and subroutines that traverse the !! component list, such as setup_body and util_spill contains @@ -209,6 +209,7 @@ module swiftest_classes procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_beg_end => util_set_beg_end_pl !! Sets the beginning and ending positions and velocities of planets. procedure :: set_mu => util_set_mu_pl !! Method used to construct the vectorized form of the central body mass procedure :: set_rhill => util_set_rhill !! Calculates the Hill's radii for each body @@ -239,6 +240,7 @@ module swiftest_classes procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure :: resize => util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods @@ -847,14 +849,59 @@ module subroutine util_peri_tp(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine util_peri_tp + end interface + + interface util_resize + module subroutine util_resize_arr_char_string(arr, nnew) + implicit none + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_char_string + + module subroutine util_resize_arr_DP(arr, nnew) + implicit none + real(DP), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_DP + + module subroutine util_resize_arr_DPvec(arr, nnew) + implicit none + real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_DPvec + + module subroutine util_resize_arr_I4B(arr, nnew) + implicit none + integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_I4B + + module subroutine util_resize_arr_logical(arr, nnew) + implicit none + logical, dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine util_resize_arr_logical + end interface - module subroutine util_resize_body(self, nrequested, param) + interface + module subroutine util_resize_body(self, nnew) implicit none - class(swiftest_body), intent(inout) :: self !! Swiftest body object - integer(I4B), intent(in) :: nrequested !! New size neded - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: nnew !! New size neded end subroutine util_resize_body + module subroutine util_resize_pl(self, nnew) + implicit none + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine util_resize_pl + + module subroutine util_resize_tp(self, nnew) + implicit none + class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine util_resize_tp + module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index eb6a74482..712b98f65 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -92,10 +92,11 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle - procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => symba_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => symba_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => symba_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_pl !******************************************************************************************************************************** @@ -111,10 +112,11 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle - procedure :: fill => symba_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: fill => symba_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => symba_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => symba_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: spill => symba_util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_tp !******************************************************************************************************************************** @@ -163,12 +165,12 @@ module symba_classes class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure integer(I4B) :: irec !! System recursion level contains - procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps - procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step - procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system - procedure :: set_recur_levels => symba_step_set_recur_levels_system !! Sets recursion levels of bodies and encounter lists to the current system level - procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary - procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step + procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps + procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step + procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system + procedure :: set_recur_levels => symba_step_set_recur_levels_system !! Sets recursion levels of bodies and encounter lists to the current system level + procedure :: recursive_step => symba_step_recur_system !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current recursion level, if applicable, and descend to the next deeper level if necessary + procedure :: reset => symba_step_reset_system !! Resets pl, tp,and encounter structures at the start of a new step end type symba_nbody_system interface @@ -439,12 +441,12 @@ module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine symba_util_fill_arr_char_info - module subroutine symba_util_fill_arr_char_kin(keeps, inserts, lfill_list) + module subroutine symba_util_fill_arr_kin(keeps, inserts, lfill_list) implicit none type(symba_kinship), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep type(symba_kinship), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine symba_util_fill_arr_char_kin + end subroutine symba_util_fill_arr_kin end interface interface @@ -463,13 +465,41 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine symba_util_fill_tp + end interface + + interface util_resize + module subroutine symba_util_resize_arr_info(arr, nnew) + implicit none + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine symba_util_resize_arr_info - module subroutine symba_util_resize_pltpenc(self, nrequested) + module subroutine symba_util_resize_arr_kin(arr, nnew) + implicit none + type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + end subroutine symba_util_resize_arr_kin + end interface + + interface + module subroutine symba_util_resize_pl(self, nnew) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine symba_util_resize_pl + + module subroutine symba_util_resize_pltpenc(self, nnew) implicit none class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - integer(I4B), intent(in) :: nrequested !! New size of list needed + integer(I4B), intent(in) :: nnew !! New size of list needed end subroutine symba_util_resize_pltpenc + module subroutine symba_util_resize_tp(self, nnew) + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine symba_util_resize_tp + module subroutine symba_util_sort_pl(self, sortby, ascending) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 626c0a974..0f67c9432 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -34,18 +34,19 @@ module whm_classes procedure :: j2h => whm_coord_j2h_pl !! Convert position and velcoity vectors from Jacobi to helliocentric coordinates procedure :: vh2vj => whm_coord_vh2vj_pl !! Convert velocity vectors from heliocentric to Jacobi coordinates procedure :: drift => whm_drift_pl !! Loop through massive bodies and call Danby drift routine to jacobi coordinates - procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) - procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies procedure :: accel_gr => whm_gr_kick_getacch_pl !! Acceleration term arising from the post-Newtonian correction procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction - procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles - procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. + procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies + procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: resize => whm_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) + procedure :: set_mu => whm_util_set_mu_eta_pl !! Sets the Jacobi mass value for all massive bodies. procedure :: sort => whm_util_sort_pl !! Sort a WHM massive body object in-place. procedure :: rearrange => whm_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: step => whm_step_pl !! Steps the body forward one stepsize procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: step => whm_step_pl !! Steps the body forward one stepsize end type whm_pl !******************************************************************************************************************************** @@ -57,10 +58,10 @@ module whm_classes !! Note to developers: If you add componenets to this class, be sure to update methods and subroutines that traverse the !! component list, such as whm_util_spill_tp contains - procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles procedure :: accel_gr => whm_gr_kick_getacch_tp !! Acceleration term arising from the post-Newtonian correction procedure :: gr_pos_kick => whm_gr_p4_tp !! Position kick due to p**4 term in the post-Newtonian correction + procedure :: accel => whm_kick_getacch_tp !! Compute heliocentric accelerations of test particles + procedure :: kick => whm_kick_vh_tp !! Kick heliocentric velocities of test particles procedure :: step => whm_step_tp !! Steps the particle forward one stepsize end type whm_tp @@ -106,14 +107,6 @@ module subroutine whm_drift_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_drift_pl - module subroutine whm_util_fill_pl(self, inserts, lfill_list) - use swiftest_classes, only : swiftest_body - implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(in) :: inserts !! inserted object - logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine whm_util_fill_pl - !> Get heliocentric accelration of massive bodies module subroutine whm_kick_getacch_pl(self, system, param, t, lbeg) use swiftest_classes, only : swiftest_cb, swiftest_parameters @@ -197,31 +190,6 @@ module subroutine whm_setup_pl(self, n, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_setup_pl - module subroutine whm_util_set_ir3j(self) - implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body object - end subroutine whm_util_set_ir3j - - module subroutine whm_util_set_mu_eta_pl(self, cb) - use swiftest_classes, only : swiftest_cb - implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object - end subroutine whm_util_set_mu_eta_pl - - module subroutine whm_util_sort_pl(self, sortby, ascending) - implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body object - character(*), intent(in) :: sortby !! Sorting attribute - logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order - end subroutine whm_util_sort_pl - - module subroutine whm_util_sort_rearrange_pl(self, ind) - implicit none - class(whm_pl), intent(inout) :: self !! WHM massive body object - integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) - end subroutine whm_util_sort_rearrange_pl - module subroutine whm_setup_initialize_system(self, param) use swiftest_classes, only : swiftest_parameters implicit none @@ -258,7 +226,6 @@ module subroutine whm_util_spill_pl(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 whm_util_spill_pl - !> Steps the Swiftest nbody system forward in time one stepsize module subroutine whm_step_system(self, param, t, dt) use swiftest_classes, only : swiftest_parameters implicit none @@ -267,6 +234,45 @@ module subroutine whm_step_system(self, param, t, dt) real(DP), intent(in) :: t !! Simulation time real(DP), intent(in) :: dt !! Current stepsize end subroutine whm_step_system + + module subroutine whm_util_fill_pl(self, inserts, lfill_list) + use swiftest_classes, only : swiftest_body + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_body), intent(in) :: inserts !! inserted object + logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps + end subroutine whm_util_fill_pl + + module subroutine whm_util_resize_pl(self, nnew) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine whm_util_resize_pl + + module subroutine whm_util_set_ir3j(self) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + end subroutine whm_util_set_ir3j + + module subroutine whm_util_set_mu_eta_pl(self, cb) + use swiftest_classes, only : swiftest_cb + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object + end subroutine whm_util_set_mu_eta_pl + + module subroutine whm_util_sort_pl(self, sortby, ascending) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + character(*), intent(in) :: sortby !! Sorting attribute + logical, intent(in) :: ascending !! Logical flag indicating whether or not the sorting should be in ascending or descending order + end subroutine whm_util_sort_pl + + module subroutine whm_util_sort_rearrange_pl(self, ind) + implicit none + class(whm_pl), intent(inout) :: self !! WHM massive body object + integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) + end subroutine whm_util_sort_rearrange_pl end interface end module whm_classes diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 2f7e5f374..dcf0de473 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -62,6 +62,52 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) return end subroutine rmvs_util_fill_tp + + module subroutine rmvs_util_resize_pl(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a massive body object against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + + ! The following are not implemented as RMVS doesn't make use of resize 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_resize(self%outer, nnew) + !call util_resize(self%inner, nnew) + !call util_resize(self%planetocentric, nnew) + + return + end subroutine rmvs_util_resize_pl + + + module subroutine rmvs_util_resize_tp(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a test particle object against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + + return + end subroutine rmvs_util_resize_tp + + module subroutine rmvs_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 70941555d..f2f72d12d 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -68,7 +68,7 @@ module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) end subroutine symba_util_fill_arr_char_info - module subroutine symba_util_fill_arr_char_kin(keeps, inserts, lfill_list) + module subroutine symba_util_fill_arr_kin(keeps, inserts, lfill_list) !! author: David A. Minton !! !! Performs a fill operation on a single array of particle kinship types @@ -85,7 +85,7 @@ module subroutine symba_util_fill_arr_char_kin(keeps, inserts, lfill_list) keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) return - end subroutine symba_util_fill_arr_char_kin + end subroutine symba_util_fill_arr_kin module subroutine symba_util_fill_pl(self, inserts, lfill_list) @@ -155,7 +155,122 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) end subroutine symba_util_fill_tp - module subroutine symba_util_resize_pltpenc(self, nrequested) + module subroutine symba_util_resize_arr_info(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of type character string. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + type(symba_particle_info), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + type(symba_particle_info), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + else + tmp(1:nnew) = arr(1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine symba_util_resize_arr_info + + + module subroutine symba_util_resize_arr_kin(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of type character string. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + type(symba_kinship), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + type(symba_kinship), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + else + tmp(1:nnew) = arr(1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine symba_util_resize_arr_kin + + + module subroutine symba_util_resize_pl(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a massive body object against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + call util_resize(self%nplenc, nnew) + call util_resize(self%ntpenc, nnew) + call util_resize(self%levelg, nnew) + call util_resize(self%levelm, nnew) + call util_resize(self%isperi, nnew) + call util_resize(self%peri, nnew) + call util_resize(self%atp, nnew) + call util_resize(self%kin, nnew) + call util_resize(self%info, nnew) + + return + end subroutine symba_util_resize_pl + + + module subroutine symba_util_resize_tp(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a test particle object against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + + return + end subroutine symba_util_resize_tp + + + module subroutine symba_util_resize_pltpenc(self, nnew) !! author: David A. Minton !! !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. @@ -163,7 +278,7 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) implicit none ! Arguments class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - integer(I4B), intent(in) :: nrequested !! New size of list needed + integer(I4B), intent(in) :: nnew !! New size of list needed ! Internals class(symba_pltpenc), allocatable :: enc_temp integer(I4B) :: nold @@ -175,17 +290,17 @@ module subroutine symba_util_resize_pltpenc(self, nrequested) else nold = 0 end if - if (nrequested > nold) then + if (nnew > nold) then if (lmalloc) allocate(enc_temp, source=self) - call self%setup(2 * nrequested) + call self%setup(2 * nnew) if (lmalloc) then call self%copy(enc_temp) deallocate(enc_temp) end if else - self%status(nrequested+1:nold) = INACTIVE + self%status(nnew+1:nold) = INACTIVE end if - self%nenc = nrequested + self%nenc = nnew return end subroutine symba_util_resize_pltpenc diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 3a5b3ba81..854220a89 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -15,7 +15,7 @@ module subroutine util_append_body(self, source, param, lsource_mask) logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to associate(nold => self%nbody, nnew => source%nbody) - if (nnew > size(self%status)) call self%resize(nnew, param) + if (nnew > size(self%status)) call self%resize(nnew) end associate return diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index bc8cdcf43..b21f061f4 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -26,7 +26,7 @@ module subroutine util_copy_into_body(self, source, param, lsource_mask) lfill_list = .false. lfill_list(1:nnew) = .true. associate(nold => self%nbody) - if (nnew > size(self%status)) call self%resize(nnew, param) + if (nnew > size(self%status)) call self%resize(nnew) call self%fill(source, lfill_list) end associate return diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 986053546..53df2bd73 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -1,40 +1,258 @@ submodule (swiftest_classes) s_util_resize use swiftest contains + module subroutine util_resize_arr_char_string(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of type character string. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + character(len=STRMAX), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + else + tmp(1:nnew) = arr(1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine util_resize_arr_char_string + - module subroutine util_resize_body(self, nrequested, param) + module subroutine util_resize_arr_DP(arr, nnew) !! author: David A. Minton !! - !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + !! Resizes an array component of double precision type. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + real(DP), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + real(DP), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + else + tmp(1:nnew) = arr(1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine util_resize_arr_DP + + + module subroutine util_resize_arr_DPvec(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of double precision vectors of size (NDIM, n). Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. implicit none ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - integer(I4B), intent(in) :: nrequested !! New size neded - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size ! Internals - class(swiftest_body), allocatable :: temp - integer(I4B) :: nold - logical :: lmalloc + real(DP), dimension(:,:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size - lmalloc = allocated(self%status) - if (lmalloc) then - nold = size(self%status) + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr, dim=2) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(NDIM, nnew)) + if (nnew > nold) then + tmp(:, 1:nold) = arr(:, 1:nold) else - nold = 0 - end if - if (nrequested > nold) then - if (lmalloc) allocate(temp, source=self) - call self%setup(nrequested, param) - if (lmalloc) then - call self%copy_into(temp, param) - deallocate(temp) - end if + tmp(:, 1:nnew) = arr(:, 1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine util_resize_arr_DPvec + + + module subroutine util_resize_arr_I4B(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of integer type. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + integer(I4B), dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) else - self%status(nrequested+1:nold) = INACTIVE + tmp(1:nnew) = arr(1:nnew) end if - self%nbody = nrequested + call move_alloc(tmp, arr) + + return + end subroutine util_resize_arr_I4B + + + module subroutine util_resize_arr_logical(arr, nnew) + !! author: David A. Minton + !! + !! Resizes an array component of logical type. Array will only be resized if has previously been allocated. Passing nnew = 0 will deallocate. + implicit none + ! Arguments + logical, dimension(:), allocatable, intent(inout) :: arr !! Array to resize + integer(I4B), intent(in) :: nnew !! New size + ! Internals + logical, dimension(:), allocatable :: tmp !! Temporary storage array in case the input array is already allocated + integer(I4B) :: nold !! Old size + + if (.not. allocated(arr) .or. nnew < 0) return + + nold = size(arr) + if (nnew == nold) return + + if (nnew == 0) then + deallocate(arr) + return + end if + + allocate(tmp(nnew)) + if (nnew > nold) then + tmp(1:nold) = arr(1:nold) + else + tmp(1:nnew) = arr(1:nnew) + end if + call move_alloc(tmp, arr) + + return + end subroutine util_resize_arr_logical + + + module subroutine util_resize_body(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + implicit none + ! Arguments + class(swiftest_body), intent(inout) :: self !! Swiftest body object + integer(I4B), intent(in) :: nnew !! New size neded + + call util_resize(self%name, nnew) + call util_resize(self%status, nnew) + call util_resize(self%ldiscard, nnew) + call util_resize(self%lmask, nnew) + call util_resize(self%mu, nnew) + call util_resize(self%xh, nnew) + call util_resize(self%vh, nnew) + call util_resize(self%xb, nnew) + call util_resize(self%vb, nnew) + call util_resize(self%ah, nnew) + call util_resize(self%aobl, nnew) + call util_resize(self%atide, nnew) + call util_resize(self%agr, nnew) + call util_resize(self%ir3h, nnew) + call util_resize(self%a, nnew) + call util_resize(self%e, nnew) + call util_resize(self%inc, nnew) + call util_resize(self%capom, nnew) + call util_resize(self%omega, nnew) + call util_resize(self%capm, nnew) + self%nbody = count(self%status(1:nnew) == ACTIVE) return end subroutine util_resize_body + + module subroutine util_resize_pl(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + implicit none + ! Arguments + class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: nnew !! New size neded + + call util_resize_body(self, nnew) + + call util_resize(self%mass, nnew) + call util_resize(self%Gmass, nnew) + call util_resize(self%rhill, nnew) + call util_resize(self%radius, nnew) + call util_resize(self%xbeg, nnew) + call util_resize(self%xend, nnew) + call util_resize(self%vbeg, nnew) + call util_resize(self%density, nnew) + call util_resize(self%Ip, nnew) + call util_resize(self%rot, nnew) + call util_resize(self%k2, nnew) + call util_resize(self%Q, nnew) + call util_resize(self%tlag, nnew) + call self%eucl_index() + + return + end subroutine util_resize_pl + + + module subroutine util_resize_tp(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + implicit none + ! Arguments + class(swiftest_tp), intent(inout) :: self !! Swiftest massive body object + integer(I4B), intent(in) :: nnew !! New size neded + + call util_resize_body(self, nnew) + + call util_resize(self%isperi, nnew) + call util_resize(self%peri, nnew) + call util_resize(self%atp, nnew) + + return + end subroutine util_resize_tp + + end submodule s_util_resize \ No newline at end of file diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index deb5dde5a..c0f3a021b 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -69,6 +69,27 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) end subroutine whm_util_fill_pl + module subroutine whm_util_resize_pl(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a massive body against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + + return + end subroutine whm_util_resize_pl + + module subroutine whm_util_set_ir3j(self) !! author: David A. Minton !! From 4372de700365915b8d3a181927dac58b434a53b5 Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 09:12:56 -0400 Subject: [PATCH 151/194] Removed unnecessary copy_into method --- src/modules/swiftest_classes.f90 | 9 -------- src/util/util_copy.f90 | 35 -------------------------------- 2 files changed, 44 deletions(-) delete mode 100644 src/util/util_copy.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 00802f3fa..47d66ee51 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -165,7 +165,6 @@ module swiftest_classes procedure :: setup => setup_body !! A constructor that sets the number of bodies and allocates all allocatable arrays procedure :: accel_user => user_kick_getacch_body !! Add user-supplied heliocentric accelerations to planets procedure :: append => util_append_body !! Appends elements from one structure to another - procedure :: copy_into => util_copy_into_body !! Copies elements from one Swiftest body object to another. procedure :: fill => util_fill_body !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => util_resize_body !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => util_set_ir3h !! Sets the inverse heliocentric radius term (1/rh**3) @@ -770,14 +769,6 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_cb), intent(in) :: cb !! Swiftest central body object end subroutine util_coord_h2b_tp - module subroutine util_copy_into_body(self, source, param, 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_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - end subroutine util_copy_into_body - module subroutine util_exit(code) implicit none integer(I4B), intent(in) :: code !! Failure exit code diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 deleted file mode 100644 index b21f061f4..000000000 --- a/src/util/util_copy.f90 +++ /dev/null @@ -1,35 +0,0 @@ -submodule (swiftest_classes) s_util_copy - use swiftest -contains - - module subroutine util_copy_into_body(self, source, param, lsource_mask) - !! author: David A. Minton - !! - !! Copies elements from one Swiftest body object to another. - !! This method will automatically resize the destination body if it is too small - implicit none - ! Arguments - class(swiftest_body), intent(inout) :: self !! Swiftest body object - class(swiftest_body), intent(in) :: source !! Source object to append - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to - ! Internals - integer(I4B) :: i,nnew - logical, dimension(:), allocatable :: lfill_list - - if (present(lsource_mask)) then - nnew = count(lsource_mask) - else - nnew = size(source%status) - end if - allocate(lfill_list(size(self%status))) - lfill_list = .false. - lfill_list(1:nnew) = .true. - associate(nold => self%nbody) - if (nnew > size(self%status)) call self%resize(nnew) - call self%fill(source, lfill_list) - end associate - return - end subroutine util_copy_into_body - -end submodule s_util_copy \ No newline at end of file From cedfc4c46c851c7716d9ce67a69857f03f7657c1 Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 09:43:34 -0400 Subject: [PATCH 152/194] Added beginnings of an append method that SyMBA will use to make add and subtract lists --- src/modules/swiftest_classes.f90 | 42 +++++++- src/util/util_append.f90 | 179 ++++++++++++++++++++++++++++++- 2 files changed, 216 insertions(+), 5 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 47d66ee51..7501d730c 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -736,12 +736,50 @@ module subroutine user_kick_getacch_body(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current time logical, intent(in) :: lbeg !! Optional argument that determines whether or not this is the beginning or end of the step end subroutine user_kick_getacch_body + end interface + + interface util_append + 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(inout) :: source !! Array to append + logical, dimension(:), optional, 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(inout) :: source !! Array to append + logical, dimension(:), optional, 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(inout) :: source !! Array to append + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + end subroutine util_append_arr_DPvec - module subroutine util_append_body(self, source, param, lsource_mask) + 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(inout) :: source !! Array to append + logical, dimension(:), optional, 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(inout) :: source !! Array to append + logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + end subroutine util_append_arr_logical + end interface + + interface + 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_parameters), intent(in) :: param !! Current run configuration parameters logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_body diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 854220a89..4d9948641 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -2,7 +2,182 @@ use swiftest contains - module subroutine util_append_body(self, source, param, lsource_mask) + module subroutine util_append_arr_char_string(arr, source, 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. + implicit none + ! Arguments + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array + character(len=STRMAX), dimension(:), allocatable, intent(inout) :: source !! Array to append + logical, dimension(:), optional, 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + call util_resize(arr, narr+nsrc) + + arr(narr+1:nsrc) = source(:) + + return + end subroutine util_append_arr_char_string + + + module subroutine util_append_arr_DP(arr, source, 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. + implicit none + ! Arguments + real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array + real(DP), dimension(:), allocatable, intent(inout) :: source !! Array to append + logical, dimension(:), optional, 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + call util_resize(arr, narr+nsrc) + + arr(narr+1:nsrc) = source(:) + + return + end subroutine util_append_arr_DP + + + module subroutine util_append_arr_DPvec(arr, source, 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. + implicit none + ! Arguments + real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array + real(DP), dimension(:,:), allocatable, intent(inout) :: source !! Array to append + logical, dimension(:), optional, 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 + + if (allocated(arr)) then + narr = size(arr, dim=2) + else + allocate(arr(NDIM,nsrc)) + narr = 0 + end if + + call util_resize(arr, narr+nsrc) + + arr(:,narr+1:nsrc) = source(:,:) + + return + end subroutine util_append_arr_DPvec + + + module subroutine util_append_arr_I4B(arr, source, 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. + implicit none + ! Arguments + integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array + integer(I4B), dimension(:), allocatable, intent(inout) :: source !! Array to append + logical, dimension(:), optional, 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + call util_resize(arr, narr+nsrc) + + arr(narr+1:nsrc) = source(:) + + return + end subroutine util_append_arr_I4B + + + module subroutine util_append_arr_logical(arr, source, 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. + implicit none + ! Arguments + logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array + logical, dimension(:), allocatable, intent(inout) :: source !! Array to append + logical, dimension(:), optional, 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + call util_resize(arr, narr+nsrc) + + arr(narr+1:nsrc) = source(:) + + return + end subroutine util_append_arr_logical + + + module subroutine util_append_body(self, source, lsource_mask) !! author: David A. Minton !! !! Append components from one Swiftest body object to another. @@ -11,11 +186,9 @@ module subroutine util_append_body(self, source, param, lsource_mask) ! Arguments class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_body), intent(in) :: source !! Source object to append - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to associate(nold => self%nbody, nnew => source%nbody) - if (nnew > size(self%status)) call self%resize(nnew) end associate return From f4bce42975db7d9a27f6040dfbe42e2d980f86e3 Mon Sep 17 00:00:00 2001 From: David Minton Date: Mon, 2 Aug 2021 12:16:05 -0400 Subject: [PATCH 153/194] Added append methods to all body types --- src/modules/rmvs_classes.f90 | 18 +++ src/modules/swiftest_classes.f90 | 52 ++++++--- src/modules/symba_classes.f90 | 40 ++++++- src/modules/whm_classes.f90 | 27 +++-- src/rmvs/rmvs_util.f90 | 69 +++++++++++- src/symba/symba_util.f90 | 144 +++++++++++++++++++++++- src/util/util_append.f90 | 182 ++++++++++++++++++++++++------- src/util/util_exit.f90 | 1 + src/whm/whm_util.f90 | 85 ++++++++++----- 9 files changed, 514 insertions(+), 104 deletions(-) diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 49794b1ef..315b098a8 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -71,6 +71,7 @@ module rmvs_classes procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure :: append => rmvs_util_append_tp !! Appends elements from one structure to another procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => rmvs_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => rmvs_util_sort_tp !! Sorts body arrays by a sortable componen @@ -93,6 +94,7 @@ module rmvs_classes logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: append => rmvs_util_append_pl !! Appends elements from one structure to another procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => rmvs_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => rmvs_util_sort_pl !! Sorts body arrays by a sortable componen @@ -156,6 +158,22 @@ module subroutine rmvs_setup_tp(self, n, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parametere end subroutine rmvs_setup_tp + module subroutine rmvs_util_append_pl(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine rmvs_util_append_pl + + module subroutine rmvs_util_append_tp(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine rmvs_util_append_tp + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 7501d730c..c7a7939a1 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -205,6 +205,7 @@ module swiftest_classes procedure :: accel_obl => obl_acc_pl !! Compute the barycentric accelerations of bodies due to the oblateness of the central body procedure :: setup => setup_pl !! A base constructor that sets the number of bodies and allocates and initializes all arrays procedure :: accel_tides => tides_kick_getacch_pl !! Compute the accelerations of bodies due to tidal interactions with the central body + procedure :: append => util_append_pl !! Appends elements from one structure to another procedure :: h2b => util_coord_h2b_pl !! Convert massive bodies from heliocentric to barycentric coordinates (position and velocity) procedure :: b2h => util_coord_b2h_pl !! Convert massive bodies from barycentric to heliocentric coordinates (position and velocity) procedure :: fill => util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) @@ -231,19 +232,20 @@ module swiftest_classes contains ! Test particle-specific concrete methods ! These are concrete because they are the same implemenation for all integrators - procedure :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies - procedure :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies - procedure :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body - procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and - procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) - procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) - procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) - procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles - procedure :: resize => util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. - procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass - procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component - procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods - procedure :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: discard => discard_tp !! Check to see if test particles should be discarded based on their positions relative to the massive bodies + procedure :: accel_int => kick_getacch_int_tp !! Compute direct cross (third) term heliocentric accelerations of test particles by massive bodies + procedure :: accel_obl => obl_acc_tp !! Compute the barycentric accelerations of bodies due to the oblateness of the central body + procedure :: setup => setup_tp !! A base constructor that sets the number of bodies and + procedure :: append => util_append_tp !! Appends elements from one structure to another + procedure :: h2b => util_coord_h2b_tp !! Convert test particles from heliocentric to barycentric coordinates (position and velocity) + procedure :: b2h => util_coord_b2h_tp !! Convert test particles from barycentric to heliocentric coordinates (position and velocity) + procedure :: fill => util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: get_peri => util_peri_tp !! Determine system pericenter passages for test particles + procedure :: resize => util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + procedure :: set_mu => util_set_mu_tp !! Method used to construct the vectorized form of the central body mass + procedure :: sort => util_sort_tp !! Sorts body arrays by a sortable component + procedure :: rearrange => util_sort_rearrange_tp !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods + procedure :: spill => util_spill_tp !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type swiftest_tp !******************************************************************************************************************************** @@ -742,35 +744,35 @@ end subroutine user_kick_getacch_body 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(inout) :: source !! Array to append + 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 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(inout) :: source !! Array to append + 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 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(inout) :: source !! Array to append + 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 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(inout) :: source !! Array to append + 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 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(inout) :: source !! Array to append + logical, dimension(:), allocatable, intent(in) :: source !! Array to append logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to end subroutine util_append_arr_logical end interface @@ -783,6 +785,20 @@ module subroutine util_append_body(self, source, lsource_mask) logical, dimension(:), optional, 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 + 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 + end subroutine util_append_tp + module subroutine util_coord_b2h_pl(self, cb) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 712b98f65..01af9a48f 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -92,6 +92,7 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: append => symba_util_append_pl !! Appends elements from one structure to another procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => symba_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen @@ -112,6 +113,7 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure :: append => symba_util_append_tp !! Appends elements from one structure to another procedure :: fill => symba_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => symba_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_tp !! Sorts body arrays by a sortable componen @@ -419,6 +421,40 @@ module subroutine symba_step_reset_system(self) implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object end subroutine symba_step_reset_system + end interface + + interface util_append + 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 + 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 + end subroutine symba_util_append_arr_kin + end interface + + interface + module subroutine symba_util_append_pl(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine symba_util_append_pl + + module subroutine symba_util_append_tp(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine symba_util_append_tp module subroutine symba_util_copy_pltpenc(self, source) implicit none @@ -434,12 +470,12 @@ end subroutine symba_util_copy_plplenc end interface interface util_fill - module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) + module subroutine symba_util_fill_arr_info(keeps, inserts, lfill_list) implicit none type(symba_particle_info), dimension(:), allocatable, intent(inout) :: keeps !! Array of values to keep type(symba_particle_info), dimension(:), allocatable, intent(in) :: inserts !! Array of values to insert into keep logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - end subroutine symba_util_fill_arr_char_info + end subroutine symba_util_fill_arr_info module subroutine symba_util_fill_arr_kin(keeps, inserts, lfill_list) implicit none diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 0f67c9432..e581e52b1 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -38,6 +38,7 @@ module whm_classes procedure :: gr_pos_kick => whm_gr_p4_pl !! Position kick due to p**4 term in the post-Newtonian correction procedure :: accel => whm_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies procedure :: kick => whm_kick_vh_pl !! Kick heliocentric velocities of massive bodies + procedure :: append => whm_util_append_pl !! Appends elements from one structure to another procedure :: fill => whm_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => whm_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: set_ir3 => whm_util_set_ir3j !! Sets both the heliocentric and jacobi inverse radius terms (1/rj**3 and 1/rh**3) @@ -207,6 +208,15 @@ module subroutine whm_step_pl(self, system, param, t, dt) real(DP), intent(in) :: dt !! Current stepsize end subroutine whm_step_pl + module subroutine whm_step_system(self, param, t, dt) + use swiftest_classes, only : swiftest_parameters + implicit none + class(whm_nbody_system), intent(inout) :: self !! WHM system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Simulation time + real(DP), intent(in) :: dt !! Current stepsize + end subroutine whm_step_system + module subroutine whm_step_tp(self, system, param, t, dt) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none @@ -217,6 +227,14 @@ module subroutine whm_step_tp(self, system, param, t, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine whm_step_tp + module subroutine whm_util_append_pl(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine whm_util_append_pl + module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none @@ -226,15 +244,6 @@ module subroutine whm_util_spill_pl(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 whm_util_spill_pl - module subroutine whm_step_system(self, param, t, dt) - use swiftest_classes, only : swiftest_parameters - implicit none - class(whm_nbody_system), intent(inout) :: self !! WHM system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Simulation time - real(DP), intent(in) :: dt !! Current stepsize - end subroutine whm_step_system - module subroutine whm_util_fill_pl(self, inserts, lfill_list) use swiftest_classes, only : swiftest_body implicit none diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index dcf0de473..8f0d7cf5d 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -2,6 +2,66 @@ use swiftest contains + module subroutine rmvs_util_append_pl(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from one massive body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + !! 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 + + select type(source) + class is (rmvs_pl) + 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) + + ! 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) + + call whm_util_append_pl(self, source, lsource_mask) + class default + write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_pl or its descendents" + call util_exit(FAILURE) + end select + + return + end subroutine rmvs_util_append_pl + + + module subroutine rmvs_util_append_tp(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from test particle object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + !! 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 + + select type(source) + class is (rmvs_tp) + 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_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class + class default + write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_tp or its descendents" + call util_exit(FAILURE) + end select + + return + end subroutine rmvs_util_append_tp + + module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton !! @@ -19,11 +79,16 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) associate(keeps => self) select type(inserts) class is (rmvs_pl) - call util_fill(keeps%nenc, inserts%nenc, lfill_list) call util_fill(keeps%tpenc1P, inserts%tpenc1P, lfill_list) call util_fill(keeps%plind, inserts%plind, lfill_list) + ! 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_fill(keeps%outer, inserts%outer, lfill_list) + !call util_fill(keeps%inner, inserts%inner, lfill_list) + !call util_fill(keeps%planetocentric, inserts%planetocentric, lfill_list) + call whm_util_fill_pl(keeps, inserts, lfill_list) class default write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' @@ -53,7 +118,7 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) call util_fill(keeps%plperP, inserts%plperP, lfill_list) call util_fill(keeps%plencP, inserts%plencP, lfill_list) - call util_fill_tp(keeps, inserts, lfill_list) + call util_fill_tp(keeps, inserts, lfill_list) ! Note: whm_tp does not have its own fill method, so we skip back to the base class class default write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' end select diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index f2f72d12d..02d839bb2 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -2,6 +2,142 @@ use swiftest contains + module subroutine symba_util_append_arr_info(arr, source, 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. + implicit none + ! 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 + ! 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if + + return + end subroutine symba_util_append_arr_info + + + module subroutine symba_util_append_arr_kin(arr, source, 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. + implicit none + ! 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 + ! 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 + + if (allocated(arr)) then + narr = size(arr) + else + allocate(arr(nsrc)) + narr = 0 + end if + + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if + + return + end subroutine symba_util_append_arr_kin + + + module subroutine symba_util_append_pl(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from one massive body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + !! 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 + + select type(source) + class is (symba_pl) + 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) + + 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 + 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 + + return + end subroutine symba_util_append_pl + + + module subroutine symba_util_append_tp(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from test particle object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + !! 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 + + select type(source) + class is (symba_tp) + 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_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class + class default + write(*,*) "Invalid object passed to the append method. Source must be of class symba_tp or its descendents" + call util_exit(FAILURE) + end select + + return + end subroutine symba_util_append_tp + module subroutine symba_util_copy_pltpenc(self, source) !! author: David A. Minton !! @@ -48,7 +184,7 @@ module subroutine symba_util_copy_plplenc(self, source) end subroutine symba_util_copy_plplenc - module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) + module subroutine symba_util_fill_arr_info(keeps, inserts, lfill_list) !! author: David A. Minton !! !! Performs a fill operation on a single array of particle origin information types @@ -65,7 +201,7 @@ module subroutine symba_util_fill_arr_char_info(keeps, inserts, lfill_list) keeps(:) = unpack(inserts(:), lfill_list(:), keeps(:)) return - end subroutine symba_util_fill_arr_char_info + end subroutine symba_util_fill_arr_info module subroutine symba_util_fill_arr_kin(keeps, inserts, lfill_list) @@ -116,7 +252,7 @@ module subroutine symba_util_fill_pl(self, inserts, lfill_list) call util_fill(keeps%kin, inserts%kin, lfill_list) call util_fill(keeps%info, inserts%info, lfill_list) - call util_fill_pl(keeps, inserts, lfill_list) + call util_fill_pl(keeps, inserts, lfill_list) ! Note: helio_pl does not have its own fill method, so we skip back to the base class class default write(*,*) 'Error! fill method called for incompatible return type on symba_pl' end select @@ -145,7 +281,7 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) call util_fill(keeps%levelg, inserts%levelg, lfill_list) call util_fill(keeps%levelm, inserts%levelm, lfill_list) - call util_fill_tp(keeps, inserts, 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 write(*,*) 'Error! fill method called for incompatible return type on symba_tp' end select diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index 4d9948641..0ca112eb9 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -8,9 +8,9 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) !! 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. implicit none ! Arguments - character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array - character(len=STRMAX), dimension(:), allocatable, intent(inout) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + 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 ! Internals integer(I4B) :: narr, nsrc @@ -29,9 +29,11 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) narr = 0 end if - call util_resize(arr, narr+nsrc) - - arr(narr+1:nsrc) = source(:) + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if return end subroutine util_append_arr_char_string @@ -43,9 +45,9 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) !! 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. implicit none ! Arguments - real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array - real(DP), dimension(:), allocatable, intent(inout) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + 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 ! Internals integer(I4B) :: narr, nsrc @@ -64,9 +66,11 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) narr = 0 end if - call util_resize(arr, narr+nsrc) - - arr(narr+1:nsrc) = source(:) + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if return end subroutine util_append_arr_DP @@ -78,9 +82,9 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) !! 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. implicit none ! Arguments - real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array - real(DP), dimension(:,:), allocatable, intent(inout) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + 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 ! Internals integer(I4B) :: narr, nsrc @@ -95,13 +99,17 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) if (allocated(arr)) then narr = size(arr, dim=2) else - allocate(arr(NDIM,nsrc)) + allocate(arr(NDIM, nsrc)) narr = 0 end if - call util_resize(arr, narr+nsrc) - - arr(:,narr+1:nsrc) = source(:,:) + if (present(lsource_mask)) then + arr(1, narr+1:nsrc) = pack(source(1,:), lsource_mask(:)) + arr(2, narr+1:nsrc) = pack(source(2,:), lsource_mask(:)) + arr(3, narr+1:nsrc) = pack(source(3,:), lsource_mask(:)) + else + arr(:, narr+1:nsrc) = source(:,:) + end if return end subroutine util_append_arr_DPvec @@ -113,9 +121,9 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) !! 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. implicit none ! Arguments - integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array - integer(I4B), dimension(:), allocatable, intent(inout) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + 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 ! Internals integer(I4B) :: narr, nsrc @@ -134,9 +142,12 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) narr = 0 end if - call util_resize(arr, narr+nsrc) + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if - arr(narr+1:nsrc) = source(:) return end subroutine util_append_arr_I4B @@ -148,20 +159,14 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) !! 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. implicit none ! Arguments - logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array - logical, dimension(:), allocatable, intent(inout) :: source !! Array to append - logical, dimension(:), optional, intent(in) :: lsource_mask !! Logical mask indicating which elements to append to + 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 ! 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 - if (allocated(arr)) then narr = size(arr) else @@ -169,9 +174,17 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) narr = 0 end if - call util_resize(arr, narr+nsrc) + if (present(lsource_mask)) then + nsrc = count(lsource_mask) + else + nsrc = size(source) + end if - arr(narr+1:nsrc) = source(:) + if (present(lsource_mask)) then + arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + else + arr(narr+1:nsrc) = source(:) + end if return end subroutine util_append_arr_logical @@ -184,14 +197,101 @@ module subroutine util_append_body(self, source, lsource_mask) !! This method will automatically resize the destination body if it is too small implicit none ! 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 - - associate(nold => self%nbody, nnew => source%nbody) + 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 + + call util_append(self%name, source%name, 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) + + self%nbody = count(self%status(:) == ACTIVE) - end associate return end subroutine util_append_body + + module subroutine util_append_pl(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from one Swiftest body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + ! 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 + + + select type(source) + class is (swiftest_pl) + 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) + + call util_append_body(self, source, lsource_mask) + + call self%eucl_index() + class default + write(*,*) "Invalid object passed to the append method. Source must be of class swiftest_pl or its descendents" + call util_exit(FAILURE) + end select + + return + end subroutine util_append_pl + + + module subroutine util_append_tp(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from one Swiftest body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + ! 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 + + select type(source) + class is (swiftest_tp) + 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_body(self, source, lsource_mask) + class default + write(*,*) "Invalid object passed to the append method. Source must be of class swiftest_tp or its descendents" + call util_exit(FAILURE) + end select + + return + end subroutine util_append_tp + end submodule s_util_append \ No newline at end of file diff --git a/src/util/util_exit.f90 b/src/util/util_exit.f90 index 6814b0029..e770c10f5 100644 --- a/src/util/util_exit.f90 +++ b/src/util/util_exit.f90 @@ -26,6 +26,7 @@ module subroutine util_exit(code) case default write(*, FAIL_MSG) VERSION_NUMBER write(*, BAR) + error stop end select stop diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index c0f3a021b..5a095192c 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -2,38 +2,33 @@ use swiftest contains - module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) + module subroutine whm_util_append_pl(self, source, lsource_mask) !! author: David A. Minton !! - !! Move spilled (discarded) WHM test particle structure from active list to discard list - !! - !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + !! Append components from one massive body object to another. + !! This method will automatically resize the destination body if it is too small implicit none - ! Arguments - class(whm_pl), intent(inout) :: self !! WHM massive body object - class(swiftest_body), intent(inout) :: discards !! Discarded object - logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards - logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - ! Internals - integer(I4B) :: i - associate(keeps => self) - select type(discards) - class is (whm_pl) - call util_spill(keeps%eta, discards%eta, lspill_list, ldestructive) - call util_spill(keeps%muj, discards%muj, lspill_list, ldestructive) - call util_spill(keeps%ir3j, discards%ir3j, lspill_list, ldestructive) - call util_spill(keeps%xj, discards%xj, lspill_list, ldestructive) - call util_spill(keeps%vj, discards%vj, lspill_list, ldestructive) - - call util_spill_pl(keeps, discards, lspill_list, ldestructive) - class default - write(*,*) 'Error! spill method called for incompatible return type on whm_pl' - end select - end associate + !! 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 + + select type(source) + class is (whm_pl) + 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) + + call util_append_pl(self, source, lsource_mask) + class default + write(*,*) "Invalid object passed to the append method. Source must be of class whm_pl or its descendents" + call util_exit(FAILURE) + end select return - end subroutine whm_util_spill_pl - + end subroutine whm_util_append_pl module subroutine whm_util_fill_pl(self, inserts, lfill_list) !! author: David A. Minton @@ -61,7 +56,8 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) call util_fill_pl(keeps, inserts, lfill_list) class default - write(*,*) 'Error! fill method called for incompatible return type on whm_pl' + write(*,*) "Invalid object passed to the fill method. Inserts must be of class whm_pl or its descendents" + call util_exit(FAILURE) end select end associate @@ -186,5 +182,38 @@ module subroutine whm_util_sort_rearrange_pl(self, ind) return end subroutine whm_util_sort_rearrange_pl + + + module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) WHM test particle structure from active list to discard list + !! + !! Adapted from David E. Kaufmann's Swifter routine whm_discard_spill.f90 + implicit none + ! Arguments + class(whm_pl), intent(inout) :: self !! WHM massive body object + class(swiftest_body), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not + ! Internals + integer(I4B) :: i + associate(keeps => self) + select type(discards) + class is (whm_pl) + call util_spill(keeps%eta, discards%eta, lspill_list, ldestructive) + call util_spill(keeps%muj, discards%muj, lspill_list, ldestructive) + call util_spill(keeps%ir3j, discards%ir3j, lspill_list, ldestructive) + call util_spill(keeps%xj, discards%xj, lspill_list, ldestructive) + call util_spill(keeps%vj, discards%vj, lspill_list, ldestructive) + + call util_spill_pl(keeps, discards, lspill_list, ldestructive) + class default + write(*,*) 'Error! spill method called for incompatible return type on whm_pl' + end select + end associate + + return + end subroutine whm_util_spill_pl end submodule s_whm_util From 1e7f96c582a07761c21c3b913b35d46de68a5862 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 12:27:35 -0400 Subject: [PATCH 154/194] Updated WHM example --- examples/whm_swifter_comparison/pl.swifter.in | 48 +++++++++---------- .../whm_swifter_comparison/pl.swiftest.in | 48 +++++++++---------- .../swiftest_vs_swifter.ipynb | 8 ++-- examples/whm_swifter_comparison/tp.swifter.in | 16 +++---- .../whm_swifter_comparison/tp.swiftest.in | 16 +++---- 5 files changed, 68 insertions(+), 68 deletions(-) diff --git a/examples/whm_swifter_comparison/pl.swifter.in b/examples/whm_swifter_comparison/pl.swifter.in index 141e997da..946ff123b 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.0014751238438755500459 +1 6.5537098095653139645e-06 0.0014751242768086609319 1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --12.104810966946379345 -1.8005812017180330847 0.9632304211885714761 -2 9.663313399581537916e-05 0.006759080797928606587 +-0.21794225400065470044 0.24570059548519398995 0.040069659678364698274 +-9.768342370075118952 -6.4098488749322373205 0.37225116289830816995 +2 9.663313399581537916e-05 0.0067590742435367571566 4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -3.0899533953493179043 -6.72112303206047562 -0.2705477431358893059 -3 0.000120026935827952453094 0.010044868190633438806 +-0.60413504586259936247 -0.39527613440541492507 0.029436881824798030033 +3.992938767473374092 -6.2169034295501688922 -0.3157349287333398891 +3 0.000120026935827952453094 0.010044891628501106769 4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -5.053802748240266633 3.568560918001247615 -0.0001869334511378976778 -4 1.2739802010675941456e-05 0.0072467082986392815006 +0.6475137988388671717 -0.78146344078682306034 3.4954277703126252982e-05 +4.7364737841481480227 3.9858178826605781494 -0.000206181980282845843 +4 1.2739802010675941456e-05 0.0072466933032545104062 2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --1.3261523862597792352 -4.4445327547884994806 -0.060612990482397517785 -5 0.037692251088985676735 0.3552707649709459117 +-1.6060166552595489531 0.43262604649099911658 0.048461907252935247647 +-1.1388942318608360441 -4.4988235352611598648 -0.066344559364066134143 +5 0.037692251088985676735 0.3552707368190505097 0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -1.5541304908644199467 2.386798324664287883 -0.044683660603562371893 -6 0.011285899820091272997 0.43765596788571493287 +4.1359946230316175786 -2.8610749953481979801 -0.08065244615734604161 +1.536603427793050461 2.399023353553466048 -0.044342472584791124157 +6 0.011285899820091272997 0.4376572328164372643 0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -1.4556566113591374531 1.2999494788820976765 -0.08051428750367411639 -7 0.0017236589478267730203 0.46957663585116591335 +6.3788284394924916754 -7.635463758938534795 -0.121111501730720202974 +1.4521392831727842248 1.3041738917825064364 -0.08044788317293871613 +7 0.0017236589478267730203 0.46959013246222981483 0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.9586068527340353378 1.013470229424341294 0.01613039934499510156 -8 0.0020336100526728302319 0.7813355837717117843 +14.803649648126269156 13.063133279359290029 -0.14329526741228329478 +-0.9596636872292902537 1.0125665712568530355 0.016140607193432704789 +8 0.0020336100526728302319 0.78135207839715916734 0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.1697807691732287658 1.1426067858222827636 -0.027409347819614317105 +29.566779964594630314 -4.5668176855665958414 -0.58741108465859714904 +0.16916723445783939828 1.142713652049310879 -0.027397346380668001207 diff --git a/examples/whm_swifter_comparison/pl.swiftest.in b/examples/whm_swifter_comparison/pl.swiftest.in index a5ed4ef1c..c13f0640d 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.0014751238438755500459 +1 6.5537098095653139645e-06 0.0014751242768086609319 1.6306381826061645943e-05 --0.065841771551149230746 0.30388831943526661838 0.030872485461978960153 --12.104810966946379345 -1.8005812017180330847 0.9632304211885714761 -2 9.663313399581537916e-05 0.006759080797928606587 +-0.21794225400065470044 0.24570059548519398995 0.040069659678364698274 +-9.768342370075118952 -6.4098488749322373205 0.37225116289830816995 +2 9.663313399581537916e-05 0.0067590742435367571566 4.0453784346544178454e-05 --0.65269716062695148917 -0.3065765656441301057 0.033456491497379246824 -3.0899533953493179043 -6.72112303206047562 -0.2705477431358893059 -3 0.000120026935827952453094 0.010044868190633438806 +-0.60413504586259936247 -0.39527613440541492507 0.029436881824798030033 +3.992938767473374092 -6.2169034295501688922 -0.3157349287333398891 +3 0.000120026935827952453094 0.010044891628501106769 4.25875607065040958e-05 -0.58046286084934750615 -0.8332000042504307258 3.7646553415201541957e-05 -5.053802748240266633 3.568560918001247615 -0.0001869334511378976778 -4 1.2739802010675941456e-05 0.0072467082986392815006 +0.6475137988388671717 -0.78146344078682306034 3.4954277703126252982e-05 +4.7364737841481480227 3.9858178826605781494 -0.000206181980282845843 +4 1.2739802010675941456e-05 0.0072466933032545104062 2.265740805092889601e-05 --1.5891417403740180081 0.4938480736359250889 0.049330990309104823244 --1.3261523862597792352 -4.4445327547884994806 -0.060612990482397517785 -5 0.037692251088985676735 0.3552707649709459117 +-1.6060166552595489531 0.43262604649099911658 0.048461907252935247647 +-1.1388942318608360441 -4.4988235352611598648 -0.066344559364066134143 +5 0.037692251088985676735 0.3552707368190505097 0.00046732617030490929307 -4.1148395833578952363 -2.8938323061728068453 -0.080043092204059404504 -1.5541304908644199467 2.386798324664287883 -0.044683660603562371893 -6 0.011285899820091272997 0.43765596788571493287 +4.1359946230316175786 -2.8610749953481979801 -0.08065244615734604161 +1.536603427793050461 2.399023353553466048 -0.044342472584791124157 +6 0.011285899820091272997 0.4376572328164372643 0.00038925687730393611812 -6.3589256477393849565 -7.653288021415167286 -0.12000977499446359442 -1.4556566113591374531 1.2999494788820976765 -0.08051428750367411639 -7 0.0017236589478267730203 0.46957663585116591335 +6.3788284394924916754 -7.635463758938534795 -0.121111501730720202974 +1.4521392831727842248 1.3041738917825064364 -0.08044788317293871613 +7 0.0017236589478267730203 0.46959013246222981483 0.00016953449859497231466 -14.816779495279050138 13.049265812461410263 -0.14351615042000470668 --0.9586068527340353378 1.013470229424341294 0.01613039934499510156 -8 0.0020336100526728302319 0.7813355837717117843 +14.803649648126269156 13.063133279359290029 -0.14329526741228329478 +-0.9596636872292902537 1.0125665712568530355 0.016140607193432704789 +8 0.0020336100526728302319 0.78135207839715916734 0.000164587904124493665 -29.564459991843019537 -4.5824598513731222837 -0.5870359532621901577 -0.1697807691732287658 1.1426067858222827636 -0.027409347819614317105 +29.566779964594630314 -4.5668176855665958414 -0.58741108465859714904 +0.16916723445783939828 1.142713652049310879 -0.027397346380668001207 diff --git a/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb index 7740f02c8..ef0a664c8 100644 --- a/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/whm_swifter_comparison/swiftest_vs_swifter.ipynb @@ -43,9 +43,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.001e+00\n", + "Reading in time 1.000e+00\n", "Creating Dataset\n", - "Successfully converted 1463 output frames.\n", + "Successfully converted 1462 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } @@ -107,7 +107,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -167,7 +167,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEGCAYAAABLgMOSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAYj0lEQVR4nO3df7RXdZ3v8ed7DhAlOKSA/DjgQcMA0RC4YGVGNnDBqQilrqSlVpdqtGWr8abTrBnHNWvKaprUanLRLytbch37IRZqCnrtYqQk4o+IIrQ8gklMJoIE5/C+f5yv3cOZA+fL/v7q9H0+1jqL7977sz/7/RH8vs5nf/d378hMJEk6XH/R6AIkSf2TASJJKsQAkSQVYoBIkgoxQCRJhQxodAH1NHz48Gxra2t0GZLUr/zkJz/5bWaO6Lm+qQKkra2NdevWNboMSepXIuJXva33FJYkqRADRJJUiAEiSSqkqT4DkaRG2LdvH+3t7ezZs6fRpRzS4MGDaW1tZeDAgWW1N0Akqcba29sZOnQobW1tRESjy+lVZrJjxw7a29uZMGFCWft4CkuSamzPnj0cffTRf7LhARARHH300Yc1SzJAJKkO/pTD40WHW6MBIkkqxACRpH7iNa95Ta/rL7jgAm6++eY6V2OASFK/cd999zW6hAN4FZYk9RNDhgzh+eefJzP54Ac/yOrVq5kwYQKNerKsMxBJ6me+853vsGnTJh555BG++MUvNmxmYoBIUj9z7733smTJElpaWhgzZgxnnHFGQ+owQCSpH/pTuCzYAJGkfub0009n+fLldHZ2sm3bNu6+++6G1OGH6JLUzyxatIjVq1dz0kknccIJJ/D617++IXUYIJLUTzz//PNA1+mrz33ucw2uxlNYkqSCDBBJUiEGiCSpEANEklSIASJJKsQAkSQVYoBIUpN497vfzciRI5k6dWpV+jNAJKlJXHDBBdx+++1V66+hARIR8yNiU0RsjojLe9keEXFtafvDETG9x/aWiFgfEd+rX9WS1D+dfvrpHHXUUVXrr2HfRI+IFuDzwFygHXggIlZk5k+7NVsATCz9zAa+UPrzRZcAG4Ej61K0JFXoylsf46dbn6tqn1PGHMkVbz6xqn2Wo5EzkFnA5szckpl7geXAwh5tFgJfzy5rgWERMRogIlqBvwa+VM+iJUldGnkvrLHAk92W2zlwdnGwNmOBbcDVwEeAoYc6SEQsBZYCjB8/vqKCJalSjZgp1EojZyC93cy+53MZe20TEW8CnsnMn/R1kMxclpkzM3PmiBEjitQpSepFIwOkHRjXbbkV2Fpmm9cCb4mIJ+g69XVGRNxQu1Ilqf9bsmQJr371q9m0aROtra18+ctfrqi/Rp7CegCYGBETgKeAc4B39GizArg4IpbTdXrr95m5Dfi70g8RMQe4NDPPq1PdktQv3XjjjVXtr2EBkpkdEXExcAfQAnwlMx+LiPeXtl8HrATOBDYDu4ELG1WvJOlADX2gVGaupCskuq+7rtvrBC7qo497gHtqUJ4k6RD8JrokqRADRJJUiAEiSSrEAJEkFWKASFITePLJJ3nDG97A5MmTOfHEE7nmmmsq7rOhV2FJkupjwIABfPrTn2b69Ons3LmTGTNmMHfuXKZMmVK4T2cgktQERo8ezfTpXU/EGDp0KJMnT+app56qqE9nIJJUT7ddDk8/Ut0+R50EC64qu/kTTzzB+vXrmT275/1rD48zEElqIs8//zxnn302V199NUceWdmjlJyBSFI9HcZModr27dvH2WefzbnnnstZZ51VcX/OQCSpCWQm73nPe5g8eTIf/vCHq9KnASJJTWDNmjV84xvfYPXq1UybNo1p06axcuXKvnc8BE9hSVITOO200+i6P231OAORJBVigEiSCjFAJEmFGCCSpEIMEElSIQaIJKkQA0SSmsCePXuYNWsWr3rVqzjxxBO54oorKu7T74FIUhN4yUtewurVqxkyZAj79u3jtNNOY8GCBZx66qmF+3QGIklNICIYMmQI0HVPrH379hERFfXpDESS6ugT93+Cn/3nz6ra56SjJnHZrMv6bNfZ2cmMGTPYvHkzF110kbdzlySVp6WlhYceeoj29nbuv/9+Hn300Yr6cwYiSXVUzkyh1oYNG8acOXO4/fbbmTp1auF+nIFIUhPYvn07zz77LAAvvPACd911F5MmTaqoT2cgktQEtm3bxvnnn09nZyf79+/n7W9/O29605sq6tMAkaQmcPLJJ7N+/fqq9ukpLElSIQaIJKmQhgZIRMyPiE0RsTkiLu9le0TEtaXtD0fE9NL6cRFxd0RsjIjHIuKS+lcvSc2tYQESES3A54EFwBRgSURM6dFsATCx9LMU+EJpfQfwt5k5GTgVuKiXfSVJNdTIGcgsYHNmbsnMvcByYGGPNguBr2eXtcCwiBidmdsy80GAzNwJbATG1rN4SWp2jQyQscCT3Zbb+a8h0GebiGgDTgF+XP0SJUkH08gA6e0uXnk4bSJiCPAt4EOZ+VyvB4lYGhHrImLd9u3bCxcrSX8OOjs7OeWUUyr+Dgg0NkDagXHdlluBreW2iYiBdIXHNzPz2wc7SGYuy8yZmTlzxIgRVSlckvqra665hsmTJ1elr0YGyAPAxIiYEBGDgHOAFT3arADeVboa61Tg95m5LbruQfxlYGNm/lt9y5ak/qm9vZ3vf//7vPe9761Kfw37JnpmdkTExcAdQAvwlcx8LCLeX9p+HbASOBPYDOwGLizt/lrgncAjEfFQad1HM3NlHYcgSYft6Y99jD9srO7t3F8yeRKjPvrRPtt96EMf4pOf/CQ7d+6synEbeiuT0hv+yh7rruv2OoGLetnv/9L75yOSpF5873vfY+TIkcyYMYN77rmnKn16LyxJqqNyZgq1sGbNGlasWMHKlSvZs2cPzz33HOeddx433HBD4T69lYkkNYGPf/zjtLe388QTT7B8+XLOOOOMisIDDBBJUkGewpKkJjNnzhzmzJlTcT/OQCRJhRggkqRCDBBJUiEGiCSpEANEklSIASJJKsTLeCWpSbS1tTF06FBaWloYMGAA69atq6g/A0SSmsjdd9/N8OHDq9KXp7AkSYU4A5GkOvrhTT/nt08+X9U+h48bwuvefkKf7SKCefPmERG8733vY+nSpRUd1wCRpCaxZs0axowZwzPPPMPcuXOZNGkSp59+euH+DBBJqqNyZgq1MmbMGABGjhzJokWLuP/++ysKED8DkaQmsGvXrj8+iXDXrl384Ac/YOrUqRX16QxEkprAb37zGxYtWgRAR0cH73jHO5g/f35FfRogktQEjjvuODZs2FDVPj2FJUkqxACRJBVigEiSCjFAJEmFGCCSpEIMEElSIQaIJDWJZ599lsWLFzNp0iQmT57Mj370o4r683sgktQkLrnkEubPn8/NN9/M3r172b17d0X9GSCS1ASee+457r33Xq6//noABg0axKBBgyrq0wCRpDq6+/plPPOrLVXtc+Sxx/GGCw59a/YtW7YwYsQILrzwQjZs2MCMGTO45pprOOKIIwof189AJKkJdHR08OCDD/KBD3yA9evXc8QRR3DVVVdV1KczEEmqo75mCrXS2tpKa2srs2fPBmDx4sUVB0hZM5CI2BARH42I4ys62n/td35EbIqIzRFxeS/bIyKuLW1/OCKml7uvJOn/GzVqFOPGjWPTpk0ArFq1iilTplTUZ7kzkLcA/wO4KSL2A/8buCkzf130wBHRAnwemAu0Aw9ExIrM/Gm3ZguAiaWf2cAXgNll7itJ6uazn/0s5557Lnv37uW4447jq1/9akX9lRUgmfkr4JPAJyNiIvAPwCeAlgqOPQvYnJlbACJiObAQ6B4CC4GvZ2YCayNiWESMBtrK2Ldqrv/bj/HCoIG16FpSE5jx5tfxTPvTDa1hYEswbdo01q1bV7U+y/4MJCLagLfTNRPpBD5S4bHHAk92W26na5bRV5uxZe4LQEQsBZYCjB8/vlCh+6OFFwZ0FtpXkjJgf2Rja9hf/eOXFSAR8WNgIHAT8LYXf/OvUPSyrucID9amnH27VmYuA5YBzJw5s9B/wXf/62VFdpMkADZu3MiosaMbXUbVHTJAIuLDpZe3Ai9+ZfGtEV3v35n5bxUcux0Y1225FdhaZptBZewrSaqhvq7CGlr6mQJ8ABhD1+mj95fWVeIBYGJETIiIQcA5wIoebVYA7ypdjXUq8PvM3FbmvpKkGjrkDCQzrwSIiB8A0zNzZ2n5n4D/qOTAmdkRERcDd9D1YfxXMvOxiHh/aft1wErgTGAzXTOgCw+1byX1SJIOT7kfoo8H9nZb3kvXlVAVycyVdIVE93XXdXudwEXl7itJqp9yb2XyDeD+iPiniLgC+DHwtdqVJUmqpk2bNjFt2rQ//hx55JFcffXVFfVZ7vdA/iUibgNeV1p1YWaur+jIkqS6eeUrX8lDDz0EQGdnJ2PHjmXRokUV9Vn290Ay80HgwYqOJklquFWrVnH88cdz7LHHVtSPN1OUpDp69tZfsnfrrqr2OWjMEQx7c/m3Kly+fDlLliyp+Ljezl2SmsjevXtZsWIFb3vb2yruyxmIJNXR4cwUauG2225j+vTpHHPMMRX35QxEkprIjTfeWJXTV2CASFLT2L17N3feeSdnnXVWVfrzFJYkNYmXvexl7Nixo2r9OQORJBVigEiSCjFAJEmFGCCSpEIMEElSIQaIJKkQA0SSmsRnPvMZTjzxRKZOncqSJUvYs2dPRf0ZIJLUBJ566imuvfZa1q1bx6OPPkpnZyfLly+vqE8DRJKaREdHBy+88AIdHR3s3r2bMWPGVNSf30SXpDq67bbbePrpp6va56hRo1iwYMEh24wdO5ZLL72U8ePH89KXvpR58+Yxb968io7rDESSmsDvfvc7brnlFh5//HG2bt3Krl27uOGGGyrq0xmIJNVRXzOFWrnrrruYMGECI0aMAOCss87ivvvu47zzzivcpzMQSWoC48ePZ+3atezevZvMZNWqVUyePLmiPg0QSWoCs2fPZvHixUyfPp2TTjqJ/fv3s3Tp0or69BSWJDWJK6+8kiuvvLJq/TkDkSQVYoBIkgoxQCSpDjKz0SX06XBrNEAkqcYGDx7Mjh07/qRDJDPZsWMHgwcPLnsfP0SXpBprbW2lvb2d7du3N7qUQxo8eDCtra1ltzdAJKnGBg4cyIQJExpdRtU15BRWRBwVEXdGxC9Kf778IO3mR8SmiNgcEZd3W/+piPhZRDwcEd+JiGF1K16SBDTuM5DLgVWZORFYVVo+QES0AJ8HFgBTgCURMaW0+U5gamaeDPwc+Lu6VC1J+qNGBchC4Gul118D3tpLm1nA5szckpl7geWl/cjMH2RmR6ndWqD8k3aSpKpoVIAck5nbAEp/juylzVjgyW7L7aV1Pb0buK3qFUqSDqlmH6JHxF3AqF42/X25XfSy7oBr4CLi74EO4JuHqGMpsBS6biYmSaqOmgVIZv7VwbZFxG8iYnRmbouI0cAzvTRrB8Z1W24Ftnbr43zgTcAb8xAXV2fmMmAZwMyZM/90L8KWpH6mUaewVgDnl16fD9zSS5sHgIkRMSEiBgHnlPYjIuYDlwFvyczddahXktRDowLkKmBuRPwCmFtaJiLGRMRKgNKH5BcDdwAbgZsy87HS/p8DhgJ3RsRDEXFdvQcgSc2uIV8kzMwdwBt7Wb8VOLPb8kpgZS/tXlHTAiVJffJeWJKkQgwQSVIhBogkqRADRJJUiAEiSSrEAJEkFWKASJIKMUAkSYUYIJKkQgwQSVIhBogkqRADRJJUiAEiSSrEAJEkFWKASJIKMUAkSYUYIJKkQgwQSVIhBogkqRADRJJUiAEiSSrEAJEkFWKASJIKMUAkSYUYIJKkQgwQSVIhBogkqRADRJJUiAEiSSrEAJEkFWKASJIKaUiARMRREXFnRPyi9OfLD9JufkRsiojNEXF5L9svjYiMiOG1r1qS1F2jZiCXA6sycyKwqrR8gIhoAT4PLACmAEsiYkq37eOAucCv61KxJOkAjQqQhcDXSq+/Bry1lzazgM2ZuSUz9wLLS/u96DPAR4CsYZ2SpINoVIAck5nbAEp/juylzVjgyW7L7aV1RMRbgKcyc0NfB4qIpRGxLiLWbd++vfLKJUkADKhVxxFxFzCql01/X24XvazLiHhZqY955XSSmcuAZQAzZ850tiJJVVKzAMnMvzrYtoj4TUSMzsxtETEaeKaXZu3AuG7LrcBW4HhgArAhIl5c/2BEzMrMp6s2AEnSITXqFNYK4PzS6/OBW3pp8wAwMSImRMQg4BxgRWY+kpkjM7MtM9voCprphock1VejAuQqYG5E/IKuK6muAoiIMRGxEiAzO4CLgTuAjcBNmflYg+qVJPVQs1NYh5KZO4A39rJ+K3Bmt+WVwMo++mqrdn2SpL75TXRJUiEGiCSpEANEklSIASJJKsQAkSQVYoBIkgoxQCRJhRggkqRCDBBJUiEGiCSpEANEklSIASJJKsQAkSQVYoBIkgoxQCRJhRggkqRCDBBJUiEGiCSpEANEklSIASJJKsQAkSQVYoBIkgoxQCRJhRggkqRCIjMbXUPdRMR24FcFdx8O/LaK5fQHjrk5OObmUMmYj83MET1XNlWAVCIi1mXmzEbXUU+OuTk45uZQizF7CkuSVIgBIkkqxAAp37JGF9AAjrk5OObmUPUx+xmIJKkQZyCSpEIMEElSIQZIDxExPyI2RcTmiLi8l+0REdeWtj8cEdMbUWc1lTHmc0tjfTgi7ouIVzWizmrqa8zd2v23iOiMiMX1rK/ayhlvRMyJiIci4rGI+D/1rrHayvh3/ZcRcWtEbCiN+cJG1FlNEfGViHgmIh49yPbqvn9lpj+lH6AF+CVwHDAI2ABM6dHmTOA2IIBTgR83uu46jPk1wMtLrxc0w5i7tVsNrAQWN7ruGv8dDwN+CowvLY9sdN11GPNHgU+UXo8A/hMY1OjaKxz36cB04NGDbK/q+5czkAPNAjZn5pbM3AssBxb2aLMQ+Hp2WQsMi4jR9S60ivocc2bel5m/Ky2uBVrrXGO1lfP3DPBB4FvAM/UsrgbKGe87gG9n5q8BMrMZxpzA0IgIYAhdAdJR3zKrKzPvpWscB1PV9y8D5EBjgSe7LbeX1h1um/7kcMfzHrp+g+nP+hxzRIwFFgHX1bGuWinn7/gE4OURcU9E/CQi3lW36mqjnDF/DpgMbAUeAS7JzP31Ka9hqvr+NaDicv68RC/rel7nXE6b/qTs8UTEG+gKkNNqWlHtlTPmq4HLMrOz6xfUfq2c8Q4AZgBvBF4K/Cgi1mbmz2tdXI2UM+b/DjwEnAEcD9wZET/MzOdqXFsjVfX9ywA5UDswrttyK12/nRxum/6krPFExMnAl4AFmbmjTrXVSjljngksL4XHcODMiOjIzO/WpcLqKvff9W8zcxewKyLuBV4F9NcAKWfMFwJXZdeHA5sj4nFgEnB/fUpsiKq+f3kK60APABMjYkJEDALOAVb0aLMCeFfpaoZTgd9n5rZ6F1pFfY45IsYD3wbe2Y9/I+2uzzFn5oTMbMvMNuBm4G/6aXhAef+ubwFeFxEDIuJlwGxgY53rrKZyxvxrumZcRMQxwCuBLXWtsv6q+v7lDKSbzOyIiIuBO+i6iuMrmflYRLy/tP06uq7IORPYDOym67eYfqvMMf8jcDTw76XfyDuyH9/JtMwx/9koZ7yZuTEibgceBvYDX8rMXi8F7Q/K/Dv+Z+D6iHiErlM7l2Vmv77Fe0TcCMwBhkdEO3AFMBBq8/7lrUwkSYV4CkuSVIgBIkkqxACRJBVigEiSCjFAJEmFGCBSQRExLCL+ptvymIi4uUbHemtE/GMfbf41Is6oxfGl3ngZr1RQRLQB38vMqXU41n3AWw71PYWIOBb4YmbOq3U9EjgDkSpxFXB86Rkan4qIthefwxARF0TEd0vPm3g8Ii6OiA9HxPqIWBsRR5XaHR8Rt5duYPjDiJjU8yARcQLwh8z8bUQMLfU3sLTtyIh4IiIGZuavgKMjYlQd/xuoiRkgUnGXA7/MzGmZ+b962T6VrtukzwL+BdidmacAPwJevNvtMuCDmTkDuBT49176eS3wIEBm7gTuAf66tO0c4FuZua+0/GCpvVRz3spEqp27S2/4OyPi98CtpfWPACdHxBC6Htb1H93u+PuSXvoZDWzvtvwl4CPAd+m6FcX/7LbtGWBMtQYgHYoBItXOH7q93t9teT9d/+/9BfBsZk7ro58XgL98cSEz15ROl70eaOlxz6rBpfZSzXkKSypuJzC06M6l5048HhFvgz8+r7q3581vBF7RY93XgRuBr/ZYfwLQb2+CqP7FAJEKKj0XZU1EPBoRnyrYzbnAeyJiA/AYvT9a917glDjwyVbfBF5OV4gAUPpg/RXAuoK1SIfFy3ilfiAirgFuzcy7SsuLgYWZ+c5ubRYB0zPzHxpUppqMn4FI/cPH6HrIExHxWWABXc916G4A8Ok616Um5gxEklSIn4FIkgoxQCRJhRggkqRCDBBJUiEGiCSpkP8HsPNLWtpay0EAAAAASUVORK5CYII=\n", "text/plain": [ "
    " ] diff --git a/examples/whm_swifter_comparison/tp.swifter.in b/examples/whm_swifter_comparison/tp.swifter.in index d4bba791e..22ca5a6ca 100644 --- a/examples/whm_swifter_comparison/tp.swifter.in +++ b/examples/whm_swifter_comparison/tp.swifter.in @@ -1,13 +1,13 @@ 4 101 -2.1778219831071528034 1.7945000787160070299 -0.344538568144980073 --2.4660672364316131263 2.6696516059587804457 0.5387135399929646282 +2.1437140623725170485 1.8307543455088179929 -0.33710883085786358393 +-2.5169991736250634084 2.6269266483088493027 0.54674712095669365287 102 -3.0442667013982411817 -0.9663926835590784803 0.40722457070173800897 -0.50161667633754136036 2.5842510880432738114 -1.8324318157740491254 +3.0507953356624089025 -0.9309107058567914761 0.38209550228666327998 +0.45214249601424874418 2.5995875558304815747 -1.8388641770977671949 103 --0.34517723265404320898 -3.1406497314215879868 0.72728042419722227496 -3.0867794854837949715 0.086392107735322389756 -0.14509697121440676101 +-0.30288545144121659103 -3.139125526168093927 0.7252151132548391166 +3.0919425994019995516 0.13633790246363267858 -0.15665049243950410883 104 --1.9619853530057589364 -0.98771442784664698067 0.2682528168870427776 -2.180176917968356245 -3.7664581464574479557 -0.15265740558307136673 +-1.9314729940131600827 -1.0389307897540689396 0.26607157142831372454 +2.2775049779995786108 -3.7157836040053666307 -0.16601542341215017115 diff --git a/examples/whm_swifter_comparison/tp.swiftest.in b/examples/whm_swifter_comparison/tp.swiftest.in index d4bba791e..22ca5a6ca 100644 --- a/examples/whm_swifter_comparison/tp.swiftest.in +++ b/examples/whm_swifter_comparison/tp.swiftest.in @@ -1,13 +1,13 @@ 4 101 -2.1778219831071528034 1.7945000787160070299 -0.344538568144980073 --2.4660672364316131263 2.6696516059587804457 0.5387135399929646282 +2.1437140623725170485 1.8307543455088179929 -0.33710883085786358393 +-2.5169991736250634084 2.6269266483088493027 0.54674712095669365287 102 -3.0442667013982411817 -0.9663926835590784803 0.40722457070173800897 -0.50161667633754136036 2.5842510880432738114 -1.8324318157740491254 +3.0507953356624089025 -0.9309107058567914761 0.38209550228666327998 +0.45214249601424874418 2.5995875558304815747 -1.8388641770977671949 103 --0.34517723265404320898 -3.1406497314215879868 0.72728042419722227496 -3.0867794854837949715 0.086392107735322389756 -0.14509697121440676101 +-0.30288545144121659103 -3.139125526168093927 0.7252151132548391166 +3.0919425994019995516 0.13633790246363267858 -0.15665049243950410883 104 --1.9619853530057589364 -0.98771442784664698067 0.2682528168870427776 -2.180176917968356245 -3.7664581464574479557 -0.15265740558307136673 +-1.9314729940131600827 -1.0389307897540689396 0.26607157142831372454 +2.2775049779995786108 -3.7157836040053666307 -0.16601542341215017115 From 26ed1c99f3158d986d4ed1bfe2c2534505d9d62a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 12:42:43 -0400 Subject: [PATCH 155/194] Fixed bug where status flag was not set properly for test particles in planetocentric systems --- .../1pl_1tp_encounter/swiftest_vs_swifter.ipynb | 4 ++-- src/rmvs/rmvs_step.f90 | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) 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 d9be0df4d..29dcf43aa 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, diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 113b4d02f..74e6958c9 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -442,6 +442,7 @@ subroutine rmvs_make_planetocentric(param, cb, pl, tp) tpenci%cb_heliocentric = cb tpenci%ipleP = i tpenci%lmask(:) = .true. + tpenci%status(:) = ACTIVE ! Grab all the encountering test particles and convert them to a planetocentric frame tpenci%id(:) = pack(tp%id(:), encmask(:)) do j = 1, NDIM From fb9449ed921286b822f743e4898ef2725b765624 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 12:52:00 -0400 Subject: [PATCH 156/194] Updated error checks to halt execution if a bad object is passed to fill and spill methods --- .../swiftest_vs_swifter.ipynb | 4 ++-- src/rmvs/rmvs_util.f90 | 16 ++++++++++------ src/symba/symba_util.f90 | 16 ++++++++++------ src/whm/whm_util.f90 | 5 +++-- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb index 7f0b1d4b9..9a4c22cb1 100644 --- a/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb +++ b/examples/helio_swifter_comparison/swiftest_vs_swifter.ipynb @@ -43,9 +43,9 @@ "output_type": "stream", "text": [ "Reading Swiftest file param.swiftest.in\n", - "Reading in time 1.001e+00\n", + "Reading in time 1.000e+00\n", "Creating Dataset\n", - "Successfully converted 1463 output frames.\n", + "Successfully converted 1462 output frames.\n", "Swiftest simulation data stored as xarray DataSet .ds\n" ] } diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 8f0d7cf5d..0ba86c7e8 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -27,7 +27,7 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) call whm_util_append_pl(self, source, lsource_mask) class default - write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_pl or its descendents" + write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_pl or its descendents!" call util_exit(FAILURE) end select @@ -54,7 +54,7 @@ module subroutine rmvs_util_append_tp(self, source, 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 class default - write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_tp or its descendents" + write(*,*) "Invalid object passed to the append method. Source must be of class rmvs_tp or its descendents!" call util_exit(FAILURE) end select @@ -91,7 +91,8 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) call whm_util_fill_pl(keeps, inserts, lfill_list) class default - write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' + write(*,*) "Invalid object passed to the fill method. Source must be of class rmvs_pl or its descendents!" + call util_exit(FAILURE) end select end associate @@ -120,7 +121,8 @@ module subroutine rmvs_util_fill_tp(self, inserts, lfill_list) call util_fill_tp(keeps, inserts, lfill_list) ! Note: whm_tp does not have its own fill method, so we skip back to the base class class default - write(*,*) 'Error! fill method called for incompatible return type on rmvs_tp' + write(*,*) "Invalid object passed to the fill method. Source must be of class rmvs_tp or its descendents!" + call util_exit(FAILURE) end select end associate @@ -334,7 +336,8 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list, ldestructive) call whm_util_spill_pl(keeps, discards, lspill_list, ldestructive) class default - write(*,*) 'Error! spill method called for incompatible return type on rmvs_pl' + write(*,*) "Invalid object passed to the spill method. Source must be of class rmvs_pl or its descendents!" + call util_exit(FAILURE) end select end associate @@ -366,7 +369,8 @@ module subroutine rmvs_util_spill_tp(self, discards, lspill_list, ldestructive) call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default - write(*,*) 'Error! spill method called for incompatible return type on rmvs_tp' + write(*,*) "Invalid object passed to the spill method. Source must be of class rmvs_tp or its descendents!" + call util_exit(FAILURE) end select end associate diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 02d839bb2..4c4b74476 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -104,7 +104,7 @@ module subroutine symba_util_append_pl(self, source, 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 class default - write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents" + write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" call util_exit(FAILURE) end select @@ -131,7 +131,7 @@ module subroutine symba_util_append_tp(self, source, 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 class default - write(*,*) "Invalid object passed to the append method. Source must be of class symba_tp or its descendents" + write(*,*) "Invalid object passed to the append method. Source must be of class symba_tp or its descendents!" call util_exit(FAILURE) end select @@ -254,7 +254,8 @@ module subroutine symba_util_fill_pl(self, inserts, lfill_list) call util_fill_pl(keeps, inserts, lfill_list) ! Note: helio_pl does not have its own fill method, so we skip back to the base class class default - write(*,*) 'Error! fill method called for incompatible return type on symba_pl' + write(*,*) "Invalid object passed to the fill method. Source must be of class symba_pl or its descendents!" + call util_exit(FAILURE) end select end associate @@ -283,7 +284,8 @@ module subroutine symba_util_fill_tp(self, inserts, 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 - write(*,*) 'Error! fill method called for incompatible return type on symba_tp' + write(*,*) "Invalid object passed to the fill method. Source must be of class symba_tp or its descendents!" + call util_exit(FAILURE) end select end associate @@ -691,7 +693,8 @@ module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) call util_spill_pl(keeps, discards, lspill_list, ldestructive) class default - write(*,*) 'Error! spill method called for incompatible return type on symba_pl' + write(*,*) "Invalid object passed to the spill method. Source must be of class symba_pl or its descendents!" + call util_exit(FAILURE) end select end associate @@ -724,7 +727,8 @@ module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) call util_spill_tp(keeps, discards, lspill_list, ldestructive) class default - write(*,*) 'Error! spill method called for incompatible return type on symba_pl' + write(*,*) "Invalid object passed to the spill method. Source must be of class symba_tp or its descendents!" + call util_exit(FAILURE) end select end associate diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 5a095192c..4dbc81fb7 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -56,7 +56,7 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) call util_fill_pl(keeps, inserts, lfill_list) class default - write(*,*) "Invalid object passed to the fill method. Inserts must be of class whm_pl or its descendents" + write(*,*) "Invalid object passed to the fill method. Inserts must be of class whm_pl or its descendents!" call util_exit(FAILURE) end select end associate @@ -209,7 +209,8 @@ module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) call util_spill_pl(keeps, discards, lspill_list, ldestructive) class default - write(*,*) 'Error! spill method called for incompatible return type on whm_pl' + write(*,*) "Invalid object passed to the spill method. Source must be of class whm_pl or its descendents!" + call util_exit(FAILURE) end select end associate From c8b0db961c02cfc8613c9b728680f39137b6c369 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 12:57:51 -0400 Subject: [PATCH 157/194] Fixed bad class selection in the symba_tp spill implementation --- src/symba/symba_util.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 4c4b74476..19ac9cd3f 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -720,7 +720,7 @@ module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) !> Spill all the common components associate(keeps => self) select type(discards) - class is (symba_pl) + class is (symba_tp) 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) From f40f7a1a67a9d8502be9eeeb9a7245a8da06536b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 13:19:03 -0400 Subject: [PATCH 158/194] Started working on creating the mergesub_list structure when a pl-pl collision is detected --- .../1pl_1pl_encounter/swiftest_vs_swifter.ipynb | 8 ++++---- .../swiftest_symba_vs_swifter_symba.ipynb | 4 ++-- src/symba/symba_collision.f90 | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index 34c978f58..69349f2a4 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -81,8 +81,8 @@ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, "execution_count": 6, @@ -485,7 +485,7 @@ " nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n", "Coordinates:\n", " id float64 100.0\n", - " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
    • id
      ()
      float64
      100.0
      array(100.)
    • time (y)
      (time (y))
      float64
      0.0 0.0006845 ... 0.1499 0.1506
      array([0.      , 0.000684, 0.001369, ..., 0.149213, 0.149897, 0.150582])
  • " ], "text/plain": [ "\n", 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 b348d1f81..c3c42dd4f 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 @@ -591,8 +591,8 @@ "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\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", diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index d601e853a..218eb9274 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -46,16 +46,30 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec 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, plplenc_list%lvdotr(k)) end do + deallocate(lmask) if (any(lcollision(:))) then + allocate(lmask(pl%nbody)) do k = 1, nplplenc - if (plplenc_list%status(k) /= COLLISION) cycle + if (.not.lcollision(k)) cycle + + ! Set this encounter as a collision and save the position and velocity vectors at the time of the collision plplenc_list%status(k) = COLLISION plplenc_list%xh1(:,k) = pl%xh(:,ind1(k)) plplenc_list%vb1(:,k) = pl%vb(:,ind1(k)) plplenc_list%xh2(:,k) = pl%xh(:,ind2(k)) plplenc_list%vb2(:,k) = pl%vb(:,ind2(k)) + + ! Check to see if either of these bodies has been involved with a collision before, and if so, make this a collisional family if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call pl%make_family([ind1(k),ind2(k)]) + + ! Add any of the bodies that have *not* previously been involved in a collision to the subtraction list + lmask(:) = .false. + lmask(ind1(k)) = .not.pl%lcollision(ind1(k)) + lmask(ind2(k)) = .not.pl%lcollision(ind2(k)) + call system%mergesub_list%append(pl, lmask) + + ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step pl%lcollision(ind1(k)) = .true. pl%lcollision(ind2(k)) = .true. end do From 025cd22a8ce74d0afff7e43e917022496da45c5b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 14:02:36 -0400 Subject: [PATCH 159/194] Started working on getting SyMBA to recognize pl-pl collisions --- src/symba/symba_collision.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 218eb9274..7c0a05c91 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -70,9 +70,10 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec call system%mergesub_list%append(pl, lmask) ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step - pl%lcollision(ind1(k)) = .true. - pl%lcollision(ind2(k)) = .true. + pl%lcollision([ind1(k), ind2(k)]) = .true. + pl%ldiscard([ind1(k), ind2(k)]) = .true. end do + end if end associate end select From cc48db22915d963fd86f68694ea373bf9145cb3c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 15:47:58 -0400 Subject: [PATCH 160/194] Fixed up append method to properly resize as needed --- src/rmvs/rmvs_util.f90 | 8 +++---- src/symba/symba_setup.f90 | 2 -- src/symba/symba_step.f90 | 4 ++-- src/symba/symba_util.f90 | 20 +++++++++++------- src/util/util_append.f90 | 44 ++++++++++++++++++++++++--------------- src/util/util_resize.f90 | 1 + src/whm/whm_util.f90 | 4 ++-- 7 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 0ba86c7e8..9f9cf0037 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -15,6 +15,8 @@ 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) + 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) @@ -24,8 +26,6 @@ module subroutine rmvs_util_append_pl(self, source, lsource_mask) !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) - - call whm_util_append_pl(self, source, lsource_mask) 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 +48,11 @@ 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 + 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_tp(self, source, lsource_mask) ! Note: whm_tp does not have its own append method, so we skip back to the base class 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_setup.f90 b/src/symba/symba_setup.f90 index dab92f3ca..f2c8e63dd 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -18,8 +18,6 @@ module subroutine symba_setup_initialize_system(self, param) ! Call parent method associate(system => self) call whm_setup_initialize_system(system, param) - call system%mergeadd_list%setup(1, param) - call system%mergesub_list%setup(1, param) call system%pltpenc_list%setup(0) call system%plplenc_list%setup(0) select type(pl => system%pl) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index e8badd577..41e7a3a74 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -265,8 +265,8 @@ module subroutine symba_step_reset_system(self) pltpenc_list%nenc = 0 end if - mergeadd_list%nbody = 0 - mergesub_list%nbody = 0 + call mergeadd_list%resize(0) + call mergesub_list%resize(0) end select end select end associate diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 19ac9cd3f..bdfbea86c 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -29,10 +29,12 @@ module subroutine symba_util_append_arr_info(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if return @@ -66,10 +68,12 @@ module subroutine symba_util_append_arr_kin(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if return @@ -89,6 +93,8 @@ 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) @@ -101,8 +107,6 @@ module subroutine symba_util_append_pl(self, source, 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) - - 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 class default write(*,*) "Invalid object passed to the append method. Source must be of class symba_pl or its descendents!" call util_exit(FAILURE) @@ -125,11 +129,11 @@ 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 + 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_tp(self, source, lsource_mask) ! Note: helio_tp does not have its own append method, so we skip back to the base class 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 0ca112eb9..a13103cfa 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -29,10 +29,12 @@ module subroutine util_append_arr_char_string(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if return @@ -66,10 +68,12 @@ module subroutine util_append_arr_DP(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if return @@ -103,12 +107,14 @@ module subroutine util_append_arr_DPvec(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(1, narr+1:nsrc) = pack(source(1,:), lsource_mask(:)) - arr(2, narr+1:nsrc) = pack(source(2,:), lsource_mask(:)) - arr(3, narr+1:nsrc) = pack(source(3,:), lsource_mask(:)) + 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:nsrc) = source(:,:) + arr(:, narr + 1:narr + nsrc) = source(:,:) end if return @@ -142,13 +148,14 @@ module subroutine util_append_arr_I4B(arr, source, lsource_mask) narr = 0 end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if - return end subroutine util_append_arr_I4B @@ -180,10 +187,12 @@ module subroutine util_append_arr_logical(arr, source, lsource_mask) nsrc = size(source) end if + call util_resize(arr, narr + nsrc) + if (present(lsource_mask)) then - arr(narr+1:nsrc) = pack(source(:), lsource_mask(:)) + arr(narr + 1:narr + nsrc) = pack(source(:), lsource_mask(:)) else - arr(narr+1:nsrc) = source(:) + arr(narr + 1:narr + nsrc) = source(:) end if return @@ -202,6 +211,7 @@ module subroutine util_append_body(self, source, lsource_mask) logical, dimension(:), optional, 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) @@ -242,6 +252,8 @@ 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) @@ -256,8 +268,6 @@ module subroutine util_append_pl(self, source, lsource_mask) call util_append(self%Q, source%Q, lsource_mask) call util_append(self%tlag, source%tlag, lsource_mask) - call util_append_body(self, source, lsource_mask) - call self%eucl_index() class default write(*,*) "Invalid object passed to the append method. Source must be of class swiftest_pl or its descendents" @@ -281,11 +291,11 @@ module subroutine util_append_tp(self, source, lsource_mask) select type(source) class is (swiftest_tp) + 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_body(self, source, lsource_mask) 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/util/util_resize.f90 b/src/util/util_resize.f90 index 53df2bd73..4a84a003b 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -181,6 +181,7 @@ module subroutine util_resize_body(self, nnew) integer(I4B), intent(in) :: nnew !! New size neded call util_resize(self%name, nnew) + call util_resize(self%id, nnew) call util_resize(self%status, nnew) call util_resize(self%ldiscard, nnew) call util_resize(self%lmask, nnew) diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index 4dbc81fb7..f3dc15d3e 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -15,13 +15,13 @@ 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) - - call util_append_pl(self, source, lsource_mask) 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 19be7d8a10ea54e2e684fcddb91d59b73687f175 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 16:43:52 -0400 Subject: [PATCH 161/194] Cleaned up discard io routines and started adding SyMBA-specific discard writer --- .../1pl_1pl_encounter/cb.swiftest.in | Bin 53 -> 80 bytes .../1pl_1pl_encounter/init_cond.py | 1 + .../1pl_1pl_encounter/param.swiftest.in | 3 +- .../1pl_1pl_encounter/pl.swifter.in | 2 +- .../1pl_1pl_encounter/pl.swiftest.in | Bin 228 -> 256 bytes .../1pl_1pl_encounter/tp.swiftest.in | Bin 2 -> 16 bytes python/swiftest/swiftest/io.py | 12 +++- src/io/io.f90 | 61 +++++++++------- src/modules/swiftest_classes.f90 | 11 +-- src/modules/symba_classes.f90 | 63 ++++++++++------- src/rmvs/rmvs_step.f90 | 4 +- src/symba/symba_io.f90 | 66 +++++++++++++++++- 12 files changed, 156 insertions(+), 67 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/cb.swiftest.in index 4c5d870405c9daad1d597cb1d3f2bd78a1b2227e..d0ae0ed15fe3ea8dd15557055a926fce3c60b59c 100644 GIT binary patch literal 80 ncmd;JKmZOP6NHU2HoW29>+AsI-}OJ>6US3*597mhVB-S-U7iOf literal 53 wcmW;Axe)*$3rbo3*74~+Eq5}gct*a?m%+)WyI1?iYw*UYD 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 7600320c2..20be5a433 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -173,6 +173,7 @@ print(f'ENC_OUT {swiftest_enc}') print(f'EXTRA_FORCE no') print(f'BIG_DISCARD no') +print(f'DISCARD_OUT discard.swiftest.out') print(f'ROTATION no') print(f'GR no') print(f'MU2KG {MU2KG}') 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 1866557b2..d44f4df0e 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -5,7 +5,7 @@ DT 0.0006844626967830253 CB_IN cb.swiftest.in PL_IN pl.swiftest.in TP_IN tp.swiftest.in -IN_TYPE ASCII +IN_TYPE REAL8 ISTEP_OUT 1 ISTEP_DUMP 1 BIN_OUT bin.swiftest.dat @@ -22,6 +22,7 @@ CHK_QMIN_RANGE 0.004650467260962157 1000.0 ENC_OUT enc.swiftest.dat EXTRA_FORCE no BIG_DISCARD no +DISCARD_OUT discard.swiftest.out ROTATION no GR no MU2KG 1.988409870698051e+30 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in index 0eb21018b..9f0548fc1 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swifter.in @@ -1,5 +1,5 @@ 3 ! Planet input file generated using init_cond.py -1 39.47692640889762629 +1 39.476926408897625196 0.0 0.0 0.0 0.0 0.0 0.0 2 0.00012002693582795244940133 0.010044724833237892 diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in index 19c6d6e3a2436162bb5984e0ecb1cb9352cb223f..d8da7a92a44b1e9caa3907ead959cdec31e066cc 100644 GIT binary patch literal 256 zcmd;JU|?VZVi4c}VgVqA@l!y8KmZa0VF>tOuNl*S=&QyDdsK0lJi2<~#U*rILVhbs zIyBlY7vp7;bRcBDlutC@{W5v`KZ2`e<&?MB!PKu_Vy_x9sl|Sa{`cIZU5Rja3YkwR SWDH@mKPFMv^xXC_SUmurogOa$ literal 228 zcmZ9Gxe)^~30`5m% zX0lVQ37Yye{^|yd{X~mu+c^*|K`` Ygvg?I8#T=l^4}PjYzRwv=DU9V0CM9iPyhe` diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/tp.swiftest.in index 573541ac9702dd3969c9bc859d2b91ec1f7e6e56..64bf92f74a457d2f4bc42798493db15cc3ab1008 100644 GIT binary patch literal 16 Ncmd;JKmZOP6953P01*HH literal 2 JcmXru0ssJP06PEx diff --git a/python/swiftest/swiftest/io.py b/python/swiftest/swiftest/io.py index 2dd4ef7b3..5782c6444 100644 --- a/python/swiftest/swiftest/io.py +++ b/python/swiftest/swiftest/io.py @@ -5,7 +5,7 @@ import sys import tempfile -newfeaturelist = ("FRAGMENTATION", "ROTATION", "TIDES", "ENERGY", "GR", "YARKOVSKY", "YORP" ) +newfeaturelist = ("FRAGMENTATION", "ROTATION", "TIDES", "ENERGY", "GR", "YARKOVSKY", "YORP") def real2float(realstr): """ @@ -279,6 +279,7 @@ def write_labeled_param(param, param_file_name): 'CB_IN', 'BIN_OUT', 'ENC_OUT', + 'DISCARD_OUT', 'CHK_QMIN', 'CHK_RMIN', 'CHK_RMAX', @@ -889,7 +890,7 @@ def swift2swifter(swift_param, plname="", tpname="", conversion_questions={}): swifter_param['ENC_OUT'] = input("ENC_OUT: Encounter file name: [enc.dat]> ") if swifter_param['ENC_OUT'] == '': swifter_param['ENC_OUT'] = "enc.dat" - + intxt = conversion_questions.get('EXTRA_FORCE', None) if not intxt: intxt = input("EXTRA_FORCE: Use additional user-specified force routines? (y/N)> ") @@ -1228,6 +1229,13 @@ def swifter2swiftest(swifter_param, plname="", tpname="", cbname="", conversion_ 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']: + swiftest_param['DISCARD_OUT'] = input("DISCARD_OUT: Discard file name: [discard.out]> ") + if swiftest_param['DISCARD_OUT'] == '': + swiftest_param['DISCARD_OUT'] = "discard.out" + swiftest_param['! VERSION'] = "Swiftest parameter file converted from Swifter" return swiftest_param diff --git a/src/io/io.f90 b/src/io/io.f90 index b424094eb..e3556b11c 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -99,7 +99,9 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) param_value = io_get_token(line, ifirst, ilast, iostat) read(param_value, *) self%qmin_ahi case ("ENC_OUT") - self%encounter_file = param_value + self%enc_out = param_value + case ("DISCARD_OUT") + self%discard_out = param_value case ("EXTRA_FORCE") call io_toupper(param_value) if (param_value == "YES" .or. param_value == 'T') self%lextra_force = .true. @@ -225,9 +227,7 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) write(*,*) "CHK_QMIN = ",self%qmin write(*,*) "CHK_QMIN_COORD = ",trim(adjustl(self%qmin_coord)) write(*,*) "CHK_QMIN_RANGE = ",self%qmin_alo, self%qmin_ahi - write(*,*) "ENC_OUT = ",trim(adjustl(self%encounter_file)) write(*,*) "EXTRA_FORCE = ",self%lextra_force - write(*,*) "BIG_DISCARD = ",self%lbig_discard write(*,*) "RHILL_PRESENT = ",self%lrhill_present write(*,*) "ROTATION = ", self%lrotation write(*,*) "TIDES = ", self%ltides @@ -235,6 +235,18 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) write(*,*) "MU2KG = ",self%MU2KG write(*,*) "TU2S = ",self%TU2S write(*,*) "DU2M = ",self%DU2M + if (trim(adjustl(self%enc_out)) /= "") then + write(*,*) "ENC_OUT = ",trim(adjustl(self%enc_out)) + else + write(*,*) "! ENC_OUT not set: Encounters will not be recorded to file" + end if + if (trim(adjustl(self%discard_out)) /= "") then + write(*,*) "DISCARD_OUT = ",trim(adjustl(self%discard_out)) + write(*,*) "BIG_DISCARD = ",self%lbig_discard + else + write(*,*) "! DISCARD_OUT not set: Discards will not be recorded to file" + write(*,*) "! BIG_DISCARD = ",self%lbig_discard + end if if ((self%MU2KG < 0.0_DP) .or. (self%TU2S < 0.0_DP) .or. (self%DU2M < 0.0_DP)) then write(iomsg,*) 'Invalid unit conversion factor' @@ -317,7 +329,7 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt) adjustl(param_name), adjustl(param_value) end if - write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%encounter_file)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) if (param%istep_dump > 0) then write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt) adjustl(param_name), adjustl(param_value) end if @@ -761,7 +773,7 @@ end subroutine io_read_param_in function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & - xh1, xh2, vh1, vh2, encounter_file, out_type) result(ierr) + xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) !! author: David A. Minton !! !! Read close encounter data from input binary files @@ -773,7 +785,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & integer(I4B), intent(out) :: name1, name2 real(DP), intent(out) :: t, mass1, mass2, radius1, radius2 real(DP), dimension(:), intent(out) :: xh1, xh2, vh1, vh2 - character(*), intent(in) :: encounter_file, out_type + character(*), intent(in) :: enc_out, out_type ! Result integer(I4B) :: ierr ! Internals @@ -782,7 +794,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & integer(I4B), save :: iu = lun if (lfirst) then - open(unit = iu, file = encounter_file, status = 'OLD', form = 'UNFORMATTED', iostat = ierr) + open(unit = iu, file = enc_out, status = 'OLD', form = 'UNFORMATTED', iostat = ierr) if (ierr /= 0) then write(*, *) "Swiftest Error:" write(*, *) " unable to open binary encounter file" @@ -1046,31 +1058,27 @@ module subroutine io_write_discard(self, param) character(*), parameter :: PLNAMEFMT = '(I8, 2(1X, E23.16))' class(swiftest_body), allocatable :: pltemp - associate(t => param%t, discards => self%tp_discards, nsp => self%tp_discards%nbody, dxh => self%tp_discards%xh, dvh => self%tp_discards%vh, & - dname => self%tp_discards%id, dstatus => self%tp_discards%status) - + 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') - open(unit = LUN, file = param%outfile, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + open(unit = LUN, file = param%discard_out, status = 'OLD', position = 'APPEND', form = 'FORMATTED', iostat = ierr) case('NEW', 'REPLACE', 'UNKNOWN') - open(unit = LUN, file = param%outfile, status = param%out_stat, form = 'UNFORMATTED', iostat = ierr) + 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) call discards%pv2v(param) + if (param%lgr) call tp_discards%pv2v(param) - write(LUN, HDRFMT) t, nsp, param%lbig_discard + write(LUN, HDRFMT) param%t, nsp, param%lbig_discard do i = 1, nsp - write(LUN, NAMEFMT) sub, dname(i), dstatus(i) - write(LUN, VECFMT) dxh(1, i), dxh(2, i), dxh(3, i) - write(LUN, VECFMT) dvh(1, i), dvh(2, i), dvh(3, i) + write(LUN, NAMEFMT) sub, tp_discards%id(i), tp_discards%status(i) + write(LUN, VECFMT) tp_discards%xh(1, i), tp_discards%xh(2, i), tp_discards%xh(3, i) + write(LUN, VECFMT) tp_discards%vh(1, i), tp_discards%vh(2, i), tp_discards%vh(3, i) end do if (param%lbig_discard) then - associate(npl => self%pl%nbody, pl => self%pl, GMpl => self%pl%Gmass, & - Rpl => self%pl%radius, name => self%pl%id, xh => self%pl%xh) - if (param%lgr) then allocate(pltemp, source = pl) call pltemp%pv2v(param) @@ -1082,12 +1090,11 @@ module subroutine io_write_discard(self, param) write(LUN, NPLFMT) npl do i = 1, npl - write(LUN, PLNAMEFMT) name(i), GMpl(i), Rpl(i) - write(LUN, VECFMT) xh(1, i), xh(2, i), xh(3, i) + write(LUN, PLNAMEFMT) pl%id(i), pl%Gmass(i), pl%radius(i) + write(LUN, VECFMT) pl%xh(1, i), pl%xh(2, i), pl%xh(3, i) write(LUN, VECFMT) vh(1, i), vh(2, i), vh(3, i) end do deallocate(vh) - end associate end if close(LUN) end associate @@ -1097,7 +1104,7 @@ end subroutine io_write_discard module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & - xh1, xh2, vh1, vh2, encounter_file, out_type) + xh1, xh2, vh1, vh2, enc_out, out_type) !! author: David A. Minton !! !! Write close encounter data to output binary files @@ -1110,16 +1117,16 @@ module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, rad integer(I4B), intent(in) :: name1, name2 real(DP), intent(in) :: t, mass1, mass2, radius1, radius2 real(DP), dimension(:), intent(in) :: xh1, xh2, vh1, vh2 - character(*), intent(in) :: encounter_file, out_type + character(*), intent(in) :: enc_out, out_type ! Internals logical , save :: lfirst = .true. integer(I4B), parameter :: lun = 30 integer(I4B) :: ierr integer(I4B), save :: iu = lun - open(unit = iu, file = encounter_file, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) + open(unit = iu, file = enc_out, status = 'OLD', position = 'APPEND', form = 'UNFORMATTED', iostat = ierr) if ((ierr /= 0) .and. lfirst) then - open(unit = iu, file = encounter_file, status = 'NEW', form = 'UNFORMATTED', iostat = ierr) + open(unit = iu, file = enc_out, status = 'NEW', form = 'UNFORMATTED', iostat = ierr) end if if (ierr /= 0) then write(*, *) "Swiftest Error:" diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index c7a7939a1..83514a2ab 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -38,7 +38,8 @@ module swiftest_classes character(STRMAX) :: qmin_coord = 'HELIO' !! Coordinate frame to use for qmin real(DP) :: qmin_alo = -1.0_DP !! Minimum semimajor axis for qmin real(DP) :: qmin_ahi = -1.0_DP !! Maximum semimajor axis for qmin - character(STRMAX) :: encounter_file = ENC_OUTFILE !! Name of output file for encounters + character(STRMAX) :: enc_out = "" !! Name of output file for encounters + character(STRMAX) :: discard_out = "" !! Name of output file for discards real(QP) :: MU2KG = -1.0_QP !! Converts mass units to grams real(QP) :: TU2S = -1.0_QP !! Converts time units to seconds real(QP) :: DU2M = -1.0_QP !! Converts distance unit to centimeters @@ -277,8 +278,8 @@ module swiftest_classes ! Concrete classes that are common to the basic integrator (only test particles considered for discard) procedure :: discard => discard_system !! Perform a discard step on the system procedure :: dump => io_dump_system !! Dump the state of the system to a file - procedure :: read_frame => io_read_frame_system !! Append a frame of output data to file - procedure :: write_discard => io_write_discard !! Append a frame of output data to file + procedure :: read_frame => io_read_frame_system !! Read in a frame of input data from file + procedure :: write_discard => io_write_discard !! Write out information about discarded test particles procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file procedure :: initialize => setup_initialize_system !! Initialize the system from input files procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. @@ -584,12 +585,12 @@ module subroutine io_toupper(string) end subroutine io_toupper module subroutine io_write_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & - xh1, xh2, vh1, vh2, encounter_file, out_type) + xh1, xh2, vh1, vh2, enc_out, out_type) implicit none integer(I4B), intent(in) :: name1, name2 real(DP), intent(in) :: t, mass1, mass2, radius1, radius2 real(DP), dimension(:), intent(in) :: xh1, xh2, vh1, vh2 - character(*), intent(in) :: encounter_file, out_type + character(*), intent(in) :: enc_out, out_type end subroutine io_write_encounter module subroutine io_write_frame_body(self, iu, param) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 01af9a48f..2094b533a 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -167,6 +167,7 @@ module symba_classes class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure integer(I4B) :: irec !! System recursion level contains + procedure :: write_discard => symba_io_write_discard !! Write out information about discarded and merged planets and test particles in SyMBA procedure :: initialize => symba_setup_initialize_system !! Performs SyMBA-specific initilization steps procedure :: step => symba_step_system !! Advance the SyMBA nbody system forward in time by one step procedure :: interp => symba_step_interp_system !! Perform an interpolation step on the SymBA nbody system @@ -265,34 +266,12 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp - module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current simulation time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - end subroutine symba_kick_getacch_pl - - module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) - use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters - implicit none - class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! Current time - logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step - end subroutine symba_kick_getacch_tp - - module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + module subroutine symba_io_write_discard(self, param) + use swiftest_classes, only : swiftest_parameters implicit none - class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - integer(I4B), intent(in) :: sgn !! sign to be applied to acceleration - end subroutine symba_kick_pltpenc + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + 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 @@ -341,6 +320,36 @@ module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) 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 + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current simulation time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine symba_kick_getacch_pl + + module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_tp), intent(inout) :: self !! SyMBA test particle data structure + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(in) :: t !! Current time + logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step + end subroutine symba_kick_getacch_tp + + module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) + implicit none + class(symba_pltpenc), intent(in) :: self !! SyMBA pl-tp encounter list object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + real(DP), intent(in) :: dt !! step size + 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_io_write_frame_info(self, iu, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 74e6958c9..0385aeecc 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -539,7 +539,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) call orbel_xv2aqt(mu, xpc(:, i), vpc(:, i), a, peri, capm, tperi) r2 = dot_product(xpc(:, i), xpc(:, i)) if ((abs(tperi) > FACQDT * dt) .or. (r2 > rhill2)) peri = sqrt(r2) - if (param%encounter_file /= "") then + if (param%enc_out /= "") then id1 = pl%id(ipleP) rpl = pl%radius(ipleP) xh1(:) = pl%inner(inner_index)%x(:, ipleP) @@ -548,7 +548,7 @@ subroutine rmvs_peri_tp(tp, pl, t, dt, lfirst, inner_index, ipleP, param) xh2(:) = xpc(:, i) + xh1(:) vh2(:) = xpc(:, i) + vh1(:) call io_write_encounter(t, id1, id2, mu, 0.0_DP, rpl, 0.0_DP, xh1(:), xh2(:), vh1(:), vh2(:), & - param%encounter_file, param%out_type) + param%enc_out, param%out_type) end if if (tp%lperi(i)) then if (peri < tp%peri(i)) then diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 403204017..97e4ab3f6 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -207,7 +207,70 @@ module subroutine symba_io_read_frame_info(self, iu, param, form, ierr) ierr = 0 end subroutine symba_io_read_frame_info - + + + module subroutine symba_io_write_discard(self, param) + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B), parameter :: LUN = 40 + integer(I4B) :: i, ierr + logical, save :: lfirst = .true. + real(DP), dimension(:,:), allocatable :: vh + character(*), parameter :: HDRFMT = '(E23.16, 1X, I8, 1X, L1)' + character(*), parameter :: NAMEFMT = '(A, 2(1X, I8))' + character(*), parameter :: VECFMT = '(3(E23.16, 1X))' + character(*), parameter :: NPLFMT = '(I8)' + character(*), parameter :: PLNAMEFMT = '(I8, 2(1X, E23.16))' + class(swiftest_body), allocatable :: pltemp + + associate(pl_discards => self%pl_discards, nsppl => self%pl_discards%nbody, pl => self%pl, npl => self%pl%nbody) + if (self%tp_discards%nbody > 0) call io_write_discard(self, param) + + if (nsppl == 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) call pl_discards%pv2v(param) + + ! write(LUN, HDRFMT) param%t, nsp, param%lbig_discard + ! do i = 1, nsp + ! write(LUN, NAMEFMT) sub, tp_discards%id(i), tp_discards%status(i) + ! write(LUN, VECFMT) tp_discards%xh(1, i), tp_discards%xh(2, i), tp_discards%xh(3, i) + ! write(LUN, VECFMT) tp_discards%vh(1, i), tp_discards%vh(2, i), tp_discards%vh(3, i) + ! end do + ! if (param%lbig_discard) then + ! if (param%lgr) then + ! allocate(pltemp, source = pl) + ! call pltemp%pv2v(param) + ! allocate(vh, source = pltemp%vh) + ! deallocate(pltemp) + ! else + ! allocate(vh, source = pl%vh) + ! end if + + ! write(LUN, NPLFMT) npl + ! do i = 1, npl + ! write(LUN, PLNAMEFMT) pl%id(i), pl%Gmass(i), pl%radius(i) + ! write(LUN, VECFMT) pl%xh(1, i), pl%xh(2, i), pl%xh(3, i) + ! write(LUN, VECFMT) vh(1, i), vh(2, i), vh(3, i) + ! end do + ! deallocate(vh) + ! end if + ! close(LUN) + end associate + + return + end subroutine symba_io_write_discard + module subroutine symba_io_write_frame_info(self, iu, param) implicit none @@ -216,6 +279,5 @@ module subroutine symba_io_write_frame_info(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_frame_info - end submodule s_symba_io From ad8520d83aad1aadad01e0110fe959badef176ff Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 17:58:37 -0400 Subject: [PATCH 162/194] Made somewhat functional SyMBA version of the discard method for pl --- src/io/io.f90 | 2 +- src/modules/symba_classes.f90 | 1 - src/setup/setup.f90 | 1 - src/symba/symba_collision.f90 | 6 +++--- src/symba/symba_drift.f90 | 8 ++++---- src/symba/symba_io.f90 | 27 ++++++++++++++++----------- src/symba/symba_kick.f90 | 6 +++--- src/util/util_append.f90 | 2 +- src/util/util_coord.f90 | 4 ++-- src/util/util_resize.f90 | 2 +- 10 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index e3556b11c..2900fc7f4 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -1074,7 +1074,7 @@ module subroutine io_write_discard(self, param) write(LUN, HDRFMT) param%t, nsp, param%lbig_discard do i = 1, nsp - write(LUN, NAMEFMT) sub, tp_discards%id(i), tp_discards%status(i) + write(LUN, NAMEFMT) SUB, tp_discards%id(i), tp_discards%status(i) write(LUN, VECFMT) tp_discards%xh(1, i), tp_discards%xh(2, i), tp_discards%xh(3, i) write(LUN, VECFMT) tp_discards%vh(1, i), tp_discards%vh(2, i), tp_discards%vh(3, i) end do diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 2094b533a..c4b399471 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -164,7 +164,6 @@ module symba_classes class(symba_pl), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions class(symba_pltpenc), allocatable :: pltpenc_list !! List of massive body-test particle encounters in a single step class(symba_plplenc), allocatable :: plplenc_list !! List of massive body-massive body encounters in a single step - class(symba_pl), allocatable :: pl_discards !! Discarded test particle data structure integer(I4B) :: irec !! System recursion level contains procedure :: write_discard => symba_io_write_discard !! Write out information about discarded and merged planets and test particles in SyMBA diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index f1e44f19c..7de8ce5c3 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -53,7 +53,6 @@ module subroutine setup_construct_system(system, param) allocate(symba_cb :: system%cb) allocate(symba_pl :: system%pl) allocate(symba_tp :: system%tp) - allocate(symba_pl :: system%pl_discards) allocate(symba_tp :: system%tp_discards) allocate(symba_pl :: system%mergeadd_list) allocate(symba_pl :: system%mergesub_list) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 7c0a05c91..ed2e1e0a1 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -67,11 +67,11 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec lmask(:) = .false. lmask(ind1(k)) = .not.pl%lcollision(ind1(k)) lmask(ind2(k)) = .not.pl%lcollision(ind2(k)) - call system%mergesub_list%append(pl, lmask) - ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step pl%lcollision([ind1(k), ind2(k)]) = .true. - pl%ldiscard([ind1(k), ind2(k)]) = .true. + pl%lcollision([ind1(k), ind2(k)]) = .true. + pl%status([ind1(k), ind2(k)]) = COLLISION + call system%mergesub_list%append(pl, lmask) end do end if diff --git a/src/symba/symba_drift.f90 b/src/symba/symba_drift.f90 index ac06cbb6a..c4efee05f 100644 --- a/src/symba/symba_drift.f90 +++ b/src/symba/symba_drift.f90 @@ -17,9 +17,9 @@ module subroutine symba_drift_pl(self, system, param, dt) select type(system) class is (symba_nbody_system) - self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + self%lmask(:) = self%status(:) /= INACTIVE .and. self%levelg(:) == system%irec call helio_drift_body(self, system, param, dt) - self%lmask(:) = self%status(:) == ACTIVE + self%lmask(:) = self%status(:) /= INACTIVE end select return @@ -41,9 +41,9 @@ module subroutine symba_drift_tp(self, system, param, dt) select type(system) class is (symba_nbody_system) - self%lmask(:) = self%status(:) == ACTIVE .and. self%levelg(:) == system%irec + self%lmask(:) = self%status(:) /= INACTIVE .and. self%levelg(:) == system%irec call helio_drift_body(self, system, param, dt) - self%lmask(:) = self%status(:) == ACTIVE + self%lmask(:) = self%status(:) /= INACTIVE end select return diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 97e4ab3f6..f35e45408 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/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_discards => self%pl_discards, nsppl => self%pl_discards%nbody, pl => self%pl, npl => self%pl%nbody) + associate(pl => self%pl, npl => self%pl%nbody, mergesub_list => self%mergesub_list, mergeadd_list => self%mergeadd_list) if (self%tp_discards%nbody > 0) call io_write_discard(self, param) - if (nsppl == 0) return + 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) @@ -239,14 +239,19 @@ module subroutine symba_io_write_discard(self, param) call util_exit(FAILURE) end select lfirst = .false. - if (param%lgr) call pl_discards%pv2v(param) - - ! write(LUN, HDRFMT) param%t, nsp, param%lbig_discard - ! do i = 1, nsp - ! write(LUN, NAMEFMT) sub, tp_discards%id(i), tp_discards%status(i) - ! write(LUN, VECFMT) tp_discards%xh(1, i), tp_discards%xh(2, i), tp_discards%xh(3, i) - ! write(LUN, VECFMT) tp_discards%vh(1, i), tp_discards%vh(2, i), tp_discards%vh(3, i) - ! end do + 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 + do i = 1, mergesub_list%nbody + write(LUN, NAMEFMT) SUB, mergesub_list%id(i), mergesub_list%status(i) + write(LUN, VECFMT) mergesub_list%xh(1, i), mergesub_list%xh(2, i), mergesub_list%xh(3, i) + write(LUN, VECFMT) mergesub_list%vh(1, i), mergesub_list%vh(2, i), mergesub_list%vh(3, i) + end do + + ! This is incomplete until the mergeadd_list methods are completed ! if (param%lbig_discard) then ! if (param%lgr) then ! allocate(pltemp, source = pl) @@ -265,7 +270,7 @@ module subroutine symba_io_write_discard(self, param) ! end do ! deallocate(vh) ! end if - ! close(LUN) + close(LUN) end associate return diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index aebb6bb2b..8625b3d81 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -124,8 +124,8 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) select type(tp => system%tp) class is (symba_tp) associate(ind1 => self%index1, ind2 => self%index2) - if (pl%nbody > 0) pl%lmask(:) = pl%status(:) == ACTIVE - if (tp%nbody > 0) tp%lmask(:) = tp%status(:) == ACTIVE + if (pl%nbody > 0) pl%lmask(:) = pl%status(:) /= INACTIVE + if (tp%nbody > 0) tp%lmask(:) = tp%status(:) /= INACTIVE irm1 = irec - 1 if (sgn < 0) then @@ -145,7 +145,7 @@ module subroutine symba_kick_pltpenc(self, system, dt, irec, sgn) else lgoodlevel = (pl%levelg(ind1(k)) >= irm1) .and. (tp%levelg(ind2(k)) >= irm1) end if - if ((self%status(k) == ACTIVE) .and. lgoodlevel) then + if ((self%status(k) /= INACTIVE) .and. lgoodlevel) then if (isplpl) then ri = ((pl%rhill(ind1(k)) + pl%rhill(ind2(k)))**2) * (RHSCALE**2) * (RSHELL**(2*irecl)) rim1 = ri * (RSHELL**2) diff --git a/src/util/util_append.f90 b/src/util/util_append.f90 index a13103cfa..0f7ac0bde 100644 --- a/src/util/util_append.f90 +++ b/src/util/util_append.f90 @@ -232,7 +232,7 @@ module subroutine util_append_body(self, source, lsource_mask) call util_append(self%omega, source%omega, lsource_mask) call util_append(self%capm, source%capm, lsource_mask) - self%nbody = count(self%status(:) == ACTIVE) + self%nbody = count(self%status(:) /= INACTIVE) return end subroutine util_append_body diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index bdc772d21..938d04951 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -54,7 +54,7 @@ module subroutine util_coord_h2b_tp(self, cb) 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) == ACTIVE) + 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) @@ -109,7 +109,7 @@ module subroutine util_coord_b2h_tp(self, cb) 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) == ACTIVE) + 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) diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 4a84a003b..9abd66189 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -201,7 +201,7 @@ module subroutine util_resize_body(self, nnew) call util_resize(self%capom, nnew) call util_resize(self%omega, nnew) call util_resize(self%capm, nnew) - self%nbody = count(self%status(1:nnew) == ACTIVE) + self%nbody = count(self%status(1:nnew) /= INACTIVE) return end subroutine util_resize_body From c1ca5fc2c8bc91ff5215a199f2882f16265978d3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 18:35:34 -0400 Subject: [PATCH 163/194] Added the central body discard code from the Fragmentation branch --- src/discard/discard.f90 | 6 +-- src/main/swiftest_driver.f90 | 2 +- src/symba/symba_discard.f90 | 89 +++++++++++++++++++++++++++++++++++- src/util/util_set.f90 | 2 +- 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 0c84c9e88..5f87ee752 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -65,7 +65,7 @@ module subroutine discard_tp(self, system, param) if (ntp > 0) call tp%h2b(cb) end if if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) then - if (ntp > 0) call discard_sun_tp(tp, system, param) + if (ntp > 0) call discard_cb_tp(tp, system, param) end if if (param%qmin >= 0.0_DP .and. ntp > 0) call discard_peri_tp(tp, system, param) if (param%lclose .and. ntp > 0) call discard_pl_tp(tp, system, param) @@ -76,7 +76,7 @@ module subroutine discard_tp(self, system, param) end subroutine discard_tp - subroutine discard_sun_tp(tp, system, param) + subroutine discard_cb_tp(tp, system, param) !! author: David A. Minton !! !! Check to see if test particles should be discarded based on their positions relative to the Sun @@ -126,7 +126,7 @@ subroutine discard_sun_tp(tp, system, param) end associate return - end subroutine discard_sun_tp + end subroutine discard_cb_tp subroutine discard_peri_tp(tp, system, param) diff --git a/src/main/swiftest_driver.f90 b/src/main/swiftest_driver.f90 index 805264c2c..55eb1bc89 100644 --- a/src/main/swiftest_driver.f90 +++ b/src/main/swiftest_driver.f90 @@ -67,7 +67,7 @@ program swiftest_driver t = t0 + iloop * dt - !> Evaluate any discards or mergers + !> Evaluate any discards or collisional outcomes call nbody_system%discard(param) !> If the loop counter is at the output cadence value, append the data file with a single frame diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 3f8ada6fe..9a90d7ea1 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -8,8 +8,95 @@ 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(in) :: param !! Current run configuration parameters - + + ! First check for collisions with the central body + associate(pl => self, npl => self%nbody, cb => system%cb) + if (npl == 0) return + if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. & + (param%rmaxu >= 0.0_DP) .or. ((param%qmin >= 0.0_DP) .and. (param%qmin_coord == "BARY"))) then + call pl%h2b(cb) + end if + if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) then + call symba_discard_cb_pl(pl, system, param) + end if + if (param%qmin >= 0.0_DP .and. npl > 0) call symba_discard_peri_pl(pl, system, param) + end associate + + select type(param) + class is (symba_parameters) + if (param%lfragmentation) then + + end if + + end select + return end subroutine symba_discard_pl + + subroutine symba_discard_cb_pl(pl, system, param) + !! author: David A. Minton + !! + !! Check to see if planets should be discarded based on their positions relative to the central body + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_cb.f90 + !! Adapted from Hal Levison's Swift routine discard_massive5.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, j + real(DP) :: energy, vb2, rb2, rh2, rmin2, rmax2, rmaxu2 + + associate(npl => pl%nbody, cb => system%cb) + call system%set_msys() + rmin2 = param%rmin**2 + rmax2 = param%rmax*2 + rmaxu2 = param%rmaxu**2 + do i = 1, npl + if (pl%status(i) == ACTIVE) then + rh2 = dot_product(pl%xh(:,i), pl%xh(:,i)) + if ((param%rmax >= 0.0_DP) .and. (rh2 > rmax2)) then + pl%ldiscard(i) = .true. + pl%status(i) = DISCARDED_RMAX + write(*, *) "Massive body ", pl%id(i), " too far from the central body at t = ", param%t + else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then + pl%ldiscard(i) = .true. + pl%status(i) = DISCARDED_RMIN + write(*, *) "Massive body ", pl%id(i), " too close to the central body at t = ", param%t + else if (param%rmaxu >= 0.0_DP) then + rb2 = dot_product(pl%xb(:,i), pl%xb(:,i)) + vb2 = dot_product(pl%vb(:,i), pl%vb(:,i)) + energy = 0.5_DP * vb2 - system%msys / sqrt(rb2) + if ((energy > 0.0_DP) .and. (rb2 > rmaxu2)) then + pl%ldiscard(i) = .true. + pl%status(i) = DISCARDED_RMAXU + write(*, *) "Massive body ", pl%id(i), " is unbound and too far from barycenter at t = ", param%t + end if + end if + end if + end do + end associate + + return + end subroutine symba_discard_cb_pl + + + subroutine symba_discard_peri_pl(pl, system, param) + !! author: David A. Minton + !! + !! Check to see if a test particle should be discarded because its perihelion distance becomes too small + !! + !! Adapted from David E. Kaufmann's Swifter routine: discard_peri.f90 + !! Adapted from Hal Levison's Swift routine discard_peri.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + return + end subroutine symba_discard_peri_pl + end submodule s_symba_discard \ No newline at end of file diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index c401cb0ce..a1c4075b6 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -62,7 +62,7 @@ module subroutine util_set_msys(self) ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nobdy system object - self%msys = self%cb%mass + sum(self%pl%mass(1:self%pl%nbody)) + self%msys = self%cb%Gmass + sum(self%pl%Gmass(1:self%pl%nbody), self%pl%status(1:self%pl%nbody) /= INACTIVE) return end subroutine util_set_msys From aa3e810729bdd5d69cb40c7a7529eaf86c32aa86 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 19:08:49 -0400 Subject: [PATCH 164/194] Removed the mergesub_list call from inside the symba step --- src/symba/symba_collision.f90 | 5 ----- src/symba/symba_discard.f90 | 8 +++++++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index ed2e1e0a1..2614a486a 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -63,15 +63,10 @@ module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec ! Check to see if either of these bodies has been involved with a collision before, and if so, make this a collisional family if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call pl%make_family([ind1(k),ind2(k)]) - ! Add any of the bodies that have *not* previously been involved in a collision to the subtraction list - lmask(:) = .false. - lmask(ind1(k)) = .not.pl%lcollision(ind1(k)) - lmask(ind2(k)) = .not.pl%lcollision(ind2(k)) ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step pl%lcollision([ind1(k), ind2(k)]) = .true. pl%lcollision([ind1(k), ind2(k)]) = .true. pl%status([ind1(k), ind2(k)]) = COLLISION - call system%mergesub_list%append(pl, lmask) end do end if diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 9a90d7ea1..f9066fdc6 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -37,7 +37,10 @@ end subroutine symba_discard_pl subroutine symba_discard_cb_pl(pl, system, param) !! author: David A. Minton !! - !! Check to see if planets should be discarded based on their positions relative to the central body + !! Check to see if planets should be discarded based on their positions relative to the central body. + !! If a body gets flagged here when it has also been previously flagged for a collision with another massive body, + !! its collisional status will be revoked. Discards due to colliding with or escaping the central body take precedence + !! over pl-pl collisions !! !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_cb.f90 !! Adapted from Hal Levison's Swift routine discard_massive5.f @@ -60,10 +63,12 @@ subroutine symba_discard_cb_pl(pl, system, param) rh2 = dot_product(pl%xh(:,i), pl%xh(:,i)) if ((param%rmax >= 0.0_DP) .and. (rh2 > rmax2)) then pl%ldiscard(i) = .true. + pl%lcollision(i) = .false. pl%status(i) = DISCARDED_RMAX write(*, *) "Massive body ", pl%id(i), " too far from the central body at t = ", param%t else if ((param%rmin >= 0.0_DP) .and. (rh2 < rmin2)) then pl%ldiscard(i) = .true. + pl%lcollision(i) = .false. pl%status(i) = DISCARDED_RMIN write(*, *) "Massive body ", pl%id(i), " too close to the central body at t = ", param%t else if (param%rmaxu >= 0.0_DP) then @@ -72,6 +77,7 @@ subroutine symba_discard_cb_pl(pl, system, param) energy = 0.5_DP * vb2 - system%msys / sqrt(rb2) if ((energy > 0.0_DP) .and. (rb2 > rmaxu2)) then pl%ldiscard(i) = .true. + pl%lcollision(i) = .false. pl%status(i) = DISCARDED_RMAXU write(*, *) "Massive body ", pl%id(i), " is unbound and too far from barycenter at t = ", param%t end if From 947c4d47f1fcab1f5a8fb57002491941198d0fb8 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 20:26:30 -0400 Subject: [PATCH 165/194] Moved encounter type up to swiftest_classes so that the fragmentation code can be written independently of SyMBA --- src/modules/swiftest_classes.f90 | 18 +++++++++++++++++- src/modules/symba_classes.f90 | 19 ++++++++----------- src/symba/symba_util.f90 | 19 +++++++++---------- src/util/util_copy.f90 | 25 +++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 src/util/util_copy.f90 diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 83514a2ab..b55dfb5e2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -75,7 +75,7 @@ module swiftest_classes logical :: lintegrate = .false. !! Flag indicating that this object should be integrated in the current step contains !! The minimal methods that all systems must have - procedure :: dump => io_dump_swiftest + procedure :: dump => io_dump_swiftest procedure(abstract_initialize), deferred :: initialize procedure(abstract_read_frame), deferred :: read_frame procedure(abstract_write_frame), deferred :: write_frame @@ -286,6 +286,16 @@ module swiftest_classes procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. end type swiftest_nbody_system + type :: swiftest_encounter + integer(I4B) :: nenc !! Total number of encounters + logical, dimension(:), allocatable :: lvdotr !! relative vdotr flag + integer(I4B), dimension(:), allocatable :: status !! status of the interaction + integer(I4B), dimension(:), allocatable :: index1 !! position of the first body in the encounter + integer(I4B), dimension(:), allocatable :: index2 !! position of the second body in the encounter + contains + procedure :: copy => util_copy_encounter + end type swiftest_encounter + abstract interface subroutine abstract_discard_body(self, system, param) import swiftest_body, swiftest_nbody_system, swiftest_parameters @@ -824,6 +834,12 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_cb), intent(in) :: cb !! Swiftest central body object end subroutine util_coord_h2b_tp + module subroutine util_copy_encounter(self, source) + implicit none + class(swiftest_encounter), intent(inout) :: self !! Encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into + end subroutine util_copy_encounter + module subroutine util_exit(code) implicit none integer(I4B), intent(in) :: code !! Failure exit code diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index c4b399471..a8c6ff716 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -4,7 +4,7 @@ module symba_classes !! Definition of classes and methods specific to the Democratic SyMBAcentric Method !! Adapted from David E. Kaufmann's Swifter routine: helio.f90 use swiftest_globals - use swiftest_classes, only : swiftest_parameters, swiftest_base + use swiftest_classes, only : swiftest_parameters, swiftest_base, swiftest_encounter use helio_classes, only : helio_cb, helio_pl, helio_tp, helio_nbody_system use rmvs_classes, only : rmvs_chk_ind implicit none @@ -125,13 +125,8 @@ module symba_classes ! symba_pltpenc class definitions and method interfaces !******************************************************************************************************************************* !> SyMBA class for tracking pl-tp close encounters in a step - type :: symba_pltpenc - integer(I4B) :: nenc !! Total number of encounters - logical, dimension(:), allocatable :: lvdotr !! relative vdotr flag - integer(I4B), dimension(:), allocatable :: status !! status of the interaction + type, extends(swiftest_encounter) :: symba_pltpenc integer(I4B), dimension(:), allocatable :: level !! encounter recursion level - integer(I4B), dimension(:), allocatable :: index1 !! position of the planet in encounter - integer(I4B), dimension(:), allocatable :: index2 !! position of the test particle in encounter contains procedure :: collision_check => symba_collision_check_pltpenc !! Checks if a test particle is going to collide with a massive body procedure :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other @@ -465,15 +460,17 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) end subroutine symba_util_append_tp module subroutine symba_util_copy_pltpenc(self, source) + use swiftest_classes, only : swiftest_encounter implicit none - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into end subroutine symba_util_copy_pltpenc module subroutine symba_util_copy_plplenc(self, source) + use swiftest_classes, only : swifest_encounter implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into end subroutine symba_util_copy_plplenc end interface diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index bdfbea86c..e76c2faff 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -148,16 +148,15 @@ module subroutine symba_util_copy_pltpenc(self, source) !! Copies elements from the source encounter list into self. implicit none ! Arguments - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into + call util_copy_encounter(self, source) associate(n => source%nenc) - self%nenc = n - self%lvdotr(1:n) = source%lvdotr(1:n) - self%status(1:n) = source%status(1:n) - self%level(1:n) = source%level(1:n) - self%index1(1:n) = source%index1(1:n) - self%index2(1:n) = source%index2(1:n) + select type(source) + class is (symba_pltpenc) + self%level(1:n) = source%level(1:n) + end select end associate return @@ -170,8 +169,8 @@ module subroutine symba_util_copy_plplenc(self, source) !! Copies elements from the source encounter list into self. implicit none ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(symba_pltpenc), intent(in) :: source !! Source object to copy into + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into call symba_util_copy_pltpenc(self, source) associate(n => source%nenc) diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 new file mode 100644 index 000000000..704e10d64 --- /dev/null +++ b/src/util/util_copy.f90 @@ -0,0 +1,25 @@ +submodule(swiftest_classes) s_util_copy + use swiftest +contains + +module subroutine util_copy_encounter(self, source) + !! author: David A. Minton + !! + !! Copies elements from the source encounter list into self. + implicit none + ! Arguments + class(swiftest_encounter), intent(inout) :: self !! Encounter list + class(swiftest_encounter), intent(in) :: source !! Source object to copy into + + associate(n => source%nenc) + self%nenc = n + self%lvdotr(1:n) = source%lvdotr(1:n) + self%status(1:n) = source%status(1:n) + self%index1(1:n) = source%index1(1:n) + self%index2(1:n) = source%index2(1:n) + end associate + + return +end subroutine util_copy_encounter + +end submodule s_util_copy From 9efb88ca97498fdcbfce70e38668ac798b2bafc4 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Mon, 2 Aug 2021 23:48:25 -0400 Subject: [PATCH 166/194] Consolidated pltp/plpl encounter lists into a single encounter object --- src/modules/swiftest_classes.f90 | 20 +++- src/modules/symba_classes.f90 | 33 ------- src/setup/setup.f90 | 44 +++++++++ src/symba/symba_collision.f90 | 154 +++++++++++-------------------- src/symba/symba_setup.f90 | 47 +--------- src/symba/symba_util.f90 | 62 ------------- src/util/util_copy.f90 | 4 + src/util/util_resize.f90 | 35 +++++++ 8 files changed, 159 insertions(+), 240 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index b55dfb5e2..fdb2360ee 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -292,8 +292,14 @@ module swiftest_classes integer(I4B), dimension(:), allocatable :: status !! status of the interaction integer(I4B), dimension(:), allocatable :: index1 !! position of the first body in the encounter integer(I4B), dimension(:), allocatable :: index2 !! position of the second body in the encounter + real(DP), dimension(:,:), allocatable :: x1 !! the position of body 1 in the encounter + real(DP), dimension(:,:), allocatable :: x2 !! the position of body 2 in the encounter + real(DP), dimension(:,:), allocatable :: v1 !! the velocity of body 1 in the encounter + real(DP), dimension(:,:), allocatable :: v2 !! the velocity of body 2 in the encounter contains - procedure :: copy => util_copy_encounter + procedure :: copy => util_copy_encounter + procedure :: resize => util_resize_encounter + procedure :: setup => setup_encounter end type swiftest_encounter abstract interface @@ -707,6 +713,12 @@ module subroutine setup_construct_system(system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine setup_construct_system + module subroutine setup_encounter(self, n) + implicit none + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter structure + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for + end subroutine setup_encounter + module subroutine setup_initialize_system(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object @@ -952,6 +964,12 @@ module subroutine util_resize_body(self, nnew) integer(I4B), intent(in) :: nnew !! New size neded end subroutine util_resize_body + module subroutine util_resize_encounter(self, nnew) + implicit none + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list + integer(I4B), intent(in) :: nnew !! New size of list needed + end subroutine util_resize_encounter + module subroutine util_resize_pl(self, nnew) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index a8c6ff716..92caa0bb3 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -133,7 +133,6 @@ module symba_classes procedure :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion procedure :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays procedure :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another - procedure :: resize => symba_util_resize_pltpenc !! Checks the current size of the pltpenc_list against the required size and extends it by a factor of 2 more than requested if it is too small end type symba_pltpenc !******************************************************************************************************************************** @@ -141,14 +140,7 @@ module symba_classes !******************************************************************************************************************************* !> SyMBA class for tracking pl-pl close encounters in a step type, extends(symba_pltpenc) :: symba_plplenc - real(DP), dimension(:,:), allocatable :: xh1 !! the heliocentric position of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: xh2 !! the heliocentric position of parent 2 in encounter - real(DP), dimension(:,:), allocatable :: vb1 !! the barycentric velocity of parent 1 in encounter - real(DP), dimension(:,:), allocatable :: vb2 !! the barycentric velocity of parent 2 in encounter contains - procedure :: collision_check => symba_collision_check_plplenc !! Checks if two massive bodies are going to collide - procedure :: setup => symba_setup_plplenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure :: copy => symba_util_copy_plplenc !! Copies all elements of one plplenc list to another end type symba_plplenc !******************************************************************************************************************************** @@ -182,17 +174,6 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_pltpenc - module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! current time - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - end subroutine symba_collision_check_plplenc - module subroutine symba_collision_make_family_pl(self,idx) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object @@ -343,7 +324,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 @@ -465,13 +445,6 @@ module subroutine symba_util_copy_pltpenc(self, source) class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list class(swiftest_encounter), intent(in) :: source !! Source object to copy into end subroutine symba_util_copy_pltpenc - - module subroutine symba_util_copy_plplenc(self, source) - use swiftest_classes, only : swifest_encounter - implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(swiftest_encounter), intent(in) :: source !! Source object to copy into - end subroutine symba_util_copy_plplenc end interface interface util_fill @@ -529,12 +502,6 @@ module subroutine symba_util_resize_pl(self, nnew) integer(I4B), intent(in) :: nnew !! New size neded end subroutine symba_util_resize_pl - module subroutine symba_util_resize_pltpenc(self, nnew) - implicit none - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - integer(I4B), intent(in) :: nnew !! New size of list needed - end subroutine symba_util_resize_pltpenc - module subroutine symba_util_resize_tp(self, nnew) implicit none class(symba_tp), intent(inout) :: self !! SyMBA massive body object diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 7de8ce5c3..ca5f38c6e 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -70,6 +70,50 @@ module subroutine setup_construct_system(system, param) end subroutine setup_construct_system + module subroutine setup_encounter(self, n) + !! author: David A. Minton + !! + !! A constructor that sets the number of encounters and allocates and initializes all arrays + !! + implicit none + ! Arguments + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter structure + integer(I4B), intent(in) :: n !! Number of encounters to allocate space for + + self%nenc = n + if (n == 0) return + + if (allocated(self%lvdotr)) deallocate(self%lvdotr) + if (allocated(self%status)) deallocate(self%status) + if (allocated(self%index1)) deallocate(self%index1) + if (allocated(self%index2)) deallocate(self%index2) + if (allocated(self%x1)) deallocate(self%x1) + if (allocated(self%x2)) deallocate(self%x2) + if (allocated(self%v1)) deallocate(self%v1) + if (allocated(self%v2)) deallocate(self%v2) + + allocate(self%lvdotr(n)) + allocate(self%status(n)) + allocate(self%index1(n)) + allocate(self%index2(n)) + allocate(self%x1(NDIM,n)) + allocate(self%x2(NDIM,n)) + allocate(self%v1(NDIM,n)) + allocate(self%v2(NDIM,n)) + + self%lvdotr(:) = .false. + self%status(:) = INACTIVE + self%index1(:) = 0 + self%index2(:) = 0 + self%x1(:,:) = 0.0_DP + self%x2(:,:) = 0.0_DP + self%v1(:,:) = 0.0_DP + self%v2(:,:) = 0.0_DP + + return + end subroutine setup_encounter + + module subroutine setup_initialize_system(self, param) !! author: David A. Minton !! diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 2614a486a..bb67508fd 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -2,89 +2,12 @@ use swiftest contains - module subroutine symba_collision_check_plplenc(self, system, param, t, dt, irec) - !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton - !! - !! Check for merger between massive bodies in SyMBA. If the user has turned on the FRAGMENTATION feature, it will call the - !! symba_regime subroutine to determine what kind of collision will occur. - !! - !! Adapted from David E. Kaufmann's Swifter routine symba_merge_pl.f90 - !! - !! Adapted from Hal Levison's Swift routine symba5_merge.f - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter list object - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(in) :: t !! current time - real(DP), intent(in) :: dt !! step size - integer(I4B), intent(in) :: irec !! Current recursion level - ! Internals - logical, dimension(:), allocatable :: lcollision, lmask - real(DP), dimension(NDIM) :: xr, vr - integer(I4B) :: k - real(DP) :: rlim, mtot - - if (self%nenc == 0) return - - select type(pl => system%pl) - class is (symba_pl) - associate(plplenc_list => self, nplplenc => self%nenc, ind1 => self%index1, ind2 => self%index2) - allocate(lmask(nplplenc)) - lmask(:) = ((plplenc_list%status(1:nplplenc) == ACTIVE) & - .and. (pl%levelg(ind1(1:nplplenc)) >= irec) & - .and. (pl%levelg(ind2(1:nplplenc)) >= irec)) - if (.not.any(lmask(:))) return - - allocate(lcollision(nplplenc)) - lcollision(:) = .false. - - do concurrent(k = 1:nplplenc, lmask(k)) - 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, plplenc_list%lvdotr(k)) - end do - deallocate(lmask) - - if (any(lcollision(:))) then - allocate(lmask(pl%nbody)) - do k = 1, nplplenc - if (.not.lcollision(k)) cycle - - ! Set this encounter as a collision and save the position and velocity vectors at the time of the collision - plplenc_list%status(k) = COLLISION - plplenc_list%xh1(:,k) = pl%xh(:,ind1(k)) - plplenc_list%vb1(:,k) = pl%vb(:,ind1(k)) - plplenc_list%xh2(:,k) = pl%xh(:,ind2(k)) - plplenc_list%vb2(:,k) = pl%vb(:,ind2(k)) - - ! Check to see if either of these bodies has been involved with a collision before, and if so, make this a collisional family - if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call pl%make_family([ind1(k),ind2(k)]) - - ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step - pl%lcollision([ind1(k), ind2(k)]) = .true. - pl%lcollision([ind1(k), ind2(k)]) = .true. - pl%status([ind1(k), ind2(k)]) = COLLISION - end do - - end if - end associate - end select - - return - - return - end subroutine symba_collision_check_plplenc - - module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec) !! author: David A. Minton !! !! Check for merger between massive bodies and test particles in SyMBA !! - !! Adapted from David E. Kaufmann's Swifter routine symba_merge_tp.f90 + !! Adapted from David E. Kaufmann's Swifter routine symba_merge.f90 and symba_merge_tp.f90 !! !! Adapted from Hal Levison's Swift routine symba5_merge.f implicit none @@ -99,39 +22,74 @@ 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 + logical :: isplpl if (self%nenc == 0) return + select type(self) + class is (symba_plplenc) + isplpl = .true. + class default + isplpl = .false. + end select select type(pl => system%pl) class is (symba_pl) select type(tp => system%tp) class is (symba_tp) - associate(pltpenc_list => self, npltpenc => self%nenc, plind => self%index1, tpind => self%index2) - allocate(lmask(npltpenc)) - lmask(:) = ((pltpenc_list%status(1:npltpenc) == ACTIVE) & - .and. (pl%levelg(plind(1:npltpenc)) >= irec) & - .and. (tp%levelg(tpind(1:npltpenc)) >= irec)) + associate(nenc => self%nenc, ind1 => self%index1, ind2 => self%index2) + allocate(lmask(nenc)) + lmask(:) = ((self%status(1:nenc) == ACTIVE) .and. (pl%levelg(ind1(1:nenc)) >= irec)) + if (isplpl) then + lmask(:) = lmask(:) .and. (pl%levelg(ind2(1:nenc)) >= irec) + else + lmask(:) = lmask(:) .and. (tp%levelg(ind2(1:nenc)) >= irec) + end if if (.not.any(lmask(:))) return - allocate(lcollision(npltpenc)) + allocate(lcollision(nenc)) lcollision(:) = .false. - do concurrent(k = 1:npltpenc, lmask(k)) - xr(:) = pl%xh(:, plind(k)) - tp%xh(:, tpind(k)) - vr(:) = pl%vb(:, plind(k)) - tp%vb(:, tpind(k)) - lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(plind(k)), pl%radius(plind(k)), dt, pltpenc_list%lvdotr(k)) - end do + if (isplpl) then + do concurrent(k = 1:nenc, lmask(k)) + 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)) + end do + else + do concurrent(k = 1:nenc, lmask(k)) + xr(:) = pl%xh(:, ind1(k)) - tp%xh(:, ind2(k)) + vr(:) = pl%vb(:, ind1(k)) - tp%vb(:, ind2(k)) + lcollision(k) = symba_collision_check_one(xr(1), xr(2), xr(3), vr(1), vr(2), vr(3), pl%Gmass(ind1(k)), pl%radius(ind1(k)), dt, self%lvdotr(k)) + end do + end if if (any(lcollision(:))) then - where(lcollision(1:npltpenc)) - pltpenc_list%status(1:npltpenc) = COLLISION - tp%status(tpind(1:npltpenc)) = DISCARDED_PLR - tp%ldiscard(tpind(1:npltpenc)) = .true. - end where - - do k = 1, npltpenc - if (pltpenc_list%status(k) /= COLLISION) cycle - write(*,*) 'Test particle ',tp%id(tpind(k)), ' collided with massive body ',pl%id(plind(k)), ' at time ',t + do k = 1, nenc + if (.not.lcollision(k)) cycle + self%status(k) = COLLISION + self%x1(:,k) = pl%xh(:,ind1(k)) + self%v1(:,k) = pl%vb(:,ind1(k)) + if (isplpl) then + self%x2(:,k) = pl%xh(:,ind2(k)) + self%v2(:,k) = pl%vb(:,ind2(k)) + + ! Check to see if either of these bodies has been involved with a collision before, and if so, make this a collisional family + if (pl%lcollision(ind1(k)) .or. pl%lcollision(ind2(k))) call pl%make_family([ind1(k),ind2(k)]) + + ! Set the collision flag for these to bodies to true in case they become involved in another collision later in the step + pl%lcollision([ind1(k), ind2(k)]) = .true. + pl%ldiscard([ind1(k), ind2(k)]) = .true. + pl%status([ind1(k), ind2(k)]) = COLLISION + else + self%x2(:,k) = tp%xh(:,ind2(k)) + self%v2(:,k) = tp%vb(:,ind2(k)) + tp%status(ind2(k)) = DISCARDED_PLR + tp%ldiscard(ind2(k)) = .true. + write(*,*) 'Test particle ',tp%id(ind2(k)), ' collided with massive body ',pl%id(ind1(k)), ' at time ',t + end if end do end if end associate diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index f2c8e63dd..524420609 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -105,63 +105,18 @@ module subroutine symba_setup_pltpenc(self, n) class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter structure integer(I4B), intent(in) :: n !! Number of encounters to allocate space for - self%nenc = n + call setup_encounter(self, n) if (n == 0) return - if (allocated(self%lvdotr)) deallocate(self%lvdotr) - if (allocated(self%status)) deallocate(self%status) if (allocated(self%level)) deallocate(self%level) - if (allocated(self%index1)) deallocate(self%index1) - if (allocated(self%index2)) deallocate(self%index2) - - allocate(self%lvdotr(n)) - allocate(self%status(n)) allocate(self%level(n)) - allocate(self%index1(n)) - allocate(self%index2(n)) - self%lvdotr(:) = .false. - self%status(:) = INACTIVE self%level(:) = -1 - self%index1(:) = 0 - self%index2(:) = 0 return end subroutine symba_setup_pltpenc - module subroutine symba_setup_plplenc(self, n) - !! author: David A. Minton - !! - !! A constructor that sets the number of encounters and allocates and initializes all arrays - ! - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer(I4B), intent(in) :: n !! Number of encounters to allocate space for - - call symba_setup_pltpenc(self, n) - if (n == 0) return - - if (allocated(self%xh1)) deallocate(self%xh1) - if (allocated(self%xh2)) deallocate(self%xh2) - if (allocated(self%vb1)) deallocate(self%vb1) - if (allocated(self%vb2)) deallocate(self%vb2) - - allocate(self%xh1(NDIM,n)) - allocate(self%xh2(NDIM,n)) - allocate(self%vb1(NDIM,n)) - allocate(self%vb2(NDIM,n)) - - self%xh1(:,:) = 0.0_DP - self%xh2(:,:) = 0.0_DP - self%vb1(:,:) = 0.0_DP - self%vb2(:,:) = 0.0_DP - - return - end subroutine symba_setup_plplenc - - module subroutine symba_setup_tp(self, n, param) !! author: David A. Minton !! diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index e76c2faff..feda27a07 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -162,31 +162,6 @@ module subroutine symba_util_copy_pltpenc(self, source) return end subroutine symba_util_copy_pltpenc - - module subroutine symba_util_copy_plplenc(self, source) - !! author: David A. Minton - !! - !! Copies elements from the source encounter list into self. - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(swiftest_encounter), intent(in) :: source !! Source object to copy into - - call symba_util_copy_pltpenc(self, source) - associate(n => source%nenc) - select type(source) - class is (symba_plplenc) - self%xh1(:,1:n) = source%xh1(:,1:n) - self%xh2(:,1:n) = source%xh2(:,1:n) - self%vb1(:,1:n) = source%vb1(:,1:n) - self%vb2(:,1:n) = source%vb2(:,1:n) - end select - end associate - - return - end subroutine symba_util_copy_plplenc - - module subroutine symba_util_fill_arr_info(keeps, inserts, lfill_list) !! author: David A. Minton !! @@ -410,43 +385,6 @@ module subroutine symba_util_resize_tp(self, nnew) return end subroutine symba_util_resize_tp - - module subroutine symba_util_resize_pltpenc(self, nnew) - !! author: David A. Minton - !! - !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. - !! Polymorphic method works on both symba_pltpenc and symba_plplenc types - implicit none - ! Arguments - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - integer(I4B), intent(in) :: nnew !! New size of list needed - ! Internals - class(symba_pltpenc), allocatable :: enc_temp - integer(I4B) :: nold - logical :: lmalloc - - lmalloc = allocated(self%status) - if (lmalloc) then - nold = size(self%status) - else - nold = 0 - end if - if (nnew > nold) then - if (lmalloc) allocate(enc_temp, source=self) - call self%setup(2 * nnew) - if (lmalloc) then - call self%copy(enc_temp) - deallocate(enc_temp) - end if - else - self%status(nnew+1:nold) = INACTIVE - end if - self%nenc = nnew - - return - end subroutine symba_util_resize_pltpenc - - module subroutine symba_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! diff --git a/src/util/util_copy.f90 b/src/util/util_copy.f90 index 704e10d64..f44777eec 100644 --- a/src/util/util_copy.f90 +++ b/src/util/util_copy.f90 @@ -17,6 +17,10 @@ module subroutine util_copy_encounter(self, source) self%status(1:n) = source%status(1:n) self%index1(1:n) = source%index1(1:n) self%index2(1:n) = source%index2(1:n) + self%x1(:,1:n) = source%x1(:,1:n) + self%x2(:,1:n) = source%x2(:,1:n) + self%v1(:,1:n) = source%v1(:,1:n) + self%v2(:,1:n) = source%v2(:,1:n) end associate return diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 9abd66189..3772a8207 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -207,6 +207,41 @@ module subroutine util_resize_body(self, nnew) end subroutine util_resize_body + module subroutine util_resize_encounter(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. + implicit none + ! Arguments + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list + integer(I4B), intent(in) :: nnew !! New size of list needed + ! Internals + class(swiftest_encounter), allocatable :: enc_temp + integer(I4B) :: nold + logical :: lmalloc + + lmalloc = allocated(self%status) + if (lmalloc) then + nold = size(self%status) + else + nold = 0 + end if + if (nnew > nold) then + if (lmalloc) allocate(enc_temp, source=self) + call self%setup(2 * nnew) + if (lmalloc) then + call self%copy(enc_temp) + deallocate(enc_temp) + end if + else + self%status(nnew+1:nold) = INACTIVE + end if + self%nenc = nnew + + return + end subroutine util_resize_encounter + + module subroutine util_resize_pl(self, nnew) !! author: David A. Minton !! From d8717b3a0fabd8a3f4dcaeba857c47c567bc6827 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 09:25:20 -0400 Subject: [PATCH 167/194] Restructured discards in SyMBA to separate types of discards from each other. Also added particle number checks to coordinate conversion methods in order to simplify calls to them --- src/discard/discard.f90 | 17 +++++++------ src/symba/symba_collision.f90 | 1 + src/symba/symba_discard.f90 | 46 ++++++++++++++++++++++++++--------- src/util/util_coord.f90 | 6 +++++ 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 5f87ee752..f4244145a 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -38,6 +38,7 @@ module subroutine discard_pl(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + if (self%nbody == 0) return self%ldiscard(:) = .false. return @@ -58,17 +59,17 @@ module subroutine discard_tp(self, system, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter associate(tp => self, ntp => self%nbody, cb => system%cb, pl => system%pl, npl => system%pl%nbody) - if (ntp == 0) return + if ((ntp == 0) .or. (npl ==0)) return + if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. & (param%rmaxu >= 0.0_DP) .or. ((param%qmin >= 0.0_DP) .and. (param%qmin_coord == "BARY"))) then - if (npl > 0) call pl%h2b(cb) - if (ntp > 0) call tp%h2b(cb) - end if - if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) then - if (ntp > 0) call discard_cb_tp(tp, system, param) + call pl%h2b(cb) + call tp%h2b(cb) end if - if (param%qmin >= 0.0_DP .and. ntp > 0) call discard_peri_tp(tp, system, param) - if (param%lclose .and. ntp > 0) call discard_pl_tp(tp, 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.) end associate diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index bb67508fd..66aa1ef30 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -142,6 +142,7 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt return end function symba_collision_check_one + module subroutine symba_collision_make_family_pl(self, idx) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index f9066fdc6..7d15d996b 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -3,14 +3,45 @@ contains module subroutine symba_discard_pl(self, system, param) + !! author: David A. Minton + !! + !! Call the various flavors of discards for massive bodies in SyMBA runs, including discards due to colling with the central body, + !! escaping the system, or colliding with each other. implicit none ! Arguments 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(in) :: param !! Current run configuration parameters + call symba_discard_nonplpl(self, system, param) + + select type(param) + class is (symba_parameters) + if (param%lfragmentation) then + + end if + + end select + + return + end subroutine symba_discard_pl + + subroutine symba_discard_nonplpl(pl, system, param) + !! author: David A. Minton + !! + !! Check to see if planets should be discarded based on their positions or because they are unbound + !s + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_pl.f90 + !! Adapted from Hal Levison's Swift routine discard_massive5.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! First check for collisions with the central body - associate(pl => self, npl => self%nbody, cb => system%cb) + associate(npl => pl%nbody, cb => system%cb) if (npl == 0) return if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. & (param%rmaxu >= 0.0_DP) .or. ((param%qmin >= 0.0_DP) .and. (param%qmin_coord == "BARY"))) then @@ -22,16 +53,9 @@ module subroutine symba_discard_pl(self, system, param) if (param%qmin >= 0.0_DP .and. npl > 0) call symba_discard_peri_pl(pl, system, param) end associate - select type(param) - class is (symba_parameters) - if (param%lfragmentation) then - - end if - - end select - return - end subroutine symba_discard_pl + end subroutine symba_discard_nonplpl + subroutine symba_discard_cb_pl(pl, system, param) @@ -42,7 +66,7 @@ subroutine symba_discard_cb_pl(pl, system, param) !! its collisional status will be revoked. Discards due to colliding with or escaping the central body take precedence !! over pl-pl collisions !! - !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_cb.f90 + !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_sun.f90 !! Adapted from Hal Levison's Swift routine discard_massive5.f implicit none ! Arguments diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index 938d04951..ab5fe85df 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -18,6 +18,7 @@ module subroutine util_coord_h2b_pl(self, cb) real(DP) :: msys real(DP), dimension(NDIM) :: xtmp, vtmp + if (self%nbody == 0) return associate(pl => self, npl => self%nbody) msys = cb%Gmass xtmp(:) = 0.0_DP @@ -51,6 +52,7 @@ module subroutine util_coord_h2b_tp(self, cb) class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object class(swiftest_cb), intent(in) :: cb !! Swiftest central body object + 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) @@ -83,6 +85,8 @@ module subroutine util_coord_b2h_pl(self, cb) ! Internals integer(I4B) :: i + 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 @@ -107,6 +111,8 @@ module subroutine util_coord_b2h_tp(self, cb) class(swiftest_tp), intent(inout) :: self !! Swiftest massive body object class(swiftest_cb), intent(in) :: cb !! Swiftest central body object + 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) From 8a3c43cf198daa7f0b3fccbdd19a412eab7e6a9c Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 10:03:08 -0400 Subject: [PATCH 168/194] Refactored msys to system%Gmtot. Added back the massive body pericenter check (originally symba_peri.f90 and symba_discard_peri_pl.f90 from Swifter. Now symba_util_peri_pl bound to the get_peri method call, and symba_discard_peri_pl --- src/discard/discard.f90 | 4 +- src/helio/helio_coord.f90 | 6 +- src/modules/swiftest_classes.f90 | 2 +- src/modules/symba_classes.f90 | 9 ++ src/symba/symba_discard.f90 | 147 ++++++++++++++++++------------- src/symba/symba_util.f90 | 87 ++++++++++++++++++ src/util/util_coord.f90 | 10 +-- src/util/util_peri.f90 | 2 +- src/util/util_set.f90 | 2 +- 9 files changed, 197 insertions(+), 72 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index f4244145a..7dbbd95c2 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -94,7 +94,7 @@ subroutine discard_cb_tp(tp, system, param) integer(I4B) :: i real(DP) :: energy, vb2, rb2, rh2, rmin2, rmax2, rmaxu2 - associate(ntp => tp%nbody, cb => system%cb, t => param%t, msys => system%msys) + associate(ntp => tp%nbody, cb => system%cb, t => param%t, Gmtot => system%Gmtot) rmin2 = max(param%rmin * param%rmin, cb%radius * cb%radius) rmax2 = param%rmax**2 rmaxu2 = param%rmaxu**2 @@ -114,7 +114,7 @@ subroutine discard_cb_tp(tp, system, param) else if (param%rmaxu >= 0.0_DP) then rb2 = dot_product(tp%xb(:, i), tp%xb(:, i)) vb2 = dot_product(tp%vb(:, i), tp%vb(:, i)) - energy = 0.5_DP * vb2 - msys / sqrt(rb2) + energy = 0.5_DP * vb2 - Gmtot / sqrt(rb2) if ((energy > 0.0_DP) .and. (rb2 > rmaxu2)) then tp%status(i) = DISCARDED_RMAXU write(*, *) "Particle ", tp%id(i), " is unbound and too far from barycenter at t = ", t diff --git a/src/helio/helio_coord.f90 b/src/helio/helio_coord.f90 index 0e58a3ab6..f40781810 100644 --- a/src/helio/helio_coord.f90 +++ b/src/helio/helio_coord.f90 @@ -68,14 +68,14 @@ module subroutine helio_coord_vh2vb_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object ! Internals integer(I4B) :: i - real(DP) :: msys + real(DP) :: Gmtot if (self%nbody == 0) return associate(pl => self, npl => self%nbody) - msys = cb%Gmass + sum(pl%Gmass(1:npl)) + Gmtot = cb%Gmass + sum(pl%Gmass(1:npl)) do i = 1, NDIM - cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vh(i, 1:npl)) / msys + cb%vb(i) = -sum(pl%Gmass(1:npl) * pl%vh(i, 1:npl)) / Gmtot pl%vb(i, 1:npl) = pl%vh(i, 1:npl) + cb%vb(i) end do end associate diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fdb2360ee..c30947d68 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -259,7 +259,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 - real(DP) :: msys = 0.0_DP !! Total system mass - used for barycentric coordinate conversion + real(DP) :: Gmtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion real(DP) :: ke = 0.0_DP !! System kinetic energy real(DP) :: pe = 0.0_DP !! System potential energy real(DP) :: te = 0.0_DP !! System total energy diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 92caa0bb3..c60b2a838 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -94,6 +94,7 @@ module symba_classes procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle procedure :: append => symba_util_append_pl !! Appends elements from one structure to another procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) + procedure :: get_peri => symba_util_peri_pl !! Determine system pericenter passages for massive bodies procedure :: resize => symba_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods @@ -479,6 +480,14 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps end subroutine symba_util_fill_tp + + module subroutine symba_util_peri_pl(self, system, param) + use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_util_peri_pl end interface interface util_resize diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 7d15d996b..a84e158d3 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -2,62 +2,6 @@ use swiftest contains - module subroutine symba_discard_pl(self, system, param) - !! author: David A. Minton - !! - !! Call the various flavors of discards for massive bodies in SyMBA runs, including discards due to colling with the central body, - !! escaping the system, or colliding with each other. - implicit none - ! Arguments - 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(in) :: param !! Current run configuration parameters - - call symba_discard_nonplpl(self, system, param) - - select type(param) - class is (symba_parameters) - if (param%lfragmentation) then - - end if - - end select - - return - end subroutine symba_discard_pl - - subroutine symba_discard_nonplpl(pl, system, param) - !! author: David A. Minton - !! - !! Check to see if planets should be discarded based on their positions or because they are unbound - !s - !! - !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_pl.f90 - !! Adapted from Hal Levison's Swift routine discard_massive5.f - implicit none - ! Arguments - class(symba_pl), intent(inout) :: pl !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - - ! First check for collisions with the central body - associate(npl => pl%nbody, cb => system%cb) - if (npl == 0) return - if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. & - (param%rmaxu >= 0.0_DP) .or. ((param%qmin >= 0.0_DP) .and. (param%qmin_coord == "BARY"))) then - call pl%h2b(cb) - end if - if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) then - call symba_discard_cb_pl(pl, system, param) - end if - if (param%qmin >= 0.0_DP .and. npl > 0) call symba_discard_peri_pl(pl, system, param) - end associate - - return - end subroutine symba_discard_nonplpl - - - subroutine symba_discard_cb_pl(pl, system, param) !! author: David A. Minton !! @@ -98,7 +42,7 @@ subroutine symba_discard_cb_pl(pl, system, param) else if (param%rmaxu >= 0.0_DP) then rb2 = dot_product(pl%xb(:,i), pl%xb(:,i)) vb2 = dot_product(pl%vb(:,i), pl%vb(:,i)) - energy = 0.5_DP * vb2 - system%msys / sqrt(rb2) + energy = 0.5_DP * vb2 - system%Gmtot / sqrt(rb2) if ((energy > 0.0_DP) .and. (rb2 > rmaxu2)) then pl%ldiscard(i) = .true. pl%lcollision(i) = .false. @@ -114,19 +58,104 @@ subroutine symba_discard_cb_pl(pl, system, param) end subroutine symba_discard_cb_pl + subroutine symba_discard_nonplpl(pl, system, param) + !! author: David A. Minton + !! + !! Check to see if planets should be discarded based on their positions or because they are unbound + !s + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_pl.f90 + !! Adapted from Hal Levison's Swift routine discard_massive5.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + ! First check for collisions with the central body + associate(npl => pl%nbody, cb => system%cb) + if (npl == 0) return + if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. & + (param%rmaxu >= 0.0_DP) .or. ((param%qmin >= 0.0_DP) .and. (param%qmin_coord == "BARY"))) then + call pl%h2b(cb) + end if + if ((param%rmin >= 0.0_DP) .or. (param%rmax >= 0.0_DP) .or. (param%rmaxu >= 0.0_DP)) then + call symba_discard_cb_pl(pl, system, param) + end if + if (param%qmin >= 0.0_DP .and. npl > 0) call symba_discard_peri_pl(pl, system, param) + end associate + + return + end subroutine symba_discard_nonplpl + + subroutine symba_discard_peri_pl(pl, system, param) !! author: David A. Minton !! !! Check to see if a test particle should be discarded because its perihelion distance becomes too small !! - !! Adapted from David E. Kaufmann's Swifter routine: discard_peri.f90 - !! Adapted from Hal Levison's Swift routine discard_peri.f + !! Adapted from David E. Kaufmann's Swifter routine: symba_discard_peri_pl.f90 + !! Adapted from Hal Levison's Swift routine discard_mass_peri.f implicit none ! Arguments class(symba_pl), intent(inout) :: pl !! SyMBA massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + logical, save :: lfirst = .true. + logical :: lfirst_orig + integer(I4B) :: i + + + lfirst_orig = pl%lfirst + pl%lfirst = lfirst + if (lfirst) then + call pl%get_peri(system, param) + lfirst = .false. + else + call pl%get_peri(system, param) + do i = 1, pl%nbody + if (pl%status(i) == ACTIVE) then + if ((pl%isperi(i) == 0) .and. (pl%nplenc(i)== 0)) then + if ((pl%atp(i) >= param%qmin_alo) .and. (pl%atp(i) <= param%qmin_ahi) .and. (pl%peri(i) <= param%qmin)) then + pl%ldiscard(i) = .true. + pl%lcollision(i) = .false. + pl%status(i) = DISCARDED_PERI + write(*, *) "Particle ", pl%id(i), " perihelion distance too small at t = ", param%t + end if + end if + end if + end do + end if + pl%lfirst = lfirst_orig + return + end subroutine symba_discard_peri_pl + + module subroutine symba_discard_pl(self, system, param) + !! author: David A. Minton + !! + !! Call the various flavors of discards for massive bodies in SyMBA runs, including discards due to colling with the central body, + !! escaping the system, or colliding with each other. + implicit none + ! Arguments + 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(in) :: param !! Current run configuration parameters + + call symba_discard_nonplpl(self, system, param) + + select type(param) + class is (symba_parameters) + if (param%lfragmentation) then + + end if + + end select + + return + end subroutine symba_discard_pl + end submodule s_symba_discard \ No newline at end of file diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index feda27a07..7050bf050 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -271,6 +271,92 @@ module subroutine symba_util_fill_tp(self, inserts, lfill_list) end subroutine symba_util_fill_tp + module subroutine symba_util_peri_pl(self, system, param) + !! author: David A. Minton + !! + !! Determine system pericenter passages for planets in SyMBA + !! + !! Adapted from David E. Kaufmann's Swifter routine: symba_peri.f90 + !! Adapted from Hal Levison's Swift routine util_mass_peri.f + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i + real(DP) :: vdotr, e + + associate(pl => self, npl => self%nbody) + if (pl%lfirst) then + if (param%qmin_coord == "HELIO") then + do i = 1, npl + if (pl%status(i) == ACTIVE) then + vdotr = dot_product(pl%xh(:,i), pl%vh(:,i)) + if (vdotr > 0.0_DP) then + pl%isperi(i) = 1 + else + pl%isperi(i) = -1 + end if + end if + end do + else + do i = 1, npl + if (pl%status(i) == ACTIVE) then + vdotr = dot_product(pl%xb(:,i), pl%vb(:,i)) + if (vdotr > 0.0_DP) then + pl%isperi(i) = 1 + else + pl%isperi(i) = -1 + end if + end if + end do + end if + else + if (param%qmin_coord == "HELIO") then + do i = 1, npl + if (pl%status(i) == ACTIVE) then + vdotr = dot_product(pl%xh(:,i), pl%vh(:,i)) + if (pl%isperi(i) == -1) then + if (vdotr >= 0.0_DP) then + pl%isperi(i) = 0 + CALL orbel_xv2aeq(pl%mu(i), pl%xh(:,i), pl%vh(:,i), pl%atp(i), e, pl%peri(i)) + end if + else + if (vdotr > 0.0_DP) then + pl%isperi(i) = 1 + else + pl%isperi(i) = -1 + end if + end if + end if + end do + else + do i = 1, npl + if (pl%status(i) == ACTIVE) then + vdotr = dot_product(pl%xb(:,i), pl%vb(:,i)) + if (pl%isperi(i) == -1) then + if (vdotr >= 0.0_DP) then + pl%isperi(i) = 0 + CALL orbel_xv2aeq(system%Gmtot, pl%xb(:,i), pl%vb(:,i), pl%atp(i), e, pl%peri(i)) + end if + else + if (vdotr > 0.0_DP) then + pl%isperi(i) = 1 + else + pl%isperi(i) = -1 + end if + end if + end if + end do + end if + end if + end associate + + return + end subroutine symba_util_peri_pl + + module subroutine symba_util_resize_arr_info(arr, nnew) !! author: David A. Minton !! @@ -385,6 +471,7 @@ module subroutine symba_util_resize_tp(self, nnew) return end subroutine symba_util_resize_tp + module subroutine symba_util_sort_pl(self, sortby, ascending) !! author: David A. Minton !! diff --git a/src/util/util_coord.f90 b/src/util/util_coord.f90 index ab5fe85df..c10dbace7 100644 --- a/src/util/util_coord.f90 +++ b/src/util/util_coord.f90 @@ -15,21 +15,21 @@ module subroutine util_coord_h2b_pl(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object ! Internals integer(I4B) :: i - real(DP) :: msys + real(DP) :: Gmtot real(DP), dimension(NDIM) :: xtmp, vtmp if (self%nbody == 0) return associate(pl => self, npl => self%nbody) - msys = cb%Gmass + Gmtot = cb%Gmass xtmp(:) = 0.0_DP vtmp(:) = 0.0_DP do i = 1, npl - msys = msys + pl%Gmass(i) + Gmtot = Gmtot + pl%Gmass(i) xtmp(:) = xtmp(:) + pl%Gmass(i) * pl%xh(:,i) vtmp(:) = vtmp(:) + pl%Gmass(i) * pl%vh(:,i) end do - cb%xb(:) = -xtmp(:) / msys - cb%vb(:) = -vtmp(:) / msys + cb%xb(:) = -xtmp(:) / Gmtot + cb%vb(:) = -vtmp(:) / Gmtot do i = 1, npl pl%xb(:,i) = pl%xh(:,i) + cb%xb(:) pl%vb(:,i) = pl%vh(:,i) + cb%vb(:) diff --git a/src/util/util_peri.f90 b/src/util/util_peri.f90 index 407ee5097..66f2254e1 100644 --- a/src/util/util_peri.f90 +++ b/src/util/util_peri.f90 @@ -45,7 +45,7 @@ module subroutine util_peri_tp(self, system, param) if (tp%isperi(i) == -1) then if (vdotr(i) >= 0.0_DP) then tp%isperi(i) = 0 - call orbel_xv2aeq(system%msys, tp%xb(:, i), tp%vb(:, i), tp%atp(i), e, tp%peri(i)) + call orbel_xv2aeq(system%Gmtot, tp%xb(:, i), tp%vb(:, i), tp%atp(i), e, tp%peri(i)) end if else if (vdotr(i) > 0.0_DP) then diff --git a/src/util/util_set.f90 b/src/util/util_set.f90 index a1c4075b6..86e021ab6 100644 --- a/src/util/util_set.f90 +++ b/src/util/util_set.f90 @@ -62,7 +62,7 @@ module subroutine util_set_msys(self) ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nobdy system object - self%msys = self%cb%Gmass + sum(self%pl%Gmass(1:self%pl%nbody), self%pl%status(1:self%pl%nbody) /= INACTIVE) + self%Gmtot = self%cb%Gmass + sum(self%pl%Gmass(1:self%pl%nbody), self%pl%status(1:self%pl%nbody) /= INACTIVE) return end subroutine util_set_msys From 9f5621c653294a87eea7732c75775ae045878276 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 10:46:43 -0400 Subject: [PATCH 169/194] Wrote template for an encounter scrub method that will make use of part of the code in the symba_collision.f90 subroutine in the current Fragmentation branch --- src/modules/symba_classes.f90 | 10 +++++++++- src/symba/symba_collision.f90 | 16 ++++++++++++++++ src/symba/symba_discard.f90 | 14 +++++--------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index c60b2a838..ee032c7f3 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -142,6 +142,7 @@ module symba_classes !> SyMBA class for tracking pl-pl close encounters in a step type, extends(symba_pltpenc) :: symba_plplenc contains + procedure :: scrub_non_collision => symba_collision_encounter_scrub !! Processes the pl-pl encounter list remove only those encounters that led to a collisio end type symba_plplenc !******************************************************************************************************************************** @@ -175,6 +176,13 @@ module subroutine symba_collision_check_pltpenc(self, system, param, t, dt, irec integer(I4B), intent(in) :: irec !! Current recursion level end subroutine symba_collision_check_pltpenc + module subroutine symba_collision_encounter_scrub(self, system, param) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameterss + end subroutine + module subroutine symba_collision_make_family_pl(self,idx) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object @@ -259,7 +267,7 @@ end subroutine symba_io_dump_particle_info module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) implicit none - class(symba_parameters), intent(inout) :: self !! Collection of parameters + class(symba_parameters), intent(inout) :: self !! Collection of SyMBA parameters integer, intent(in) :: unit !! File unit number character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. !! If you do not include a char-literal-constant, the iotype argument contains only DT. diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 66aa1ef30..5cc886485 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -204,4 +204,20 @@ module subroutine symba_collision_make_family_pl(self, idx) return end subroutine symba_collision_make_family_pl + module subroutine symba_collision_encounter_scrub(self, system, param) + !! author: David A. Minton + !! + !! Processes the pl-pl encounter list remove only those encounters that led to a collision + !! + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + + return + end subroutine + + end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index a84e158d3..f5e397548 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -144,15 +144,11 @@ 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(in) :: param !! Current run configuration parameters - - call symba_discard_nonplpl(self, system, param) - - select type(param) - class is (symba_parameters) - if (param%lfragmentation) then - - end if - + + select type(system) + class is (symba_nbody_system) + call symba_discard_nonplpl(self, system, param) + call system%plplenc_list%scrub_non_collision(system, param) end select return From 15c1d9c46a02cafc0257bda1332aba5c69456483 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 12:17:22 -0400 Subject: [PATCH 170/194] Added in code for scrubbing out the non-colliding encounters from the plplenc_list object --- src/modules/swiftest_classes.f90 | 15 ++++-- src/modules/symba_classes.f90 | 18 ++++--- src/symba/symba_collision.f90 | 84 ++++++++++++++++++++++++++------ src/symba/symba_util.f90 | 48 ++++++++++-------- src/util/util_resize.f90 | 3 ++ src/util/util_spill.f90 | 33 +++++++++++++ 6 files changed, 155 insertions(+), 46 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index c30947d68..0fe43e391 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -297,9 +297,10 @@ module swiftest_classes real(DP), dimension(:,:), allocatable :: v1 !! the velocity of body 1 in the encounter real(DP), dimension(:,:), allocatable :: v2 !! the velocity of body 2 in the encounter contains - procedure :: copy => util_copy_encounter - procedure :: resize => util_resize_encounter - procedure :: setup => setup_encounter + procedure :: setup => setup_encounter !! A constructor that sets the number of encounters and allocates and initializes all arrays + procedure :: copy => util_copy_encounter !! Copies elements from the source encounter list into self. + procedure :: spill => util_spill_encounter !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) + procedure :: resize => util_resize_encounter !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. end type swiftest_encounter abstract interface @@ -1152,6 +1153,14 @@ module subroutine util_spill_body(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_body + module subroutine util_spill_encounter(self, discards, lspill_list, ldestructive) + implicit none + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list + class(swiftest_encounter), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + end subroutine util_spill_encounter + module subroutine util_spill_pl(self, discards, lspill_list, ldestructive) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index ee032c7f3..d682020ae 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -133,7 +133,7 @@ module symba_classes procedure :: encounter_check => symba_encounter_check_pltpenc !! Checks if massive bodies are going through close encounters with each other procedure :: kick => symba_kick_pltpenc !! Kick barycentric velocities of active test particles within SyMBA recursion procedure :: setup => symba_setup_pltpenc !! A constructor that sets the number of encounters and allocates and initializes all arrays - procedure :: copy => symba_util_copy_pltpenc !! Copies all elements of one pltpenc list to another + procedure :: spill => symba_util_spill_pltpenc !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_pltpenc !******************************************************************************************************************************** @@ -447,13 +447,6 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) 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 end subroutine symba_util_append_tp - - module subroutine symba_util_copy_pltpenc(self, source) - use swiftest_classes, only : swiftest_encounter - implicit none - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(swiftest_encounter), intent(in) :: source !! Source object to copy into - end subroutine symba_util_copy_pltpenc end interface interface util_fill @@ -580,6 +573,15 @@ module subroutine symba_util_spill_pl(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 symba_util_spill_pl + module subroutine symba_util_spill_pltpenc(self, discards, lspill_list, ldestructive) + use swiftest_classes, only : swiftest_encounter + implicit none + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(swiftest_encounter), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + end subroutine symba_util_spill_pltpenc + module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) use swiftest_classes, only : swiftest_body implicit none diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 5cc886485..739ca9778 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -143,6 +143,74 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt end function symba_collision_check_one + module subroutine symba_collision_encounter_scrub(self, system, param) + !! author: David A. Minton + !! + !! Processes the pl-pl encounter list remove only those encounters that led to a collision + !! + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + logical, dimension(self%nenc) :: lplpl_collision + logical, dimension(:), allocatable :: lplpl_unique_parent + integer(I4B), dimension(:), pointer :: plparent + integer(I4B), dimension(:), allocatable :: collision_idx, unique_parent_idx + integer(I4B) :: i, index_coll, ncollisions, nunique_parent + type(symba_plplenc) :: plplenc_noncollision + + + select type (pl => system%pl) + class is (symba_pl) + associate(plplenc_list => self, nplplenc => self%nenc, idx1 => self%index1, idx2 => self%index2, plparent => pl%kin%parent) + lplpl_collision(:) = plplenc_list%status(1:nplplenc) == COLLISION + if (.not.any(lplpl_collision)) return + + ! Get the subset of pl-pl encounters that lead to a collision + ncollisions = count(lplpl_collision(:)) + allocate(collision_idx(ncollisions)) + collision_idx = pack([(i, i=1, nplplenc)], lplpl_collision) + + ! Get the subset of collisions that involve a unique pair of parents + allocate(lplpl_unique_parent(ncollisions)) + + lplpl_unique_parent(:) = plparent(idx1(collision_idx(:))) /= plparent(idx2(collision_idx(:))) + nunique_parent = count(lplpl_unique_parent(:)) + allocate(unique_parent_idx(nunique_parent)) + unique_parent_idx = pack(collision_idx(:), lplpl_unique_parent(:)) + + ! Scrub all pl-pl collisions involving unique pairs of parents, which will remove all duplicates and leave behind + ! all pairs that have themselves as parents but are not part of the unique parent list. This can hapepn in rare cases + ! due to restructuring of parent/child relationships when there are large numbers of multi-body collisions in a single + ! step + lplpl_unique_parent(:) = .true. + do index_coll = 1, ncollisions + associate(ip1 => plparent(idx1(collision_idx(index_coll))), ip2 => plparent(idx2(collision_idx(index_coll)))) + lplpl_unique_parent(:) = .not. ( any(plparent(idx1(unique_parent_idx(:))) == ip1) .or. & + any(plparent(idx2(unique_parent_idx(:))) == ip1) .or. & + any(plparent(idx1(unique_parent_idx(:))) == ip2) .or. & + any(plparent(idx2(unique_parent_idx(:))) == ip2) ) + end associate + end do + + ! Reassemble collision index list to include only those containing the unique pairs of parents, plus all the non-unique pairs that don't + ! contain a parent body on the unique parent list. + ncollisions = nunique_parent + count(lplpl_unique_parent) + collision_idx = [unique_parent_idx(:), pack(collision_idx(:), lplpl_unique_parent(:))] + + ! Create a mask that contains only the pl-pl encounters that did not result in a collision, and then discard them + lplpl_collision(:) = .true. + lplpl_collision(collision_idx(:)) = .false. + call plplenc_list%spill(plplenc_noncollision, lplpl_collision, ldestructive = .true.) + end associate + end select + + return + end subroutine symba_collision_encounter_scrub + + module subroutine symba_collision_make_family_pl(self, idx) !! author: Jennifer L.L. Pouplin, Carlisle A. wishard, and David A. Minton !! @@ -204,20 +272,4 @@ module subroutine symba_collision_make_family_pl(self, idx) return end subroutine symba_collision_make_family_pl - module subroutine symba_collision_encounter_scrub(self, system, param) - !! author: David A. Minton - !! - !! Processes the pl-pl encounter list remove only those encounters that led to a collision - !! - implicit none - ! Arguments - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list - class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - - return - end subroutine - - end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 7050bf050..56eaacc2c 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -142,25 +142,6 @@ module subroutine symba_util_append_tp(self, source, lsource_mask) return end subroutine symba_util_append_tp - module subroutine symba_util_copy_pltpenc(self, source) - !! author: David A. Minton - !! - !! Copies elements from the source encounter list into self. - implicit none - ! Arguments - class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list - class(swiftest_encounter), intent(in) :: source !! Source object to copy into - - call util_copy_encounter(self, source) - associate(n => source%nenc) - select type(source) - class is (symba_pltpenc) - self%level(1:n) = source%level(1:n) - end select - end associate - - return - end subroutine symba_util_copy_pltpenc module subroutine symba_util_fill_arr_info(keeps, inserts, lfill_list) !! author: David A. Minton @@ -730,6 +711,35 @@ module subroutine symba_util_spill_pl(self, discards, lspill_list, ldestructive) end subroutine symba_util_spill_pl + module subroutine symba_util_spill_pltpenc(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) SyMBA encounter structure from active list to discard list + !! Note: Because the symba_plplenc currently does not contain any additional variable components, this method can recieve it as an input as well. + implicit none + ! Arguments + class(symba_pltpenc), intent(inout) :: self !! SyMBA pl-tp encounter list + class(swiftest_encounter), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + ! Internals + integer(I4B) :: i + + associate(keeps => self) + select type(discards) + class is (symba_pltpenc) + call util_spill(keeps%level, discards%level, lspill_list, ldestructive) + call util_spill_encounter(keeps, discards, lspill_list, ldestructive) + class default + write(*,*) "Invalid object passed to the spill method. Source must be of class symba_pltpenc or its descendents!" + call util_exit(FAILURE) + end select + end associate + + return + end subroutine symba_util_spill_pltpenc + + module subroutine symba_util_spill_tp(self, discards, lspill_list, ldestructive) !! author: David A. Minton !! diff --git a/src/util/util_resize.f90 b/src/util/util_resize.f90 index 3772a8207..c6d5aa34f 100644 --- a/src/util/util_resize.f90 +++ b/src/util/util_resize.f90 @@ -211,6 +211,9 @@ module subroutine util_resize_encounter(self, nnew) !! author: David A. Minton !! !! Checks the current size of the encounter list against the required size and extends it by a factor of 2 more than requested if it is too small. + !! Note: The reason to extend it by a factor of 2 is for performance. When there are many enounters per step, resizing every time you want to add an + !! encounter takes significant computational effort. Resizing by a factor of 2 is a tradeoff between performance (fewer resize calls) and memory managment + !! Memory usage grows by a factor of 2 each time it fills up, but no more. implicit none ! Arguments class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 5f942854a..fc945765c 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -194,6 +194,39 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) return end subroutine util_spill_body + module subroutine util_spill_encounter(self, discards, lspill_list, ldestructive) + !! author: David A. Minton + !! + !! Move spilled (discarded) Swiftest encounter structure from active list to discard list + implicit none + ! Arguments + class(swiftest_encounter), intent(inout) :: self !! Swiftest encounter list + class(swiftest_encounter), intent(inout) :: discards !! Discarded object + logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards + logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter body by removing the discard list + ! Internals + integer(I4B) :: i + + associate(keeps => self) + + call util_spill(keeps%lvdotr, discards%lvdotr, lspill_list, ldestructive) + call util_spill(keeps%status, discards%status, lspill_list, ldestructive) + call util_spill(keeps%index1, discards%index1, lspill_list, ldestructive) + call util_spill(keeps%index2, discards%index2, lspill_list, ldestructive) + call util_spill(keeps%x1, discards%x1, lspill_list, ldestructive) + call util_spill(keeps%x2, discards%x2, lspill_list, ldestructive) + call util_spill(keeps%v1, discards%v1, lspill_list, ldestructive) + call util_spill(keeps%v2, discards%v2, 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 nenc values for both the keeps and discareds + discards%nenc = count(lspill_list(:)) + keeps%nenc = count(.not.lspill_list(:)) + end associate + + return + end subroutine util_spill_encounter + module subroutine util_spill_pl(self, discards, lspill_list, ldestructive) !! author: David A. Minton From fdd2cf9ec24c4860f597152705135594007d3c0b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 12:33:10 -0400 Subject: [PATCH 171/194] Added in template methods for resolving fragmentations and mergers --- src/modules/symba_classes.f90 | 18 +++++++++++++++++- src/symba/symba_collision.f90 | 32 ++++++++++++++++++++++++++++++++ src/symba/symba_discard.f90 | 15 +++++++++++++-- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index d682020ae..88c973aee 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -142,7 +142,9 @@ module symba_classes !> SyMBA class for tracking pl-pl close encounters in a step type, extends(symba_pltpenc) :: symba_plplenc contains - procedure :: scrub_non_collision => symba_collision_encounter_scrub !! Processes the pl-pl encounter list remove only those encounters that led to a collisio + procedure :: scrub_non_collision => symba_collision_encounter_scrub !! Processes the pl-pl encounter list remove only those encounters that led to a collision + procedure :: resolve_fragmentations => symba_collision_resolve_fragmentations !! Process list of collisions, determine the collisional regime, and then create fragments + procedure :: resolve_mergers => symba_collision_resolve_mergers !! Process list of collisions and merge colliding bodies together end type symba_plplenc !******************************************************************************************************************************** @@ -189,6 +191,20 @@ module subroutine symba_collision_make_family_pl(self,idx) integer(I4B), dimension(2), intent(in) :: idx !! Array holding the indices of the two bodies involved in the collision end subroutine symba_collision_make_family_pl + module subroutine symba_collision_resolve_fragmentations(self, system, param) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions + end subroutine symba_collision_resolve_fragmentations + + module subroutine symba_collision_resolve_mergers(self, system, param) + implicit none + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions + end subroutine symba_collision_resolve_mergers + module subroutine symba_discard_pl(self, system, param) use swiftest_classes, only : swiftest_nbody_system, swiftest_parameters implicit none diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 739ca9778..11175fe3a 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -272,4 +272,36 @@ module subroutine symba_collision_make_family_pl(self, idx) return end subroutine symba_collision_make_family_pl + + module subroutine symba_collision_resolve_fragmentations(self, system, param) + !! author: David A. Minton + !! + !! Process list of collisions, determine the collisional regime, and then create fragments. + !! + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions + ! Internals + + return + end subroutine symba_collision_resolve_fragmentations + + + module subroutine symba_collision_resolve_mergers(self, system, param) + !! author: David A. Minton + !! + !! Process list of collisions and merge colliding bodies together. + !! + implicit none + ! Arguments + class(symba_plplenc), intent(inout) :: self !! SyMBA pl-pl encounter list + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions + ! Internals + + return + end subroutine symba_collision_resolve_mergers + end submodule s_symba_collision \ No newline at end of file diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index f5e397548..57b26e8ea 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -147,8 +147,19 @@ module subroutine symba_discard_pl(self, system, param) select type(system) class is (symba_nbody_system) - call symba_discard_nonplpl(self, system, param) - call system%plplenc_list%scrub_non_collision(system, param) + select type(param) + class is (symba_parameters) + associate(pl => self, plplenc_list => system%plplenc_list) + call symba_discard_nonplpl(self, system, param) + call plplenc_list%scrub_non_collision(system, param) + call pl%h2b(system%cb) + if (param%lfragmentation) then + call plplenc_list%resolve_fragmentations(system, param) + else + call plplenc_list%resolve_mergers(system, param) + end if + end associate + end select end select return From 8c8c8a0d400cf92b89055a05298bce81815f116b Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 13:24:28 -0400 Subject: [PATCH 172/194] Added in the family consolidation code --- src/symba/symba_collision.f90 | 118 ++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 11175fe3a..13c874b0f 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -143,6 +143,124 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt end function symba_collision_check_one + function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, radius, L_spin, Ip) result(lflag) + !! author: David A. Minton + !! + !! Loops through the pl-pl collision list and groups families together by index. Outputs the indices of all family members, + !! and pairs of quantities (x and v vectors, mass, radius, L_spin, and Ip) that can be used to resolve the collisional outcome. + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA massive body object + integer(I4B), dimension(2), intent(inout) :: idx_parent !! Index of the two bodies considered the "parents" of the collision + integer(I4B), dimension(:), allocatable, intent(out) :: family !! List of indices of all bodies inovlved in the collision + real(DP), dimension(NDIM,2), intent(out) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(2), intent(out) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + ! Result + logical :: lflag !! Logical flag indicating whether a family was successfully created or not + ! Internals + type family_array + integer(I4B), dimension(:), allocatable :: id + integer(I4B), dimension(:), allocatable :: idx + end type family_array + type(family_array), dimension(2) :: parent_child_index_array + integer(I4B), dimension(2) :: nchild + integer(I4B) :: i, j, fam_size, idx_child + real(DP), dimension(2) :: volume, density + real(DP) :: mchild, mtot, volchild + real(DP), dimension(NDIM) :: xc, vc, xcom, vcom, xchild, vchild, xcrossv + + nchild(:) = pl%kin(idx_parent(:))%nchild + ! If all of these bodies share a parent, but this is still a unique collision, move the last child + ! out of the parent's position and make it the secondary body + if (idx_parent(1) == idx_parent(2)) then + if (nchild(1) == 0) then ! There is only one valid body recorded in this pair (this could happen due to restructuring of the kinship relationships, though it should be rare) + lflag = .false. + return + end if + idx_parent(2) = pl%kin(idx_parent(1))%child(nchild(1)) + nchild(1) = nchild(1) - 1 + nchild(2) = 0 + pl%kin(idx_parent(:))%nchild = nchild(:) + pl%kin(idx_parent(2))%parent = idx_parent(1) + end if + + mass(:) = pl%mass(idx_parent(:)) ! Note: This is meant to mass, not G*mass, as the collisional regime determination uses mass values that will be converted to Si + radius(:) = pl%radius(idx_parent(:)) + volume(:) = (4.0_DP / 3.0_DP) * PI * radius(:)**3 + + ! Group together the ids and indexes of each collisional parent and its children + do j = 1, 2 + allocate(parent_child_index_array(j)%idx(nchild(j)+ 1)) + allocate(parent_child_index_array(j)%id(nchild(j)+ 1)) + associate(idx_arr => parent_child_index_array(j)%idx, & + id_arr => parent_child_index_array(j)%id, & + ncj => nchild(j), & + pl => pl, & + plkinj => pl%kin(idx_parent(j))) + idx_arr(1) = idx_parent(j) + if (ncj > 0) idx_arr(2:ncj + 1) = plkinj%child(1:ncj) + id_arr(:) = pl%id(idx_arr(:)) + end associate + end do + + ! Consolidate the groups of collsional parents with any children they may have into a single "family" index array + fam_size = 2 + sum(nchild(:)) + allocate(family(fam_size)) + family = [parent_child_index_array(1)%idx(:),parent_child_index_array(2)%idx(:)] + fam_size = count(pl%status(family(:)) == ACTIVE) + family = pack(family(:), pl%status(family(:)) == ACTIVE) + + ! Find the barycenter of each body along with its children, if it has any + do j = 1, 2 + x(:, j) = pl%xb(:, idx_parent(j)) + v(:, j) = pl%vb(:, idx_parent(j)) + Ip(:, j) = mass(j) * pl%Ip(:, idx_parent(j)) + ! Assume principal axis rotation about axis corresponding to highest moment of inertia (3rd Ip) + L_spin(:, j) = Ip(3, j) * radius(j)**2 * pl%rot(:, idx_parent(j)) + + ! Use conservation of energy and angular momentum to adjust velocities and distances to be those equivalent to where they would be when the mutual radii are touching + !call vector_adjust(mass(j), x(:,j), v(:,j)) + if (nchild(j) > 0) then + do i = 1, nchild(j) ! Loop over all children and take the mass weighted mean of the properties + idx_child = parent_child_index_array(j)%idx(i + 1) + if ((idx_child) /= COLLISION) cycle + mchild = pl%Gmass(idx_child) + xchild(:) = pl%xb(:, idx_child) + vchild(:) = pl%vb(:, idx_child) + volchild = (4.0_DP / 3.0_DP) * PI * pl%radius(idx_child)**3 + volume(j) = volume(j) + volchild + ! Get angular momentum of the child-parent pair and add that to the spin + xcom(:) = (mass(j) * x(:,j) + mchild * xchild(:)) / (mass(j) + mchild) + vcom(:) = (mass(j) * v(:,j) + mchild * vchild(:)) / (mass(j) + mchild) + xc(:) = x(:, j) - xcom(:) + vc(:) = v(:, j) - vcom(:) + xcrossv(:) = xc(:) .cross. vc(:) + L_spin(:, j) = L_spin(:, j) + mass(j) * xcrossv(:) + + xc(:) = xchild(:) - xcom(:) + vc(:) = vchild(:) - vcom(:) + xcrossv(:) = xc(:) .cross. vc(:) + L_spin(:, j) = L_spin(:, j) + mchild * xcrossv(:) + + ! Add the child's spin + L_spin(:, j) = L_spin(:, j) + mchild * pl%Ip(3, idx_child) * pl%radius(idx_child)**2 * pl%rot(:, idx_child) + + ! Merge the child and parent + mass(j) = mass(j) + mchild + x(:, j) = xcom(:) + v(:, j) = vcom(:) + Ip(:, j) = Ip(:, j) + mchild * pl%Ip(:, idx_child) + end do + end if + density(j) = mass(j) / volume(j) + radius(j) = ((3 * mass(j)) / (density(j) * 4 * pi))**(1.0_DP / 3.0_DP) + Ip(:, j) = Ip(:, j) / mass(j) + end do + lflag = .true. + + return + end function symba_collision_consolidate_familes + module subroutine symba_collision_encounter_scrub(self, system, param) !! author: David A. Minton !! From 96e31703c93e57eb282d49d534f60d7b72b37c41 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 14:59:37 -0400 Subject: [PATCH 173/194] Added start of merger resolving code --- src/modules/symba_classes.f90 | 4 +-- src/symba/symba_collision.f90 | 61 ++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 88c973aee..45b5acfbc 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -283,7 +283,7 @@ end subroutine symba_io_dump_particle_info module subroutine symba_io_param_reader(self, unit, iotype, v_list, iostat, iomsg) implicit none - class(symba_parameters), intent(inout) :: self !! Collection of SyMBA parameters + class(symba_parameters), intent(inout) :: self !! Current run configuration parameters with SyMBA additionss integer, intent(in) :: unit !! File unit number character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. !! If you do not include a char-literal-constant, the iotype argument contains only DT. @@ -294,7 +294,7 @@ end subroutine symba_io_param_reader module subroutine symba_io_param_writer(self, unit, iotype, v_list, iostat, iomsg) implicit none - class(symba_parameters),intent(in) :: self !! Collection of SyMBA parameters + class(symba_parameters),intent(in) :: self !! Current run configuration parameters with SyMBA additions integer, intent(in) :: unit !! File unit number character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. !! If you do not include a char-literal-constant, the iotype argument contains only DT. diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 13c874b0f..edb02dee5 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -143,7 +143,7 @@ pure elemental function symba_collision_check_one(xr, yr, zr, vxr, vyr, vzr, Gmt end function symba_collision_check_one - function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, radius, L_spin, Ip) result(lflag) + function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) result(lflag) !! author: David A. Minton !! !! Loops through the pl-pl collision list and groups families together by index. Outputs the indices of all family members, @@ -151,6 +151,7 @@ function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, implicit none ! Arguments class(symba_pl), intent(inout) :: pl !! SyMBA massive body object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions integer(I4B), dimension(2), intent(inout) :: idx_parent !! Index of the two bodies considered the "parents" of the collision integer(I4B), dimension(:), allocatable, intent(out) :: family !! List of indices of all bodies inovlved in the collision real(DP), dimension(NDIM,2), intent(out) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision @@ -209,6 +210,8 @@ function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, family = [parent_child_index_array(1)%idx(:),parent_child_index_array(2)%idx(:)] fam_size = count(pl%status(family(:)) == ACTIVE) family = pack(family(:), pl%status(family(:)) == ACTIVE) + L_spin(:,:) = 0.0_DP + Ip(:,:) = 0.0_DP ! Find the barycenter of each body along with its children, if it has any do j = 1, 2 @@ -216,10 +219,8 @@ function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, v(:, j) = pl%vb(:, idx_parent(j)) Ip(:, j) = mass(j) * pl%Ip(:, idx_parent(j)) ! Assume principal axis rotation about axis corresponding to highest moment of inertia (3rd Ip) - L_spin(:, j) = Ip(3, j) * radius(j)**2 * pl%rot(:, idx_parent(j)) + if (param%lrotation) L_spin(:, j) = Ip(3, j) * radius(j)**2 * pl%rot(:, idx_parent(j)) - ! Use conservation of energy and angular momentum to adjust velocities and distances to be those equivalent to where they would be when the mutual radii are touching - !call vector_adjust(mass(j), x(:,j), v(:,j)) if (nchild(j) > 0) then do i = 1, nchild(j) ! Loop over all children and take the mass weighted mean of the properties idx_child = parent_child_index_array(j)%idx(i + 1) @@ -230,31 +231,33 @@ function symba_collision_consolidate_familes(pl, idx_parent, family, x, v, mass, volchild = (4.0_DP / 3.0_DP) * PI * pl%radius(idx_child)**3 volume(j) = volume(j) + volchild ! Get angular momentum of the child-parent pair and add that to the spin - xcom(:) = (mass(j) * x(:,j) + mchild * xchild(:)) / (mass(j) + mchild) - vcom(:) = (mass(j) * v(:,j) + mchild * vchild(:)) / (mass(j) + mchild) - xc(:) = x(:, j) - xcom(:) - vc(:) = v(:, j) - vcom(:) - xcrossv(:) = xc(:) .cross. vc(:) - L_spin(:, j) = L_spin(:, j) + mass(j) * xcrossv(:) - - xc(:) = xchild(:) - xcom(:) - vc(:) = vchild(:) - vcom(:) - xcrossv(:) = xc(:) .cross. vc(:) - L_spin(:, j) = L_spin(:, j) + mchild * xcrossv(:) - ! Add the child's spin - L_spin(:, j) = L_spin(:, j) + mchild * pl%Ip(3, idx_child) * pl%radius(idx_child)**2 * pl%rot(:, idx_child) + if (param%lrotation) then + xcom(:) = (mass(j) * x(:,j) + mchild * xchild(:)) / (mass(j) + mchild) + vcom(:) = (mass(j) * v(:,j) + mchild * vchild(:)) / (mass(j) + mchild) + xc(:) = x(:, j) - xcom(:) + vc(:) = v(:, j) - vcom(:) + xcrossv(:) = xc(:) .cross. vc(:) + L_spin(:, j) = L_spin(:, j) + mass(j) * xcrossv(:) + + xc(:) = xchild(:) - xcom(:) + vc(:) = vchild(:) - vcom(:) + xcrossv(:) = xc(:) .cross. vc(:) + L_spin(:, j) = L_spin(:, j) + mchild * xcrossv(:) + + L_spin(:, j) = L_spin(:, j) + mchild * pl%Ip(3, idx_child) * pl%radius(idx_child)**2 * pl%rot(:, idx_child) + Ip(:, j) = Ip(:, j) + mchild * pl%Ip(:, idx_child) + end if ! Merge the child and parent mass(j) = mass(j) + mchild x(:, j) = xcom(:) v(:, j) = vcom(:) - Ip(:, j) = Ip(:, j) + mchild * pl%Ip(:, idx_child) end do end if density(j) = mass(j) / volume(j) radius(j) = ((3 * mass(j)) / (density(j) * 4 * pi))**(1.0_DP / 3.0_DP) - Ip(:, j) = Ip(:, j) / mass(j) + if (param%lrotation) Ip(:, j) = Ip(:, j) / mass(j) end do lflag = .true. @@ -418,6 +421,26 @@ module subroutine symba_collision_resolve_mergers(self, system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions ! Internals + integer(I4B) :: i + logical :: lgoodcollision + integer(I4B), dimension(:), allocatable :: family !! List of indices of all bodies inovlved in the collision + integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision + real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + + associate(plpl_collisions => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2) + select type(pl => system%pl) + class is (symba_pl) + do i = 1, ncollisions + idx_parent(1) = pl%kin(idx1(i))%parent + idx_parent(2) = pl%kin(idx2(i))%parent + lgoodcollision = symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) + if (.not. lgoodcollision) cycle + if (any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! One of these two bodies has already been resolved + !call symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + end do + end select + end associate return end subroutine symba_collision_resolve_mergers From 8ea46e177060fd3a73cdad57c0b15ea3b1147e5a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 15:19:36 -0400 Subject: [PATCH 174/194] Fixed some issues with masks in the encounter to collision scrub --- src/symba/symba_collision.f90 | 84 ++++++++++++++++++----------------- src/symba/symba_discard.f90 | 2 + src/util/util_spill.f90 | 9 ++-- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index edb02dee5..efae0ba39 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -217,9 +217,11 @@ function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v do j = 1, 2 x(:, j) = pl%xb(:, idx_parent(j)) v(:, j) = pl%vb(:, idx_parent(j)) - Ip(:, j) = mass(j) * pl%Ip(:, idx_parent(j)) ! Assume principal axis rotation about axis corresponding to highest moment of inertia (3rd Ip) - if (param%lrotation) L_spin(:, j) = Ip(3, j) * radius(j)**2 * pl%rot(:, idx_parent(j)) + if (param%lrotation) then + Ip(:, j) = mass(j) * pl%Ip(:, idx_parent(j)) + L_spin(:, j) = Ip(3, j) * radius(j)**2 * pl%rot(:, idx_parent(j)) + end if if (nchild(j) > 0) then do i = 1, nchild(j) ! Loop over all children and take the mass weighted mean of the properties @@ -282,49 +284,49 @@ module subroutine symba_collision_encounter_scrub(self, system, param) integer(I4B) :: i, index_coll, ncollisions, nunique_parent type(symba_plplenc) :: plplenc_noncollision - select type (pl => system%pl) class is (symba_pl) associate(plplenc_list => self, nplplenc => self%nenc, idx1 => self%index1, idx2 => self%index2, plparent => pl%kin%parent) lplpl_collision(:) = plplenc_list%status(1:nplplenc) == COLLISION - if (.not.any(lplpl_collision)) return - - ! Get the subset of pl-pl encounters that lead to a collision - ncollisions = count(lplpl_collision(:)) - allocate(collision_idx(ncollisions)) - collision_idx = pack([(i, i=1, nplplenc)], lplpl_collision) - - ! Get the subset of collisions that involve a unique pair of parents - allocate(lplpl_unique_parent(ncollisions)) - - lplpl_unique_parent(:) = plparent(idx1(collision_idx(:))) /= plparent(idx2(collision_idx(:))) - nunique_parent = count(lplpl_unique_parent(:)) - allocate(unique_parent_idx(nunique_parent)) - unique_parent_idx = pack(collision_idx(:), lplpl_unique_parent(:)) - - ! Scrub all pl-pl collisions involving unique pairs of parents, which will remove all duplicates and leave behind - ! all pairs that have themselves as parents but are not part of the unique parent list. This can hapepn in rare cases - ! due to restructuring of parent/child relationships when there are large numbers of multi-body collisions in a single - ! step - lplpl_unique_parent(:) = .true. - do index_coll = 1, ncollisions - associate(ip1 => plparent(idx1(collision_idx(index_coll))), ip2 => plparent(idx2(collision_idx(index_coll)))) - lplpl_unique_parent(:) = .not. ( any(plparent(idx1(unique_parent_idx(:))) == ip1) .or. & - any(plparent(idx2(unique_parent_idx(:))) == ip1) .or. & - any(plparent(idx1(unique_parent_idx(:))) == ip2) .or. & - any(plparent(idx2(unique_parent_idx(:))) == ip2) ) - end associate - end do - - ! Reassemble collision index list to include only those containing the unique pairs of parents, plus all the non-unique pairs that don't - ! contain a parent body on the unique parent list. - ncollisions = nunique_parent + count(lplpl_unique_parent) - collision_idx = [unique_parent_idx(:), pack(collision_idx(:), lplpl_unique_parent(:))] - - ! Create a mask that contains only the pl-pl encounters that did not result in a collision, and then discard them - lplpl_collision(:) = .true. - lplpl_collision(collision_idx(:)) = .false. - call plplenc_list%spill(plplenc_noncollision, lplpl_collision, ldestructive = .true.) + if (any(lplpl_collision)) then ! Collisions have been detected in this step. So we need to determine which of them are between unique bodies. + + ! Get the subset of pl-pl encounters that lead to a collision + ncollisions = count(lplpl_collision(:)) + allocate(collision_idx(ncollisions)) + collision_idx = pack([(i, i=1, nplplenc)], lplpl_collision) + + ! Get the subset of collisions that involve a unique pair of parents + allocate(lplpl_unique_parent(ncollisions)) + + lplpl_unique_parent(:) = plparent(idx1(collision_idx(:))) /= plparent(idx2(collision_idx(:))) + nunique_parent = count(lplpl_unique_parent(:)) + allocate(unique_parent_idx(nunique_parent)) + unique_parent_idx = pack(collision_idx(:), lplpl_unique_parent(:)) + + ! Scrub all pl-pl collisions involving unique pairs of parents, which will remove all duplicates and leave behind + ! all pairs that have themselves as parents but are not part of the unique parent list. This can hapepn in rare cases + ! due to restructuring of parent/child relationships when there are large numbers of multi-body collisions in a single + ! step + lplpl_unique_parent(:) = .true. + do index_coll = 1, ncollisions + associate(ip1 => plparent(idx1(collision_idx(index_coll))), ip2 => plparent(idx2(collision_idx(index_coll)))) + lplpl_unique_parent(:) = .not. ( any(plparent(idx1(unique_parent_idx(:))) == ip1) .or. & + any(plparent(idx2(unique_parent_idx(:))) == ip1) .or. & + any(plparent(idx1(unique_parent_idx(:))) == ip2) .or. & + any(plparent(idx2(unique_parent_idx(:))) == ip2) ) + end associate + end do + + ! Reassemble collision index list to include only those containing the unique pairs of parents, plus all the non-unique pairs that don't + ! contain a parent body on the unique parent list. + ncollisions = nunique_parent + count(lplpl_unique_parent) + collision_idx = [unique_parent_idx(:), pack(collision_idx(:), lplpl_unique_parent(:))] + + ! Create a mask that contains only the pl-pl encounters that did not result in a collision, and then discard them + lplpl_collision(:) = .false. + lplpl_collision(collision_idx(:)) = .true. + end if + call plplenc_list%spill(plplenc_noncollision, .not.lplpl_collision, ldestructive=.true.) ! Remove any encounters that are not collisions from the list. end associate end select diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 57b26e8ea..2fa789d46 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -152,6 +152,8 @@ module subroutine symba_discard_pl(self, system, param) associate(pl => self, plplenc_list => system%plplenc_list) call symba_discard_nonplpl(self, system, param) call plplenc_list%scrub_non_collision(system, param) + if (plplenc_list%nenc == 0) return ! No collisions to resolve + call pl%h2b(system%cb) if (param%lfragmentation) then call plplenc_list%resolve_fragmentations(system, param) diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index fc945765c..0cef49194 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -183,12 +183,8 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) ! 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(:)) - if (allocated(keeps%ldiscard)) deallocate(keeps%ldiscard) - if (allocated(discards%ldiscard)) deallocate(discards%ldiscard) - allocate(keeps%ldiscard(keeps%nbody)) - allocate(discards%ldiscard(discards%nbody)) - keeps%ldiscard = .false. - discards%ldiscard = .true. + if (keeps%nbody > size(keeps%status)) keeps%status(keeps%nbody+1:size(keeps%status)) = INACTIVE + end associate return @@ -222,6 +218,7 @@ module subroutine util_spill_encounter(self, discards, lspill_list, ldestructive ! Therefore we need to set the nenc values for both the keeps and discareds discards%nenc = count(lspill_list(:)) keeps%nenc = count(.not.lspill_list(:)) + if (keeps%nenc > size(keeps%status)) keeps%status(keeps%nenc+1:size(keeps%status)) = INACTIVE end associate return From cf2feb1ff886d238a476074c11bd27567591f35a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 16:56:41 -0400 Subject: [PATCH 175/194] Added merger code --- src/modules/rmvs_classes.f90 | 4 +- src/modules/symba_classes.f90 | 74 +++++++++++----- src/modules/whm_classes.f90 | 2 +- src/setup/setup.f90 | 4 +- src/symba/symba_collision.f90 | 18 ++-- src/symba/symba_discard.f90 | 1 + src/symba/symba_fragmentation.f90 | 135 ++++++++++++++++++++++++++++++ src/symba/symba_io.f90 | 54 ++++++------ src/symba/symba_setup.f90 | 26 ++++++ src/symba/symba_util.f90 | 50 ++++++++++- 10 files changed, 307 insertions(+), 61 deletions(-) create mode 100644 src/symba/symba_fragmentation.f90 diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index 315b098a8..fbbfa15fe 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -70,7 +70,7 @@ module rmvs_classes procedure :: encounter_check => rmvs_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => rmvs_kick_getacch_tp !! Calculates either the standard or modified version of the acceleration depending if the !! if the test particle is undergoing a close encounter or not - procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for number of particles + procedure :: setup => rmvs_setup_tp !! Constructor method - Allocates space for the input number of bodiess procedure :: append => rmvs_util_append_tp !! Appends elements from one structure to another procedure :: fill => rmvs_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => rmvs_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. @@ -93,7 +93,7 @@ module rmvs_classes class(rmvs_nbody_system), dimension(:), allocatable :: planetocentric !! Planetocentric version of the massive body objects (one for each massive body) logical :: lplanetocentric = .false. !! Flag that indicates that the object is a planetocentric set of masive bodies used for close encounter calculations contains - procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: setup => rmvs_setup_pl !! Constructor method - Allocates space for the input number of bodiess procedure :: append => rmvs_util_append_pl !! Appends elements from one structure to another procedure :: fill => rmvs_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => rmvs_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 45b5acfbc..b0daf9496 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -91,16 +91,24 @@ module symba_classes procedure :: drift => symba_drift_pl !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level procedure :: encounter_check => symba_encounter_check_pl !! Checks if massive bodies are going through close encounters with each other procedure :: accel => symba_kick_getacch_pl !! Compute heliocentric accelerations of massive bodies - procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for number of particle + procedure :: setup => symba_setup_pl !! Constructor method - Allocates space for the input number of bodies procedure :: append => symba_util_append_pl !! Appends elements from one structure to another procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: get_peri => symba_util_peri_pl !! Determine system pericenter passages for massive bodies - procedure :: resize => symba_util_resize_pl !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. + procedure :: resize => symba_util_resize_pl !! Checks the current size of a SyMBA massive body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: spill => symba_util_spill_pl !! "Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) end type symba_pl + type, extends(symba_pl) :: symba_merger + integer(I4B), dimension(:), allocatable :: ncomp + contains + procedure :: append => symba_util_append_merger !! Appends elements from one structure to another + procedure :: resize => symba_util_resize_merger !! Checks the current size of a SyMBA merger list against the requested size and resizes it if it is too small. + procedure :: setup => symba_setup_merger !! Constructor method - Allocates space for the input number of bodies + end type symba_merger + !******************************************************************************************************************************** ! symba_tp class definitions and method interfaces !******************************************************************************************************************************* @@ -113,7 +121,7 @@ module symba_classes procedure :: drift => symba_drift_tp !! Method for Danby drift in Democratic Heliocentric coordinates. Sets the mask to the current recursion level procedure :: encounter_check => symba_encounter_check_tp !! Checks if any test particles are undergoing a close encounter with a massive body procedure :: accel => symba_kick_getacch_tp !! Compute heliocentric accelerations of test particles - procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for number of particle + procedure :: setup => symba_setup_tp !! Constructor method - Allocates space for the input number of bodies procedure :: append => symba_util_append_tp !! Appends elements from one structure to another procedure :: fill => symba_util_fill_tp !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: resize => symba_util_resize_tp !! Checks the current size of a Swiftest body against the requested size and resizes it if it is too small. @@ -151,8 +159,8 @@ module symba_classes ! symba_nbody_system class definitions and method interfaces !******************************************************************************************************************************** type, extends(helio_nbody_system) :: symba_nbody_system - class(symba_pl), allocatable :: mergeadd_list !! List of added bodies in mergers or collisions - class(symba_pl), allocatable :: mergesub_list !! List of subtracted bodies in mergers or collisions + class(symba_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_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 @@ -266,6 +274,16 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp + module function symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) + implicit none + 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 + real(DP), dimension(:,:), intent(in) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(in) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collisio + integer(I4B) :: status !! Status flag assigned to this outcome + end function symba_fragmentation_casemerge + module subroutine symba_io_write_discard(self, param) use swiftest_classes, only : swiftest_parameters implicit none @@ -357,11 +375,26 @@ module subroutine symba_io_write_frame_info(self, iu, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_io_write_frame_info + module subroutine symba_setup_initialize_system(self, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(symba_nbody_system), intent(inout) :: self !! SyMBA system object + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters + end subroutine symba_setup_initialize_system + + module subroutine symba_setup_merger(self, n, param) + use swiftest_classes, only : swiftest_parameters + implicit none + class(symba_merger), intent(inout) :: self !! SyMBA merger list object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_setup_merger + module subroutine symba_setup_pl(self, n, param) use swiftest_classes, only : swiftest_parameters implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_setup_pl @@ -371,19 +404,6 @@ module subroutine symba_setup_pltpenc(self,n) integer(I4B), intent(in) :: n !! Number of encounters to allocate space for end subroutine symba_setup_pltpenc - module subroutine symba_setup_plplenc(self,n) - implicit none - class(symba_plplenc), intent(inout) :: self !! SyMBA pl-tp encounter structure - integer(I4B), intent(in) :: n !! Number of encounters to allocate space for - end subroutine symba_setup_plplenc - - module subroutine symba_setup_initialize_system(self, param) - use swiftest_classes, only : swiftest_parameters - implicit none - class(symba_nbody_system), intent(inout) :: self !! SyMBA system object - class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - end subroutine symba_setup_initialize_system - module subroutine symba_setup_tp(self, n, param) use swiftest_classes, only : swiftest_parameters implicit none @@ -448,6 +468,14 @@ end subroutine symba_util_append_arr_kin end interface interface + module subroutine symba_util_append_merger(self, source, lsource_mask) + use swiftest_classes, only : swiftest_body + 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 + end subroutine symba_util_append_merger + module subroutine symba_util_append_pl(self, source, lsource_mask) use swiftest_classes, only : swiftest_body implicit none @@ -522,6 +550,12 @@ end subroutine symba_util_resize_arr_kin end interface interface + module subroutine symba_util_resize_merger(self, nnew) + implicit none + class(symba_merger), intent(inout) :: self !! SyMBA merger list object + integer(I4B), intent(in) :: nnew !! New size neded + end subroutine symba_util_resize_merger + module subroutine symba_util_resize_pl(self, nnew) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index e581e52b1..a79f52bca 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -46,7 +46,7 @@ module whm_classes procedure :: sort => whm_util_sort_pl !! Sort a WHM massive body object in-place. procedure :: rearrange => whm_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods procedure :: spill => whm_util_spill_pl !!"Spills" bodies from one object to another depending on the results of a mask (uses the PACK intrinsic) - procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for number of particles + procedure :: setup => whm_setup_pl !! Constructor method - Allocates space for the input number of bodiess procedure :: step => whm_step_pl !! Steps the body forward one stepsize end type whm_pl diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index ca5f38c6e..edb641907 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_pl :: system%mergeadd_list) - allocate(symba_pl :: system%mergesub_list) + allocate(symba_merger :: system%mergeadd_list) + allocate(symba_merger :: system%mergesub_list) allocate(symba_plplenc :: system%plplenc_list) allocate(symba_pltpenc :: system%pltpenc_list) end select diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index efae0ba39..0f8b4d519 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -208,8 +208,8 @@ function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v fam_size = 2 + sum(nchild(:)) allocate(family(fam_size)) family = [parent_child_index_array(1)%idx(:),parent_child_index_array(2)%idx(:)] - fam_size = count(pl%status(family(:)) == ACTIVE) - family = pack(family(:), pl%status(family(:)) == ACTIVE) + fam_size = count(pl%status(family(:)) == COLLISION) + family = pack(family(:), pl%status(family(:)) == COLLISION) L_spin(:,:) = 0.0_DP Ip(:,:) = 0.0_DP @@ -423,12 +423,12 @@ module subroutine symba_collision_resolve_mergers(self, system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions ! Internals - integer(I4B) :: i - logical :: lgoodcollision - integer(I4B), dimension(:), allocatable :: family !! List of indices of all bodies inovlved in the collision - integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision - real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision - real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + integer(I4B), dimension(:), allocatable :: family !! List of indices of all bodies inovlved in the collision + integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision + real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + logical :: lgoodcollision + integer(I4B) :: i, status associate(plpl_collisions => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2) select type(pl => system%pl) @@ -439,7 +439,7 @@ module subroutine symba_collision_resolve_mergers(self, system, param) lgoodcollision = symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) if (.not. lgoodcollision) cycle if (any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! One of these two bodies has already been resolved - !call symba_collision_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + status = symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) end do end select end associate diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 2fa789d46..1c5b4a732 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -153,6 +153,7 @@ module subroutine symba_discard_pl(self, system, param) call symba_discard_nonplpl(self, system, param) call plplenc_list%scrub_non_collision(system, param) if (plplenc_list%nenc == 0) return ! No collisions to resolve + write(*, *) "Collision detected at time t = ",param%t call pl%h2b(system%cb) if (param%lfragmentation) then diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 new file mode 100644 index 000000000..ccc79892f --- /dev/null +++ b/src/symba/symba_fragmentation.f90 @@ -0,0 +1,135 @@ +submodule (symba_classes) s_symba_fragmentation + use swiftest +contains + + module function symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) + !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Merge planets. + !! + !! Adapted from David E. Kaufmann's Swifter routines symba_merge_pl.f90 and symba_discard_merge_pl.f90 + !! + !! Adapted from Hal Levison's Swift routines symba5_merge.f and discard_mass_merge.f + 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 + real(DP), dimension(:,:), intent(in) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(in) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + ! 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 + 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 + logical, dimension(system%pl%nbody) :: lmask + class(symba_pl), allocatable :: plnew + + 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 + + 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) + + ! 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%Gmass(i) * pl%Gmass(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 = 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 + + ! Create the new merged body + allocate(plnew, mold=pl) + call plnew%setup(1, param) + + ! 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%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 + pl%Ip(:,1) = Ip_new(:) + pl%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 + + ! 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 associate + end select + + return + + end function symba_fragmentation_casemerge + +end submodule s_symba_fragmentation diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index f35e45408..d3091155d 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -215,7 +215,7 @@ module subroutine symba_io_write_discard(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals integer(I4B), parameter :: LUN = 40 - integer(I4B) :: i, ierr + integer(I4B) :: iadd, isub, j, ierr, nsub, nadd logical, save :: lfirst = .true. real(DP), dimension(:,:), allocatable :: vh character(*), parameter :: HDRFMT = '(E23.16, 1X, I8, 1X, L1)' @@ -245,33 +245,35 @@ module subroutine symba_io_write_discard(self, param) end if write(LUN, HDRFMT) param%t, mergesub_list%nbody, param%lbig_discard - do i = 1, mergesub_list%nbody - write(LUN, NAMEFMT) SUB, mergesub_list%id(i), mergesub_list%status(i) - write(LUN, VECFMT) mergesub_list%xh(1, i), mergesub_list%xh(2, i), mergesub_list%xh(3, i) - write(LUN, VECFMT) mergesub_list%vh(1, i), mergesub_list%vh(2, i), mergesub_list%vh(3, i) + 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) SUB, 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 + end do end do - ! This is incomplete until the mergeadd_list methods are completed - ! if (param%lbig_discard) then - ! if (param%lgr) then - ! allocate(pltemp, source = pl) - ! call pltemp%pv2v(param) - ! allocate(vh, source = pltemp%vh) - ! deallocate(pltemp) - ! else - ! allocate(vh, source = pl%vh) - ! end if - - ! write(LUN, NPLFMT) npl - ! do i = 1, npl - ! write(LUN, PLNAMEFMT) pl%id(i), pl%Gmass(i), pl%radius(i) - ! write(LUN, VECFMT) pl%xh(1, i), pl%xh(2, i), pl%xh(3, i) - ! write(LUN, VECFMT) vh(1, i), vh(2, i), vh(3, i) - ! end do - ! deallocate(vh) - ! end if - close(LUN) - end associate + close(LUN) + end associate return end subroutine symba_io_write_discard diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index 524420609..021873a70 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -35,6 +35,32 @@ module subroutine symba_setup_initialize_system(self, param) end subroutine symba_setup_initialize_system + module subroutine symba_setup_merger(self, n, param) + !! author: David A. Minton + !! + !! Allocate SyMBA test particle structure + !! + !! Equivalent in functionality to David E. Kaufmann's Swifter routine symba_setup.f90 + implicit none + ! Arguments + class(symba_merger), intent(inout) :: self !! SyMBA merger list object + integer(I4B), intent(in) :: n !! Number of particles to allocate space for + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + ! Internals + integer(I4B) :: i + + !> Call allocation method for parent class. In this case, helio_pl does not have its own setup method so we use the base method for swiftest_pl + call symba_setup_pl(self, n, param) + if (n <= 0) return + + if (allocated(self%ncomp)) deallocate(self%ncomp) + allocate(self%ncomp(n)) + self%ncomp(:) = 0 + + return + end subroutine symba_setup_merger + + module subroutine symba_setup_pl(self, n, param) !! author: David A. Minton !! diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 56eaacc2c..7063e0910 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -116,6 +116,37 @@ module subroutine symba_util_append_pl(self, source, lsource_mask) end subroutine symba_util_append_pl + module subroutine symba_util_append_merger(self, source, lsource_mask) + !! author: David A. Minton + !! + !! Append components from one massive body object to another. + !! This method will automatically resize the destination body if it is too small + implicit none + ! 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 + ! 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 + + return + end subroutine symba_util_append_merger + + module subroutine symba_util_append_tp(self, source, lsource_mask) !! author: David A. Minton !! @@ -406,10 +437,27 @@ module subroutine symba_util_resize_arr_kin(arr, nnew) end subroutine symba_util_resize_arr_kin + module subroutine symba_util_resize_merger(self, nnew) + !! author: David A. Minton + !! + !! Checks the current size of a SyMBA merger list against the requested size and resizes it if it is too small. + implicit none + ! Arguments + 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) + + return + end subroutine symba_util_resize_merger + + module subroutine symba_util_resize_pl(self, nnew) !! author: David A. Minton !! - !! Checks the current size of a massive body object against the requested size and resizes it if it is too small. + !! Checks the current size of a SyMBA massive body object against the requested size and resizes it if it is too small. implicit none ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA massive body object From 31b7c695aa1f2a36e596992fa9a8c92fac941f5e Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 17:13:40 -0400 Subject: [PATCH 176/194] Fixed problem with 1pl_1pl initial conditions generator dtypes for ids --- .../1pl_1pl_encounter/init_cond.py | 3 +- .../1pl_1pl_encounter/pl.swiftest.in | Bin 256 -> 248 bytes src/io/io.f90 | 40 +++++++++--------- 3 files changed, 21 insertions(+), 22 deletions(-) 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 20be5a433..ece9101e0 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -131,8 +131,7 @@ plfile = FortranFile(swiftest_pl, 'w') plfile.write_record(npl) - -plfile.write_record(np.array([plid1, plid2])) +plfile.write_record(np.array([plid1, plid2], dtype=np.int32)) plfile.write_record(np.vstack([p_pl1[0],p_pl2[0]])) plfile.write_record(np.vstack([p_pl1[1],p_pl2[1]])) plfile.write_record(np.vstack([p_pl1[2],p_pl2[2]])) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_encounter/pl.swiftest.in index d8da7a92a44b1e9caa3907ead959cdec31e066cc..1bda0535db1ca1f471c53398b42ba7eb9da4250a 100644 GIT binary patch delta 37 dcmZo*`oSp6!N9=41jHZ!V#D|;AofJn+W self%nbody) - read(iu, iostat=ierr, err=100) self%id(1:n) + read(iu, iostat=ierr, err=100) self%id(:) !read(iu, iostat=ierr, err=100) self%name(1:n) select case (form) case (EL) @@ -849,33 +849,33 @@ module subroutine io_read_frame_body(self, iu, param, form, ierr) if (.not.allocated(self%capom)) allocate(self%capom(n)) if (.not.allocated(self%omega)) allocate(self%omega(n)) if (.not.allocated(self%capm)) allocate(self%capm(n)) - read(iu, iostat=ierr, err=100) self%a(1:n) - read(iu, iostat=ierr, err=100) self%e(1:n) - read(iu, iostat=ierr, err=100) self%inc(1:n) + read(iu, iostat=ierr, err=100) self%a(:) + read(iu, iostat=ierr, err=100) self%e(:) + read(iu, iostat=ierr, err=100) self%inc(:) read(iu, iostat=ierr, err=100) self%capom(:) read(iu, iostat=ierr, err=100) self%omega(:) read(iu, iostat=ierr, err=100) self%capm(:) case (XV) - read(iu, iostat=ierr, err=100) self%xh(1, 1:n) - read(iu, iostat=ierr, err=100) self%xh(2, 1:n) - read(iu, iostat=ierr, err=100) self%xh(3, 1:n) - read(iu, iostat=ierr, err=100) self%vh(1, 1:n) - read(iu, iostat=ierr, err=100) self%vh(2, 1:n) - read(iu, iostat=ierr, err=100) self%vh(3, 1:n) + read(iu, iostat=ierr, err=100) self%xh(1, :) + read(iu, iostat=ierr, err=100) self%xh(2, :) + read(iu, iostat=ierr, err=100) self%xh(3, :) + read(iu, iostat=ierr, err=100) self%vh(1, :) + read(iu, iostat=ierr, err=100) self%vh(2, :) + read(iu, iostat=ierr, err=100) self%vh(3, :) end select select type(pl => self) class is (swiftest_pl) ! Additional output if the passed polymorphic object is a massive body - read(iu, iostat=ierr, err=100) pl%Gmass(1:n) - pl%mass(1:n) = pl%Gmass / param%GU - if (param%lrhill_present) read(iu, iostat=ierr, err=100) pl%rhill(1:n) - read(iu, iostat=ierr, err=100) pl%radius(1:n) + 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%lrotation) then - read(iu, iostat=ierr, err=100) pl%rot(1, 1:n) - read(iu, iostat=ierr, err=100) pl%rot(2, 1:n) - read(iu, iostat=ierr, err=100) pl%rot(3, 1:n) - read(iu, iostat=ierr, err=100) pl%Ip(1, 1:n) - read(iu, iostat=ierr, err=100) pl%Ip(2, 1:n) - read(iu, iostat=ierr, err=100) pl%Ip(3, 1:n) + read(iu, iostat=ierr, err=100) pl%rot(1, :) + read(iu, iostat=ierr, err=100) pl%rot(2, :) + read(iu, iostat=ierr, err=100) pl%rot(3, :) + read(iu, iostat=ierr, err=100) pl%Ip(1, :) + read(iu, iostat=ierr, err=100) pl%Ip(2, :) + read(iu, iostat=ierr, err=100) pl%Ip(3, :) end if if (param%ltides) then read(iu, iostat=ierr, err=100) pl%k2(1:n) From 68dc219936c079ccef86f16c0a898abb1fb613c6 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 17:15:27 -0400 Subject: [PATCH 177/194] Fixed bad ADD/SUB code for the mergeadd_list in symba_io --- 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 d3091155d..1f8626242 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -252,7 +252,7 @@ module subroutine symba_io_write_discard(self, param) nsub = mergesub_list%ncomp(isub) do j = 1, nadd if (iadd <= mergeadd_list%nbody) then - write(LUN, NAMEFMT) SUB, mergesub_list%id(iadd), mergesub_list%status(iadd) + 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 From cec408a7a6642ed9cac11da1222a457304e6f8fc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 18:05:49 -0400 Subject: [PATCH 178/194] Added symba_discard_conserve_mtm code but have not troubleshooted all of the probems yet --- src/modules/symba_classes.f90 | 8 ++ src/symba/symba_collision.f90 | 9 +- src/symba/symba_discard.f90 | 166 ++++++++++++++++++++++++++++-- src/symba/symba_fragmentation.f90 | 2 +- src/symba/symba_util.f90 | 17 +++ 5 files changed, 190 insertions(+), 12 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index b0daf9496..71df4b92e 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -95,6 +95,7 @@ module symba_classes procedure :: append => symba_util_append_pl !! Appends elements from one structure to another procedure :: fill => symba_util_fill_pl !! "Fills" bodies from one object into another depending on the results of a mask (uses the UNPACK intrinsic) procedure :: get_peri => symba_util_peri_pl !! Determine system pericenter passages for massive bodies + procedure :: rearray => symba_util_rearray_pl !! Clean up the massive body structures to remove discarded bodies and add new bodies procedure :: resize => symba_util_resize_pl !! Checks the current size of a SyMBA massive body against the requested size and resizes it if it is too small. procedure :: sort => symba_util_sort_pl !! Sorts body arrays by a sortable componen procedure :: rearrange => symba_util_sort_rearrange_pl !! Rearranges the order of array elements of body based on an input index array. Used in sorting methods @@ -533,6 +534,13 @@ module subroutine symba_util_peri_pl(self, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine symba_util_peri_pl + + module subroutine symba_util_rearray_pl(self, system, param) + implicit none + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + end subroutine symba_util_rearray_pl end interface interface util_resize diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 0f8b4d519..ad0e64079 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -208,8 +208,8 @@ function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v fam_size = 2 + sum(nchild(:)) allocate(family(fam_size)) family = [parent_child_index_array(1)%idx(:),parent_child_index_array(2)%idx(:)] - fam_size = count(pl%status(family(:)) == COLLISION) - family = pack(family(:), pl%status(family(:)) == COLLISION) + fam_size = count(pl%lcollision(family(:))) + family = pack(family(:), pl%lcollision(family(:))) L_spin(:,:) = 0.0_DP Ip(:,:) = 0.0_DP @@ -226,8 +226,8 @@ function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v if (nchild(j) > 0) then do i = 1, nchild(j) ! Loop over all children and take the mass weighted mean of the properties idx_child = parent_child_index_array(j)%idx(i + 1) - if ((idx_child) /= COLLISION) cycle - mchild = pl%Gmass(idx_child) + if (.not. pl%lcollision(idx_child)) cycle + mchild = pl%mass(idx_child) xchild(:) = pl%xb(:, idx_child) vchild(:) = pl%vb(:, idx_child) volchild = (4.0_DP / 3.0_DP) * PI * pl%radius(idx_child)**3 @@ -266,6 +266,7 @@ function symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v return end function symba_collision_consolidate_familes + module subroutine symba_collision_encounter_scrub(self, system, param) !! author: David A. Minton !! diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 1c5b4a732..f8ab11d04 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -58,6 +58,108 @@ subroutine symba_discard_cb_pl(pl, system, param) end subroutine symba_discard_cb_pl + subroutine symba_discard_conserve_mtm(pl, system, param, ipl, lescape_body) + !! author: David A. Minton + !! + !! Conserves system momentum when a body is lost from the system or collides with central body + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl + class(symba_nbody_system), intent(inout) :: system + class(symba_parameters), intent(inout) :: param + integer(I4B), intent(in) :: ipl + logical, intent(in) :: lescape_body + ! Internals + real(DP), dimension(NDIM) :: Lpl, Ltot, Lcb, xcom, vcom + real(DP) :: pe, ke_orbit, ke_spin + integer(I4B) :: i, oldstat + + select type(cb => system%cb) + class is (symba_cb) + + ! Add the potential and kinetic energy of the lost body to the records + pe = -cb%mass * pl%mass(ipl) / norm2(pl%xb(:, ipl) - pl%xb(:, 1)) + ke_orbit = 0.5_DP * pl%mass(ipl) * dot_product(pl%vb(:, ipl), pl%vb(:, ipl)) + if (param%lrotation) then + ke_spin = 0.5_DP * pl%mass(ipl) * pl%radius(ipl)**2 * pl%Ip(3, ipl) * dot_product(pl%rot(:, ipl), pl%rot(:, ipl)) + else + ke_spin = 0.0_DP + end if + + ! Add the pre-collision ke of the central body to the records + ! Add planet mass to central body accumulator + if (lescape_body) then + system%Mescape = system%Mescape + pl%mass(ipl) + do i = 1, npl + if (i == ipl) cycle + pe = pe - pl%mass(i) * pl%mass(ipl) / norm2(xb(:, ipl) - xb(:, i)) + end do + + Ltot(:) = 0.0_DP + do i = 1, npl + Lpl(:) = mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) + Ltot(:) = Ltot(:) + Lpl(:) + end do + Ltot(:) = Ltot(:) + cb%mass * cb%xb(:) .cross. cb%vb(:) + call pl%b2h(cb) + oldstat = status(ipl) + pl%status(ipl) = INACTIVE + call pl%h2b(cb) + pl%status(ipl) = oldstat + do i = 1, npl + if (i == ipl) cycle + Lpl(:) = mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) + Ltot(:) = Ltot(:) - Lpl(:) + end do + Ltot(:) = Ltot(:) - cb%mass * cb%xb(:) .cross. cb%vb(:) + system%Lescape(:) = system%Lescape(:) + system%Ltot(:) + if (param%lrotation) system%Lescape(:) = system%Lescape + pl%mass(ipl) * pl%radius(ipl)**2 * pl%Ip(3, ipl) * pl%rot(:, ipl) + + else + xcom(:) = (pl%mass(ipl) * pl%xb(:, ipl) + cb%mass * cb%xb(:)) / (cb%mass + pl%mass(ipl)) + vcom(:) = (pl%mass(ipl) * pl%vb(:, ipl) + cb%mass * cb%vb(:)) / (cb%mass + pl%mass(ipl)) + Lpl(:) = (pl%xb(:,ipl) - xcom(:)) .cross. pL%vb(:,ipl) - vcom(:) + if (param%lrotation) Lpl(:) = pl%mass(ipl) * (Lpl(:) + pl%radius(ipl)**2 * pl%Ip(3,ipl) * pl%rot(:, ipl)) + + Lcb(:) = cb%mass * (cb%xb(:) - xcom(:)) .cross. (cb%vb(:) - vcom(:)) + + ke_orbit = ke_orbit + 0.5_DP * cb%mass * dot_product(cb%vb(:), cb%vb(:)) + if (param%lrotation) ke_spin = ke_spin + 0.5_DP * cb%mass * cb%radius**2 * cb%Ip(3) * dot_product(cb%rot(:), cb%rot(:)) + ! Update mass of central body to be consistent with its total mass + cb%dM = cb%dM + pl%mass(ipl) + cb%dR = cb%dR + 1.0_DP / 3.0_DP * (pl%radius(ipl) / cb%radius)**3 - 2.0_DP / 9.0_DP * (pl%radius(ipl) / cb%radius)**6 + cb%mass = cb%M0 + cb%dM + cb%Gmass = param%GU * cb%mass + cb%radius = cb%R0 + cb%dR + param%rmin = cb%radius + ! Add planet angular momentum to central body accumulator + cb%dL(:) = Lpl(:) + Lcb(:) + cb%dL(:) + ! Update rotation of central body to by consistent with its angular momentum + if (param%lrotation) then + cb%rot(:) = (cb%L0(:) + cb%dL(:)) / (cb%Ip(3) * cb%mass * cb%radius**2) + ke_spin = ke_spin - 0.5_DP * cb%mass * cb%radius**2 * cb%Ip(3) * dot_product(cb%rot(:), cb%rot(:)) + end if + cb%xb(:) = xcom(:) + cb%vb(:) = vcom(:) + ke_orbit = ke_orbit - 0.5_DP * cb%mass * dot_product(cb%vb(:), cb%vb(:)) + end if + call pl%b2h(cb) + + ! We must do this for proper book-keeping, since we can no longer track this body's contribution to energy directly + if (lescape_body) then + system%Ecollisions = system%Ecollisions + ke_orbit + ke_spin + pe + system%Euntracked = system%Euntracked - (ke_orbit + ke_spin + pe) + else + system%Ecollisions = system%Ecollisions + pe + system%Euntracked = system%Euntracked - pe + end if + + end select + return + + end subroutine symba_discard_conserve_mtm + + subroutine symba_discard_nonplpl(pl, system, param) !! author: David A. Minton !! @@ -89,6 +191,45 @@ subroutine symba_discard_nonplpl(pl, system, param) end subroutine symba_discard_nonplpl + subroutine symba_discard_nonplpl_conservation(pl, system, param) + !! author: David A. Minton + !! + !! If there are any bodies that are removed due to either colliding with the central body or escaping the systme, + !! we need to track the conserved quantities with the system bookkeeping terms. + implicit none + ! Arguments + class(symba_pl), intent(inout) :: pl !! SyMBA test particle object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + integer(I4B) :: i, ndiscard, dstat + logical :: lescape + logical, dimension(pl%nbody) :: discard_l_pl + integer(I4B), dimension(:), allocatable :: discard_index_list + + associate(npl => pl%nbody) + discard_l_pl(1:npl) = pl%ldiscard(1:npl) .and. .not. pl%lcollision(1:npl) ! These are bodies that are discarded but not flagged as pl-pl collision + ndiscard = count(discard_l_pl(:)) + allocate(discard_index_list(ndiscard)) + discard_index_list(:) = pack([(i, i = 1, npl)], discard_l_pl(1:npl)) + do i = 1, ndiscard + dstat = pl%status(discard_index_list(i)) + if ((dstat == DISCARDED_RMIN) .or. (dstat == DISCARDED_PERI)) then + lescape = .false. + else if ((dstat == DISCARDED_RMAX) .or. (dstat == DISCARDED_RMAXU)) then + lescape = .true. + else + cycle + end if + ! Conserve all the quantities + call symba_discard_conserve_mtm(pl, system, param, discard_index_list(i), lescape) + end do + end associate + + return + end subroutine symba_discard_nonplpl_conservation + + subroutine symba_discard_peri_pl(pl, system, param) !! author: David A. Minton !! @@ -150,17 +291,28 @@ module subroutine symba_discard_pl(self, system, param) select type(param) class is (symba_parameters) associate(pl => self, plplenc_list => system%plplenc_list) + call pl%h2b(system%cb) + + ! First deal with the non pl-pl collisions call symba_discard_nonplpl(self, system, param) + + ! Scrub the pl-pl encounter list of any encounters that did not lead to a collision call plplenc_list%scrub_non_collision(system, param) - if (plplenc_list%nenc == 0) return ! No collisions to resolve - write(*, *) "Collision detected at time t = ",param%t - call pl%h2b(system%cb) - if (param%lfragmentation) then - call plplenc_list%resolve_fragmentations(system, param) - else - call plplenc_list%resolve_mergers(system, param) + if ((plplenc_list%nenc > 0) .and. any(pl%lcollision(:))) then + write(*, *) "Collision between massive bodies detected at time t = ",param%t + if (param%lfragmentation) then + call plplenc_list%resolve_fragmentations(system, param) + else + call plplenc_list%resolve_mergers(system, param) + end if end if + + if (any(pl%ldiscard(:))) then + call symba_discard_nonplpl_conservation(self, system, param) + call pl%rearray(self, system, param) + end if + end associate end select end select diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index ccc79892f..cafaacfd7 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -73,7 +73,7 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, pe = 0.0_DP do j = 1, nfamily do i = j + 1, nfamily - pe = pe - pl%Gmass(i) * pl%Gmass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) + pe = pe - pl%mass(i) * pl%mass(j) / norm2(pl%xb(:, i) - pl%xb(:, j)) end do end do system%Ecollisions = system%Ecollisions + pe diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 7063e0910..c0276291a 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -369,6 +369,23 @@ module subroutine symba_util_peri_pl(self, system, param) end subroutine symba_util_peri_pl + module subroutine symba_util_rearray_pl(self, system, param) + !! Author: the Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott + !! + !! Clean up the massive body structures to remove discarded bodies and add new bodies + implicit none + ! Arguments + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + + ! First + + return + end subroutine symba_util_rearray_pl + + + module subroutine symba_util_resize_arr_info(arr, nnew) !! author: David A. Minton !! From ffd42d7b49a8a2f14d97966eb82cd394c3d791bc Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 18:06:13 -0400 Subject: [PATCH 179/194] Fixed bad cb index --- src/symba/symba_discard.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index f8ab11d04..63a38fc42 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -78,7 +78,7 @@ subroutine symba_discard_conserve_mtm(pl, system, param, ipl, lescape_body) class is (symba_cb) ! Add the potential and kinetic energy of the lost body to the records - pe = -cb%mass * pl%mass(ipl) / norm2(pl%xb(:, ipl) - pl%xb(:, 1)) + pe = -cb%mass * pl%mass(ipl) / norm2(pl%xb(:, ipl) - cb%xb(:)) ke_orbit = 0.5_DP * pl%mass(ipl) * dot_product(pl%vb(:, ipl), pl%vb(:, ipl)) if (param%lrotation) then ke_spin = 0.5_DP * pl%mass(ipl) * pl%radius(ipl)**2 * pl%Ip(3, ipl) * dot_product(pl%rot(:, ipl), pl%rot(:, ipl)) From cfedcd54e08c04d77606ed87d433ec46f8eca173 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 18:15:12 -0400 Subject: [PATCH 180/194] Fixed up typos and mismatched intents, allowing the discards to alter param%rmin --- src/discard/discard.f90 | 6 +++--- src/modules/rmvs_classes.f90 | 2 +- src/modules/swiftest_classes.f90 | 8 ++++---- src/modules/symba_classes.f90 | 2 +- src/rmvs/rmvs_discard.f90 | 2 +- src/symba/symba_discard.f90 | 24 ++++++++++++------------ 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index 7dbbd95c2..be377e49e 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -10,7 +10,7 @@ module subroutine discard_system(self, param) implicit none ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals logical :: lany_discards @@ -36,7 +36,7 @@ module subroutine discard_pl(self, system, param) ! Arguments class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameter if (self%nbody == 0) return self%ldiscard(:) = .false. @@ -56,7 +56,7 @@ module subroutine discard_tp(self, system, param) ! Arguments 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(in) :: param !! Current run configuration parameter + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameter associate(tp => self, ntp => self%nbody, cb => system%cb, pl => system%pl, npl => system%pl%nbody) if ((ntp == 0) .or. (npl ==0)) return diff --git a/src/modules/rmvs_classes.f90 b/src/modules/rmvs_classes.f90 index fbbfa15fe..4f7255237 100644 --- a/src/modules/rmvs_classes.f90 +++ b/src/modules/rmvs_classes.f90 @@ -114,7 +114,7 @@ module subroutine rmvs_discard_tp(self, system, param) implicit none class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine rmvs_discard_tp module function rmvs_encounter_check_tp(self, system, dt) result(lencounter) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 0fe43e391..74add9081 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -308,7 +308,7 @@ subroutine abstract_discard_body(self, system, param) import swiftest_body, swiftest_nbody_system, swiftest_parameters class(swiftest_body), intent(inout) :: self !! Swiftest body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine abstract_discard_body subroutine abstract_accel(self, system, param, t, lbeg) @@ -384,20 +384,20 @@ module subroutine discard_pl(self, system, param) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameter end subroutine discard_pl module subroutine discard_system(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine discard_system module subroutine discard_tp(self, system, param) implicit none 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(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine discard_tp module pure subroutine drift_all(mu, x, v, n, param, dt, mask, iflag) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 71df4b92e..c5aba1a7f 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -219,7 +219,7 @@ module subroutine symba_discard_pl(self, system, param) implicit none 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(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters end subroutine symba_discard_pl module subroutine symba_drift_pl(self, system, param, dt) diff --git a/src/rmvs/rmvs_discard.f90 b/src/rmvs/rmvs_discard.f90 index 551cdab92..bcdb9f902 100644 --- a/src/rmvs/rmvs_discard.f90 +++ b/src/rmvs/rmvs_discard.f90 @@ -13,7 +13,7 @@ module subroutine rmvs_discard_tp(self, system, param) ! Arguments class(rmvs_tp), intent(inout) :: self !! RMVS test particle object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 63a38fc42..33fe47354 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -90,25 +90,25 @@ subroutine symba_discard_conserve_mtm(pl, system, param, ipl, lescape_body) ! Add planet mass to central body accumulator if (lescape_body) then system%Mescape = system%Mescape + pl%mass(ipl) - do i = 1, npl + do i = 1, pl%nbody if (i == ipl) cycle - pe = pe - pl%mass(i) * pl%mass(ipl) / norm2(xb(:, ipl) - xb(:, i)) + pe = pe - pl%mass(i) * pl%mass(ipl) / norm2(pl%xb(:, ipl) - pl%xb(:, i)) end do Ltot(:) = 0.0_DP - do i = 1, npl - Lpl(:) = mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) + do i = 1, pl%nbody + Lpl(:) = pL%mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) Ltot(:) = Ltot(:) + Lpl(:) end do Ltot(:) = Ltot(:) + cb%mass * cb%xb(:) .cross. cb%vb(:) call pl%b2h(cb) - oldstat = status(ipl) + oldstat = pl%status(ipl) pl%status(ipl) = INACTIVE call pl%h2b(cb) pl%status(ipl) = oldstat - do i = 1, npl + do i = 1, pl%nbody if (i == ipl) cycle - Lpl(:) = mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) + Lpl(:) = pl%mass(i) * pl%xb(:,i) .cross. pl%vb(:, i) Ltot(:) = Ltot(:) - Lpl(:) end do Ltot(:) = Ltot(:) - cb%mass * cb%xb(:) .cross. cb%vb(:) @@ -198,9 +198,9 @@ subroutine symba_discard_nonplpl_conservation(pl, system, param) !! we need to track the conserved quantities with the system bookkeeping terms. implicit none ! Arguments - class(symba_pl), intent(inout) :: pl !! SyMBA test particle object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(symba_pl), intent(inout) :: pl !! SyMBA test particle object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals integer(I4B) :: i, ndiscard, dstat logical :: lescape @@ -284,7 +284,7 @@ module subroutine symba_discard_pl(self, system, param) ! Arguments 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(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters select type(system) class is (symba_nbody_system) @@ -310,7 +310,7 @@ module subroutine symba_discard_pl(self, system, param) if (any(pl%ldiscard(:))) then call symba_discard_nonplpl_conservation(self, system, param) - call pl%rearray(self, system, param) + !call pl%rearray(self, system, param) end if end associate From 5dee8d3788949f716f15f225678a894b17a1e428 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 19:41:44 -0400 Subject: [PATCH 181/194] Reorganized io subroutines into alphabetical order like the other submodules --- .../swiftest_vs_swifter.ipynb | 1208 ++++++++++++++++- src/io/io.f90 | 732 +++++----- src/modules/symba_classes.f90 | 6 +- src/symba/symba_discard.f90 | 2 +- src/symba/symba_fragmentation.f90 | 2 + src/symba/symba_util.f90 | 30 +- src/util/util_spill.f90 | 1 + 7 files changed, 1540 insertions(+), 441 deletions(-) diff --git a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb index 69349f2a4..3a80eebd1 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/swiftest_vs_swifter.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -75,23 +75,23 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", - " ]" + "[,\n", + " ]" ] }, - "execution_count": 6, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAaRklEQVR4nO3df5BV5Z3n8fenG5AYUVHBNDYRJvQ4os4S7EX8USalwxYwWYkxSclmAxozDP4qs052h5qtnUlqaxJmMu64blgtjD/AzYbK5ocSC3UYY9asCUZMHAUZBkaNNLZCMBqJo/y43/3jnG6ulwvcc/uevpdzP6+qW33POc9z7vdcOP3t5zznPI8iAjMzs1p1NDsAMzM7ujhxmJlZJk4cZmaWiROHmZll4sRhZmaZjGh2AMPhlFNOiUmTJjU7DDOzo8rTTz/9q4gYV7m+LRLHpEmTWL9+fbPDMDM7qkj6ZbX1vlRlZmaZOHGYmVkmThxmZpZJW/RxVLN37176+vp45513mh1KU4wePZru7m5GjhzZ7FDM7CjTtomjr6+PMWPGMGnSJCQ1O5xhFRHs2rWLvr4+Jk+e3OxwzOwo07aXqt555x1OPvnktksaAJI4+eST27a1ZWZD07aJA2jLpDGgnY/dzIambS9VmZnl7V/27Oetd/ZSCtgfQakUREApIn2VvS8l72OgbFp+7/5gfynYWyqxf3+wrxTsK5WSdfuD/aXSgTL7k/X7SsG+dNvl07uZfMr7G3pcThzD6IILLuAnP/nJQeuvuuoqPvaxj/HJT36yCVGZWR727i9x4V/9kNd/u6epcUw/fawTx9GsWtIws2Las6/E67/dw+yzPsBHzhhHh5JLxB0SnR3QIaXLyfuO8vcdSdkRHaKzQ4zs7Eh+diQ/R3Qm20Z0dBx4n5YZMbg9Wc6DE8cwOu6449i9ezcRwY033sgPf/hDJk+ejGdhNCueUnpen3v6WObP+GCTo2mstu4cb5bvf//7bN68meeee44777zTLRGzAiqlfw8W8T4UJ44mePzxx5k/fz6dnZ1MmDCBSy65pNkhmVmDDVxJ6Chg5nDiaBLfDmtWbANXoHPqZmgqJ44muPjii1m1ahX79++nv7+fxx57rNkhmVmDDfRxdBQwc+SaOCTNlrRZ0lZJS6psl6Tb0u3PSpqerp8o6TFJmyRtlHRTWZ2TJK2VtCX9OTbPY8jD5ZdfTk9PD+eccw7XXnstH/nIR5odkpk12GAfR3PDyEVud1VJ6gSWAbOAPuApSasj4vmyYnOAnvR1HnB7+nMf8CcR8XNJY4CnJa1N6y4BHo2IpWkyWgL8aV7H0Ui7d+8GkstUX//615scjZnlaaCPo4iXpfNsccwAtkbECxGxB1gFzKsoMw9YGYl1wImSuiKiPyJ+DhARbwGbgNPK6qxI368APp7jMZiZ1WXgJnt3jmdzGrCtbLmPA7/8ay4jaRLwYeDJdNWpEdEPkP4cX+3DJS2StF7S+p07d9Z7DGZmdRns4yhe3sg1cVT7uiqfdDtsGUnHAd8FvhARv8ny4RGxPCJ6I6J33LiD5lo3M8tVafCuquJljjwTRx8wsWy5G3il1jKSRpIkjW9GxPfKyrwmqSst0wXsaHDcZmZDVipw73ieieMpoEfSZEmjgCuB1RVlVgML0rurZgJvRkS/kt6ku4BNEfHfqtRZmL5fCDyQ3yGYmdUnCtziyO2uqojYJ+kG4BGgE7g7IjZKWpxuvwNYA8wFtgJvA1en1S8EPgs8J+mZdN2fRcQaYCnwbUnXAC8Dn8rrGMzM6hUUt48j10EO01/0ayrW3VH2PoDrq9T7fxyigRcRu4BLGxtpc2zbto0FCxbw6quv0tHRwaJFi7jpppveUyYiuOmmm1izZg3HHnss9957L9OnT29SxGZWqyL3cXh03CYaMWIEt9xyC9OnT+ett97i3HPPZdasWUydOnWwzEMPPcSWLVvYsmULTz75JNdeey1PPvnkYfZqZq2gNPgcR5MDyYGHHGmirq6uwdbDmDFjOPPMM9m+fft7yjzwwAMsWLAAScycOZM33niD/v7+ZoRrZhkU+QFAtziAL/9gI8+/kulu3yOaOuF4/uLfnlVz+Zdeeolf/OIXnHfeee9Zv337diZOPHDjWXd3N9u3b6erq6thsZpZ45U8yKHlaffu3VxxxRXceuutHH/88e/ZVm2SpyL+BWNWNL6rquCytAwabe/evVxxxRV85jOf4ROf+MRB27u7u9m27cDD9X19fUyYMGE4QzSzOvjJcctFRHDNNddw5plncvPNN1ctc9lll7Fy5UoignXr1nHCCSf4MpXZUaA0eLWgeJnDLY4meuKJJ7jvvvs455xzmDZtGgBf+cpXePnllwFYvHgxc+fOZc2aNUyZMoVjjz2We+65p4kRm1mtijyRkxNHE1100UVV+zDKSWLZsmXDFJGZNUrJU8eamVkWgy2OAv6WLeAhmZk1X6nAz3E4cZiZ5aDAg+M6cZiZ5SHcx2FmZlkUeZBDJw4zsxyEHwC0PHzuc59j/PjxnH322YPrXn/9dWbNmkVPTw+zZs3i17/+9eC2r371q0yZMoUzzjiDRx55pOo+D1ffzIbPYB+HWxzWSFdddRUPP/zwe9YtXbqUSy+9lC1btnDppZeydOlSAJ5//nlWrVrFxo0befjhh7nuuuvYv3//Qfs8VH0zG17hYdUtDxdffDEnnXTSe9Y98MADLFyYzIy7cOFC7r///sH1V155JccccwyTJ09mypQp/OxnPzton4eqb2bDq8h9HH5yHOChJfDqc43d5wfOgTnZ/9p/7bXXBsei6urqYseOHUAyvPrMmTMHyw0Mr15rfTMbXh7k0JrOw6ubHV0Ghzgs4HnqFgfU1TLIy6mnnkp/fz9dXV309/czfvx4oPbh1Q9V38yGl1scNmwuu+wyVqxYAcCKFSuYN2/e4PpVq1bx7rvv8uKLL7JlyxZmzJhRc30zG15FnjrWiaOJ5s+fz/nnn8/mzZvp7u7mrrvuYsmSJaxdu5aenh7Wrl3LkiVLADjrrLP49Kc/zdSpU5k9ezbLli2js7MTgM9//vOsX78e4JD1zWx4lUrJzyK2OHSkYb2LoLe3NwZ+sQ7YtGkTZ555ZpMiag3+Dszy83cbX2XRfU/z4I0XcfZpJzQ7nLpIejoieivXu8VhZpaDA53jTQ0jF04cZmY58CCHBdUOl+kOpZ2P3Ww4HBhypLlx5KFtE8fo0aPZtWtXW/4CjQh27drF6NGjmx2KWWEVeerYtn2Oo7u7m76+Pnbu3NnsUJpi9OjRdHd3NzsMs8I6MORIc+PIQ9smjpEjRzJ58uRmh2FmBeXnOMzMLJMo8CCHThxmZjkY6OMoXtpw4jAzy0WRh1V34jAzy0HJEzmZmVkmAy2OAt5W5cRhZpYDD6tuZmaZDD45XsDucScOM7McuMVhZmaZ+AHAOkmaLWmzpK2SDppRSInb0u3PSppetu1uSTskbaio8yVJ2yU9k77m5nkMZmb1GBgFzy2ODCR1AsuAOcBUYL6kqRXF5gA96WsRcHvZtnuB2YfY/d9GxLT0taahgZuZNUCpVNxBDvNsccwAtkbECxGxB1gFVE6APQ9YGYl1wImSugAi4nHg9RzjMzPLjYdVr89pwLay5b50XdYy1dyQXtq6W9LYagUkLZK0XtL6dh0B18yap+Q+jrpU+7YqJ7+opUyl24EPAdOAfuCWaoUiYnlE9EZE77hx446wSzOzxooCD6ueZ+LoAyaWLXcDr9RR5j0i4rWI2B8RJeBOkktiZmYtJXAfRz2eAnokTZY0CrgSWF1RZjWwIL27aibwZkT0H26nA30gqcuBDYcqa2bWLEUe5DC3iZwiYp+kG4BHgE7g7ojYKGlxuv0OYA0wF9gKvA1cPVBf0reAjwKnSOoD/iIi7gL+WtI0kktaLwF/nNcxmJnVq8iDHOY6A2B6q+yainV3lL0P4PpD1J1/iPWfbWSMZmZ5CN9VZWZmWUS4j8PMzDIoch+HE4eZWQ48yKGZmWVy4Mnx4mUOJw4zsxxERCE7xsGJw8wsFxHF7N8AJw4zs1yUIgrZvwFOHGZmuShFMfs3wInDzCwXEVHA2cYTThxmZjlILlUVM3U4cZiZ5SDpHG92FPlw4jAzy0HJd1WZmVkWpYjqU9UVgBOHmVkOwn0cZmaWRcl9HGZmlkXgFoeZmWXgBwDNzCwTD3JoZmaZlEru4zAzswz85LiZmWUS+AFAMzPLoOQ+DjMzyyICJw4zM6ud+zjMzCwTD3JoZmaZ+DkOMzPLJNziMDOzLEqeOtbMzLJw57iZmWVS8u24ZmaWhfs4zMwsk4igo6C/YQt6WGZmzZV0jrdpi0PS+CrrzsgnHDOzYmj3qWN/LOnTAwuS/gT4fn4hmZkd/ZJBDouZOUbUUOajwHJJnwJOBTYBM/IMysysCNq2xRER/cDDwPnAJGBlROzOOS4zs6NakZ/jOGKLQ9JaoB84G+gG7pb0eER8Me/gzMyOVqVSez/H8RDwZxHxRkRsAC4A3qxl55JmS9osaaukJVW2S9Jt6fZnJU0v23a3pB2SNlTUOUnSWklb0p9ja4nFzGw4FbmPo5bEMQZ4RNKPJV0PnBwR//VIlSR1AsuAOcBUYL6kqRXF5gA96WsRcHvZtnuB2VV2vQR4NCJ6gEfTZTOzlhLtfFdVRHw5Is4CrgcmAP9X0t/XsO8ZwNaIeCEi9gCrgHkVZeaR9JlERKwDTpTUlX7u48DrVfY7D1iRvl8BfLyGWMzMhlVQ3D6OLA8A7gBeBXYBBz3bUcVpwLay5b50XdYylU5NO+wHOu6rxiJpkaT1ktbv3LmzhnDNzBqnrSdyknStpB+RXBY6BfijiPj9GvZd7RuLOsrUJSKWR0RvRPSOGzeuEbs0M6tZqcATOdXyHMfpwBci4pmM++4DJpYtdwOv1FGm0muSuiKiP72stSNjXGZmuUtGxy1m5qilj2NJHUkD4CmgR9JkSaOAK4HVFWVWAwvSu6tmAm8OXIY6jNXAwvT9QuCBOmIzM8tVRLRv53i9ImIfcAPwCMnT5t+OiI2SFktanBZbA7wAbAXuBK4bqC/pW8BPgTMk9Um6Jt20FJglaQswK102M2spRR5WvZZLVXWLiDUkyaF83R1l74Pkbq1qdecfYv0u4NIGhmlm1nAltzjMzCyLUkD1+3+Ofk4cZmY5cB+HmZllUuRBDp04zMxyEIGnjjUzs9q1+yCHZmaWUURRu8adOMzMcuE+DjMzyyRo42HVzcwsO7c4zMwsk2TqWCcOMzOrURR4WHUnDjOzHJTaeepYMzPLzlPHmplZJm09kZOZmWXnQQ7NzCyTpMXR7Cjy4cRhZpYDP8dhZmaZFHnqWCcOM7MclPwch5mZZZGMjlvMzOHEYWaWg5LvqjIzsyxKEXQUNHM4cZiZ5SB8O66ZmWXhu6rMzCyTUkRBu8adOMzMcuEHAM3MLBMPq25mZjWLCMCj45qZWY3SvOFLVWZmVpvSYIujyYHkxInDzKzBSoMtjubGkRcnDjOzBiu5j8PMzOrhPg4zM6vJQIvDl6rMzKwmA30cBW1wOHGYmTXagRZHMTOHE4eZWYNFKfnpznEzM6tJ4D6OukmaLWmzpK2SllTZLkm3pduflTT9SHUlfUnSdknPpK+5eR6DmVlWJT85Xh9JncAyYA4wFZgvaWpFsTlAT/paBNxeY92/jYhp6WtNXsdgZlYPPzlevxnA1oh4ISL2AKuAeRVl5gErI7EOOFFSV411zcxakh8ArN9pwLay5b50XS1ljlT3hvTS1t2Sxlb7cEmLJK2XtH7nzp31HoOZWWbhIUfqVu0rixrLHK7u7cCHgGlAP3BLtQ+PiOUR0RsRvePGjaspYDOzRij66Lgjctx3HzCxbLkbeKXGMqMOVTciXhtYKelO4MHGhWxmNnR+crx+TwE9kiZLGgVcCayuKLMaWJDeXTUTeDMi+g9XN+0DGXA5sCHHYzAzy2ywj6Ogs47n1uKIiH2SbgAeATqBuyNio6TF6fY7gDXAXGAr8DZw9eHqprv+a0nTSC5dvQT8cV7HYGZWjyj4kCN5XqoivVV2TcW6O8reB3B9rXXT9Z9tcJhmZg3lIUfMzCyTwc7xgv6GLehhmZk1j1scZmaWSanywYOCceIwM2uwcIvDzMyy8CCHZmaWiYdVNzOzTEqeyMnMzLLwsOpmZpZJ0Qc5dOIwM2swD3JoZmaZDDzG4RaHmZnVxH0cZmaWSXjqWDMzy6LkqWPNzCwL31VlZmaZuI/DzMwy8bDqZmaWyeDUsc0NIzdOHGZmDTbY4iho77gTh5lZg4XvqjIzsyxKfo7DzMyy8O24ZmaWyWCLo8lx5MWJw8yswTx1rJmZZRJ+ANDMzLJwi8PMzDJxi8PMzDJxi8PMzDLx1LFmZpbJwNSxfgDQzMxqEm5xmJlZFh5yxMzMMimVkp9ucZiZWU08kZOZmWVyoHO8qWHkxonDzKzBwi0OMzPLYuABwILmDScOM7NGcx/HEEiaLWmzpK2SllTZLkm3pduflTT9SHUlnSRpraQt6c+xeR6DmVlWbnHUSVInsAyYA0wF5kuaWlFsDtCTvhYBt9dQdwnwaET0AI+my2ZmraPgLY4ROe57BrA1Il4AkLQKmAc8X1ZmHrAykp6kdZJOlNQFTDpM3XnAR9P6K4AfAX+axwE8s3wxeu25PHZtZgU2tRT8+YiJiD9odii5yDNxnAZsK1vuA86rocxpR6h7akT0A0REv6Tx1T5c0iKSVgwf/OAH6zqA943qRKM666prZu3trHHHc9L7RzU7jFzkmTiqtdGixjK11D2siFgOLAfo7e3NVHfAGVctq6eamVmh5dk53gdMLFvuBl6psczh6r6WXs4i/bmjgTGbmdkR5Jk4ngJ6JE2WNAq4ElhdUWY1sCC9u2om8GZ6GepwdVcDC9P3C4EHcjwGMzOrkNulqojYJ+kG4BGgE7g7IjZKWpxuvwNYA8wFtgJvA1cfrm6666XAtyVdA7wMfCqvYzAzs4Np4NH4Iuvt7Y3169c3Owwzs6OKpKcjordyvZ8cNzOzTJw4zMwsEycOMzPLxInDzMwyaYvOcUk7gV/WWf0U4FcNDCcPrR6j4xu6Vo+x1eOD1o+xFeM7PSLGVa5si8QxFJLWV7uroJW0eoyOb+haPcZWjw9aP8ZWj6+cL1WZmVkmThxmZpaJE8eRLW92ADVo9Rgd39C1eoytHh+0foytHt8g93GYmVkmbnGYmVkmThxmZpZJWycOSbMlbZa0VdJBc5enw73flm5/VtL0Wus2Mz5JEyU9JmmTpI2Sbmql+Mq2d0r6haQH84hvqDGmUxl/R9I/pt/l+S0W339I/303SPqWpNGNjq/GGH9P0k8lvSvpi1nqNjO+4TpPhhJj2fbcz5VMIqItXyTDtf8z8DvAKOAfgKkVZeYCD5HMSDgTeLLWuk2OrwuYnr4fA/xTK8VXtv1m4H8DD7bav3G6bQXw+fT9KODEVomPZHrlF4H3pcvfBq5q0nc4HvjXwF8CX8xSt8nx5X6eDDXG4TpXsr7aucUxA9gaES9ExB5gFTCvosw8YGUk1gEnKpl1sJa6TYsvIvoj4ucAEfEWsInkF01LxAcgqRv4Q+AbDY6rITFKOh64GLgLICL2RMQbrRJfum0E8D5JI4BjOXiGzWGJMSJ2RMRTwN6sdZsZ3zCdJ0OKEYbtXMmknRPHacC2suU+Dv5Pc6gytdRtZnyDJE0CPgw82WLx3Qr8J6DU4Lhq/fwjlfkdYCdwT3qJ4BuS3t8q8UXEduBvSCYz6yeZPfPvGhxfrTHmUbdWDfmMHM8TGHqMt5L/uZJJOycOVVlXeW/yocrUUneohhJfslE6Dvgu8IWI+E0DYzviZx+ujKSPATsi4ukGx1RpKN/hCGA6cHtEfBj4LdDoa/RD+Q7HkvzVOhmYALxf0r9vcHyH/PxhqFurIX9GzucJDCHGYTxXMmnnxNEHTCxb7ubgpv6hytRSt5nxIWkkycnwzYj4XoNjG2p8FwKXSXqJpNl+iaT/1WIx9gF9ETHwF+h3SBJJq8T3B8CLEbEzIvYC3wMuaHB8tcaYR91aDekzhuE8gaHFOFznSjbN7mRp1ovkL8oXSP5iG+iwOquizB/y3o7Jn9Vat8nxCVgJ3NqK319FmY+SX+f4kGIEfgyckb7/EvC1VokPOA/YSNK3IZKO/Bub8R2Wlf0S7+18bonz5DDx5X6eDDXGim25nSuZj6nZATT14JM7Vv6J5I6H/5yuWwwsTt8LWJZufw7oPVzdVokPuIikKfws8Ez6mtsq8VXsI9eTYYj/xtOA9en3eD8wtsXi+zLwj8AG4D7gmCZ9hx8g+av6N8Ab6fvjW+g8qRrfcJ0nQ/0Oh+tcyfLykCNmZpZJO/dxmJlZHZw4zMwsEycOMzPLxInDzMwyceIwM7NMnDjMMkpHzb2ubHmCpO/k9Fkfl/TnRyjzN5IuyePzzarx7bhmGaXjGj0YEWcPw2f9BLgsIn51mDKnA3dGxL/JOx4zcIvDrB5LgQ9JekbS1yRNkrQBQNJVku6X9ANJL0q6QdLN6UCJ6ySdlJb7kKSHJT0t6ceSfq/yQyT9LvBuRPxK0ph0fyPTbcdLeknSyIj4JXCypA8M43dgbcyJwyy7JcA/R8S0iPiPVbafDfw7kuG0/xJ4O5KBEn8KLEjLLCcZIuRc4IvA/6yynwuB8mG/f0QyBAnAlcB3IxmnirTchUM8LrOajGh2AGYF9Fj6i/4tSW8CP0jXPwf8fjoa6wXA/5EGB049psp+ukiGdh/wDZLhte8Hrgb+qGzbDpJRcs1y58Rh1njvlr0vlS2XSM65DuCNiJh2hP38C3DCwEJEPJFeFvsI0BkRG8rKjk7Lm+XOl6rMsnuLZKrRukQy58OLkj4Fg/OK/6sqRTcBUyrWrQS+BdxTsf53SQY7NMudE4dZRhGxC3hC0gZJX6tzN58BrpH0DyTDo1ebUvVx4MMqu54FfBMYS5I8gME5JaaQjORrljvfjmvWwiT9d+AHEfH36fIngXkR8dmyMpcD0yPivzQpTGsz7uMwa21fIZm0CUn/A5hDMrdDuRHALcMcl7UxtzjMzCwT93GYmVkmThxmZpaJE4eZmWXixGFmZpk4cZiZWSb/H/QYAJv507pwAAAAAElFTkSuQmCC\n", "text/plain": [ "
    " ] @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -466,74 +466,1150 @@ " fill: currentColor;\n", "}\n", "
    <xarray.DataArray 'vx' (time (y): 221)>\n",
    -       "array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\n",
    -       "        0.,  0., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n",
    -       "       nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n",
    +       "array([0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "...\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.        , 0.        , 0.        ,\n",
    +       "       0.        , 0.        , 0.02101973, 0.02102004, 0.02102057,\n",
    +       "       0.0210213 , 0.02102224, 0.02102336, 0.02102465, 0.02102612,\n",
    +       "       0.02102774, 0.02102951, 0.02103142, 0.02103346, 0.02103561,\n",
    +       "       0.02103787, 0.02104022, 0.02104267, 0.02104519, 0.02104778,\n",
    +       "       0.02105043, 0.02105312, 0.02105586, 0.02105862, 0.0210614 ,\n",
    +       "       0.02106419])\n",
            "Coordinates:\n",
    -       "    id        float64 100.0\n",
    -       "  * time (y)  (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
    " + " id float64 2.0\n", + " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" ], "text/plain": [ "\n", - "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", - " 0., 0., nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n", - " nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])\n", + "array([0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + "...\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0.02101973, 0.02102004, 0.02102057,\n", + " 0.0210213 , 0.02102224, 0.02102336, 0.02102465, 0.02102612,\n", + " 0.02102774, 0.02102951, 0.02103142, 0.02103346, 0.02103561,\n", + " 0.02103787, 0.02104022, 0.02104267, 0.02104519, 0.02104778,\n", + " 0.02105043, 0.02105312, 0.02105586, 0.02105862, 0.0210614 ,\n", + " 0.02106419])\n", "Coordinates:\n", - " id float64 100.0\n", + " id float64 2.0\n", " * time (y) (time (y)) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" ] }, - "execution_count": 7, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "swiftdiff['vx'].sel(id=100)" + "swiftdiff['vx'].sel(id=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'vx' (time: 221)>\n",
    +       "array([ 0.        , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n",
    +       "       -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n",
    +       "       -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n",
    +       "       -0.40940715, -0.43666596, -0.463918  , -0.49116285, -0.51840009,\n",
    +       "       -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n",
    +       "       -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n",
    +       "       -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n",
    +       "       -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n",
    +       "       -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n",
    +       "       -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n",
    +       "       -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671  ,\n",
    +       "       -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n",
    +       "       -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n",
    +       "       -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n",
    +       "       -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n",
    +       "       -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n",
    +       "       -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n",
    +       "       -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n",
    +       "       -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n",
    +       "       -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n",
    +       "...\n",
    +       "       -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n",
    +       "       -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n",
    +       "       -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n",
    +       "       -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n",
    +       "       -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n",
    +       "       -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n",
    +       "       -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n",
    +       "       -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n",
    +       "       -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n",
    +       "       -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n",
    +       "       -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n",
    +       "       -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n",
    +       "       -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n",
    +       "       -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n",
    +       "       -5.24263186, -5.9750488 ,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan])\n",
    +       "Coordinates:\n",
    +       "    id       float64 100.0\n",
    +       "  * time     (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
    " + ], + "text/plain": [ + "\n", + "array([ 0. , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n", + " -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n", + " -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n", + " -0.40940715, -0.43666596, -0.463918 , -0.49116285, -0.51840009,\n", + " -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n", + " -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n", + " -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n", + " -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n", + " -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n", + " -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n", + " -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671 ,\n", + " -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n", + " -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n", + " -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n", + " -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n", + " -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n", + " -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n", + " -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n", + " -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n", + " -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n", + "...\n", + " -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n", + " -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n", + " -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n", + " -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n", + " -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n", + " -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n", + " -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n", + " -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n", + " -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n", + " -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n", + " -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n", + " -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n", + " -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n", + " -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n", + " -5.24263186, -5.9750488 , nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan])\n", + "Coordinates:\n", + " id float64 100.0\n", + " * time (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftestsim.ds.sel(id=100)['vx']" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    <xarray.DataArray 'vx' (time: 221)>\n",
    +       "array([ 0.        , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n",
    +       "       -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n",
    +       "       -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n",
    +       "       -0.40940715, -0.43666596, -0.463918  , -0.49116285, -0.51840009,\n",
    +       "       -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n",
    +       "       -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n",
    +       "       -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n",
    +       "       -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n",
    +       "       -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n",
    +       "       -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n",
    +       "       -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671  ,\n",
    +       "       -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n",
    +       "       -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n",
    +       "       -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n",
    +       "       -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n",
    +       "       -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n",
    +       "       -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n",
    +       "       -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n",
    +       "       -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n",
    +       "       -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n",
    +       "...\n",
    +       "       -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n",
    +       "       -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n",
    +       "       -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n",
    +       "       -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n",
    +       "       -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n",
    +       "       -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n",
    +       "       -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n",
    +       "       -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n",
    +       "       -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n",
    +       "       -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n",
    +       "       -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n",
    +       "       -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n",
    +       "       -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n",
    +       "       -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n",
    +       "       -5.24263186, -5.9750488 ,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan,         nan,         nan,         nan,         nan,\n",
    +       "               nan])\n",
    +       "Coordinates:\n",
    +       "    id       int64 100\n",
    +       "  * time     (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506
    " + ], + "text/plain": [ + "\n", + "array([ 0. , -0.02730963, -0.05461883, -0.08192718, -0.10923426,\n", + " -0.13653965, -0.16384292, -0.19114364, -0.21844141, -0.24573578,\n", + " -0.27302634, -0.30031266, -0.32759433, -0.35487091, -0.38214199,\n", + " -0.40940715, -0.43666596, -0.463918 , -0.49116285, -0.51840009,\n", + " -0.5456293 , -0.57285005, -0.60006193, -0.62726452, -0.6544574 ,\n", + " -0.68164014, -0.70881234, -0.73597358, -0.76312342, -0.79026147,\n", + " -0.8173873 , -0.8445005 , -0.87160064, -0.89868733, -0.92576014,\n", + " -0.95281866, -0.97986247, -1.00689117, -1.03390434, -1.06090158,\n", + " -1.08788246, -1.11484659, -1.14179356, -1.16872296, -1.19563437,\n", + " -1.22252741, -1.24940165, -1.27625671, -1.30309216, -1.32990762,\n", + " -1.35670269, -1.38347696, -1.41023003, -1.43696151, -1.463671 ,\n", + " -1.4903581 , -1.51702243, -1.54366359, -1.57028119, -1.59687484,\n", + " -1.62344416, -1.64998874, -1.67650822, -1.70300221, -1.72947032,\n", + " -1.75591217, -1.78232739, -1.8087156 , -1.83507643, -1.8614095 ,\n", + " -1.88771444, -1.91399088, -1.94023846, -1.96645681, -1.99264557,\n", + " -2.01880437, -2.04493287, -2.0710307 , -2.09709752, -2.12313297,\n", + " -2.1491367 , -2.17510838, -2.20104766, -2.2269542 , -2.25282767,\n", + " -2.27866774, -2.30447407, -2.33024634, -2.35598424, -2.38168744,\n", + " -2.40735563, -2.43298851, -2.45858576, -2.48414708, -2.50967219,\n", + " -2.53516079, -2.56061259, -2.58602731, -2.61140468, -2.63674443,\n", + "...\n", + " -3.28166908, -3.30592115, -3.33013189, -3.3543014 , -3.37842979,\n", + " -3.40251722, -3.42656386, -3.45056991, -3.47453562, -3.49846126,\n", + " -3.52234715, -3.54619364, -3.57000113, -3.59377005, -3.61750092,\n", + " -3.64119426, -3.66485068, -3.68847086, -3.71205553, -3.73560548,\n", + " -3.75912161, -3.78260489, -3.80605637, -3.82947723, -3.85286873,\n", + " -3.87623226, -3.89956936, -3.92288168, -3.94617105, -3.96943947,\n", + " -3.99268912, -4.01592242, -4.03914199, -4.06235073, -4.08555183,\n", + " -4.10874879, -4.13194551, -4.15514625, -4.17835577, -4.20157933,\n", + " -4.2248228 , -4.24809272, -4.2713964 , -4.29474206, -4.31813893,\n", + " -4.34159746, -4.36512951, -4.38874856, -4.41247007, -4.43631182,\n", + " -4.46029439, -4.48444172, -4.50878191, -4.53334814, -4.55817998,\n", + " -4.58332498, -4.60884098, -4.63479915, -4.66128825, -4.68842081,\n", + " -4.71634199, -4.7452432 , -4.77538326, -4.80712299, -4.84098468,\n", + " -4.87776098, -4.91873117, -4.96614064, -5.02443531, -5.10428159,\n", + " -5.24263186, -5.9750488 , nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan, nan, nan, nan, nan,\n", + " nan])\n", + "Coordinates:\n", + " id int64 100\n", + " * time (time) float64 0.0 0.0006845 0.001369 ... 0.1492 0.1499 0.1506" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftersim.ds.sel(id=100)['vx']" ] }, { diff --git a/src/io/io.f90 b/src/io/io.f90 index d2791aa92..145752836 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -2,6 +2,238 @@ use swiftest contains + module subroutine io_dump_param(self, param_file_name) + !! author: David A. Minton + !! + !! Dump integration parameters to file + !! + !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 + !! Adapted from Martin Duncan's Swift routine io_dump_param.f + implicit none + ! Arguments + class(swiftest_parameters),intent(in) :: self !! Output collection of parameters + character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) + ! Internals + integer(I4B), parameter :: LUN = 7 !! Unit number of output file + integer(I4B) :: ierr !! Error code + character(STRMAX) :: error_message !! Error message in UDIO procedure + + open(unit = LUN, file = param_file_name, status='replace', form = 'FORMATTED', iostat =ierr) + if (ierr /=0) then + write(*,*) 'Swiftest error.' + write(*,*) ' Could not open dump file: ',trim(adjustl(param_file_name)) + call util_exit(FAILURE) + end if + + !! todo: Currently this procedure does not work in user-defined derived-type input mode + !! due to compiler incompatabilities + !write(LUN,'(DT)') param + call self%writer(LUN, iotype = "none", v_list = [0], iostat = ierr, iomsg = error_message) + if (ierr /= 0) then + write(*,*) trim(adjustl(error_message)) + call util_exit(FAILURE) + end if + close(LUN) + + return + end subroutine io_dump_param + + + module subroutine io_dump_swiftest(self, param, msg) + !! author: David A. Minton + !! + !! Dump massive body data to files + !! + !! Adapted from David E. Kaufmann's Swifter routine: io_dump_pl.f90 and io_dump_tp.f90 + !! Adapted from Hal Levison's Swift routine io_dump_pl.f and io_dump_tp.f + implicit none + ! Arguments + class(swiftest_base), intent(inout) :: self !! Swiftest base object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + character(*), optional, intent(in) :: msg !! Message to display with dump operation + ! Internals + integer(I4B) :: ierr !! Error code + integer(I4B),parameter :: LUN = 7 !! Unit number for dump file + integer(I4B) :: iu = LUN + character(len=:), allocatable :: dump_file_name + + select type(self) + class is(swiftest_cb) + dump_file_name = trim(adjustl(param%incbfile)) + class is (swiftest_pl) + dump_file_name = trim(adjustl(param%inplfile)) + class is (swiftest_tp) + dump_file_name = trim(adjustl(param%intpfile)) + end select + open(unit = iu, file = dump_file_name, form = "UNFORMATTED", status = 'replace', iostat = ierr) + if (ierr /= 0) then + write(*, *) "Swiftest error:" + write(*, *) " Unable to open binary dump file " // dump_file_name + call util_exit(FAILURE) + end if + call self%write_frame(iu, param) + close(LUN) + + return + end subroutine io_dump_swiftest + + + module subroutine io_dump_system(self, param, msg) + !! author: David A. Minton + !! + !! Dumps the state of the system to files in case the simulation is interrupted. + !! As a safety mechanism, there are two dump files that are written in alternating order + !! so that if a dump file gets corrupted during writing, the user can restart from the older one. + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + character(*), optional, intent(in) :: msg !! Message to display with dump operation + ! Internals + class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names + !! to dump file-specific values without changing the user-defined values + integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security + !! in case the program halts during writing + character(len=:), allocatable :: param_file_name + real(DP) :: tfrac + + allocate(dump_param, source=param) + param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) + dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) + dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) + dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) + dump_param%out_form = XV + dump_param%out_stat = 'APPEND' + dump_param%T0 = param%t + call dump_param%dump(param_file_name) + + call self%cb%dump(dump_param) + if (self%pl%nbody > 0) call self%pl%dump(dump_param) + if (self%tp%nbody > 0) call self%tp%dump(dump_param) + + idx = idx + 1 + if (idx > NDUMPFILES) idx = 1 + + ! Print the status message (format code passed in from main driver) + tfrac = (param%t - param%t0) / (param%tstop - param%t0) + write(*,msg) param%t, tfrac, self%pl%nbody, self%tp%nbody + + return + end subroutine io_dump_system + + + module function io_get_args(integrator, param_file_name) result(ierr) + !! author: David A. Minton + !! + !! Reads in the name of the parameter file from command line arguments. + implicit none + ! Arguments + integer(I4B) :: integrator !! Symbolic code of the requested integrator + character(len=:), allocatable :: param_file_name !! Name of the input parameters file + ! Result + integer(I4B) :: ierr !! I/O error code + ! Internals + character(len=STRMAX) :: arg1, arg2 + integer :: narg,ierr_arg1, ierr_arg2 + character(len=*),parameter :: linefmt = '(A)' + + ierr = -1 ! Default is to fail + narg = command_argument_count() ! + if (narg == 2) then + call get_command_argument(1, arg1, status = ierr_arg1) + call get_command_argument(2, arg2, status = ierr_arg2) + if ((ierr_arg1 == 0) .and. (ierr_arg2 == 0)) then + ierr = 0 + call io_toupper(arg1) + select case(arg1) + case('BS') + integrator = BS + case('HELIO') + integrator = HELIO + case('RA15') + integrator = RA15 + case('TU4') + integrator = TU4 + case('WHM') + integrator = WHM + case('RMVS') + integrator = RMVS + case('SYMBA') + integrator = SYMBA + case('RINGMOONS') + integrator = RINGMOONS + case default + integrator = UNKNOWN_INTEGRATOR + write(*,*) trim(adjustl(arg1)) // ' is not a valid integrator.' + ierr = -1 + end select + param_file_name = trim(adjustl(arg2)) + end if + else + call get_command_argument(1, arg1, status = ierr_arg1) + if (ierr_arg1 == 0) then + if (arg1 == '-v' .or. arg1 == '--version') then + call util_version() + else if (arg1 == '-h' .or. arg1 == '--help') then + call util_exit(HELP) + end if + end if + end if + if (ierr /= 0) call util_exit(USAGE) + + return + end function io_get_args + + + module function io_get_token(buffer, ifirst, ilast, ierr) result(token) + !! author: David A. Minton + !! + !! Retrieves a character token from an input string. Here a token is defined as any set of contiguous non-blank characters not + !! beginning with or containing "!". If "!" is present, any remaining part of the buffer including the "!" is ignored + !! + !! Adapted from David E. Kaufmann's Swifter routine io_get_token.f90 + implicit none + ! Arguments + character(len=*), intent(in) :: buffer !! Input string buffer + integer(I4B), intent(inout) :: ifirst !! Index of the buffer at which to start the search for a token + integer(I4B), intent(out) :: ilast !! Index of the buffer at the end of the returned token + integer(I4B), intent(out) :: ierr !! Error code + ! Result + character(len=:), allocatable :: token !! Returned token string + ! Internals + integer(I4B) :: i,ilength + + ilength = len(buffer) + + if (ifirst > ilength) then + ilast = ifirst + ierr = -1 !! Bad input + token = '' + return + end if + do i = ifirst, ilength + if (buffer(i:i) /= ' ') exit + end do + if ((i > ilength) .or. (buffer(i:i) == '!')) then + ifirst = i + ilast = i + ierr = -2 !! No valid token + token = '' + return + end if + ifirst = i + do i = ifirst, ilength + if ((buffer(i:i) == ' ') .or. (buffer(i:i) == '!')) exit + end do + ilast = i - 1 + ierr = 0 + + token = buffer(ifirst:ilast) + + return + end function io_get_token + + module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -257,342 +489,110 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) ! Calculate the G for the system units self%GU = GC / (self%DU2M**3 / (self%MU2KG * self%TU2S**2)) - ! Calculate the inverse speed of light in the system units - self%inv_c2 = einsteinC * self%TU2S / self%DU2M - self%inv_c2 = (self%inv_c2)**(-2) - - associate(integrator => v_list(1)) - if (integrator == RMVS) then - if (.not.self%lclose) then - write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' - iostat = -1 - return - end if - end if - - ! Determine if the GR flag is set correctly for this integrator - select case(integrator) - case(WHM, RMVS, HELIO, SYMBA) - write(*,*) "GR = ", self%lgr - case default - if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' - self%lgr = .false. - end select - end associate - - iostat = 0 - - return - end subroutine io_param_reader - - - module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) - !! author: David A. Minton - !! - !! Dump integration parameters to file - !! - !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 - !! Adapted from Martin Duncan's Swift routine io_dump_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(in) :: self !! Collection of parameters - integer, intent(in) :: unit !! File unit number - character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. - !! If you do not include a char-literal-constant, the iotype argument contains only DT. - integer, intent(in) :: v_list(:) !! Not used in this procedure - integer, intent(out) :: iostat !! IO status code - character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 - ! Internals - character(*),parameter :: Ifmt = '(I0)' !! Format label for integer values - character(*),parameter :: Rfmt = '(ES25.17)' !! Format label for real values - character(*),parameter :: Rarrfmt = '(3(ES25.17,1X))' !! Format label for real values - character(*),parameter :: Lfmt = '(L1)' !! Format label for logical values - character(len=*), parameter :: Afmt = '(A25,1X,64(:,A25,1X))' - character(256) :: param_name, param_value - type character_array - character(25) :: value - end type character_array - type(character_array), dimension(:), allocatable :: param_array - integer(I4B) :: i - - associate(param => self) - write(param_name, Afmt) "T0"; write(param_value,Rfmt) param%t0; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DT"; write(param_value, Rfmt) param%dt; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "PL_IN"; write(param_value, Afmt) trim(adjustl(param%inplfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TP_in"; write(param_value, Afmt) trim(adjustl(param%intpfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "IN_TYPE"; write(param_value, Afmt) trim(adjustl(param%in_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%istep_out > 0) then - write(param_name, Afmt) "ISTEP_OUT"; write(param_value, Ifmt) param%istep_out; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "BIN_OUT"; write(param_value, Afmt) trim(adjustl(param%outfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_TYPE"; write(param_value, Afmt) trim(adjustl(param%out_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - end if - write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%istep_dump > 0) then - write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - end if - write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - if (param%qmin >= 0.0_DP) then - write(param_name, Afmt) "CHK_QMIN_COORD"; write(param_value, Afmt) trim(adjustl(param%qmin_coord)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) - allocate(param_array(2)) - write(param_array(1)%value, Rfmt) param%qmin_alo - write(param_array(2)%value, Rfmt) param%qmin_ahi - write(param_name, Afmt) "CHK_QMIN_RANGE"; write(unit, Afmt) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) - end if - write(param_name, Afmt) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt) adjustl(param_name), adjustl(param_value) - iostat = 0 - iomsg = "UDIO not implemented" - end associate - - return - end subroutine io_param_writer - - - module subroutine io_dump_param(self, param_file_name) - !! author: David A. Minton - !! - !! Dump integration parameters to file - !! - !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 - !! Adapted from Martin Duncan's Swift routine io_dump_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(in) :: self !! Output collection of parameters - character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) - ! Internals - integer(I4B), parameter :: LUN = 7 !! Unit number of output file - integer(I4B) :: ierr !! Error code - character(STRMAX) :: error_message !! Error message in UDIO procedure - - open(unit = LUN, file = param_file_name, status='replace', form = 'FORMATTED', iostat =ierr) - if (ierr /=0) then - write(*,*) 'Swiftest error.' - write(*,*) ' Could not open dump file: ',trim(adjustl(param_file_name)) - call util_exit(FAILURE) - end if - - !! todo: Currently this procedure does not work in user-defined derived-type input mode - !! due to compiler incompatabilities - !write(LUN,'(DT)') param - call self%writer(LUN, iotype = "none", v_list = [0], iostat = ierr, iomsg = error_message) - if (ierr /= 0) then - write(*,*) trim(adjustl(error_message)) - call util_exit(FAILURE) - end if - close(LUN) - - return - end subroutine io_dump_param - - - module subroutine io_dump_swiftest(self, param, msg) - !! author: David A. Minton - !! - !! Dump massive body data to files - !! - !! Adapted from David E. Kaufmann's Swifter routine: io_dump_pl.f90 and io_dump_tp.f90 - !! Adapted from Hal Levison's Swift routine io_dump_pl.f and io_dump_tp.f - implicit none - ! Arguments - class(swiftest_base), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation - ! Internals - integer(I4B) :: ierr !! Error code - integer(I4B),parameter :: LUN = 7 !! Unit number for dump file - integer(I4B) :: iu = LUN - character(len=:), allocatable :: dump_file_name - - select type(self) - class is(swiftest_cb) - dump_file_name = trim(adjustl(param%incbfile)) - class is (swiftest_pl) - dump_file_name = trim(adjustl(param%inplfile)) - class is (swiftest_tp) - dump_file_name = trim(adjustl(param%intpfile)) - end select - open(unit = iu, file = dump_file_name, form = "UNFORMATTED", status = 'replace', iostat = ierr) - if (ierr /= 0) then - write(*, *) "Swiftest error:" - write(*, *) " Unable to open binary dump file " // dump_file_name - call util_exit(FAILURE) - end if - call self%write_frame(iu, param) - close(LUN) - - return - end subroutine io_dump_swiftest - - - module subroutine io_dump_system(self, param, msg) - !! author: David A. Minton - !! - !! Dumps the state of the system to files in case the simulation is interrupted. - !! As a safety mechanism, there are two dump files that are written in alternating order - !! so that if a dump file gets corrupted during writing, the user can restart from the older one. - implicit none - ! Arguments - class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - character(*), optional, intent(in) :: msg !! Message to display with dump operation - ! Internals - class(swiftest_parameters), allocatable :: dump_param !! Local parameters variable used to parameters change input file names - !! to dump file-specific values without changing the user-defined values - integer(I4B), save :: idx = 1 !! Index of current dump file. Output flips between 2 files for extra security - !! in case the program halts during writing - character(len=:), allocatable :: param_file_name - real(DP) :: tfrac - - allocate(dump_param, source=param) - param_file_name = trim(adjustl(DUMP_PARAM_FILE(idx))) - dump_param%incbfile = trim(adjustl(DUMP_CB_FILE(idx))) - dump_param%inplfile = trim(adjustl(DUMP_PL_FILE(idx))) - dump_param%intpfile = trim(adjustl(DUMP_TP_FILE(idx))) - dump_param%out_form = XV - dump_param%out_stat = 'APPEND' - dump_param%T0 = param%t - call dump_param%dump(param_file_name) - - call self%cb%dump(dump_param) - if (self%pl%nbody > 0) call self%pl%dump(dump_param) - if (self%tp%nbody > 0) call self%tp%dump(dump_param) - - idx = idx + 1 - if (idx > NDUMPFILES) idx = 1 - - ! Print the status message (format code passed in from main driver) - tfrac = (param%t - param%t0) / (param%tstop - param%t0) - write(*,msg) param%t, tfrac, self%pl%nbody, self%tp%nbody - - return - end subroutine io_dump_system - - - module function io_get_args(integrator, param_file_name) result(ierr) - !! author: David A. Minton - !! - !! Reads in the name of the parameter file from command line arguments. - implicit none - ! Arguments - integer(I4B) :: integrator !! Symbolic code of the requested integrator - character(len=:), allocatable :: param_file_name !! Name of the input parameters file - ! Result - integer(I4B) :: ierr !! I/O error code - ! Internals - character(len=STRMAX) :: arg1, arg2 - integer :: narg,ierr_arg1, ierr_arg2 - character(len=*),parameter :: linefmt = '(A)' + ! Calculate the inverse speed of light in the system units + self%inv_c2 = einsteinC * self%TU2S / self%DU2M + self%inv_c2 = (self%inv_c2)**(-2) - ierr = -1 ! Default is to fail - narg = command_argument_count() ! - if (narg == 2) then - call get_command_argument(1, arg1, status = ierr_arg1) - call get_command_argument(2, arg2, status = ierr_arg2) - if ((ierr_arg1 == 0) .and. (ierr_arg2 == 0)) then - ierr = 0 - call io_toupper(arg1) - select case(arg1) - case('BS') - integrator = BS - case('HELIO') - integrator = HELIO - case('RA15') - integrator = RA15 - case('TU4') - integrator = TU4 - case('WHM') - integrator = WHM - case('RMVS') - integrator = RMVS - case('SYMBA') - integrator = SYMBA - case('RINGMOONS') - integrator = RINGMOONS - case default - integrator = UNKNOWN_INTEGRATOR - write(*,*) trim(adjustl(arg1)) // ' is not a valid integrator.' - ierr = -1 - end select - param_file_name = trim(adjustl(arg2)) - end if - else - call get_command_argument(1, arg1, status = ierr_arg1) - if (ierr_arg1 == 0) then - if (arg1 == '-v' .or. arg1 == '--version') then - call util_version() - else if (arg1 == '-h' .or. arg1 == '--help') then - call util_exit(HELP) + associate(integrator => v_list(1)) + if (integrator == RMVS) then + if (.not.self%lclose) then + write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' + iostat = -1 + return end if end if - end if - if (ierr /= 0) call util_exit(USAGE) + + ! Determine if the GR flag is set correctly for this integrator + select case(integrator) + case(WHM, RMVS, HELIO, SYMBA) + write(*,*) "GR = ", self%lgr + case default + if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + self%lgr = .false. + end select + end associate - return - end function io_get_args + iostat = 0 + + return + end subroutine io_param_reader - module function io_get_token(buffer, ifirst, ilast, ierr) result(token) + module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) !! author: David A. Minton !! - !! Retrieves a character token from an input string. Here a token is defined as any set of contiguous non-blank characters not - !! beginning with or containing "!". If "!" is present, any remaining part of the buffer including the "!" is ignored + !! Dump integration parameters to file !! - !! Adapted from David E. Kaufmann's Swifter routine io_get_token.f90 + !! Adapted from David E. Kaufmann's Swifter routine io_dump_param.f90 + !! Adapted from Martin Duncan's Swift routine io_dump_param.f implicit none ! Arguments - character(len=*), intent(in) :: buffer !! Input string buffer - integer(I4B), intent(inout) :: ifirst !! Index of the buffer at which to start the search for a token - integer(I4B), intent(out) :: ilast !! Index of the buffer at the end of the returned token - integer(I4B), intent(out) :: ierr !! Error code - ! Result - character(len=:), allocatable :: token !! Returned token string + class(swiftest_parameters),intent(in) :: self !! Collection of parameters + integer, intent(in) :: unit !! File unit number + character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. + !! If you do not include a char-literal-constant, the iotype argument contains only DT. + integer, intent(in) :: v_list(:) !! Not used in this procedure + integer, intent(out) :: iostat !! IO status code + character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 ! Internals - integer(I4B) :: i,ilength - - ilength = len(buffer) - - if (ifirst > ilength) then - ilast = ifirst - ierr = -1 !! Bad input - token = '' - return - end if - do i = ifirst, ilength - if (buffer(i:i) /= ' ') exit - end do - if ((i > ilength) .or. (buffer(i:i) == '!')) then - ifirst = i - ilast = i - ierr = -2 !! No valid token - token = '' - return - end if - ifirst = i - do i = ifirst, ilength - if ((buffer(i:i) == ' ') .or. (buffer(i:i) == '!')) exit - end do - ilast = i - 1 - ierr = 0 - - token = buffer(ifirst:ilast) + character(*),parameter :: Ifmt = '(I0)' !! Format label for integer values + character(*),parameter :: Rfmt = '(ES25.17)' !! Format label for real values + character(*),parameter :: Rarrfmt = '(3(ES25.17,1X))' !! Format label for real values + character(*),parameter :: Lfmt = '(L1)' !! Format label for logical values + character(len=*), parameter :: Afmt = '(A25,1X,64(:,A25,1X))' + character(256) :: param_name, param_value + type character_array + character(25) :: value + end type character_array + type(character_array), dimension(:), allocatable :: param_array + integer(I4B) :: i + + associate(param => self) + write(param_name, Afmt) "T0"; write(param_value,Rfmt) param%t0; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TSTOP"; write(param_value, Rfmt) param%tstop; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "DT"; write(param_value, Rfmt) param%dt; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "PL_IN"; write(param_value, Afmt) trim(adjustl(param%inplfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TP_in"; write(param_value, Afmt) trim(adjustl(param%intpfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "IN_TYPE"; write(param_value, Afmt) trim(adjustl(param%in_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%istep_out > 0) then + write(param_name, Afmt) "ISTEP_OUT"; write(param_value, Ifmt) param%istep_out; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "BIN_OUT"; write(param_value, Afmt) trim(adjustl(param%outfile)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_TYPE"; write(param_value, Afmt) trim(adjustl(param%out_type)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_FORM"; write(param_value, Afmt) trim(adjustl(param%out_form)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "OUT_STAT"; write(param_value, Afmt) "APPEND"; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + end if + write(param_name, Afmt) "ENC_OUT"; write(param_value, Afmt) trim(adjustl(param%enc_out)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%istep_dump > 0) then + write(param_name, Afmt) "ISTEP_DUMP"; write(param_value, Ifmt) param%istep_dump; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + end if + write(param_name, Afmt) "CHK_RMIN"; write(param_value, Rfmt) param%rmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_RMAX"; write(param_value, Rfmt) param%rmax; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_EJECT"; write(param_value, Rfmt) param%rmaxu; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_QMIN"; write(param_value, Rfmt) param%qmin; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + if (param%qmin >= 0.0_DP) then + write(param_name, Afmt) "CHK_QMIN_COORD"; write(param_value, Afmt) trim(adjustl(param%qmin_coord)); write(unit, Afmt) adjustl(param_name), adjustl(param_value) + allocate(param_array(2)) + write(param_array(1)%value, Rfmt) param%qmin_alo + write(param_array(2)%value, Rfmt) param%qmin_ahi + write(param_name, Afmt) "CHK_QMIN_RANGE"; write(unit, Afmt) adjustl(param_name), adjustl(param_array(1)%value), adjustl(param_array(2)%value) + end if + write(param_name, Afmt) "MU2KG"; write(param_value, Rfmt) param%MU2KG; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TU2S"; write(param_value, Rfmt) param%TU2S ; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "DU2M"; write(param_value, Rfmt) param%DU2M; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "RHILL_PRESENT"; write(param_value, Lfmt) param%lrhill_present; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "EXTRA_FORCE"; write(param_value, Lfmt) param%lextra_force; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "BIG_DISCARD"; write(param_value, Lfmt) param%lbig_discard; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "CHK_CLOSE"; write(param_value, Lfmt) param%lclose; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ENERGY"; write(param_value, Lfmt) param%lenergy; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + iostat = 0 + iomsg = "UDIO not implemented" + end associate return - end function io_get_token + end subroutine io_param_writer module subroutine io_read_body_in(self, param) @@ -730,50 +730,9 @@ module subroutine io_read_cb_in(self, param) end subroutine io_read_cb_in - module subroutine io_read_param_in(self, param_file_name) - !! author: David A. Minton - !! - !! Read in parameters for the integration - !! - !! Adapted from David E. Kaufmann's Swifter routine io_init_param.f90 - !! Adapted from Martin Duncan's Swift routine io_init_param.f - implicit none - ! Arguments - class(swiftest_parameters),intent(inout) :: self !! Current run configuration parameters - character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) - ! Internals - integer(I4B), parameter :: LUN = 7 !! Unit number of input file - integer(I4B) :: ierr = 0 !! Input error code - character(STRMAX) :: error_message !! Error message in UDIO procedure - - ! Read in name of parameter file - write(*, *) 'Parameter input file is ', trim(adjustl(param_file_name)) - write(*, *) ' ' - 100 format(A) - open(unit = LUN, file = param_file_name, status = 'old', iostat = ierr) - if (ierr /= 0) then - write(*,*) 'Swiftest error: ', ierr - write(*,*) ' Unable to open file ',trim(adjustl(param_file_name)) - call util_exit(FAILURE) - end if - - !! todo: Currently this procedure does not work in user-defined derived-type input mode - !! as the newline characters are ignored in the input file when compiled in ifort. - - !read(LUN,'(DT)', iostat= ierr, iomsg = error_message) param - call self%reader(LUN, iotype= "none", v_list = [self%integrator], iostat = ierr, iomsg = error_message) - if (ierr /= 0) then - write(*,*) 'Swiftest error reading ', trim(adjustl(param_file_name)) - write(*,*) ierr,trim(adjustl(error_message)) - call util_exit(FAILURE) - end if - - return - end subroutine io_read_param_in - function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & - xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) + xh1, xh2, vh1, vh2, enc_out, out_type) result(ierr) !! author: David A. Minton !! !! Read close encounter data from input binary files @@ -807,7 +766,7 @@ function io_read_encounter(t, name1, name2, mass1, mass2, radius1, radius2, & close(unit = iu, iostat = ierr) return end if - + read(iu, iostat = ierr) name1, xh1(1), xh1(2), xh1(3), vh1(1), vh1(2), vh1(3), mass1, radius1 if (ierr /= 0) then close(unit = iu, iostat = ierr) @@ -931,7 +890,7 @@ module subroutine io_read_frame_cb(self, iu, param, form, ierr) return end subroutine io_read_frame_cb - + module subroutine io_read_frame_system(self, iu, param, form, ierr) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! @@ -1009,6 +968,47 @@ function io_read_hdr(iu, t, npl, ntp, out_form, out_type) result(ierr) return end function io_read_hdr + module subroutine io_read_param_in(self, param_file_name) + !! author: David A. Minton + !! + !! Read in parameters for the integration + !! + !! Adapted from David E. Kaufmann's Swifter routine io_init_param.f90 + !! Adapted from Martin Duncan's Swift routine io_init_param.f + implicit none + ! Arguments + class(swiftest_parameters),intent(inout) :: self !! Current run configuration parameters + character(len=*), intent(in) :: param_file_name !! Parameter input file name (i.e. param.in) + ! Internals + integer(I4B), parameter :: LUN = 7 !! Unit number of input file + integer(I4B) :: ierr = 0 !! Input error code + character(STRMAX) :: error_message !! Error message in UDIO procedure + + ! Read in name of parameter file + write(*, *) 'Parameter input file is ', trim(adjustl(param_file_name)) + write(*, *) ' ' + 100 format(A) + open(unit = LUN, file = param_file_name, status = 'old', iostat = ierr) + if (ierr /= 0) then + write(*,*) 'Swiftest error: ', ierr + write(*,*) ' Unable to open file ',trim(adjustl(param_file_name)) + call util_exit(FAILURE) + end if + + !! todo: Currently this procedure does not work in user-defined derived-type input mode + !! as the newline characters are ignored in the input file when compiled in ifort. + + !read(LUN,'(DT)', iostat= ierr, iomsg = error_message) param + call self%reader(LUN, iotype= "none", v_list = [self%integrator], iostat = ierr, iomsg = error_message) + if (ierr /= 0) then + write(*,*) 'Swiftest error reading ', trim(adjustl(param_file_name)) + write(*,*) ierr,trim(adjustl(error_message)) + call util_exit(FAILURE) + end if + + return + end subroutine io_read_param_in + module subroutine io_toupper(string) !! author: David A. Minton diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index c5aba1a7f..f920fff87 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -537,9 +537,9 @@ end subroutine symba_util_peri_pl module subroutine symba_util_rearray_pl(self, system, param) implicit none - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions end subroutine symba_util_rearray_pl end interface diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 33fe47354..6ab835e36 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -310,7 +310,7 @@ module subroutine symba_discard_pl(self, system, param) if (any(pl%ldiscard(:))) then call symba_discard_nonplpl_conservation(self, system, param) - !call pl%rearray(self, system, param) + call pl%rearray(system, param) end if end associate diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index cafaacfd7..f8afffb85 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -97,6 +97,8 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, ibiggest = maxloc(pl%Gmass(family(:)), dim=1) plnew%id(1) = pl%id(family(ibiggest)) plnew%status(1) = ACTIVE + plnew%lcollision = .false. + plnew%ldiscard = .false. plnew%xb(:,1) = xcom(:) plnew%vb(:,1) = vcom(:) plnew%xh(:,1) = xcom(:) - cb%xb(:) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index c0276291a..98c8889d8 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -375,17 +375,37 @@ module subroutine symba_util_rearray_pl(self, system, param) !! Clean up the massive body structures to remove discarded bodies and add new bodies implicit none ! Arguments - class(symba_pl), intent(inout) :: self !! SyMBA massive body object - class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(symba_pl), intent(inout) :: self !! SyMBA massive body object + class(symba_nbody_system), intent(inout) :: system !! Swiftest nbody system object + class(symba_parameters), intent(in) :: param !! Current run configuration parameters + ! Internals + class(symba_pl), allocatable :: pl_discards !! The discarded body list. + + associate(pl => self, mergeadd_list => system%mergeadd_list) + allocate(pl_discards, mold=pl) + ! Remove the discards + call pl%spill(pl_discards, lspill_list=(pl%ldiscard(:) .or. pl%status(:) == INACTIVE), ldestructive=.true.) + + ! Add in any new bodies + call pl%append(mergeadd_list) + + ! If there are still bodies in the system, sort by mass in descending order and re-index + if (pl%nbody > 0) then + call pl%sort("mass", ascending=.false.) + pl%lmtiny(:) = pl%Gmass(:) > param%MTINY + pl%nplm = count(pl%lmtiny(:)) + call pl%eucl_index() + end if - ! First + ! Destroy the discarded body list, since we already have what we need in the mergesub_list + call pl_discards%setup(0,param) + deallocate(pl_discards) + end associate return end subroutine symba_util_rearray_pl - module subroutine symba_util_resize_arr_info(arr, nnew) !! author: David A. Minton !! diff --git a/src/util/util_spill.f90 b/src/util/util_spill.f90 index 0cef49194..9acc6ae93 100644 --- a/src/util/util_spill.f90 +++ b/src/util/util_spill.f90 @@ -163,6 +163,7 @@ module subroutine util_spill_body(self, discards, lspill_list, ldestructive) call util_spill(keeps%name, discards%name, lspill_list, ldestructive) call util_spill(keeps%status, discards%status, lspill_list, ldestructive) call util_spill(keeps%lmask, discards%lmask, lspill_list, ldestructive) + call util_spill(keeps%ldiscard, discards%ldiscard, lspill_list, ldestructive) call util_spill(keeps%mu, discards%mu, lspill_list, ldestructive) call util_spill(keeps%xh, discards%xh, lspill_list, ldestructive) call util_spill(keeps%vh, discards%vh, lspill_list, ldestructive) From fb21ff7e17451588f65bbdcfbfbbba96591b1690 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 20:36:45 -0400 Subject: [PATCH 182/194] Added energy and momentum report back in --- src/io/io.f90 | 86 ++++++++++++++++++ src/modules/swiftest_classes.f90 | 62 ++++++++++--- src/obl/obl.f90 | 40 +++++++++ src/util/util_get_energy_momentum.f90 | 121 ++++++++++++++++++++++++++ 4 files changed, 299 insertions(+), 10 deletions(-) create mode 100644 src/util/util_get_energy_momentum.f90 diff --git a/src/io/io.f90 b/src/io/io.f90 index 145752836..e159d019d 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -2,6 +2,92 @@ use swiftest contains + module subroutine io_conservation_report(self, param, lterminal) + !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott + !! + !! Reports the current state of energy, mass, and angular momentum conservation in a run + implicit none + ! Arguments + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Input colleciton of user-defined parameters + logical, intent(in) :: lterminal !! Indicates whether to output information to the terminal screen + ! Internals + real(DP), dimension(NDIM) :: Ltot_now, Lorbit_now, Lspin_now + real(DP), dimension(NDIM), save :: Ltot_last, Lorbit_last, Lspin_last + real(DP), save :: ke_orbit_last, ke_spin_last, pe_last, Eorbit_last + real(DP) :: ke_orbit_now, ke_spin_now, pe_now, Eorbit_now + real(DP) :: Eorbit_error, Etotal_error, Ecoll_error + real(DP) :: Mtot_now, Merror + real(DP) :: Lmag_now, Lerror + character(len=*), parameter :: EGYFMT = '(ES23.16,10(",",ES23.16,:))' ! Format code for all simulation output + character(len=*), parameter :: EGYHEADER = '("t,Eorbit,Ecollisions,Lx,Ly,Lz,Mtot")' + integer(I4B), parameter :: EGYIU = 72 + character(len=*), parameter :: EGYTERMFMT = '(" DL/L0 = ", ES12.5 & + "; DEcollisions/|E0| = ", ES12.5, & + "; D(Eorbit+Ecollisions)/|E0| = ", ES12.5, & + "; DM/M0 = ", ES12.5)' + + associate(system => self, pl => self%pl, cb => self%cb, npl => self%pl%nbody, Ecollisions => self%Ecollisions, Lescape => self%Lescape, Mescape => self%Mescape, & + 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") + write(EGYIU,EGYHEADER) + end if + end if + call system%get_energy_and_momentum(param, ke_orbit_now, ke_spin_now, pe_now, Lorbit_now, Lspin_now) + Eorbit_now = ke_orbit_now + ke_spin_now + pe_now + Ltot_now(:) = Lorbit_now(:) + Lspin_now(:) + Lescape(:) + Mtot_now = cb%mass + sum(pl%mass(1:npl)) + system%Mescape + if (lfirst) then + Eorbit_orig = Eorbit_now + Mtot_orig = Mtot_now + Lorbit_orig(:) = Lorbit_now(:) + Lspin_orig(:) = Lspin_now(:) + Ltot_orig(:) = Ltot_now(:) + Lmag_orig = norm2(Ltot_orig(:)) + lfirst = .false. + end if + + write(EGYIU,EGYFMT) param%t, Eorbit_now, Ecollisions, Ltot_now, Mtot_now + flush(EGYIU) + if (.not.lfirst .and. lterminal) then + Lmag_now = norm2(Ltot_now) + Lerror = norm2(Ltot_now - Ltot_orig) / Lmag_orig + Eorbit_error = (Eorbit_now - Eorbit_orig) / abs(Eorbit_orig) + Ecoll_error = Ecollisions / abs(Eorbit_orig) + Etotal_error = (Eorbit_now - Ecollisions - Eorbit_orig - Euntracked) / abs(Eorbit_orig) + Merror = (Mtot_now - Mtot_orig) / Mtot_orig + write(*, egytermfmt) Lerror, Ecoll_error, Etotal_error, Merror + if (Ecoll_error > 0.0_DP) then + write(*,*) 'Something has gone wrong! Collisional energy should not be positive!' + write(*,*) 'dke_orbit: ',(ke_orbit_now - ke_orbit_last) / abs(Eorbit_orig) + write(*,*) 'dke_spin : ',(ke_spin_now - ke_spin_last) / abs(Eorbit_orig) + write(*,*) 'dpe : ',(pe_now - pe_last) / abs(Eorbit_orig) + write(*,*) + end if + if (Lerror > 1e-6) then + write(*,*) 'Something has gone wrong! Angular momentum is too high!' + write(*,*) 'Lerror: ', Lerror + end if + end if + ke_orbit_last = ke_orbit_now + ke_spin_last = ke_spin_now + pe_last = pe_now + Eorbit_last = Eorbit_now + Lorbit_last(:) = Lorbit_now(:) + Lspin_last(:) = Lspin_now(:) + Ltot_last(:) = Ltot_now(:) + end associate + return + + end subroutine io_conservation_report + + module subroutine io_dump_param(self, param_file_name) !! author: David A. Minton !! diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 74add9081..dcff0f6d8 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -45,8 +45,9 @@ 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 - !Logical flags to turn on or off various features of the code + ! 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) logical :: lextra_force = .false. !! User defined force function turned on logical :: lbig_discard = .false. !! Save big bodies on every discard @@ -56,6 +57,16 @@ module swiftest_classes logical :: lrotation = .false. !! Include rotation states of big bodies logical :: ltides = .false. !! Include tidal dissipation + ! Initial values to pass to the energy report subroutine (usually only used in the case of a restart, otherwise these will be updated with initial conditions values) + real(DP) :: Eorbit_orig = 0.0_DP !! Initial orbital energy + real(DP) :: Mtot_orig = 0.0_DP !! Initial system mass + real(DP) :: Lmag_orig = 0.0_DP !! Initial total angular momentum magnitude + 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 + logical :: lfirstenergy = .true. !! This is the first time computing energe + logical :: lfirstkick = .true. !! Initiate the first kick in a symplectic step + ! Future features not implemented or in development logical :: lgr = .false. !! Turn on GR logical :: lyarkovsky = .false. !! Turn on Yarkovsky effect @@ -259,7 +270,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 - real(DP) :: Gmtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion + real(DP) :: Gmtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion real(DP) :: ke = 0.0_DP !! System kinetic energy real(DP) :: pe = 0.0_DP !! System potential energy real(DP) :: te = 0.0_DP !! System total energy @@ -276,14 +287,16 @@ module swiftest_classes procedure(abstract_step_system), deferred :: step ! Concrete classes that are common to the basic integrator (only test particles considered for discard) - procedure :: discard => discard_system !! Perform a discard step on the system - procedure :: dump => io_dump_system !! Dump the state of the system to a file - procedure :: read_frame => io_read_frame_system !! Read in a frame of input data from file - procedure :: write_discard => io_write_discard !! Write out information about discarded test particles - procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file - procedure :: initialize => setup_initialize_system !! Initialize the system from input files - procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. - procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. + procedure :: discard => discard_system !! Perform a discard step on the system + procedure :: conservation_report => io_conservation_report !! Compute energy and momentum and print out the change with time + procedure :: dump => io_dump_system !! Dump the state of the system to a file + procedure :: read_frame => io_read_frame_system !! Read in a frame of input data from file + procedure :: write_discard => io_write_discard !! Write out information about discarded test particles + procedure :: write_frame => io_write_frame_system !! Append a frame of output data to file + procedure :: initialize => setup_initialize_system !! Initialize the system from input files + procedure :: step_spin => tides_step_spin_system !! Steps the spins of the massive & central bodies due to tides. + procedure :: set_msys => util_set_msys !! Sets the value of msys from the masses of system bodies. + procedure :: get_energy_and_momentum => util_get_energy_momentum_system !! Calculates the total system energy and momentum end type swiftest_nbody_system type :: swiftest_encounter @@ -487,6 +500,13 @@ module pure subroutine gr_vh2pv_body(self, param) class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_vh2pv_body + module subroutine io_conservation_report(self, param, lterminal) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(inout) :: param !! Input colleciton of user-defined parameters + logical, intent(in) :: lterminal !! Indicates whether to output information to the terminal screen + end subroutine io_conservation_report + module subroutine io_dump_param(self, param_file_name) implicit none class(swiftest_parameters),intent(in) :: self !! Output collection of parameters @@ -662,6 +682,17 @@ module subroutine obl_acc_tp(self, system) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object end subroutine obl_acc_tp + module subroutine obl_pot(npl, Mcb, Mpl, j2rp2, j4rp4, xh, irh, oblpot) + implicit none + integer(I4B), intent(in) :: npl + real(DP), intent(in) :: Mcb + real(DP), dimension(:), intent(in) :: Mpl + real(DP), intent(in) :: j2rp2, j4rp4 + real(DP), dimension(:), intent(in) :: irh + real(DP), dimension(:, :), intent(in) :: xh + real(DP), intent(out) :: oblpot + end subroutine obl_pot + module subroutine orbel_el2xv_vec(self, cb) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest body object @@ -983,6 +1014,17 @@ module subroutine util_resize_tp(self, nnew) integer(I4B), intent(in) :: nnew !! New size neded end subroutine util_resize_tp + module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin, pe, Lorbit, Lspin) + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(out) :: ke_orbit !! Orbital kinetic energy + real(DP), intent(out) :: ke_spin !! Spin kinetic energy + real(DP), intent(out) :: pe !! Potential energy + real(DP), dimension(:), intent(out) :: Lorbit !! Orbital angular momentum + real(DP), dimension(:), intent(out) :: Lspin !! Spin angular momentum + end subroutine util_get_energy_momentum_system + module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) implicit none class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 91b20b62b..035a54b18 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -106,5 +106,45 @@ module subroutine obl_acc_tp(self, system) end subroutine obl_acc_tp + module subroutine obl_pot(npl, Mcb, Mpl, j2rp2, j4rp4, xh, irh, oblpot) + !! author: David A. Minton + !! + !! Compute the contribution to the total gravitational potential due solely to the oblateness of the central body + !! Returned value does not include monopole term or terms higher than J4 + !! + !! Reference: MacMillan, W. D. 1958. The Theory of the Potential, (Dover Publications), 363. + !! + !! Adapted from David E. Kaufmann's Swifter routine: obl_pot.f90 + !! Adapted from Hal Levison's Swift routine obl_pot.f + implicit none + ! Arguments + integer(I4B), intent(in) :: npl + real(DP), intent(in) :: Mcb + real(DP), dimension(:), intent(in) :: Mpl + real(DP), intent(in) :: j2rp2, j4rp4 + real(DP), dimension(:), intent(in) :: irh + real(DP), dimension(:, :), intent(in) :: xh + real(DP), intent(out) :: oblpot + + ! Internals + integer(I4B) :: i + real(DP) :: rinv2, t0, t1, t2, t3, p2, p4, mu + + oblpot = 0.0_DP + mu = Mcb + do i = 1, npl + rinv2 = irh(i)**2 + t0 = mu * Mpl(i) * rinv2 * irh(i) + t1 = j2rp2 + t2 = xh(3, i) * xh(3, i) * rinv2 + t3 = j4rp4 * rinv2 + p2 = 0.5_DP * (3 * t2 - 1.0_DP) + p4 = 0.125_DP * ((35 * t2 - 30.0_DP) * t2 + 3.0_DP) + oblpot = oblpot + t0 * (t1 * p2 + t3 * p4) + end do + + return + end subroutine obl_pot + end submodule s_obl diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 new file mode 100644 index 000000000..69936e1b2 --- /dev/null +++ b/src/util/util_get_energy_momentum.f90 @@ -0,0 +1,121 @@ +submodule (swiftest_classes) s_util_get_energy_momentum + use swiftest +contains + module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin, pe, Lorbit, Lspin) + !! author: David A. Minton + !! + !! Compute total system angular momentum vector and kinetic, potential and total system energy + !! + !! Adapted from David E. Kaufmann Swifter routine symba_energy_eucl.f90 + !! + !! Adapted from Martin Duncan's Swift routine anal_energy.f + implicit none + class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object + class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + real(DP), intent(out) :: ke_orbit !! Orbital kinetic energy + real(DP), intent(out) :: ke_spin !! Spin kinetic energy + real(DP), intent(out) :: pe !! Potential energy + real(DP), dimension(:), intent(out) :: Lorbit !! Orbital angular momentum + real(DP), dimension(:), intent(out) :: Lspin !! Spin angular momentum + ! Internals + integer(I4B) :: i, j + integer(I8B) :: k + real(DP) :: rmag, v2, rot2, oblpot, hx, hy, hz, hsx, hsy, hsz + 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 + logical, dimension(self%pl%nplpl) :: lstatpl + logical, dimension(self%pl%nbody) :: lstatus + + Lorbit(:) = 0.0_DP + Lspin(:) = 0.0_DP + ke_orbit = 0.0_DP + ke_spin = 0.0_DP + associate(system => self, pl => self%pl, npl => self%pl%nbody, cb => self%cb) + kepl(:) = 0.0_DP + Lplorbitx(:) = 0.0_DP + Lplorbity(:) = 0.0_DP + Lplorbitz(:) = 0.0_DP + Lplspinx(:) = 0.0_DP + Lplspiny(:) = 0.0_DP + Lplspinz(:) = 0.0_DP + lstatus(1:npl) = pl%status(1:npl) /= INACTIVE + !!$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) + + ! 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 + end do + if (param%lrotation) then + 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) + + ! 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 do + else + kespinpl(:) = 0.0_DP + end if + + ! 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)) + pecb(i) = -cb%mass * 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) = -pl%mass(ik) * pl%mass(jk) / norm2(pl%xb(:, jk) - pl%xb(:, ik)) + lstatpl(k) = (lstatus(ik) .and. lstatus(jk)) + end associate + end do + + ke_orbit = 0.5_DP * sum(kepl(1:npl), lstatus(:)) + if (param%lrotation) ke_spin = 0.5_DP * sum(kespinpl(1:npl), lstatus(:)) + + pe = sum(pepl(:), lstatpl(:)) + sum(pecb(2:npl), lstatus(2:npl)) + + ! Potential energy from the oblateness term + if (param%loblatecb) then + !$omp simd + 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) + pe = pe + oblpot + end if + + Lorbit(1) = sum(Lplorbitx(1:npl), lstatus(1:npl)) + Lorbit(2) = sum(Lplorbity(1:npl), lstatus(1:npl)) + Lorbit(3) = sum(Lplorbitz(1:npl), lstatus(1:npl)) + + Lspin(1) = sum(Lplspinx(1:npl), lstatus(1:npl)) + Lspin(2) = sum(Lplspiny(1:npl), lstatus(1:npl)) + Lspin(3) = sum(Lplspinz(1:npl), lstatus(1:npl)) + + end associate + + return + end subroutine util_get_energy_momentum_system + +end submodule s_util_get_energy_momentum From 7fa96eb6b2cfcbe8f5e81046e20aa5d35bd8dee7 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 20:43:30 -0400 Subject: [PATCH 183/194] Enabled conservation report --- .../1pl_1pl_encounter/init_cond.py | 1 + .../1pl_1pl_encounter/param.swiftest.in | 1 + src/io/io.f90 | 9 +++------ src/modules/swiftest_classes.f90 | 4 ++-- src/modules/symba_classes.f90 | 2 +- src/symba/symba_io.f90 | 2 +- 6 files changed, 9 insertions(+), 10 deletions(-) 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 ece9101e0..245f5fae0 100755 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/init_cond.py @@ -174,6 +174,7 @@ print(f'BIG_DISCARD no') print(f'DISCARD_OUT discard.swiftest.out') print(f'ROTATION no') +print(f'ENERGY yes') print(f'GR no') print(f'MU2KG {MU2KG}') print(f'DU2M {DU2M}') 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 d44f4df0e..3050dea4a 100644 --- a/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in +++ b/examples/symba_swifter_comparison/1pl_1pl_encounter/param.swiftest.in @@ -24,6 +24,7 @@ EXTRA_FORCE no BIG_DISCARD no DISCARD_OUT discard.swiftest.out ROTATION no +ENERGY yes GR no MU2KG 1.988409870698051e+30 DU2M 149597870700.0 diff --git a/src/io/io.f90 b/src/io/io.f90 index e159d019d..360088980 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -70,10 +70,6 @@ module subroutine io_conservation_report(self, param, lterminal) write(*,*) 'dpe : ',(pe_now - pe_last) / abs(Eorbit_orig) write(*,*) end if - if (Lerror > 1e-6) then - write(*,*) 'Something has gone wrong! Angular momentum is too high!' - write(*,*) 'Lerror: ', Lerror - end if end if ke_orbit_last = ke_orbit_now ke_spin_last = ke_spin_now @@ -135,7 +131,7 @@ module subroutine io_dump_swiftest(self, param, msg) implicit none ! Arguments class(swiftest_base), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + 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 @@ -173,7 +169,7 @@ module subroutine io_dump_system(self, param, msg) implicit none ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + 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 @@ -203,6 +199,7 @@ module subroutine io_dump_system(self, param, msg) ! 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 + if (param%lenergy) call self%conservation_report(param, lterminal=.true.) return end subroutine io_dump_system diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index dcff0f6d8..47cfc6dd1 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -516,14 +516,14 @@ end subroutine io_dump_param module subroutine io_dump_swiftest(self, param, msg) implicit none class(swiftest_base), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + 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) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + 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 diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index f920fff87..697356b44 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -296,7 +296,7 @@ module subroutine symba_io_dump_particle_info(self, param, msg) use swiftest_classes, only : swiftest_parameters implicit none class(symba_particle_info), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine symba_io_dump_particle_info diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 1f8626242..2e568dd7e 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -8,7 +8,7 @@ module subroutine symba_io_dump_particle_info(self, param, msg) !! Dumps the particle information data to a file implicit none class(symba_particle_info), intent(inout) :: self !! Swiftest base object - class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters + class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters character(*), optional, intent(in) :: msg !! Message to display with dump operation end subroutine symba_io_dump_particle_info From aee2941a259df1eaa2bf7fa11bdc34bb11c85f04 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 22:42:46 -0400 Subject: [PATCH 184/194] Added in initial conditions values to parameter file reader/writer --- src/io/io.f90 | 529 +++++++++++++++++-------------- src/modules/swiftest_classes.f90 | 5 + 2 files changed, 301 insertions(+), 233 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 360088980..10bb911f8 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -332,270 +332,315 @@ module subroutine io_param_reader(self, unit, iotype, v_list, iostat, iomsg) class(swiftest_parameters), intent(inout) :: self !! Collection of parameters integer, intent(in) :: unit !! File unit number character(len=*), intent(in) :: iotype !! Dummy argument passed to the input/output procedure contains the text from the char-literal-constant, prefixed with DT. - !! If you do not include a char-literal-constant, the iotype argument contains only DT. + !! If you do not include a char-literal-constant, the iotype argument contains only DT. integer, intent(in) :: v_list(:) !! The first element passes the integrator code to the reader integer, intent(out) :: iostat !! IO status code character(len=*), intent(inout) :: iomsg !! Message to pass if iostat /= 0 ! Internals - logical :: t0_set = .false. !! Is the initial time set in the input file? - logical :: tstop_set = .false. !! Is the final time set in the input file? - logical :: dt_set = .false. !! Is the step size set in the input file? - logical :: mtiny_set = .false. !! Is the mtiny value set? - integer(I4B) :: ilength, ifirst, ilast !! Variables used to parse input file - character(STRMAX) :: line !! Line of the input file + logical :: t0_set = .false. !! Is the initial time set in the input file? + logical :: tstop_set = .false. !! Is the final time set in the input file? + logical :: dt_set = .false. !! Is the step size set in the input file? + integer(I4B) :: ilength, ifirst, ilast, i !! Variables used to parse input file + character(STRMAX) :: line !! Line of the input file character (len=:), allocatable :: line_trim,param_name, param_value !! Strings used to parse the param file - character(*),parameter :: linefmt = '(A)' !! Format code for simple text string + character(*),parameter :: linefmt = '(A)' !! Format code for simple text string ! Parse the file line by line, extracting tokens then matching them up with known parameters if possible - - do - read(unit = unit, fmt = linefmt, iostat = iostat, end = 1) line - line_trim = trim(adjustl(line)) - ilength = len(line_trim) - if ((ilength /= 0)) then - ifirst = 1 - ! Read the pair of tokens. The first one is the parameter name, the second is the value. - param_name = io_get_token(line_trim, ifirst, ilast, iostat) - if (param_name == '') cycle ! No parameter name (usually because this line is commented out) - call io_toupper(param_name) - ifirst = ilast + 1 - param_value = io_get_token(line_trim, ifirst, ilast, iostat) - select case (param_name) - case ("T0") - read(param_value, *) self%t0 - t0_set = .true. - case ("TSTOP") - read(param_value, *) self%tstop - tstop_set = .true. - case ("DT") - read(param_value, *) self%dt - dt_set = .true. - case ("CB_IN") - self%incbfile = param_value - case ("PL_IN") - self%inplfile = param_value - case ("TP_IN") - self%intpfile = param_value - case ("IN_TYPE") - call io_toupper(param_value) - self%in_type = param_value - case ("ISTEP_OUT") - read(param_value, *) self%istep_out - case ("BIN_OUT") - self%outfile = param_value - case ("OUT_TYPE") - call io_toupper(param_value) - self%out_type = param_value - case ("OUT_FORM") - call io_toupper(param_value) - self%out_form = param_value - case ("OUT_STAT") - call io_toupper(param_value) - self%out_stat = param_value - case ("ISTEP_DUMP") - read(param_value, *) self%istep_dump - case ("CHK_CLOSE") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%lclose = .true. - case ("CHK_RMIN") - read(param_value, *) self%rmin - case ("CHK_RMAX") - read(param_value, *) self%rmax - case ("CHK_EJECT") - read(param_value, *) self%rmaxu - case ("CHK_QMIN") - read(param_value, *) self%qmin - case ("CHK_QMIN_COORD") - call io_toupper(param_value) - self%qmin_coord = param_value - case ("CHK_QMIN_RANGE") - read(param_value, *) self%qmin_alo + associate(param => self) + do + read(unit = unit, fmt = linefmt, iostat = iostat, end = 1) line + line_trim = trim(adjustl(line)) + ilength = len(line_trim) + if ((ilength /= 0)) then + ifirst = 1 + ! Read the pair of tokens. The first one is the parameter name, the second is the value. + param_name = io_get_token(line_trim, ifirst, ilast, iostat) + if (param_name == '') cycle ! No parameter name (usually because this line is commented out) + call io_toupper(param_name) ifirst = ilast + 1 - param_value = io_get_token(line, ifirst, ilast, iostat) - read(param_value, *) self%qmin_ahi - case ("ENC_OUT") - self%enc_out = param_value - case ("DISCARD_OUT") - self%discard_out = param_value - case ("EXTRA_FORCE") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%lextra_force = .true. - case ("BIG_DISCARD") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T' ) self%lbig_discard = .true. - case ("RHILL_PRESENT") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T' ) self%lrhill_present = .true. - case ("MU2KG") - read(param_value, *) self%MU2KG - case ("TU2S") - read(param_value, *) self%TU2S - case ("DU2M") - read(param_value, *) self%DU2M - case ("ENERGY") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%lenergy = .true. - case ("GR") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%lgr = .true. - case ("ROTATION") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%lrotation = .true. - case ("TIDES") - call io_toupper(param_value) - if (param_value == "YES" .or. param_value == 'T') self%ltides = .true. - case ("NPLMAX", "NTPMAX", "MTINY", "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 - return - end select - end if - end do - 1 continue - iostat = 0 + param_value = io_get_token(line_trim, ifirst, ilast, iostat) + select case (param_name) + case ("T0") + read(param_value, *) param%t0 + t0_set = .true. + case ("TSTOP") + read(param_value, *) param%tstop + tstop_set = .true. + case ("DT") + read(param_value, *) param%dt + dt_set = .true. + case ("CB_IN") + param%incbfile = param_value + case ("PL_IN") + param%inplfile = param_value + case ("TP_IN") + param%intpfile = param_value + case ("IN_TYPE") + call io_toupper(param_value) + param%in_type = param_value + case ("ISTEP_OUT") + read(param_value, *) param%istep_out + case ("BIN_OUT") + param%outfile = param_value + case ("OUT_TYPE") + call io_toupper(param_value) + param%out_type = param_value + case ("OUT_FORM") + call io_toupper(param_value) + param%out_form = param_value + case ("OUT_STAT") + call io_toupper(param_value) + param%out_stat = param_value + case ("ISTEP_DUMP") + read(param_value, *) param%istep_dump + case ("CHK_CLOSE") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%lclose = .true. + case ("CHK_RMIN") + read(param_value, *) param%rmin + case ("CHK_RMAX") + read(param_value, *) param%rmax + case ("CHK_EJECT") + read(param_value, *) param%rmaxu + case ("CHK_QMIN") + read(param_value, *) param%qmin + case ("CHK_QMIN_COORD") + call io_toupper(param_value) + param%qmin_coord = param_value + case ("CHK_QMIN_RANGE") + read(param_value, *) param%qmin_alo + ifirst = ilast + 1 + param_value = io_get_token(line, ifirst, ilast, iostat) + read(param_value, *) param%qmin_ahi + case ("ENC_OUT") + param%enc_out = param_value + case ("DISCARD_OUT") + param%discard_out = param_value + case ("EXTRA_FORCE") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%lextra_force = .true. + case ("BIG_DISCARD") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T' ) param%lbig_discard = .true. + case ("RHILL_PRESENT") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T' ) param%lrhill_present = .true. + case ("MU2KG") + read(param_value, *) param%MU2KG + case ("TU2S") + read(param_value, *) param%TU2S + case ("DU2M") + read(param_value, *) param%DU2M + case ("ENERGY") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%lenergy = .true. + case ("GR") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%lgr = .true. + case ("ROTATION") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%lrotation = .true. + case ("TIDES") + call io_toupper(param_value) + if (param_value == "YES" .or. param_value == 'T') param%ltides = .true. + case ("FIRSTKICK") + call io_toupper(param_value) + if (param_value == "NO" .or. param_value == 'F') param%lfirstkick = .false. + case ("FIRSTENERGY") + call io_toupper(param_value) + if (param_value == "NO" .or. param_value == 'F') param%lfirstenergy = .false. + case("EORBIT_ORIG") + read(param_value, *) param%Eorbit_orig + case("MTOT_ORIG") + read(param_value, *) param%Mtot_orig + case("LTOT_ORIG") + read(param_value, *) param%Ltot_orig(1) + do i = 2, NDIM + ifirst = ilast + 1 + param_value = io_get_token(line, ifirst, ilast, iostat) + read(param_value, *) param%Ltot_orig(i) + end do + param%Lmag_orig = norm2(param%Ltot_orig(:)) + case("LORBIT_ORIG") + read(param_value, *) param%Lorbit_orig(1) + do i = 2, NDIM + ifirst = ilast + 1 + param_value = io_get_token(line, ifirst, ilast, iostat) + read(param_value, *) param%Lorbit_orig(i) + end do + case("LSPIN_ORIG") + read(param_value, *) param%Lspin_orig(1) + do i = 2, NDIM + ifirst = ilast + 1 + param_value = io_get_token(line, ifirst, ilast, iostat) + read(param_value, *) param%Lspin_orig(i) + end do + case("LESCAPE") + read(param_value, *) param%Lescape(1) + do i = 2, NDIM + ifirst = ilast + 1 + param_value = io_get_token(line, ifirst, ilast, iostat) + read(param_value, *) param%Lescape(i) + end do + case("MESCAPE") + read(param_value, *) param%Mescape + case("ECOLLISIONS") + 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 default + write(iomsg,*) "Unknown parameter -> ",param_name + iostat = -1 + return + end select + end if + end do + 1 continue + iostat = 0 - !! Do basic sanity checks on the input values - if ((.not. t0_set) .or. (.not. tstop_set) .or. (.not. dt_set)) then - write(iomsg,*) 'Valid simulation time not set' - iostat = -1 - return - end if - if (self%dt <= 0.0_DP) then - write(iomsg,*) 'Invalid timestep: ' - iostat = -1 - return - end if - if (self%inplfile == "") then - write(iomsg,*) 'No valid massive body file in input file' - iostat = -1 - return - end if - if ((self%in_type /= REAL8_TYPE) .and. (self%in_type /= "ASCII")) then - write(iomsg,*) 'Invalid input file type:',trim(adjustl(self%in_type)) - iostat = -1 - return - end if - if ((self%istep_out <= 0) .and. (self%istep_dump <= 0)) then - write(iomsg,*) 'Invalid istep' - iostat = -1 - return - end if - if ((self%istep_out > 0) .and. (self%outfile == "")) then - write(iomsg,*) 'Invalid outfile' - iostat = -1 - return - end if - if (self%outfile /= "") then - if ((self%out_type /= REAL4_TYPE) .and. (self%out_type /= REAL8_TYPE) .and. & - (self%out_type /= SWIFTER_REAL4_TYPE) .and. (self%out_type /= SWIFTER_REAL8_TYPE)) then - write(iomsg,*) 'Invalid out_type: ',trim(adjustl(self%out_type)) + !! Do basic sanity checks on the input values + if ((.not. t0_set) .or. (.not. tstop_set) .or. (.not. dt_set)) then + write(iomsg,*) 'Valid simulation time not set' iostat = -1 return end if - if ((self%out_form /= "EL") .and. (self%out_form /= "XV")) then - write(iomsg,*) 'Invalid out_form: ',trim(adjustl(self%out_form)) + if (param%dt <= 0.0_DP) then + write(iomsg,*) 'Invalid timestep: ' iostat = -1 return end if - if ((self%out_stat /= "NEW") .and. (self%out_stat /= "REPLACE") .and. (self%out_stat /= "APPEND") .and. (self%out_stat /= "UNKNOWN")) then - write(iomsg,*) 'Invalid out_stat: ',trim(adjustl(self%out_stat)) + if (param%inplfile == "") then + write(iomsg,*) 'No valid massive body file in input file' iostat = -1 return end if - end if - if (self%qmin > 0.0_DP) then - if ((self%qmin_coord /= "HELIO") .and. (self%qmin_coord /= "BARY")) then - write(iomsg,*) 'Invalid qmin_coord: ',trim(adjustl(self%qmin_coord)) + if ((param%in_type /= REAL8_TYPE) .and. (param%in_type /= "ASCII")) then + write(iomsg,*) 'Invalid input file type:',trim(adjustl(param%in_type)) iostat = -1 return end if - if ((self%qmin_alo <= 0.0_DP) .or. (self%qmin_ahi <= 0.0_DP)) then - write(iomsg,*) 'Invalid qmin vals' + if ((param%istep_out <= 0) .and. (param%istep_dump <= 0)) then + write(iomsg,*) 'Invalid istep' + iostat = -1 + return + end if + if ((param%istep_out > 0) .and. (param%outfile == "")) then + write(iomsg,*) 'Invalid outfile' + iostat = -1 + return + end if + 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 + write(iomsg,*) 'Invalid out_type: ',trim(adjustl(param%out_type)) + iostat = -1 + return + end if + if ((param%out_form /= "EL") .and. (param%out_form /= "XV")) then + write(iomsg,*) 'Invalid out_form: ',trim(adjustl(param%out_form)) + iostat = -1 + return + end if + if ((param%out_stat /= "NEW") .and. (param%out_stat /= "REPLACE") .and. (param%out_stat /= "APPEND") .and. (param%out_stat /= "UNKNOWN")) then + write(iomsg,*) 'Invalid out_stat: ',trim(adjustl(param%out_stat)) + 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 + write(iomsg,*) 'Invalid qmin_coord: ',trim(adjustl(param%qmin_coord)) + iostat = -1 + return + end if + if ((param%qmin_alo <= 0.0_DP) .or. (param%qmin_ahi <= 0.0_DP)) then + write(iomsg,*) 'Invalid qmin vals' + iostat = -1 + return + end if + end if + if (param%ltides .and. .not. param%lrotation) then + write(iomsg,*) 'Tides require rotation to be turned on' iostat = -1 return end if - end if - if (self%ltides .and. .not. self%lrotation) then - write(iomsg,*) 'Tides require rotation to be turned on' - iostat = -1 - return - end if - write(*,*) "T0 = ",self%t0 - write(*,*) "TSTOP = ",self%tstop - write(*,*) "DT = ",self%dt - write(*,*) "CB_IN = ",trim(adjustl(self%incbfile)) - write(*,*) "PL_IN = ",trim(adjustl(self%inplfile)) - write(*,*) "TP_IN = ",trim(adjustl(self%intpfile)) - write(*,*) "IN_TYPE = ",trim(adjustl(self%in_type)) - write(*,*) "ISTEP_OUT = ",self%istep_out - write(*,*) "BIN_OUT = ",trim(adjustl(self%outfile)) - write(*,*) "OUT_TYPE = ",trim(adjustl(self%out_type)) - write(*,*) "OUT_FORM = ",trim(adjustl(self%out_form)) - write(*,*) "OUT_STAT = ",trim(adjustl(self%out_stat)) - write(*,*) "ISTEP_DUMP = ",self%istep_dump - write(*,*) "CHK_CLOSE = ",self%lclose - write(*,*) "CHK_RMIN = ",self%rmin - write(*,*) "CHK_RMAX = ",self%rmax - write(*,*) "CHK_EJECT = ",self%rmaxu - write(*,*) "CHK_QMIN = ",self%qmin - write(*,*) "CHK_QMIN_COORD = ",trim(adjustl(self%qmin_coord)) - write(*,*) "CHK_QMIN_RANGE = ",self%qmin_alo, self%qmin_ahi - write(*,*) "EXTRA_FORCE = ",self%lextra_force - write(*,*) "RHILL_PRESENT = ",self%lrhill_present - write(*,*) "ROTATION = ", self%lrotation - write(*,*) "TIDES = ", self%ltides - write(*,*) "ENERGY = ",self%lenergy - write(*,*) "MU2KG = ",self%MU2KG - write(*,*) "TU2S = ",self%TU2S - write(*,*) "DU2M = ",self%DU2M - if (trim(adjustl(self%enc_out)) /= "") then - write(*,*) "ENC_OUT = ",trim(adjustl(self%enc_out)) - else - write(*,*) "! ENC_OUT not set: Encounters will not be recorded to file" - end if - if (trim(adjustl(self%discard_out)) /= "") then - write(*,*) "DISCARD_OUT = ",trim(adjustl(self%discard_out)) - write(*,*) "BIG_DISCARD = ",self%lbig_discard - else - write(*,*) "! DISCARD_OUT not set: Discards will not be recorded to file" - write(*,*) "! BIG_DISCARD = ",self%lbig_discard - end if + write(*,*) "T0 = ",param%t0 + write(*,*) "TSTOP = ",param%tstop + write(*,*) "DT = ",param%dt + write(*,*) "CB_IN = ",trim(adjustl(param%incbfile)) + write(*,*) "PL_IN = ",trim(adjustl(param%inplfile)) + write(*,*) "TP_IN = ",trim(adjustl(param%intpfile)) + write(*,*) "IN_TYPE = ",trim(adjustl(param%in_type)) + write(*,*) "ISTEP_OUT = ",param%istep_out + write(*,*) "BIN_OUT = ",trim(adjustl(param%outfile)) + write(*,*) "OUT_TYPE = ",trim(adjustl(param%out_type)) + write(*,*) "OUT_FORM = ",trim(adjustl(param%out_form)) + write(*,*) "OUT_STAT = ",trim(adjustl(param%out_stat)) + write(*,*) "ISTEP_DUMP = ",param%istep_dump + write(*,*) "CHK_CLOSE = ",param%lclose + write(*,*) "CHK_RMIN = ",param%rmin + write(*,*) "CHK_RMAX = ",param%rmax + write(*,*) "CHK_EJECT = ",param%rmaxu + write(*,*) "CHK_QMIN = ",param%qmin + write(*,*) "CHK_QMIN_COORD = ",trim(adjustl(param%qmin_coord)) + write(*,*) "CHK_QMIN_RANGE = ",param%qmin_alo, param%qmin_ahi + write(*,*) "EXTRA_FORCE = ",param%lextra_force + write(*,*) "RHILL_PRESENT = ",param%lrhill_present + write(*,*) "ROTATION = ", param%lrotation + write(*,*) "TIDES = ", param%ltides + write(*,*) "ENERGY = ",param%lenergy + write(*,*) "MU2KG = ",param%MU2KG + write(*,*) "TU2S = ",param%TU2S + write(*,*) "DU2M = ",param%DU2M + if (trim(adjustl(param%enc_out)) /= "") then + write(*,*) "ENC_OUT = ",trim(adjustl(param%enc_out)) + else + write(*,*) "! ENC_OUT not set: Encounters will not be recorded to file" + end if + if (trim(adjustl(param%discard_out)) /= "") then + write(*,*) "DISCARD_OUT = ",trim(adjustl(param%discard_out)) + write(*,*) "BIG_DISCARD = ",param%lbig_discard + else + write(*,*) "! DISCARD_OUT not set: Discards will not be recorded to file" + write(*,*) "! BIG_DISCARD = ",param%lbig_discard + end if - if ((self%MU2KG < 0.0_DP) .or. (self%TU2S < 0.0_DP) .or. (self%DU2M < 0.0_DP)) then - write(iomsg,*) 'Invalid unit conversion factor' - iostat = -1 - return - end if + if ((param%MU2KG < 0.0_DP) .or. (param%TU2S < 0.0_DP) .or. (param%DU2M < 0.0_DP)) then + write(iomsg,*) 'Invalid unit conversion factor' + iostat = -1 + return + end if - ! Calculate the G for the system units - self%GU = GC / (self%DU2M**3 / (self%MU2KG * self%TU2S**2)) + ! 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 - self%inv_c2 = einsteinC * self%TU2S / self%DU2M - self%inv_c2 = (self%inv_c2)**(-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) - associate(integrator => v_list(1)) - if (integrator == RMVS) then - if (.not.self%lclose) then - write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' - iostat = -1 - return + associate(integrator => v_list(1)) + if (integrator == RMVS) then + if (.not.param%lclose) then + write(iomsg,*) 'This integrator requires CHK_CLOSE to be enabled.' + iostat = -1 + return + end if end if - end if - - ! Determine if the GR flag is set correctly for this integrator - select case(integrator) - case(WHM, RMVS, HELIO, SYMBA) - write(*,*) "GR = ", self%lgr - case default - if (self%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' - self%lgr = .false. - end select - end associate + + ! Determine if the GR flag is set correctly for this integrator + select case(integrator) + case(WHM, RMVS, HELIO, SYMBA) + write(*,*) "GR = ", param%lgr + case default + if (param%lgr) write(iomsg, *) 'GR is not yet implemented for this integrator. This parameter will be ignored.' + param%lgr = .false. + end select + end associate - iostat = 0 + iostat = 0 + end associate return end subroutine io_param_reader @@ -670,6 +715,24 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) write(param_name, Afmt) "GR"; write(param_value, Lfmt) param%lgr; write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "ROTATION"; write(param_value, Lfmt) param%lrotation; write(unit, Afmt) adjustl(param_name), adjustl(param_value) write(param_name, Afmt) "TIDES"; write(param_value, Lfmt) param%ltides; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + + if (param%lenergy) then + write(param_name, Afmt) "FIRSTENERGY"; write(param_value, Lfmt) param%lfirstenergy; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "EORBIT_ORIG"; write(param_value, Rfmt) param%Eorbit_orig; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "MTOT_ORIG"; write(param_value, Rfmt) param%Mtot_orig; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(unit, '("LTOT_ORIG ",3(1X,ES25.17))') param%Ltot_orig(:) + write(unit, '("LORBIT_ORIG",3(1X,ES25.17))') param%Lorbit_orig(:) + write(unit, '("LSPIN_ORIG ",3(1X,ES25.17))') param%Lspin_orig(:) + write(unit, '("LESCAPE ",3(1X,ES25.17))') param%Lescape(:) + + write(param_name, Afmt) "MESCAPE"; write(param_value, Rfmt) param%Mescape; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "ECOLLISIONS"; write(param_value, Rfmt) param%Ecollisions; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + write(param_name, Afmt) "EUNTRACKED"; write(param_value, Rfmt) param%Euntracked; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + end if + write(param_name, Afmt) "FIRSTKICK"; write(param_value, Lfmt) param%lfirstkick; write(unit, Afmt) adjustl(param_name), adjustl(param_value) + + + iostat = 0 iomsg = "UDIO not implemented" end associate diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 47cfc6dd1..a4042eb27 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -64,6 +64,11 @@ 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 logical :: lfirstenergy = .true. !! This is the first time computing energe logical :: lfirstkick = .true. !! Initiate the first kick in a symplectic step From b4f1cb716590cfcdc94d0f2eb502403a69c11df5 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 22:51:48 -0400 Subject: [PATCH 185/194] Streamlined the energy calc --- src/io/io.f90 | 7 ++++- src/modules/swiftest_classes.f90 | 13 ++++----- src/setup/setup.f90 | 1 + src/symba/symba_discard.f90 | 2 +- src/util/util_get_energy_momentum.f90 | 38 ++++++++++++--------------- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/io/io.f90 b/src/io/io.f90 index 10bb911f8..d7b899475 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -39,7 +39,12 @@ module subroutine io_conservation_report(self, param, lterminal) write(EGYIU,EGYHEADER) end if end if - call system%get_energy_and_momentum(param, ke_orbit_now, ke_spin_now, pe_now, Lorbit_now, Lspin_now) + call system%get_energy_and_momentum(param) + ke_orbit_now = system%ke_orbit + ke_spin_now = system%ke_spin + pe_now = system%pe + Lorbit_now = system%Lorbit + Lspin_now = system%Lspin Eorbit_now = ke_orbit_now + ke_spin_now + pe_now Ltot_now(:) = Lorbit_now(:) + Lspin_now(:) + Lescape(:) Mtot_now = cb%mass + sum(pl%mass(1:npl)) + system%Mescape diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index a4042eb27..10e60a491 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -276,10 +276,12 @@ module swiftest_classes class(swiftest_tp), allocatable :: tp !! Test particle data structure class(swiftest_tp), allocatable :: tp_discards !! Discarded test particle data structure real(DP) :: Gmtot = 0.0_DP !! Total system mass - used for barycentric coordinate conversion - real(DP) :: ke = 0.0_DP !! System kinetic energy + real(DP) :: ke_orbit = 0.0_DP !! System orbital kinetic energy + real(DP) :: ke_spin = 0.0_DP !! System spin kinetic energy real(DP) :: pe = 0.0_DP !! System potential energy real(DP) :: te = 0.0_DP !! System total energy - real(DP), dimension(NDIM) :: Ltot = 0.0_DP !! System angular momentum vector + real(DP), dimension(NDIM) :: Lorbit = 0.0_DP !! System orbital angular momentum vector + real(DP), dimension(NDIM) :: Lspin = 0.0_DP !! System spin 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 @@ -1019,15 +1021,10 @@ module subroutine util_resize_tp(self, nnew) integer(I4B), intent(in) :: nnew !! New size neded end subroutine util_resize_tp - module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin, pe, Lorbit, Lspin) + module subroutine util_get_energy_momentum_system(self, param) implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(out) :: ke_orbit !! Orbital kinetic energy - real(DP), intent(out) :: ke_spin !! Spin kinetic energy - real(DP), intent(out) :: pe !! Potential energy - real(DP), dimension(:), intent(out) :: Lorbit !! Orbital angular momentum - real(DP), dimension(:), intent(out) :: Lspin !! Spin angular momentum end subroutine util_get_energy_momentum_system module subroutine util_set_beg_end_pl(self, xbeg, xend, vbeg) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index edb641907..33b5c07c4 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -133,6 +133,7 @@ module subroutine setup_initialize_system(self, param) 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/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index 6ab835e36..5f6d3926a 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -112,7 +112,7 @@ subroutine symba_discard_conserve_mtm(pl, system, param, ipl, lescape_body) Ltot(:) = Ltot(:) - Lpl(:) end do Ltot(:) = Ltot(:) - cb%mass * cb%xb(:) .cross. cb%vb(:) - system%Lescape(:) = system%Lescape(:) + system%Ltot(:) + system%Lescape(:) = system%Lescape(:) + Ltot(:) if (param%lrotation) system%Lescape(:) = system%Lescape + pl%mass(ipl) * pl%radius(ipl)**2 * pl%Ip(3, ipl) * pl%rot(:, ipl) else diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 69936e1b2..38701229d 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -1,7 +1,7 @@ submodule (swiftest_classes) s_util_get_energy_momentum use swiftest contains - module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin, pe, Lorbit, Lspin) + module subroutine util_get_energy_momentum_system(self, param) !! author: David A. Minton !! !! Compute total system angular momentum vector and kinetic, potential and total system energy @@ -12,11 +12,6 @@ module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin implicit none class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - real(DP), intent(out) :: ke_orbit !! Orbital kinetic energy - real(DP), intent(out) :: ke_spin !! Spin kinetic energy - real(DP), intent(out) :: pe !! Potential energy - real(DP), dimension(:), intent(out) :: Lorbit !! Orbital angular momentum - real(DP), dimension(:), intent(out) :: Lspin !! Spin angular momentum ! Internals integer(I4B) :: i, j integer(I8B) :: k @@ -28,11 +23,12 @@ module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin logical, dimension(self%pl%nplpl) :: lstatpl logical, dimension(self%pl%nbody) :: lstatus - Lorbit(:) = 0.0_DP - Lspin(:) = 0.0_DP - ke_orbit = 0.0_DP - ke_spin = 0.0_DP associate(system => self, pl => self%pl, npl => self%pl%nbody, cb => self%cb) + system%Lorbit(:) = 0.0_DP + system%Lspin(:) = 0.0_DP + system%ke_orbit = 0.0_DP + system%ke_spin = 0.0_DP + kepl(:) = 0.0_DP Lplorbitx(:) = 0.0_DP Lplorbity(:) = 0.0_DP @@ -56,6 +52,7 @@ module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin ! Kinetic energy from orbit and spin kepl(i) = pl%mass(i) * v2 end do + if (param%lrotation) then do i = 1, npl rot2 = dot_product(pl%rot(:,i), pl%rot(:,i)) @@ -90,10 +87,10 @@ module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin end associate end do - ke_orbit = 0.5_DP * sum(kepl(1:npl), lstatus(:)) - if (param%lrotation) ke_spin = 0.5_DP * sum(kespinpl(1:npl), lstatus(:)) + 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(:)) - pe = sum(pepl(:), lstatpl(:)) + sum(pecb(2:npl), lstatus(2:npl)) + system%pe = sum(pepl(:), lstatpl(:)) + sum(pecb(2:npl), lstatus(2:npl)) ! Potential energy from the oblateness term if (param%loblatecb) then @@ -102,17 +99,16 @@ module subroutine util_get_energy_momentum_system(self, param, ke_orbit, ke_spin 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) - pe = pe + oblpot + system%pe = system%pe + oblpot end if - Lorbit(1) = sum(Lplorbitx(1:npl), lstatus(1:npl)) - Lorbit(2) = sum(Lplorbity(1:npl), lstatus(1:npl)) - Lorbit(3) = sum(Lplorbitz(1:npl), lstatus(1:npl)) - - Lspin(1) = sum(Lplspinx(1:npl), lstatus(1:npl)) - Lspin(2) = sum(Lplspiny(1:npl), lstatus(1:npl)) - Lspin(3) = sum(Lplspinz(1:npl), lstatus(1:npl)) + 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)) end associate return From 4fc17fd9296985550b8ad219027ee1880259f4a1 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 23:05:52 -0400 Subject: [PATCH 186/194] Added collisional regime determination code --- Makefile | 6 +++ src/fragmentation/fragmentation.f90 | 32 +++++++++++++++ src/modules/swiftest_classes.f90 | 9 +++++ src/symba/symba_collision.f90 | 62 +++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 src/fragmentation/fragmentation.f90 diff --git a/Makefile b/Makefile index 63cfb0ee0..162129149 100644 --- a/Makefile +++ b/Makefile @@ -96,6 +96,11 @@ lib: ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ ln -s $(SWIFTEST_HOME)/Makefile .; \ make libdir + cd $(SWIFTEST_HOME)/src/fragmentation; \ + rm -f Makefile.Defines Makefile; \ + ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ + ln -s $(SWIFTEST_HOME)/Makefile .; \ + make libdir cd $(SWIFTEST_HOME)/src/gr; \ rm -f Makefile.Defines Makefile; \ ln -s $(SWIFTEST_HOME)/Makefile.Defines .; \ @@ -189,6 +194,7 @@ clean: cd $(SWIFTEST_HOME)/src/discard; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/drift; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/eucl; rm -f Makefile.Defines Makefile *.gc* + cd $(SWIFTEST_HOME)/src/fragmentation; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/gr; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/helio; rm -f Makefile.Defines Makefile *.gc* cd $(SWIFTEST_HOME)/src/io; rm -f Makefile.Defines Makefile *.gc* diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 new file mode 100644 index 000000000..d809bc03a --- /dev/null +++ b/src/fragmentation/fragmentation.f90 @@ -0,0 +1,32 @@ +submodule(swiftest_classes) s_fragmentation + use swiftest +contains + 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. + !! Current version requires all values to be converted to SI units prior to calling the function + !! References: + !! Kokubo, E., Genda, H., 2010. Formation of Terrestrial Planets from Protoplanets Under a Realistic Accretion + !! Condition. ApJL 714, L21. https://doi.org/10.1088/2041-8205/714/1/L21 + !! Leinhardt, Z.M., Stewart, S.T., 2012. Collisions between Gravity-dominated Bodies. I. Outcome Regimes and Scaling + !! Laws 745, 79. https://doi.org/10.1088/0004-637X/745/1/79 + !! Mustill, A.J., Davies, M.B., Johansen, A., 2018. The dynamical evolution of transiting planetary systems including + !! a realistic collision prescription. Mon Not R Astron Soc 478, 2896–2908. https://doi.org/10.1093/mnras/sty1273 + !! Rufu, R., Aharonson, O., 2019. Impact Dynamics of Moons Within a Planetary Potential. J. Geophys. Res. Planets 124, + !! 1008–1019. https://doi.org/10.1029/2018JE005798 + !! Stewart, S.T., Leinhardt, Z.M., 2012. Collisions between Gravity-dominated Bodies. II. The Diversity of Impact + !! Outcomes during the End Stage of Planet Formation. ApJ 751, 32. https://doi.org/10.1088/0004-637X/751/1/32 + !! + implicit none + ! 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), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 + real(DP), intent(out) :: Qloss !! The residual energy after the collision + + return + end subroutine fragmentation_regime + +end submodule s_fragmentation \ No newline at end of file diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 10e60a491..af751fdcf 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -452,6 +452,15 @@ module subroutine eucl_dist_index_plpl(self) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object end subroutine + 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, mtiny + real(DP), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 + real(DP), intent(out) :: Qloss !! The residual energy after the collision + end subroutine fragmentation_regime + module pure subroutine gr_kick_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index ad0e64079..843de7dd6 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -408,6 +408,68 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object class(symba_parameters), intent(in) :: param !! Current run configuration parameters with SyMBA additions ! Internals + ! Internals + integer(I4B), dimension(:), allocatable :: family !! List of indices of all bodies inovlved in the collision + integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision + real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision + logical :: lgoodcollision + integer(I4B) :: i, status, jtarg, jproj, regime + real(DP), dimension(2) :: radius_si, mass_si, density_si + real(DP) :: mtiny_si, Mcb_si + real(DP), dimension(NDIM) :: x1_si, v1_si, x2_si, v2_si + real(DP) :: mlr, mslr, mtot, dentot, msys, msys_new, Qloss, impact_parameter + integer(I4B), parameter :: NRES = 3 !! Number of collisional product results + real(DP), dimension(NRES) :: mass_res + + associate(plpl_collisions => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2, cb => system%cb) + select type(pl => system%pl) + class is (symba_pl) + do i = 1, ncollisions + idx_parent(1) = pl%kin(idx1(i))%parent + idx_parent(2) = pl%kin(idx2(i))%parent + lgoodcollision = symba_collision_consolidate_familes(pl, param, idx_parent, family, x, v, mass, radius, L_spin, Ip) + if (.not. lgoodcollision) cycle + if (any(pl%status(idx_parent(:)) /= COLLISION)) cycle ! One of these two bodies has already been resolved + + ! Convert all quantities to SI units and determine which of the pair is the projectile vs. target before sending them + ! to symba_regime + if (mass(1) > mass(2)) then + jtarg = 1 + jproj = 2 + else + jtarg = 2 + jproj = 1 + end if + mass_si(:) = (mass(:)) * param%MU2KG !! The collective mass of the parent and its children + radius_si(:) = radius(:) * param%DU2M !! The collective radius of the parent and its children + x1_si(:) = plpl_collisions%x1(:,i) * param%DU2M !! The position of the parent from inside the step (at collision) + v1_si(:) = plpl_collisions%v1(:,i) * param%DU2M / param%TU2S !! The velocity of the parent from inside the step (at collision) + x2_si(:) = plpl_collisions%x2(:,i) * param%DU2M !! The position of the parent from inside the step (at collision) + 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 + + mass_res(:) = 0.0_DP + + mtot = sum(mass_si(:)) + dentot = sum(mass_si(:) * density_si(:)) / mtot + + !! Use the positions and velocities of the parents from indside the step (at collision) to calculate the collisional regime + call fragmentation_regime(Mcb_si, mass_si(jtarg), mass_si(jproj), radius_si(jtarg), radius_si(jproj), x1_si(:), x2_si(:),& + v1_si(:), v2_si(:), density_si(jtarg), density_si(jproj), regime, mlr, mslr, mtiny_si, Qloss) + + 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 + + !status = symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + end do + end select + end associate return end subroutine symba_collision_resolve_fragmentations From 663ad8fb6568f5e5c4cabb3ee274dd517e0f6386 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 23:08:49 -0400 Subject: [PATCH 187/194] Added the rest of fragmentation_regime (formerally symba_regime from the Fragmentation branch --- src/fragmentation/fragmentation.f90 | 251 +++++++++++++++++++++++++++- 1 file changed, 249 insertions(+), 2 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index d809bc03a..a01af206b 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -19,14 +19,261 @@ module subroutine fragmentation_regime(Mcb, m1, m2, rad1, rad2, xh1, xh2, vb1, v !! Outcomes during the End Stage of Planet Formation. ApJ 751, 32. https://doi.org/10.1088/0004-637X/751/1/32 !! implicit none - ! Arguments + ! 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), dimension(:), intent(in) :: xh1, xh2, vb1, vb2 real(DP), intent(out) :: Qloss !! The residual energy after the collision + ! Constants + integer(I4B), parameter :: N1 = 1 !number of objects with mass equal to the largest remnant from LS12 + integer(I4B), parameter :: N2 = 2 !number of objects with mass larger than second largest remnant from LS12 + real(DP), parameter :: DENSITY1 = 1000.0_DP !standard density parameter from LS12 [kg/m3] + real(DP), parameter :: MU_BAR = 0.37_DP !0.385#0.37#0.3333# 3.978 # 1/3 material parameter for hydrodynamic planet-size bodies (LS12) + real(DP), parameter :: BETA = 2.85_DP !slope of sfd for remnants from LS12 2.85 + real(DP), parameter :: C1 = 2.43_DP !! Kokubo & Genda (2010) eq. (3) + real(DP), parameter :: C2 = -0.0408_DP !! Kokubo & Genda (2010) eq. (3) + real(DP), parameter :: C3 = 1.86_DP !! Kokubo & Genda (2010) eq. (3) + real(DP), parameter :: C4 = 1.08_DP !! Kokubo & Genda (2010) eq. (3) + real(DP), parameter :: CRUFU = 2.0_DP - 3 * MU_BAR ! central potential variable from Rufu and Aharonson (2019) + real(DP), parameter :: SUPERCAT_QRATIO = 1.8_DP ! See Section 4.1 of LS12 + ! Internals + real(DP) :: a1, alpha, aint, b, bcrit, c_star, egy, zeta, l, lint, mu, phi, theta + real(DP) :: Qr, Qrd_pstar, Qr_erosion, Qr_supercat + real(DP) :: Vhr, Verosion, Vescp, Vhill, Vimp, Vsupercat + real(DP) :: Mint, Mtot + real(DP) :: Rp, rhill + real(DP) :: Mresidual + real(DP) :: U_binding + + Vimp = norm2(vb2(:) - vb1(:)) + b = calc_b(xh2, vb2, xh1, vb1) + l = (rad1 + rad2) * (1 - b) + egy = 0.5_DP * dot_product(vb1, vb1) - GC * Mcb / norm2(xh1) + a1 = - GC * Mcb / 2.0_DP / egy + Mtot = m1 + m2 + mu = (m1 * m2) / Mtot + if (l < 2 * rad2) then + !calculate Mint + phi = 2 * acos((l - rad2) / rad2) + aint = rad2**2 * (PI - (phi - sin(phi)) / 2.0_DP) + lint = 2 * sqrt(rad2**2 - (rad2 - l / 2.0_DP) ** 2) + Mint = aint * lint ![kg] + alpha = (l**2) * (3 * rad2 - l) / (4 * (rad2**3)) + else + alpha = 1.0_DP + Mint = m2 + end if + Rp = (3 * (m1 / den1 + alpha * m2 / den2) / (4 * PI))**(1.0_DP/3.0_DP) ! (Mustill et al. 2018) + c_star = calc_c_star(Rp) + !calculate Vescp + Vescp = sqrt(2 * GC * Mtot / Rp) !Mustill et al. 2018 eq 6 + !calculate rhill + rhill = a1 * (m1 / 3.0_DP / (Mcb + m1))**(1.0_DP/3.0_DP) + !calculate Vhill + if ((rad2 + rad1) < rhill) then + Vhill = sqrt(2 * GC * m1 * ((rhill**2 - rhill * (rad1 + rad2)) / & + (rhill**2 - 0.5_DP * (rad1 + rad2)**2)) / (rad1 + rad2)) + else + Vhill = Vescp + end if + !calculate Qr_pstar + Qrd_pstar = calc_Qrd_pstar(m1, m2, alpha, c_star) * (Vhill / Vescp)**CRUFU !Rufu and Aharaonson eq (3) + !calculate Verosion + Qr_erosion = 2 * (1.0_DP - m1 / Mtot) * Qrd_pstar + Verosion = (2 * Qr_erosion * Mtot / mu)** (1.0_DP / 2.0_DP) + Qr = mu*(Vimp**2) / Mtot / 2.0_DP + !calculate mass largest remnant Mlr + Mlr = (1.0_DP - Qr / Qrd_pstar / 2.0_DP) * Mtot ! [kg] # LS12 eq (5) + !calculate Vsupercat + Qr_supercat = SUPERCAT_QRATIO * Qrd_pstar ! See LS12 Section 4.1 + Vsupercat = sqrt(2 * Qr_supercat * Mtot / mu) + !calculate Vhr + zeta = (m1 - m2) / Mtot + theta = 1.0_DP - b + Vhr = Vescp * (C1 * zeta**2 * theta**(2.5_DP) + C2 * zeta**2 + C3 * theta**(2.5_DP) + C4) ! Kokubo & Genda (2010) eq. (3) + bcrit = rad1 / (rad1 + rad2) + Qloss = 0.0_DP + U_binding = (3.0_DP * Mtot) / (5.0_DP * Rp) ! LS12 eq. 27 + + if ((m1 < mtiny).or.(m2 < mtiny)) then + regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime + Mlr = Mtot + Mslr = 0.0_DP + Qloss = 0.0_DP + write(*,*) "FORCE MERGE" + else + if( Vimp < Vescp) then + regime = COLLRESOLVE_REGIME_MERGE !perfect merging regime + Mlr = Mtot + Mslr = 0.0_DP + Qloss = 0.0_DP + else if (Vimp < Verosion) then + if (b < bcrit) then + regime = COLLRESOLVE_REGIME_MERGE !partial accretion regime" + Mlr = Mtot + Mslr = 0.0_DP + Qloss = 0.0_DP + else if ((b > bcrit) .and. (Vimp < Vhr)) then + regime = COLLRESOLVE_REGIME_MERGE ! graze and merge + Mlr = Mtot + Mslr = 0.0_DP + Qloss = 0.0_DP + else + Mlr = m1 + Mslr = calc_Qrd_rev(m2, m1, Mint, den1, den2, Vimp, c_star) + regime = COLLRESOLVE_REGIME_HIT_AND_RUN !hit and run + Qloss = (c_star + 1.0_DP) * U_binding ! Qr + end if + else if (Vimp > Verosion .and. Vimp < Vsupercat) then + if (m2 < 0.001_DP * m1) then + regime = COLLRESOLVE_REGIME_MERGE !cratering regime" + Mlr = Mtot + Mslr = 0.0_DP + Qloss = 0.0_DP + else + Mslr = Mtot * (3.0_DP - BETA) * (1.0_DP - N1 * Mlr / Mtot) / (N2 * BETA) ! LS12 eq (37) + regime = COLLRESOLVE_REGIME_DISRUPTION !disruption + Qloss = (c_star + 1.0_DP) * U_binding ! Qr - Qr_erosion + end if + else if (Vimp > Vsupercat) then + Mlr = Mtot * 0.1_DP * (Qr / (Qrd_pstar * SUPERCAT_QRATIO))**(-1.5_DP) !LS12 eq (44) + Mslr = Mtot * (3.0_DP - BETA) * (1.0_DP - N1 * Mlr / Mtot) / (N2 * BETA) !LS12 eq (37) + regime = COLLRESOLVE_REGIME_SUPERCATASTROPHIC ! supercatastrophic + Qloss = (c_star + 1.0_DP) * U_binding ! Qr - Qr_supercat + else + write(*,*) "Error no regime found in symba_regime" + end if + end if + Mresidual = Mtot - Mlr - Mslr + if (Mresidual < 0.0_DP) then ! prevents final masses from going negative + Mlr = Mlr + Mresidual + end if + + return + + ! Internal functions + contains + function calc_Qrd_pstar(Mtarg, Mp, alpha, c_star) result(Qrd_pstar) + !! author: Jennifer L.L. Pouplin and Carlisle A. Wishard + !! + !! Calculates the corrected Q* for oblique impacts. See Eq. (15) of LS12. + !! Reference: + !! Leinhardt, Z.M., Stewart, S.T., 2012. Collisions between Gravity-dominated Bodies. I. Outcome Regimes and Scaling + !! Laws 745, 79. https://doi.org/10.1088/0004-637X/745/1/79 + !! + implicit none + ! Arguments + real(DP),intent(in) :: Mtarg, Mp, alpha, c_star + ! Result + real(DP) :: Qrd_pstar + ! Internals + real(DP) :: Qrd_star1, mu_alpha, mu, Qrd_star + + ! calc mu, mu_alpha + mu = (Mtarg * Mp) / (Mtarg + Mp) ! [kg] + mu_alpha = (Mtarg * alpha * Mp) / (Mtarg + alpha * Mp) ! [kg] + ! calc Qrd_star1 + Qrd_star1 = (c_star * 4 * PI * DENSITY1 * GC * Rp**2) / 5.0_DP + ! calc Qrd_star + Qrd_star = Qrd_star1 * (((Mp / Mtarg + 1.0_DP)**2) / (4 * Mp / Mtarg))**(2.0_DP / (3.0_DP * MU_BAR) - 1.0_DP) !(eq 23) + ! calc Qrd_pstar, v_pstar + Qrd_pstar = ((mu / mu_alpha)**(2.0_DP - 3.0_DP * MU_BAR / 2.0_DP)) * Qrd_star ! (eq 15) + + return + end function calc_Qrd_pstar + + function calc_Qrd_rev(Mp, Mtarg, Mint, den1, den2, Vimp, c_star) result(Mslr) + !! author: Jennifer L.L. Pouplin and Carlisle A. Wishard + !! + !! Calculates mass of second largest fragment. + !! + implicit none + ! Arguments + real(DP),intent(in) :: Mp, Mtarg, Mint, den1, den2, Vimp, c_star + ! Result + real(DP) :: Mslr + ! Internals + real(DP) :: mtot_rev, mu_rev, gamma_rev, Qrd_star1, Qrd_star, mu_alpha_rev + real(DP) :: Qrd_pstar, Rc1, Qr_rev, Qrd_pstar_rev, Qr_supercat_rev + + ! calc Mslr, Rc1, mu, gammalr + mtot_rev = Mint + Mp + Rc1 = (3 * (Mint / den1 + Mp / den2) / (4 * PI))**(1.0_DP/3.0_DP) ! [m] Mustill et al 2018 + mu_rev = (Mint * Mp) / mtot_rev ! [kg] eq 49 LS12 + mu_alpha_rev = (Mtarg * alpha * Mp) / (Mtarg + alpha * Mp) + gamma_rev = Mint / Mp ! eq 50 LS12 + !calc Qr_rev + Qr_rev = mu_rev * (Vimp**2) / (2 * mtot_rev) + ! calc Qrd_star1, v_star1 + Qrd_star1 = (c_star * 4 * PI * mtot_rev * GC ) / Rc1 / 5.0_DP + ! calc Qrd_pstar_rev + Qrd_star = Qrd_star1 * (((gamma_rev + 1.0_DP)**2) / (4 * gamma_rev)) ** (2.0_DP / (3.0_DP * MU_BAR) - 1.0_DP) !(eq 52) + Qrd_pstar = Qrd_star * ((mu_rev / mu_alpha_rev)**(2.0_DP - 3.0_DP * MU_BAR / 2.0_DP)) + Qrd_pstar_rev = Qrd_pstar * (Vhill / Vescp)**CRUFU !Rufu and Aharaonson eq (3) + !calc Qr_supercat_rev + Qr_supercat_rev = 1.8_DP * Qrd_pstar_rev + if (Qr_rev > Qr_supercat_rev ) then + Mslr = mtot_rev * (0.1_DP * ((Qr_rev / (Qrd_pstar_rev * 1.8_DP))**(-1.5_DP))) !eq (44) + else if ( Qr_rev < Qrd_pstar_rev ) then + Mslr = Mp + else + Mslr = (1.0_DP - Qr_rev / Qrd_pstar_rev / 2.0_DP) * (mtot_rev) ! [kg] #(eq 5) + end if + + if ( Mslr > Mp ) Mslr = Mp !check conservation of mass + + return + end function calc_Qrd_rev + + function calc_b(proj_pos, proj_vel, targ_pos, targ_vel) result(sintheta) + !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Calculates the impact factor b = sin(theta), where theta is the angle between the relative velocity + !! and distance vectors of the target and projectile bodies. See Fig. 2 of Leinhardt and Stewart (2012) + !! + implicit none + !! Arguments + real(DP), dimension(:), intent(in) :: proj_pos, proj_vel, targ_pos, targ_vel + !! Result + real(DP) :: sintheta + !! Internals + real(DP), dimension(NDIM) :: imp_vel, distance, x_cross_v + + imp_vel(:) = proj_vel(:) - targ_vel(:) + distance(:) = proj_pos(:) - targ_pos(:) + x_cross_v(:) = distance(:) .cross. imp_vel(:) + sintheta = norm2(x_cross_v(:)) / norm2(distance(:)) / norm2(imp_vel(:)) + return + end function calc_b + + function calc_c_star(Rc1) result(c_star) + !! author: David A. Minton + !! + !! Calculates c_star as a function of impact equivalent radius. It inteRpolates between 5 for ~1 km sized bodies to + !! 1.8 for ~10000 km sized bodies. See LS12 Fig. 4 for details. + !! + implicit none + !! Arguments + real(DP), intent(in) :: Rc1 + !! Result + real(DP) :: c_star + !! Internals + real(DP), parameter :: loR = 1.0e3_DP ! Lower bound of inteRpolation size (m) + real(DP), parameter :: hiR = 1.0e7_DP ! Upper bound of inteRpolation size (m) + real(DP), parameter :: loval = 5.0_DP ! Value of C* at lower bound + real(DP), parameter :: hival = 1.9_DP ! Value of C* at upper bound + + if (Rc1 < loR) then + c_star = loval + else if (Rc1 < hiR) then + c_star = loval + (hival - loval) * log(Rc1 / loR) / log(hiR /loR) + else + c_star = hival + end if + return + end function calc_c_star - return end subroutine fragmentation_regime end submodule s_fragmentation \ No newline at end of file From b274576c252266a66312e131cd3b7734c4b7cace Mon Sep 17 00:00:00 2001 From: David A Minton Date: Wed, 4 Aug 2021 23:12:29 -0400 Subject: [PATCH 188/194] Added in placeholder select statement to switch between fragmenation regimes --- src/symba/symba_collision.f90 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 843de7dd6..97f3e415d 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -466,7 +466,19 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) mass_res(:) = (mass_res(:) / param%MU2KG) * param%GU Qloss = Qloss * (param%GU / param%MU2KG) * (param%TU2S / param%DU2M)**2 - !status = symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + select case (regime) + case (COLLRESOLVE_REGIME_DISRUPTION) + !status = symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + case (COLLRESOLVE_REGIME_SUPERCATASTROPHIC) + !status = symba_fragmentation_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + case (COLLRESOLVE_REGIME_HIT_AND_RUN) + !status = symba_fragmentation_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) + status = symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) + case default + write(*,*) "Error in symba_collision, unrecognized collision regime" + call util_exit(FAILURE) + end select end do end select end associate From 11f61d6bdfd484c32b63184f1a97ad834ad4be8a Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 06:46:11 -0400 Subject: [PATCH 189/194] Added interfaces for fragmentation cases --- src/modules/symba_classes.f90 | 36 ++++++++++++++++ src/symba/symba_collision.f90 | 8 ++-- src/symba/symba_fragmentation.f90 | 72 +++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 4 deletions(-) diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 697356b44..0e66ebf7c 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -275,6 +275,30 @@ module function symba_encounter_check_tp(self, system, dt, irec) result(lany_enc logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp + module function symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + implicit none + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collisionn + integer(I4B) :: status !! Status flag assigned to this outcome + end function symba_fragmentation_casedisruption + + module function symba_fragmentation_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + implicit none + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collision + integer(I4B) :: status !! Status flag assigned to this outcome + end function symba_fragmentation_casehitandrun + module function symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) implicit none class(symba_nbody_system), intent(inout) :: system !! SyMBA nbody system object @@ -285,6 +309,18 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, integer(I4B) :: status !! Status flag assigned to this outcome end function symba_fragmentation_casemerge + module function symba_fragmentation_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + implicit none + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collision + integer(I4B) :: status !! Status flag assigned to this outcome + end function symba_fragmentation_casesupercatastrophic + module subroutine symba_io_write_discard(self, param) use swiftest_classes, only : swiftest_parameters implicit none diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 97f3e415d..952d59709 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -420,7 +420,7 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) real(DP), dimension(NDIM) :: x1_si, v1_si, x2_si, v2_si real(DP) :: mlr, mslr, mtot, dentot, msys, msys_new, Qloss, impact_parameter integer(I4B), parameter :: NRES = 3 !! Number of collisional product results - real(DP), dimension(NRES) :: mass_res + real(DP), dimension(NRES) :: mass_res associate(plpl_collisions => self, ncollisions => self%nenc, idx1 => self%index1, idx2 => self%index2, cb => system%cb) select type(pl => system%pl) @@ -468,11 +468,11 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) select case (regime) case (COLLRESOLVE_REGIME_DISRUPTION) - !status = symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + status = symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) case (COLLRESOLVE_REGIME_SUPERCATASTROPHIC) - !status = symba_fragmentation_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + status = symba_fragmentation_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) case (COLLRESOLVE_REGIME_HIT_AND_RUN) - !status = symba_fragmentation_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) + status = symba_fragmentation_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) case (COLLRESOLVE_REGIME_MERGE, COLLRESOLVE_REGIME_GRAZE_AND_MERGE) status = symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) case default diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index f8afffb85..3ad475e4d 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -2,6 +2,54 @@ use swiftest contains + module function symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Create the fragments resulting from a non-catastrophic disruption collision + !! + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collision + ! Result + integer(I4B) :: status !! Status flag assigned to this outcome + ! Internals + + status = DISRUPTION + + return + end function symba_fragmentation_casedisruption + + + module function symba_fragmentation_casehitandrun(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Create the fragments resulting from a non-catastrophic hit-and-run collision + !! + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collision + ! Result + integer(I4B) :: status !! Status flag assigned to this outcome + ! Internals + + status = HIT_AND_RUN + + return + end function symba_fragmentation_casehitandrun + + module function symba_fragmentation_casemerge(system, param, family, x, v, mass, radius, L_spin, Ip) result(status) !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! @@ -134,4 +182,28 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, end function symba_fragmentation_casemerge + + module function symba_fragmentation_casesupercatastrophic(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) + !! author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Create the fragments resulting from a supercatastrophic collision + !! + 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 + real(DP), dimension(:,:), intent(inout) :: x, v, L_spin, Ip !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass, radius !! Input values that represent a 2-body equivalent of a possibly 2+ body collision + real(DP), dimension(:), intent(inout) :: mass_res !! The distribution of fragment mass obtained by the regime calculation + real(DP), intent(inout) :: Qloss !! Energy lost during collision + ! Result + integer(I4B) :: status !! Status flag assigned to this outcome + ! Internals + + status = SUPERCATASTROPHIC + + return + end function symba_fragmentation_casesupercatastrophic + end submodule s_symba_fragmentation From 8a35ffcaf20ffbd228a20e203fc3b4529f00d9d0 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 07:08:14 -0400 Subject: [PATCH 190/194] Added disruption case (without fragment initialization yet) --- src/modules/swiftest_classes.f90 | 1 + src/setup/setup.f90 | 1 + src/symba/symba_fragmentation.f90 | 115 +++++++++++++++++++++++++++++- 3 files changed, 114 insertions(+), 3 deletions(-) diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index af751fdcf..1aec7dc9d 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -289,6 +289,7 @@ module swiftest_classes logical :: lbeg !! True if this is the beginning of a step. This is used so that test particle steps can be calculated !! separately from massive bodies. Massive body variables are saved at half steps, and passed to !! the test particles + integer(I4B) :: maxid = -1 !! The current maximum particle id number contains !> Each integrator will have its own version of the step procedure(abstract_step_system), deferred :: step diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 33b5c07c4..6cba6d27b 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -128,6 +128,7 @@ module subroutine setup_initialize_system(self, 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%set_msys() call self%pl%set_mu(self%cb) call self%tp%set_mu(self%cb) diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index 3ad475e4d..fea7dea91 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -1,5 +1,8 @@ submodule (symba_classes) s_symba_fragmentation use swiftest + + integer(I4B), parameter :: NFRAG_DISRUPT = 12 + integer(I4B), parameter :: NFRAG_SUPERCAT = 20 contains module function symba_fragmentation_casedisruption(system, param, family, x, v, mass, radius, L_spin, Ip, mass_res, Qloss) result(status) @@ -19,8 +22,114 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals + integer(I4B) :: i, istart, nfrag, ibiggest, nstart, nend + real(DP) :: mtot, avg_dens + real(DP), dimension(NDIM) :: xcom, vcom, Ip_new + 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 + logical :: lfailure + class(symba_pl), allocatable :: plnew + + 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(pl, 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 + 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 = 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 - status = DISRUPTION + end associate + end select return end function symba_fragmentation_casedisruption @@ -157,8 +266,8 @@ module function symba_fragmentation_casemerge(system, param, family, x, v, mass, plnew%radius(1) = radius_new plnew%info(1) = pl%info(family(ibiggest)) if (param%lrotation) then - pl%Ip(:,1) = Ip_new(:) - pl%rot(:,1) = rot_new(:) + plnew%Ip(:,1) = Ip_new(:) + plnew%rot(:,1) = rot_new(:) end if if (param%ltides) then plnew%Q = pl%Q(ibiggest) From ca1d66b92d3ec8df363a10fe5af2ff5fc15cd5da Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 07:48:38 -0400 Subject: [PATCH 191/194] Added fragment initialization code (formerly symba_frag_pos from the Fragmentation branch) --- Makefile | 2 +- Makefile.Defines | 8 +- src/fragmentation/fragmentation.f90 | 835 ++++++++++++++++++++++++++++ src/modules/swiftest_classes.f90 | 44 ++ src/util/util_minimize_bfgs.f90 | 584 +++++++++++++++++++ src/util/util_solve.f90 | 138 ++++- 6 files changed, 1605 insertions(+), 6 deletions(-) create mode 100644 src/util/util_minimize_bfgs.f90 diff --git a/Makefile b/Makefile index 162129149..94dfbceeb 100644 --- a/Makefile +++ b/Makefile @@ -45,13 +45,13 @@ #****************************************************************************** SWIFTEST_MODULES = swiftest_globals.f90 \ + lambda_function.f90\ swiftest_classes.f90 \ swiftest_operators.f90 \ whm_classes.f90 \ rmvs_classes.f90 \ helio_classes.f90 \ symba_classes.f90 \ - lambda_function.f90\ swiftest.f90 diff --git a/Makefile.Defines b/Makefile.Defines index 291f2c604..70069bb71 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -FORTRAN = ifort +#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 a01af206b..d1965914f 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -1,6 +1,841 @@ submodule(swiftest_classes) s_fragmentation use swiftest contains + + 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) + !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton + !! + !! Initialize the position and velocity of fragments to conserve energy and momentum. + 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 + ! Internals + real(DP) :: mscale, rscale, 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 + 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 + real(DP), dimension(:), allocatable :: rmag, rotmag, v_r_mag, v_t_mag + real(DP), dimension(NDIM) :: Ltot_before + real(DP), dimension(NDIM) :: Ltot_after + real(DP) :: Etot_before, ke_orbit_before, ke_spin_before, pe_before, Lmag_before + real(DP) :: Etot_after, ke_orbit_after, ke_spin_after, pe_after, Lmag_after, dEtot, dLmag + real(DP), dimension(NDIM) :: L_frag_tot, L_frag_orb + real(DP) :: ke_frag_budget, ke_frag_orbit, ke_radial, ke_frag_spin, ke_avg_deficit, ke_avg_deficit_old + real(DP), dimension(NDIM) :: x_col_unit, y_col_unit, z_col_unit + character(len=*), parameter :: fmtlabel = "(A14,10(ES11.4,1X,:))" + integer(I4B) :: try, subtry + 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 + integer(I4B), parameter :: MAXTRY = 3000 + integer(I4B), parameter :: TANTRY = 3 + logical, dimension(size(IEEE_ALL)) :: fpe_halting_modes, fpe_quiet_modes + + if (nfrag < NFRAG_MIN) then + write(*,*) "symba_frag_pos needs at least ",NFRAG_MIN," fragments, but only ",nfrag," were given." + lfailure = .true. + return + end if + + call ieee_get_halting_mode(IEEE_ALL,fpe_halting_modes) ! Save the current halting modes so we can turn them off temporarily + fpe_quiet_modes(:) = .false. + call ieee_set_halting_mode(IEEE_ALL,fpe_quiet_modes) + + f_spin = 0.05_DP + mscale = 1.0_DP + rscale = 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) + + call set_scale_factors() + call define_coordinate_system() + call calculate_system_energy(linclude_fragments=.false.) + + r_max_start = norm2(x(:,2) - x(:,1)) + try = 1 + lfailure = .false. + ke_avg_deficit = 0.0_DP + do while (try < MAXTRY) + lfailure = .false. + ke_avg_deficit_old = ke_avg_deficit + ke_avg_deficit = 0.0_DP + subtry = 1 + do + call set_fragment_position_vectors() + call set_fragment_tan_vel(lfailure) + ke_avg_deficit = ke_avg_deficit - ke_radial + subtry = subtry + 1 + if (.not.lfailure .or. subtry == TANTRY) exit + !write(*,*) 'Trying new arrangement' + end do + ke_avg_deficit = ke_avg_deficit / subtry + if (lfailure) write(*,*) 'Failed to find tangential velocities' + + if (.not.lfailure) then + 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)) + 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. + else if (abs(dLmag) / Lmag_before > Ltol) then + write(*,*) 'Failed due to high angular momentum error: ', dLmag / Lmag_before + lfailure = .true. + end if + end if + end if + + if (.not.lfailure) exit + call restructure_failed_fragments() + try = try + 1 + end do + 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 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 + + 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 + !! 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) + vscale = sqrt(Escale / mscale) + tscale = rscale / vscale + Lscale = mscale * rscale * vscale + + xcom(:) = xcom(:) / rscale + vcom(:) = vcom(:) / vscale + + mtot = mtot / mscale + mass = mass / mscale + radius = radius / rscale + x = x / rscale + 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 / rscale + 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(:) * rscale + vcom(:) = vcom(:) * vscale + + mtot = mtot * mscale + mass = mass * mscale + radius = radius * rscale + x = x * rscale + 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 * rscale + rot_frag = rot_frag / tscale + x_frag = x_frag * rscale + 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 + + 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 + rscale = 1.0_DP + vscale = 1.0_DP + tscale = 1.0_DP + Lscale = 1.0_DP + Escale = 1.0_DP + + 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 + + ! 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 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) + deallocate(tmpsys%cb) + allocate(tmpsys%cb, source=cb) + allocate(ltmp(npl)) + ltmp(:) = .true. + 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 + tmpsys%pl%mass(npl+1:npl_new) = 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) + tmpsys%pl%status(npl+1:npl_new) = COLLISION + 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) + 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) + end if + + 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%mtiny / mscale) + 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%mass > param%mtiny) + 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 + 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 + 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 + + 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 + + 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(:) + 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 + + ! 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_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. + + 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 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 + + 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 + + + end subroutine fragmentation_initialize + + + 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 !! diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index 1aec7dc9d..d00d271fb 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -966,6 +966,17 @@ end subroutine util_fill_arr_logical end interface interface + module function util_minimize_bfgs(f, N, x0, eps, lerr) result(x1) + use lambda_function + implicit none + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0 + real(DP), intent(in) :: eps + logical, intent(out) :: lerr + real(DP), dimension(:), allocatable :: x1 + end function util_minimize_bfgs + module subroutine util_peri_tp(self, system, param) implicit none class(swiftest_tp), intent(inout) :: self !! Swiftest test particle object @@ -974,6 +985,39 @@ 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) implicit none diff --git a/src/util/util_minimize_bfgs.f90 b/src/util/util_minimize_bfgs.f90 new file mode 100644 index 000000000..fbd48c8c2 --- /dev/null +++ b/src/util/util_minimize_bfgs.f90 @@ -0,0 +1,584 @@ +submodule (swiftest_classes) s_util_minimize_bfgs + use swiftest +contains + module function util_minimize_bfgs(f, N, x0, eps, lerr) result(x1) + !! author: David A. Minton + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! This function implements the Broyden-Fletcher-Goldfarb-Shanno method to determine the minimum of a function of N variables. + !! It recieves as input: + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! N : Number of variables of function f + !! x0 : Initial starting value of x + !! eps : Accuracy of 1 - dimensional minimization at each step + !! The outputs include + !! lerr : Returns .true. if it could not find the minimum + !! Returns + !! x1 : Final minimum (all 0 if none found) + !! 0 = No miniumum found + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + use, intrinsic :: ieee_exceptions + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0 + real(DP), intent(in) :: eps + logical, intent(out) :: lerr + ! Result + real(DP), dimension(:), allocatable :: x1 + ! Internals + integer(I4B) :: i, j, k, l, conv, num + integer(I4B), parameter :: MAXLOOP = 1000 !! Maximum number of loops before method is determined to have failed + real(DP), parameter :: graddelta = 1e-4_DP !! Delta x for gradient calculations + real(DP), dimension(N) :: S !! Direction vectors + real(DP), dimension(N,N) :: H !! Approximated inverse Hessian matrix + real(DP), dimension(N) :: grad1 !! gradient of f + real(DP), dimension(N) :: grad0 !! old value of gradient + real(DP) :: astar !! 1D minimized value + real(DP), dimension(N) :: y, P + real(DP), dimension(N,N) :: PP, PyH, HyP + real(DP) :: yHy, Py + type(ieee_status_type) :: original_fpe_status + logical, dimension(:), allocatable :: fpe_flag + + call ieee_get_status(original_fpe_status) ! Save the original floating point exception status + call ieee_set_flag(ieee_all, .false.) ! Set all flags to quiet + allocate(fpe_flag(size(ieee_usual))) + + lerr = .false. + allocate(x1, source=x0) + ! Initialize approximate Hessian with the identity matrix (i.e. begin with method of steepest descent) + ! Get initial gradient and initialize arrays for updated values of gradient and x + H(:,:) = reshape([((0._DP, i=1, j-1), 1._DP, (0._DP, i=j+1, N), j=1, N)], [N,N]) + grad0 = gradf(f, N, x0(:), graddelta, lerr) + if (lerr) then + call ieee_set_status(original_fpe_status) + return + end if + grad1(:) = grad0(:) + do i = 1, MAXLOOP + !check for convergence + conv = count(abs(grad1(:)) > eps) + if (conv == 0) then + !write(*,*) "BFGS converged on gradient after ",i," iterations" + exit + end if + S(:) = -matmul(H(:,:), grad1(:)) + astar = minimize1D(f, x1, S, N, graddelta, lerr) + if (lerr) then + !write(*,*) "Exiting BFGS with error in minimize1D step" + exit + end if + ! Get new x values + P(:) = astar * S(:) + x1(:) = x1(:) + P(:) + ! Calculate new gradient + grad0(:) = grad1(:) + grad1 = gradf(f, N, x1, graddelta, lerr) + y(:) = grad1(:) - grad0(:) + Py = sum(P(:) * y(:)) + ! set up factors for H matrix update + yHy = 0._DP + do k = 1, N + do j = 1, N + yHy = yHy + y(j) * H(j,k) * y(k) + end do + end do + ! prevent divide by zero (convergence) + if (abs(Py) < tiny(Py)) then + !write(*,*) "BFGS Converged on tiny Py after ",i," iterations" + exit + end if + ! set up update + PyH(:,:) = 0._DP + HyP(:,:) = 0._DP + do k = 1, N + do j = 1, N + PP(j, k) = P(j) * P(k) + do l = 1, N + PyH(j, k) = PyH(j, k) + P(j) * y(l) * H(l,k) + HyP(j, k) = HyP(j, k) + P(k) * y(l) * H(j,l) + end do + end do + end do + ! update H matrix + H(:,:) = H(:,:) + ((1._DP - yHy / Py) * PP(:,:) - PyH(:,:) - HyP(:,:)) / Py + ! Normalize to prevent it from blowing up if it takes many iterations to find a solution + H(:,:) = H(:,:) / norm2(H(:,:)) + ! Stop everything if there are any exceptions to allow the routine to fail gracefully + call ieee_get_flag(ieee_usual, fpe_flag) + if (any(fpe_flag)) exit + if (i == MAXLOOP) then + lerr = .true. + !write(*,*) "BFGS ran out of loops!" + end if + end do + call ieee_get_flag(ieee_usual, fpe_flag) + lerr = lerr .or. any(fpe_flag) + !if (any(fpe_flag)) write(*,*) 'BFGS did not converge due to fpe' + !if (lerr) write(*,*) "BFGS did not converge!" + call ieee_set_status(original_fpe_status) + + return + + contains + + function gradf(f, N, x1, dx, lerr) result(grad) + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! Purpose: Estimates the gradient of a function using a central difference + !! approximation + !! Inputs: + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! N : number of variables N + !! x1 : x value array + !! dx : step size to use when calculating derivatives + !! Outputs: + !! lerr : .true. if an error occurred. Otherwise returns .false. + !! Returns + !! grad : N sized array containing estimated gradient of f at x1 + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x1 + real(DP), intent(in) :: dx + logical, intent(out) :: lerr + ! Result + real(DP), dimension(N) :: grad + ! Internals + integer(I4B) :: i, j + real(DP), dimension(N) :: xp, xm + real(DP) :: fp, fm + logical :: lerrp, lerrm + + do i = 1, N + do j = 1, N + if (j == i) then + xp(j) = x1(j) + dx + xm(j) = x1(j) - dx + else + xp(j) = x1(j) + xm(j) = x1(j) + end if + end do + select type (f) + class is (lambda_obj_err) + fp = f%eval(xp) + lerrp = f%lerr + fm = f%eval(xm) + lerrm = f%lerr + lerr = lerrp .or. lerrm + class is (lambda_obj) + fp = f%eval(xp) + fm = f%eval(xm) + lerr = .false. + end select + grad(i) = (fp - fm) / (2 * dx) + if (lerr) return + end do + return + end function gradf + + function minimize1D(f, x0, S, N, eps, lerr) result(astar) + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! This program find the minimum of a function of N variables in a single direction + !! S using in sequence: + !! 1. A Bracketing method + !! 2. The golden section method + !! 3. A quadratic polynomial fit + !! Inputs + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! x0 : Array of size N of initial x values + !! S : Array of size N that determines the direction of minimization + !! N : Number of variables of function f + !! eps : Accuracy of 1 - dimensional minimization at each step + !! Output + !! lerr : .true. if an error occurred. Otherwise returns .false. + !! Returns + !! astar : Final minimum along direction S + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0, S + real(DP), intent(in) :: eps + logical, intent(out) :: lerr + ! Result + real(DP) :: astar + ! Internals + integer(I4B) :: num = 0 + real(DP), parameter :: step = 0.7_DP !! Bracketing method step size + real(DP), parameter :: gam = 1.2_DP !! Bracketing method expansion parameter + real(DP), parameter :: greduce = 0.2_DP !! Golden section method reduction factor + real(DP), parameter :: greduce2 = 0.1_DP ! Secondary golden section method reduction factor + real(DP) :: alo, ahi !! High and low values for 1 - D minimization routines + real(DP), parameter :: a0 = epsilon(1.0_DP) !! Initial guess of alpha + + alo = a0 + call bracket(f, x0, S, N, gam, step, alo, ahi, lerr) + if (lerr) then + !write(*,*) "BFGS bracketing step failed!" + return + end if + if (abs(alo - ahi) < eps) then + astar = alo + lerr = .false. + return + end if + call golden(f, x0, S, N, greduce, alo, ahi, lerr) + if (lerr) then + !write(*,*) "BFGS golden section step failed!" + return + end if + if (abs(alo - ahi) < eps) then + astar = alo + lerr = .false. + return + end if + call quadfit(f, x0, S, N, eps, alo, ahi, lerr) + if (lerr) then + !write(*,*) "BFGS quadfit failed!" + return + end if + if (abs(alo - ahi) < eps) then + astar = alo + lerr = .false. + return + end if + ! Quadratic fit method won't converge, so finish off with another golden section + call golden(f, x0, S, N, greduce2, alo, ahi, lerr) + if (.not. lerr) astar = (alo + ahi) / 2.0_DP + return + end function minimize1D + + function n2one(f, x0, S, N, a, lerr) result(fnew) + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0, S + real(DP), intent(in) :: a + logical, intent(out) :: lerr + + ! Return + real(DP) :: fnew + ! Internals + real(DP), dimension(N) :: xnew + integer(I4B) :: i + + xnew(:) = x0(:) + a * S(:) + fnew = f%eval(xnew(:)) + select type(f) + class is (lambda_obj_err) + lerr = f%lerr + class is (lambda_obj) + lerr = .false. + end select + return + end function n2one + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + subroutine bracket(f, x0, S, N, gam, step, lo, hi, lerr) + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! This subroutine brackets the minimum. It recieves as input: + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! x0 : Array of size N of initial x values + !! S : Array of size N that determines the direction of minimization + !! gam : expansion parameter + !! step : step size + !! lo : initial guess of lo bracket value + !! The outputs include + !! lo : lo bracket + !! hi : hi bracket + !! lerr : .true. if an error occurred. Otherwise returns .false. + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0, S + real(DP), intent(in) :: gam, step + real(DP), intent(inout) :: lo + real(DP), intent(out) :: hi + logical, intent(out) :: lerr + ! Internals + real(DP) :: a0, a1, a2, atmp, da + real(DP) :: f0, f1, f2 + integer(I4B) :: i, j + integer(I4B), parameter :: MAXLOOP = 100 ! maximum number of loops before method is determined to have failed + real(DP), parameter :: eps = epsilon(lo) ! small number precision to test floating point equality + + ! set up initial bracket points + a0 = lo + da = step + a1 = a0 + da + a2 = a0 + 2 * da + f0 = n2one(f, x0, S, N, a0, lerr) + if (lerr) return + f1 = n2one(f, x0, S, N, a1, lerr) + if (lerr) return + f2 = n2one(f, x0, S, N, a2, lerr) + if (lerr) return + ! loop over bracket method until either min is bracketed method fails + do i = 1, MAXLOOP + if ((f0 > f1) .and. (f1 < f2)) then ! Minimum was found + lo = a0 + hi = a2 + return + else if ((f0 >= f1) .and. (f1 > f2)) then ! Function appears to decrease + da = da * gam + atmp = a2 + da + a0 = a1 + a1 = a2 + a2 = atmp + f0 = f1 + f1 = f2 + f2 = n2one(f, x0, S, N, a2, lerr) + else if ((f0 < f1) .and. (f1 <= f2)) then ! Function appears to increase + da = da * gam + atmp = a0 - da + a2 = a1 + a1 = a0 + a0 = atmp + f2 = f1 + f0 = n2one(f, x0, S, N, a0, lerr) + else if ((f0 < f1) .and. (f1 > f2)) then ! We are at a peak. Pick the direction that descends the fastest + da = da * gam + if (f2 > f0) then ! LHS is lower than RHS + atmp = a2 + da + a0 = a1 + a1 = a2 + a2 = atmp + f0 = f1 + f1 = f2 + f2 = n2one(f, x0, S, N, a2, lerr) + else ! RHS is lower than LHS + atmp = a0 - da + a2 = a1 + a1 = a0 + a0 = atmp + f2 = f1 + f1 = f2 + f0 = n2one(f, x0, S, N, a0, lerr) + end if + else if ((f0 > f1) .and. (abs(f2 - f1) <= eps)) then ! Decrasging but RHS equal + da = da * gam + atmp = a2 + da + a2 = atmp + f2 = n2one(f, x0, S, N, a2, lerr) + else if ((abs(f0 - f1) < eps) .and. (f1 < f2)) then ! Increasing but LHS equal + da = da * gam + atmp = a0 - da + a0 = atmp + f0 = n2one(f, x0, S, N, a0, lerr) + else ! all values equal. Expand in either direction and try again + a0 = a0 - da + a2 = a2 + da + f0 = n2one(f, x0, S, N, a0, lerr) + if (lerr) exit ! An error occurred while evaluating the function + f2 = n2one(f, x0, S, N, a2, lerr) + end if + if (lerr) exit ! An error occurred while evaluating the function + end do + lerr = .true. + return ! no minimum found + end subroutine bracket + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + subroutine golden(f, x0, S, N, eps, lo, hi, lerr) + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! This function uses the golden section method to reduce the starting interval lo, hi by some amount sigma. + !! It recieves as input: + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! x0 : Array of size N of initial x values + !! S : Array of size N that determines the direction of minimization + !! gam : expansion parameter + !! eps : reduction interval in range (0 < sigma < 1) such that: + !! hi(new) - lo(new) = eps * (hi(old) - lo(old)) + !! lo : initial guess of lo bracket value + !! The outputs include + !! lo : lo bracket + !! hi : hi bracket + !! lerr : .true. if an error occurred. Otherwise returns .false. + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0, S + real(DP), intent(in) :: eps + real(DP), intent(inout) :: lo + real(DP), intent(out) :: hi + logical, intent(out) :: lerr + ! Internals + real(DP), parameter :: tau = 0.5_DP * (sqrt(5.0_DP) - 1.0_DP) ! Golden section constant + integer(I4B), parameter :: MAXLOOP = 40 ! maximum number of loops before method is determined to have failed (unlikely, but could occur if no minimum exists between lo and hi) + real(DP) :: i0 ! Initial interval value + real(DP) :: a1, a2 + real(DP) :: f1, f2 + integer(I4B) :: i, j + + i0 = hi - lo + a1 = hi - tau * i0 + a2 = lo + tau * i0 + f1 = n2one(f, x0, S, N, a1, lerr) + if (lerr) return + f2 = n2one(f, x0, S, N, a2, lerr) + if (lerr) return + do i = 1, MAXLOOP + if (abs((hi - lo) / i0) <= eps) return ! interval reduced to input amount + if (f2 > f1) then + hi = a2 + a2 = a1 + f2 = f1 + a1 = hi - tau * (hi - lo) + f1 = n2one(f, x0, S, N, a1, lerr) + else + lo = a1 + a1 = a2 + f2 = f1 + a2 = hi - (1.0_DP - tau) * (hi - lo) + f2 = n2one(f, x0, S, N, a2, lerr) + end if + if (lerr) exit + end do + lerr = .true. + return ! search took too many iterations - no minimum found + end subroutine golden + + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + subroutine quadfit(f, x0, S, N, eps, lo, hi, lerr) + ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + !! This function uses a quadratic polynomial fit to locate the minimum of a function + !! to some accuracy eps. It recieves as input: + !! f%eval(x) : lambda function object containing the objective function as the eval metho + !! lo : low bracket value + !! hi : high bracket value + !! eps : desired accuracy of final minimum location + !! The outputs include + !! lo : final minimum location + !! hi : final minimum location + !! Notes: Uses the ieee_exceptions intrinsic module to allow for graceful failure due to floating point exceptions, which won't terminate the run. + !! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + implicit none + ! Arguments + integer(I4B), intent(in) :: N + class(lambda_obj), intent(inout) :: f + real(DP), dimension(:), intent(in) :: x0, S + real(DP), intent(in) :: eps + real(DP), intent(inout) :: lo + real(DP), intent(out) :: hi + logical, intent(out) :: lerr + ! Internals + integer(I4B), parameter :: MAXLOOP = 20 ! maximum number of loops before method is determined to have failed. + real(DP) :: a1, a2, a3, astar ! three points for the polynomial fit and polynomial minimum + real(DP) :: f1, f2, f3, fstar ! three function values for the polynomial and polynomial minimum + real(DP), dimension(3) :: row_1, row_2, row_3, rhs, soln ! matrix for 3 equation solver (gaussian elimination) + real(DP), dimension(3,3) :: lhs + real(DP) :: d1, d2, d3, aold, denom, errval + integer(I4B) :: i + + lerr = .false. + ! Get initial a1, a2, a3 values + a1 = lo + a2 = lo + 0.5_DP * (hi - lo) + a3 = hi + aold = a1 + astar = a2 + f1 = n2one(f, x0, S, N, a1, lerr) + if (lerr) return + f2 = n2one(f, x0, S, N, a2, lerr) + if (lerr) return + f3 = n2one(f, x0, S, N, a3, lerr) + if (lerr) return + do i = 1, MAXLOOP + ! check to see if convergence is reached and exit + errval = abs((astar - aold) / astar) + call ieee_get_flag(ieee_usual, fpe_flag) + if (any(fpe_flag)) then + !write(*,*) 'quadfit fpe' + !write(*,*) 'aold : ',aold + !write(*,*) 'astar: ',astar + lerr = .true. + exit + end if + if (errval < eps) then + lo = astar + hi = astar + exit + end if + ! Set up system for gaussian elimination equation solver + row_1 = [1.0_DP, a1, a1**2] + row_2 = [1.0_DP, a2, a2**2] + row_3 = [1.0_DP, a3, a3**2] + rhs = [f1, f2, f3] + lhs(1, :) = row_1 + lhs(2, :) = row_2 + lhs(3, :) = row_3 + ! Solve system of equations + soln(:) = util_solve_linear_system(lhs, rhs, 3, lerr) + call ieee_set_flag(ieee_all, .false.) ! Set all flags back to quiet + call ieee_set_halting_mode(ieee_divide_by_zero, .false.) + if (lerr) then + !write(*,*) 'quadfit fpe:' + !write(*,*) 'util_solve_linear_system failed' + exit + end if + aold = astar + if (soln(2) == soln(3)) then ! Handles the case where they are both 0. 0/0 is an unhandled exception + astar = -0.5_DP + else + astar = -soln(2) / (2 * soln(3)) + end if + call ieee_get_flag(ieee_usual, fpe_flag) + if (any(fpe_flag)) then + !write(*,*) 'quadfit fpe' + !write(*,*) 'soln(2:3): ',soln(2:3) + !write(*,*) 'a1, a2, a3' + !write(*,*) a1, a2, a3 + !write(*,*) 'f1, f2, f3' + !write(*,*) f1, f2, f3 + lerr = .true. + exit + end if + fstar = n2one(f, x0, S, N, astar, lerr) + if (lerr) exit + ! keep the three closest a values to astar and discard the fourth + d1 = abs(a1 - astar) + d2 = abs(a2 - astar) + d3 = abs(a3 - astar) + + if (d1 > d2) then + if (d1 > d3) then + f1 = fstar + a1 = astar + else if (d3 > d2) then + f3 = fstar + a3 = astar + end if + else + if (d2 > d3) then + f2 = fstar + a2 = astar + else if (d3 > d1) then + f3 = fstar + a3 = astar + end if + end if + end do + if (lerr) return + lo = a1 + hi = a3 + return + end subroutine quadfit + + end function util_minimize_bfgs +end submodule s_util_minimize_bfgs \ No newline at end of file diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 0c3161ae2..ed9ff40ea 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -2,7 +2,143 @@ use swiftest contains - function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) + module function util_solve_linear_system_d(A,b,n,lerr) result(x) + !! Author: David A. Minton + !! + !! Solves the linear equation of the form A*x = b for x. + !! A is an (n,n) arrays + !! x and b are (n) arrays + !! Uses Gaussian elimination, so will have issues if system is ill-conditioned. + !! Uses quad precision intermidiate values, so works best on small arrays. + use, intrinsic :: ieee_exceptions + implicit none + ! Arguments + integer(I4B), intent(in) :: n + real(DP), dimension(:,:), intent(in) :: A + real(DP), dimension(:), intent(in) :: b + logical, intent(out) :: lerr + ! Result + real(DP), dimension(n) :: x + ! Internals + real(QP), dimension(:), allocatable :: qx + type(ieee_status_type) :: original_fpe_status + logical, dimension(:), allocatable :: fpe_flag + + call ieee_get_status(original_fpe_status) ! Save the original floating point exception status + call ieee_set_flag(ieee_all, .false.) ! Set all flags to quiet + allocate(fpe_flag(size(ieee_usual))) + + qx = solve_wbs(ge_wpp(real(A, kind=QP), real(b, kind=QP))) + + call ieee_get_flag(ieee_usual, fpe_flag) + lerr = any(fpe_flag) + if (lerr .or. (any(abs(qx) > huge(x))) .or. (any(abs(qx) < tiny(x)))) then + x = 0.0_DP + else + x = real(qx, kind=DP) + end if + call ieee_set_status(original_fpe_status) + + return + end function util_solve_linear_system_d + + module function util_solve_linear_system_q(A,b,n,lerr) result(x) + !! Author: David A. Minton + !! + !! Solves the linear equation of the form A*x = b for x. + !! A is an (n,n) arrays + !! x and b are (n) arrays + !! Uses Gaussian elimination, so will have issues if system is ill-conditioned. + !! Uses quad precision intermidiate values, so works best on small arrays. + use, intrinsic :: ieee_exceptions + use swiftest + implicit none + ! Arguments + integer(I4B), intent(in) :: n + real(QP), dimension(:,:), intent(in) :: A + real(QP), dimension(:), intent(in) :: b + logical, intent(out) :: lerr + ! Result + real(QP), dimension(n) :: x + ! Internals + type(ieee_status_type) :: original_fpe_status + logical, dimension(:), allocatable :: fpe_flag + + call ieee_get_status(original_fpe_status) ! Save the original floating point exception status + call ieee_set_flag(ieee_all, .false.) ! Set all flags to quiet + allocate(fpe_flag(size(ieee_usual))) + + x = solve_wbs(ge_wpp(A, b)) + + call ieee_get_flag(ieee_usual, fpe_flag) + lerr = any(fpe_flag) + if (lerr) x = 0.0_DP + call ieee_set_status(original_fpe_status) + + return + end function util_solve_linear_system_q + + function solve_wbs(u) result(x) ! solve with backward substitution + !! Based on code available on Rosetta Code: https://rosettacode.org/wiki/Gaussian_elimination#Fortran + use, intrinsic :: ieee_exceptions + use swiftest + implicit none + ! Arguments + real(QP), intent(in), dimension(:,:), allocatable :: u + ! Result + real(QP), dimension(:), allocatable :: x + ! Internals + integer(I4B) :: i,n + + n = size(u, 1) + if (allocated(x)) deallocate(x) + if (.not.allocated(x)) allocate(x(n)) + if (any(abs(u) < tiny(1._DP)) .or. any(abs(u) > huge(1._DP))) then + x(:) = 0._DP + return + end if + call ieee_set_halting_mode(ieee_divide_by_zero, .false.) + do i = n, 1, -1 + x(i) = (u(i, n + 1) - sum(u(i, i + 1:n) * x(i + 1:n))) / u(i, i) + end do + return + end function solve_wbs + + function ge_wpp(A, b) result(u) ! gaussian eliminate with partial pivoting + !! Solve Ax=b using Gaussian elimination then backwards substitution. + !! A being an n by n matrix. + !! x and b are n by 1 vectors. + !! Based on code available on Rosetta Code: https://rosettacode.org/wiki/Gaussian_elimination#Fortran + use, intrinsic :: ieee_exceptions + use swiftest + implicit none + ! Arguments + real(QP), dimension(:,:), intent(in) :: A + real(QP), dimension(:), intent(in) :: b + ! Result + real(QP), dimension(:,:), allocatable :: u + ! Internals + integer(I4B) :: i,j,n,p + real(QP) :: upi + + n = size(a, 1) + allocate(u(n, (n + 1))) + u = reshape([A, b], [n, n + 1]) + call ieee_set_halting_mode(ieee_divide_by_zero, .false.) + do j = 1, n + p = maxloc(abs(u(j:n, j)), 1) + j - 1 ! maxloc returns indices between (1, n - j + 1) + if (p /= j) u([p, j], j) = u([j, p], j) + u(j + 1:, j) = u(j + 1:, j) / u(j, j) + do i = j + 1, n + 1 + upi = u(p, i) + if (p /= j) u([p, j], i) = u([j, p], i) + u(j + 1:n, i) = u(j + 1:n, i) - upi * u(j + 1:n, j) + end do + end do + return + end function ge_wpp + + module function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) !! author: David A. Minton !! !! Implements the 4th order Runge-Kutta-Fehlberg ODE solver for initial value problems of the form f=dy/dt, y0 = y(t=0), solving for y1 = y(t=t1). Uses a 5th order adaptive step size control. From 8b4d5237f4738e8dea8154ae489762ff137f7724 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 07:50:26 -0400 Subject: [PATCH 192/194] Fixed duplicate use statement that was giving a problem in util_solve with ifort --- Makefile.Defines | 8 ++++---- src/util/util_solve.f90 | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Makefile.Defines b/Makefile.Defines index 70069bb71..291f2c604 100644 --- a/Makefile.Defines +++ b/Makefile.Defines @@ -65,13 +65,13 @@ 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 = $(IDEBUG) $(HEAPARR) #FFLAGS = -init=snan,arrays -no-wrap-margin -O3 $(STRICTREAL) $(SIMDVEC) $(PAR) -#FORTRAN = ifort +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/util/util_solve.f90 b/src/util/util_solve.f90 index ed9ff40ea..057ed1182 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -51,7 +51,6 @@ module function util_solve_linear_system_q(A,b,n,lerr) result(x) !! Uses Gaussian elimination, so will have issues if system is ill-conditioned. !! Uses quad precision intermidiate values, so works best on small arrays. use, intrinsic :: ieee_exceptions - use swiftest implicit none ! Arguments integer(I4B), intent(in) :: n From d0e7fb4c150ee2ef8132c989cfe5ee6380ba4dc3 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 07:59:37 -0400 Subject: [PATCH 193/194] Enabled the disruption and supercat fragmentation and got all of the interfaces straightened out --- src/fragmentation/fragmentation.f90 | 2 +- src/modules/swiftest_classes.f90 | 16 ++++ src/symba/symba_fragmentation.f90 | 111 +++++++++++++++++++++++++++- 3 files changed, 125 insertions(+), 4 deletions(-) diff --git a/src/fragmentation/fragmentation.f90 b/src/fragmentation/fragmentation.f90 index d1965914f..460060183 100644 --- a/src/fragmentation/fragmentation.f90 +++ b/src/fragmentation/fragmentation.f90 @@ -2,7 +2,7 @@ use swiftest contains - subroutine fragmentation_initialize(system, param, family, x, v, L_spin, Ip, mass, radius, & + 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) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index d00d271fb..2455e77f2 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -453,6 +453,22 @@ module subroutine eucl_dist_index_plpl(self) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object end subroutine + 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 + end subroutine fragmentation_initialize + 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 diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index fea7dea91..138ab9179 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -73,8 +73,8 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, Ip_frag(:, i) = Ip_new(:) end do - !call fragmentation_initialize(pl, param, family, x, v, L_spin, Ip, mass, radius, & - ! nfrag, Ip_frag, m_frag, rad_frag, xb_frag, vb_frag, rot_frag, Qloss, lfailure) + 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' @@ -83,6 +83,7 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, else ! Populate the list of new bodies write(*,'("Generating ",I2.0," fragments")') nfrag + status = DISRUPTION allocate(plnew, mold=pl) call plnew%setup(nfrag, param) @@ -309,8 +310,112 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals + integer(I4B) :: i, nfrag, ibiggest, nstart, nend + real(DP) :: mtot, avg_dens, min_frag_mass + real(DP), dimension(NDIM) :: xcom, vcom + real(DP), dimension(2) :: vol + 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 + logical :: lfailure + class(symba_pl), allocatable :: plnew + + 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 - 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 + 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 = 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 select return end function symba_fragmentation_casesupercatastrophic From ee7bdec0544fff1e9c4af8cc1fdd22e0213cf765 Mon Sep 17 00:00:00 2001 From: David A Minton Date: Thu, 5 Aug 2021 08:12:25 -0400 Subject: [PATCH 194/194] Added in hit and run case --- src/symba/symba_fragmentation.f90 | 166 +++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 4 deletions(-) diff --git a/src/symba/symba_fragmentation.f90 b/src/symba/symba_fragmentation.f90 index 138ab9179..efdd8c0d7 100644 --- a/src/symba/symba_fragmentation.f90 +++ b/src/symba/symba_fragmentation.f90 @@ -22,13 +22,14 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, istart, nfrag, ibiggest, nstart, nend + integer(I4B) :: i, istart, nfrag, ibiggest, nfamily, nstart, nend real(DP) :: mtot, avg_dens real(DP), dimension(NDIM) :: xcom, vcom, Ip_new 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 logical :: lfailure + logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew select type(pl => system%pl) @@ -84,6 +85,18 @@ module function symba_fragmentation_casedisruption(system, param, family, x, v, ! 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) @@ -153,8 +166,140 @@ 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 + real(DP) :: mtot, avg_dens + real(DP), dimension(NDIM) :: xcom, vcom + 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 :: lpure + logical, dimension(system%pl%nbody) :: lmask + class(symba_pl), allocatable :: plnew + + 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 + 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 = 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 + 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) - status = HIT_AND_RUN + end if + end associate + end select return end function symba_fragmentation_casehitandrun @@ -310,7 +455,7 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, ! Result integer(I4B) :: status !! Status flag assigned to this outcome ! Internals - integer(I4B) :: i, nfrag, ibiggest, nstart, nend + integer(I4B) :: i, nfrag, ibiggest, nfamily, nstart, nend real(DP) :: mtot, avg_dens, min_frag_mass real(DP), dimension(NDIM) :: xcom, vcom real(DP), dimension(2) :: vol @@ -318,6 +463,7 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, real(DP), dimension(:, :), allocatable :: vb_frag, xb_frag, rot_frag, Ip_frag real(DP), dimension(:), allocatable :: m_frag, rad_frag logical :: lfailure + logical, dimension(system%pl%nbody) :: lmask class(symba_pl), allocatable :: plnew select type(pl => system%pl) @@ -369,6 +515,18 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, ! 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 + allocate(plnew, mold=pl) call plnew%setup(nfrag, param) @@ -387,7 +545,7 @@ module function symba_fragmentation_casesupercatastrophic(system, param, family, plnew%Gmass(:) = param%GU * m_frag(:) plnew%density(:) = avg_dens plnew%radius(:) = rad_frag(:) - plnew%info(:)%origin_type = "Disruption" + plnew%info(:)%origin_type = "Supercatastrophic" plnew%info(:)%origin_time = param%t do i = 1, nfrag plnew%info(i)%origin_xh(:) = plnew%xh(:,i)